翻译:杨彪 原作者:Peter Norvig 原文链接:Teach Yourself Programming in Ten Years
为什么每个人都如此的匆忙?
走进任何一家书店,你都会看到类似七天学会JAVA程序设计、几小时或者几天学会Visual Basic, Windows, Internet等书籍。我在亚马逊网上书城尝试了如下搜索:
出版日期:1992年之后 和 标题包含:天 和 (标题包含:学习 或 标题包含:自学)
最后得到248个返回结果,其中排在前面的78本书都是计算机书籍(第79本是《三十天学会孟加拉语》)。如果我把搜索条件中的“天”替换成“小时”,也能得到惊人相似的返回结果:总共超过253本书符合条件,其中前面77本都是计算机书籍,第78本是《二十四小时自学语法和风格》。在前200个结果中,有96%是计算机书籍。
从上可得出的推论就是:要么人们都想急切的学会计算机编程,要么学习计算机编程比学习其他东西更加容易。我们的书店里面并没有几天学会贝多芬、几天学会量子物理等书籍,甚至连几天学会宠物美容的书籍都没有。在《程序设计方法》这本书中,傅雷森直言不讳的说“编写糟糕的程序并不是什么难事,即使笨蛋也可以在21天内学会“,也是对人们这种浮躁心理的认同。
如果一本书叫三天学会C++,我们来分析一下这意味着什么:
十年学会程序设计
有研究者表明在任何领域大部分人需要大概十年时间的持续学习才能达到专家级水准,包括下棋、音乐创作、电报操作、绘画、弹钢琴、游泳、网球,还有神经心理学研究和拓扑学研究等领域。其中的要点就是刻意的练习:不仅仅是反反复复的练习,而且需要不断挑战自我,尝试更难的任务、分析完成的情况、修正出现的错误。然后不断地重复这个过程。这看起来没有任何捷径:即使是莫扎特——四岁时就开始展现出惊人的音乐天赋,也是通过13多年的练习之后才开始创作世界级的音乐。另外一个例子,在1964年,披头士乐队好像突然就走进大众的视野火了起来,发行了非常叫卖的唱片并且出现在埃德·沙利文的电视节目中。你要知道的是,自从1957年以来他们就开始在利物浦和汉堡的小酒吧里面驻唱;而在取得大规模的影响力之后,直到1967年,他们发行了Sgt. Pepper专辑后才取得真正意义上的成功。马尔科姆·格拉德威尔曾经对柏林音乐学院的学生做过研究,他统计了学生们过去在音乐学习上花的时间,然后分别对表现优异、中等和一般的三类学生做了比较:
在这三组中,每个人几乎都在相同的年龄开始练习演奏——大约5岁左右。在刚开始的前几年中,每个人的练习总时间都差不多——每周两到三个小时左右。但是在八岁左右时,他们之间开始出现了差异。那些优秀的学生开始比其他学生练习更长的时间:九岁时每周六小时,12岁时每周八小时,14岁时每周16小时,越来越多,直到20岁时他们每周练习时间已经超过30个小时。到20岁时,那些一流演奏者的练习时间总计超过10000个小时。相比之下,表现良好学生总计用了8000个小时,而那些未来的音乐教师仅仅只是超过4000个小时。
看起来10000个小时可能就是那个神奇的时间点,而不是前面说的10年。(摄影师亨利·卡蒂尔·布雷松曾说过”你的前10000张照片都是废片“,不过他每个小时按快门次数肯定不止一次)。塞缪尔·约翰逊(1709-1784)则认为需要更长的时间:”任何领域都需要一生的不懈努力才能做到出类拔萃,而不是随随便便就能成功“。还有作家杰弗里·乔叟(1340-1400)也曾说过”生命如此短暂,而学习技能又如此的缓慢“。古希腊医学之父希波克拉底(约公元前400年)有一句非常著名的语录——”ars longa, vita brevis“,它是这个长句的一部分——”Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, 中文翻译过来就是这样的:“人生苦短,学艺艰辛,时光飞逝,世多歧路,难以抉择”。尽管在拉丁语中,ars也可以指艺术(art)或者技能(craft),但是在古希腊语中thechne这个词指的是技能(skill),而不是艺术(art)。
如果你想成为一个程序员
下面是我对学好程序设计的一些体会:
了解到这些之后,你觉得仅仅通过书本的学习能在编程之路上走多远?在我第一个孩子出生之前,我阅读了所有How to的编程技术书籍,但感觉还像个什么都不会的新手。30个月之后——当我第二个孩子来到了这个世上时,我并没有回去重新复习这些书。取而代之的是,我凭着个人经验不断去实践——最后证明远比那些书籍更有用,才打消了之前对自己编程上的很多疑问。
在《没有银弹》这本书中,佛瑞德·布鲁克斯提出了如何培养优秀软件设计师的三步计划
以上假设这些人已经具有了成为优秀软件设计师必要品质,接下来你只要引导他们走上正轨。艾伦·佩利则说的更加直白:“你可以教任何人如何雕塑,但米开朗基罗就用不着教。对伟大的程序员也是如此”。佩利的意思是说优秀的人具有一些内在品质,而这些品质是培训或教育所不能给予的。那么这些品质从何而来?与生俱来的吗?还是通过后天的勤奋发展起来的?Auguste Gusteau(电影料理鼠王的主角)把它归结为对未知的无所畏惧,“每个人都能烹饪,只有那些无畏的人才能成为大厨师”。而我认为这更多是把一生的大部分时间奉献给勤奋实践的这种意愿。但这可能也可以总结成对未知的无畏。或者,就像Gusteau的批评者,Anton Ego说的:“并不是每个人都可以成为伟大的艺术家,但是一个伟大的艺术家可能来自任何地方”。
所以,不要犹豫去买Java/Ruby/Javascript/PHP的书籍,你有可能会从中学到很多东西。但如果你不想改变你的生活,或者不想为了多学点程序设计的专业知识,而花上24小时、数天、或者数周。那么如何做到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.
Bryan, W.L. & Harter, N. “Studies on the telegraphic language: The acquisition of a hierarchy of habits. Psychology Review, 1899, 8, 345-375
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Chase, William G. & Simon, Herbert A. “Perception in Chess” Cognitive Psychology, 1973, 4, 55-81.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life , Cambridge University Press, 1988.
参考答案
一台典型的PC上各种操作的大概时间:
执行一条指令(大部分) 1/1,000,000,000秒 = 1纳秒
从L1缓存去数据或指令 0.5纳秒
分支预测失败 5纳秒
从L2缓存去数据或指令 7纳秒
互斥锁/解锁 25纳秒
从内存从取数据或指令 100纳秒
通过1Gbps网络发送2KB数据 20,000纳秒
从内存读取1MB的连续数据块 250,000纳秒
从磁盘的新位置获取数据 8,000,000纳秒
从磁盘读取1MB的连续数据块 20,000,000纳秒
从美国发送一个数据包到欧洲并返回 150毫秒 = 150,000,000纳秒
附录:语言选择
好几个人曾问过我他们应该从哪门语言入手开始学习编程。这个问题没有统一的答案,不过你可以参考以下这几点:
有了这些准则后,我推荐初学者使用Python或Scheme作为学习编程的第一门语言。但是每个人的背景可能大不相同,所以也应该有其他很多的选择。如果你只有十几岁的话,你可能更加喜欢Alici或者Squeak(大点的初学者也可能会喜欢)。最重要的是,选择一门语言,然后努力开始学习。
附录:书籍和一些资源
一些人问我他们应该从哪些书籍或者网页开始学习。虽然反复强调“书本的学习远远不够”,但我还是可以推荐下面这些资料:
(译注:基于2007年更新的版本翻译,有几处难以理解的地方参考了徐宥老版本翻译)