10年学会编程--转载

10年学会编程

 

原文:http://www.norvig.com/21-days.html
译本出处:http://www.cnblogs.com/cxsharp/articles/2010.html

为什么每个人都急不可耐?

走入任何书店里,你会看到《7天内学会Java》靠在一堆提供在几天或者几小时内学会VB、Windows、Internet…教学的书籍旁。我在Amazon.com上进行了如下搜索pubdate: after 1992 and title: days and (title: learn or title: teach yourself)得到的书籍有248本,前面的78个是计算机书籍(第79个是《Learn Bengali in 30 days》,30天学会孟加拉语)。我把关键词“days”换成“hours”,得到了非常相似的结果:这次有253本书,头77本是计算机书籍,第78本是《Teach Yourself Grammar and Style in 24 Hours》(24小时学会文法和文体)。头200本书中,有96%是计算机书籍。我得到的结论是–人们非常急于学习计算机相关知识,或者不知道何故,计算机难以置信的比其他任何东西都要容易学。却没发现一本书是关于在多少天内学会演奏贝多芬音乐、量子物理、甚至学会养狗。让我们来分析一下像《Learn Pascal in Three Days》(3天学会Pascal)这样的题目到底是什么意思:

学会:在3天内你根本没有时间写出一个像样的程序,不会有使用它编程的成功或失败过程中学习的经历。也不会有时间和一个经验丰富的程序员一起工作,更不会理解程序在实际的编程环境中是怎样的。简而言之,你没有足够的时间学习更多的。所以这样的书只能谈一些肤浅的知识,不会让你深入的理解。亚历山大说过,肤浅的学习是危险的事情。

Pascal:3天内也许你能搞懂Pascal的语法(如果你以前过另外一种类似的语言),但是你不能学会如何利用这样的语法。简而言之,假如你是个Basic程序员,你会用Basic风格写Pascal代码,但不会明白什么是Pascal的优点(或者不足)。为什么有这样的观点?Alan Perlis说过:“一门语言没有影响你的编程思想,它就不值得学习。”另一个观点,你只是学习了Pascal(更像,Visual Basic或者JavaScript)很少的部分知识,因为你只是需要使用这样的工具去完成一个特定的任务。但是你没有学会如何编程;你只是学会如何完成一些特定的任务。

3天:不幸地,如下节要说的,这根本不够。

10年编程无师自通

学者们(HayesBloom)研究表明,要想成为业界专家,任何一个宽广的领域,都需要10年的时间,比如下棋、作曲、绘画、演奏钢琴、游泳、网球,和研究神经心理学、地质学。这说明没有捷径:即使莫扎特,在4岁的时候就已经显示了音乐天赋,但在他写出了世界级的音乐作品前,他也花了13年的时间。另外一个例子,披头士乐队,好像是在 1964年突然在Ed Sullivan冒出来的,但其实他们在1957年就开始演出了,并在更早就组成了乐队,他们第一张震撼唱片《Sgt.Pepers》(《佩帕军士》)在 1967年才发行。Samuel Johnson认为10年可能还不够,“任何领域的卓越成就只有靠穷极一生的努力来获得,别想用更少的代价就取得。”Chaucer感叹到“生命如此短暂,而要学的东西如此多。”

下面是我对如何在编程上取得成功的建议:

1,保持对编程的兴趣,感觉编程有乐趣。保证你在10年后都能够有乐趣。

2,和其他程序员交流,阅读其他人的程序,这比读书和培训重要得多。

3,写程序。最好的学习方法是边做边学。用更加学术的话来讲:“在一个给定的领域中,个人能力的提高并不会是自动的获得,就像经验一样的,把已有经验的延伸、扩展,而是需要通过特别有经验的人经过很大的努力来增长”。“而且对于特定的人,最有效的学习需要一个定义良好的、有一定难度的任务、该任务还要有丰富的信息反馈、有重复和纠正错误的机会。” 书《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》(《在实践中认识:心理,数学,和文化在人生中的每一天》)有趣的证明了这样的观点。

4,如果你愿意,花4年时间呆在大学里(或者在研究院呆更长的时间)。这会让你能得到那些需要学历的工作,并且会让你对这个领域有更深的理解。但是如果你不喜欢上学,你也可以(做一些贡献)在工作中得到类似的经验。无论如何,仅有书本知识是不够的。《The New Hacker’s Dictionary》(《新黑客字典》)作者Eric Raymond说,“计算机科学不像绘画,当学会了画笔和颜料技巧就能成为一个专业的画家,计算机科学教育不能让任何人成为专业的程序员。”。我雇佣过的最好的程序员之一就只有中学学历,但他写出了许多绝好的软件,拥有他自己的新闻组,并且因为享有股权比我有钱得多。

5,和其他程序员一起做项目。在一些项目中做最好的程序员,在其他的一些项目中做最糟糕的程序员。如果你是最好的程序员,就试着领导一个项目以提高你的能力,通过你的远见来激发其他人。如果你是差劲的程序员,就学习其他高手是如何做的,并且去做那些他们不喜欢做的部分(因为他们让你去给他们做这些部分)。

6,在其他程序员后面接手一个项目,因为需要你理解其他人写的程序是棘手的事情。看看在原作者不在的时候你如何理解和修改他们的代码。考虑如何设计你的程序能让接手你程序的人更容易理解。

7,至少学会6种计算机语言。包括一种支持class abstractions(比如Java和C++)的语言,一种支持functional abstraction(比如Lisp和ML)的语言,一种支持syntactic abstraction(比如Lisp)的语言,一种支持declarative specifications(比如Prolog和C++模板)的语言,一种支持coroutines(比如Icon和Schema)的语言,一种支持 parallelism(比如Sisal)的语言。

8,记住“计算机科学”中的“计算机”。搞懂你的计算机执行一个指令要多长时间,从内存中取一个字要多长时间(在Cache命中和没命中的情况下),从磁盘上读连续的字要多长时间,在磁盘上搜索一个新位置要多少时间。

9,参与制定一种语言标准。可以是ANSI C++委员会,也可以是把你周围人的几种编码风格统一起来,该采取几个字符缩进的锯齿状。不管是哪种,你都能弄懂其他人喜欢语言中的什么、有多喜欢、权衡他们为什么有这样的感觉。

10,对将要开始的语言标准化取得成功充满信心。

做到上面的这些,光靠书籍学习就能得到是值得怀疑的。我第一个孩子降生前,我几乎读了所有的“How To”系列的书,但是还是感觉像个菜无能的初学者。30个月后,等我第二个孩子降生后,我又把这些书都又复习一遍了吗?不,没有,我认识到靠我自己的个人经验要比那些专家写到上千页的书上的东西有用和可靠得多。

Fred Brooks在他的短文《No Silver Bullets》(没有银弹)中确立了如何发现杰出的软件设计师的三步规划:

1. 尽可能早的发现设计天才。

2. 指派一个职业生涯的导师为他的发展前景负责,并且仔细保持一份职业生涯的档案。

3. 为成长的设计师们提供机会,使他们相互激励和影响。

这样做的前提是这些人已经有发展成为伟大设计师所必备的潜质;这样的工作需要一直很有耐心。Alan Perlis更直接:“每个人都需要教雕琢:Michelangelo却被告诉什么不需要做,这个道理也同样适合于伟大的程序员。”前进一步,买这样的Java书;你会为它耗尽精力。但是你并没有改变你的生涯,你也不会在24小时、一天、几个月内成为卓越的程序员。

参考文献

Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Hayes, John R., Complete Problem Solver, Lawrence Erlbaum, 1989.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

答案

各种操作的计时,2001年夏天在一台典型的1GHz PC上完成:
执行单条指令            1 纳秒 = (1/1,000,000,000) 秒
从L1缓存中取一个word        2 纳秒
从主内存中取一个word        10 纳秒
从连续的磁盘位置中取一个word    200 纳秒
从新的磁盘位置中取一个word(寻址) 8,000,000纳秒 = 8毫秒

脚注

T. Capey指出Amazon上面《Complete Problem Solver》的页面中,《Teach Yourself Bengali in 21 days》 和《Teach Yourself Grammar and Style》被列在了“购买此书的顾客还买了以下书籍”栏目里面。 我猜其中一大部分察看这两本书的人都是从我这里过去的。

译本

日文(Yasushi Murakawa),中文(郭晓刚),繁体中文(Jason Chen), 西班牙文(Carlos Rueda),德文(Stefan Ram),法文(P. E. Allary)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值