作者:Peter Norvig
译者:刘海粟
本文原文为:http://norvig.com/21-days.html
该翻译文档的PDF版可以在这里获得:http://download.csdn.net/source/2983778
为何万事都如此仓促?
随便走进一家书店,你就能看到《7天学会Java》以及各种万变不离其宗的书籍,形如:在数天或是数小时内学会Visual Basic、Windows系统、互联网等等。我在亚马逊 做了个高级搜索 :
pubdate: after 1992 and title: days and
(title: learn or title: teach yourself) [1]
共得到了248个结果。前78个是计算机类图书(第79个是《30天学会孟加拉语 》)。我把搜索中的“days (天)”替换成“hours (小时)”,结果得到了一个相似度惊人的结果:253本书中,前77本都是计算机类图书,紧随其后的第78本是《24小时内教会自己语法与格调 》。而在200名之后,有96%是计算机类图书。
由此可见:要么是人们都在急匆匆的学习计算机,要么就是出于某种原因计算机比其他任何东西都要好学。而没有一本书是关于如何在数日之内学会贝多芬或是量子力学甚至是狗的饲养的。Felleisen等人在《如何设计程序 》中也指出了这一趋势,他们说:“糟糕的编程非常简单,蠢货都能在21天的时间内学会,即便他们就是根木头都可以!”
让我们来分析一下诸如《三天内学会C++ 》这样的标题意味着什么:
用十年教会自己编程
研究员们(Bloom (1985) , Bryan & Harter (1899) , Hayes (1989) , Simmon & Chase (1973) )已经指出在许多领域中想达到精通都需要花费十年左右的时间,这其中包括国际象棋、音乐创作、电报操作、绘画、钢琴演奏、游泳、网球以及对神经心理学或是拓扑学的研究。关键在于用心去练习:并非仅仅是一遍又一遍的单纯重复,而是要去挑战一个刚好高于你目前水平的目标。去尝试,并在做的时候以及完成后分析自己的表现,指出所有的错误。之后重复,再重复……这没有捷径:甚至是莫扎特——4岁时他就是个音乐神童了,但一样是用了13年的时间才创作出世界级的音乐。另一个例子,虽然看上去甲壳虫乐队是在1964年的埃德·沙利文秀上一夜走红的,但其实他们早在1957年就开始在利物浦和汉堡的小俱乐部中演出了,而且虽然很早就受到大众的青睐,但他们第一次重要的成功却是1967年发行的专辑——《Sgt. Peppers》。Malcolm Gladwell 公布了一份关于柏林音乐学院学生的研究报告,比较了优等、中等和后进的三类学生并为他们制定了练习时间:
三组 人从几乎相同的年龄开始练习演奏——大约五岁左右。起初的几年中,每个人都练习几乎相同的时间——每周2到3个小时。但到了八岁左右的时候,真正的差距开 始出现了。那些班中最优秀的学生的练习量开始超过其他人:九岁时达到每周6小时,十二岁时每周8小时,十四岁时每周16小时,越来越多。到了二十岁的时 候,他们每周的练习时间超过了30小时。二十岁时,在精英演奏者的人生历程中共计练习了10,000小时。相较之下,仅仅是好学生的练习时间只有 8,000小时,而未来的音乐教师仅有4,000小时的练习。 |
出于以上经验,我很怀疑你能从书本中学到多少。在我第一个孩子出生前,我读了所有的指南书籍,但依然感到茫然无措。30个月之后,当我第二个孩子出生的时候,我还需要回去复习那些书籍么?不,这次完全凭借我的个人经验了。这对我来说显然比专家们写的数千页的纸张更有效果。
Fred Brooks,在他的文章《没有银弹 》中指出了寻找一位伟大的程序设计者的三个步骤:
这样做的前提是已经假定了某人具有一个伟大设计者所应有的素质,他要做的只是去引导其他人的前进。Alan Perlis 将这些变得更加简洁:“每个人都能学会雕塑:米开朗基罗这样的人反倒需要学习如何不去雕塑。伟大的程序员也是如此。”
所以,尽管去买那本Java的教程吧。或许你能从中学到些什么,但你不会因此改变人生,也不会在24小时、24天甚至是24个月之后成为一个真正的程序员。
参考文献:
Bloom, Benjamin (编)《在年轻人中培养人才 》, 百龄坛, 1985.
Brooks, Fred, 《没有银弹 》, IEEE计算机, vol. 20, no. 4, 1987, p. 10-19.
Bryan, W.L.和Harter, N.《电报语言研究:一种习惯上的收获》, 心理学回顾, 1899, 8, 345-375
Hayes, John R., 《完全问题求解 》, Lawrence Erlbaum, 1989.
Chase, William G.和Simon, Herbert A.《国际象棋的感知 》, 认知心理学, 1973, 4, 55-81
Lave, Jean, 《实践中认知:日常生活中的思想,数学与文化 》, 剑桥大学出版社, 1988.
答案:
在典型PC机上各种操作的近似时间:
执行典型指令 |
1/1,000,000,000 秒 =1 纳秒 |
从一级缓存中读取数据 |
0.5 纳秒 |
分支预测错误 |
5 纳秒 |
从二级缓存中读取数据 |
7 纳秒 |
互斥锁定 / 解锁 |
25 纳秒 |
从主存储器中读取数据 |
100 纳秒 |
在 1Gbps 的网络中发送 2KB 数据 |
20,000 纳秒 |
从内存中读取 1MB 数据 |
250,000 纳秒 |
从新的磁盘位置读取数据 ( 寻轨 ) |
8,000,000 纳秒 |
从磁盘中读取 1MB 数据 |
20,000,000 纳秒 |
在美国向欧洲发包并返回 |
150 毫秒 =150,000,000 纳秒 |
给出以上这些准则,我建议首先学习的语言是Python 或Scheme 。但你自身的情况可能有所不同,所以还有很多其他不错的选择。如果你的年龄是个位数,你可能更喜欢Alice 或Squeak (年长一些的学习者可能也会喜欢这些)。重点在于——你选择并且你开始。
附录:书籍与其他资源
常有人问有哪些书籍或网站可以学习。我重申“仅仅看书是绝对不够的”,但我可以推荐以下这些:
作者注释:
T. Capey指出,亚马逊网站上《完全问题求解 》一书的页面中,“购买此商品的顾客也同时购买”一项里已经出现了《30天学会孟加拉语》和《24小时内教会自己语法与格调》。我猜这其中大部分的人是从此文中看到那些书的。感谢Ross Cohen在Hippocrates问题上对我的帮助。
译者注释:
[1]意为:出版日期在1992年之后,题目中含有“天”并同时含有“学习”或“自学”。 返回>>
[2]原文中为“in English”,是把之前的拉丁文翻译为英文。因为本文是翻译稿,所以直接说成中文。 返回>>
[3]指Jamie Zawinski——XEmacs和Netscape Navigator的创始人。