黄小非译注:
本文作者 Peter Norvig 目前任职于 Google,其职位是研究主管(Director of Research). Peter Norvig 是享誉世界的计算机科学家和人工智能专家。
他是 AAAI 和 ACM 的会员,是业界内经典书籍《Artificial Intelligence: A Modern Approach 人工智能:一种现代方法》的作者之一。
在加入 Google 之前,他曾经是 NASA (美国航空航天局)计算科学部门的主要负责人,并在南加州大学以及伯克利大学任教。以下为译文。
英文原文:Teach Yourself Programming in Ten Years
随意步入一家书店,满目都是《7天搞定 Java 编程》这种速成书目,同样的书籍还包括 Visual Basic、Window 系统、Internet 互联网等等,它们都承诺在几天,甚至几小时之内就让你能够学会相关技术。我在亚马逊网站上做了如下的条件检索:
pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)
出版日期:1992年以后,题目关键字:“天”,“学会”或者“自学”
然后得到了 248 条搜索结果。头 78 条都是计算机类书籍(第 79 条记录是《30天学会孟加拉语》)。我将“天”关键字换成了“小时”,不出意外地搜索到了 253 条记录,其中头 77 条记录是计算机书籍,第 78 条的搜索记录是《24小时语法和样式自学手册》。在总共搜索到的头 200 条记录中,有 96% 是计算机书籍。
从上面的搜索结果可以看出来,要么就是人们对计算机技术的学习如饥似渴,要么就是计算机技术实在太简单,不费吹灰之力就能学会。相比于计算机技术书籍的如此“速成”,在其他领域的书籍里,你却很难找到诸如:“三天学会贝多芬”,或者“五天搞定量子力学”,这种速成教材,甚至连《狗狗喂养手册》这种宠物指南,都鲜有“几天搞定”的说法。Felleisenet al.在他们的著作《如何设计程序》一书中明确指出了这种“速成”的趋势,并评论到:“垃圾的编程技术当然非常容易,傻子都能在 21 天之内学会,哪怕他天生就是个白痴。”
让我们来仔细看看《3天学会C++》这种速成教材实际上意味着什么:
peter norvig
研究人员(Bloom (1985)、 Bryan & Harter (1899,见文后参考书目)、Hayes (1989)、Simmon & Chase (1973,见文后参考书目) 的一系列调查研究显示,在各个领域内,要想获得专业级别的水平,大约需要 10 年时间的努力。参与此项调查的领域包括:国际象棋,作曲,发报,绘画,钢琴演奏,游泳,网球等。科学家们从神经心理学和拓扑学的角度对这些领域进行研究,并得出结论。若要在某一领域内达到专家级的水平,其关键在于“审慎地重复”,也就是说,并非是机械地,一遍又一遍地练习,而是要不断地挑战自我,试图超越自身当前的水平,通过不断的尝试挑战,并在尝试的过程中和尝试之后对自身的表现进行分析和总结,吸取经验,纠正之前犯过的各种错误。把这一“审慎”的过程不断重复,才能取得成功。
所谓的“捷径”是不存在的,即使对于莫扎特这种天才来说,也没有捷径可走,尽管 4 岁就开始作曲,可是他也花了 13 年的时间,才真正地写出了世界级的作品。再举一个例子,甲壳虫乐队(The Beatles),他们似乎在 1964 年凭借一系列热门单曲和其在艾德沙利文秀(The Ed Sullivan show)上的演出一炮而红,但是你也许不知道,他们早在 1957 年就在利物浦和汉堡两地进行小规模演出了,而在此之前的非正式演出更是不计其数。甲壳虫乐队的主要成名曲《Sgt. Peppers》,则是 1967 年才发行的。Malcolm Gladwell 公布了他对柏林音乐学院所作的一项研究的报告,该研究对比了一个班里的学习成绩为上、中下三个档次的学生,并逐一询问他们进行音乐练习的时间
这三个档次中的所有人,大约都是在 5 岁的时候开始练习音乐的,一开始的时候大家练习音乐的时间都差不多,大约一周 2 到 3 小时。但是到了八岁左右,大家的区别就开始体现了。后来成为班里最好的那一部分学生开始比别的学生练习得更多,大概每周 6 到 9 小时,12岁的时候每周 8 小时,14岁的时候每周 16 小时,往后则越来越多,直到 20 岁左右,他们每周练习音乐的时间已经超过 30 小时了。在 20 岁的年纪,那些精英级别的演奏家们都有累计超过 10000 小时的音乐练习时间。相比之下,仅有部分优等生能达到 8000 小时的累计练习时间,而那些音乐教师级别的学生,他们的累计练习时间只有 4000 小时左右。
所以,也许这个让你能达到专业等级的神奇时间应该是 10000 小时,而不是 10 年。(Henri Cartier-Bresson (1908-2004)说过,“(作为摄影师),你所拍摄的头 10000 张照片都是垃圾”,但即使是垃圾作品,他拍一张照片也要花接近一小时。)Samuel Johnson (1709-1784)认为这个时间应该更长:“在任何一个领域要想做到极好,势必穷尽一生的精力,否则根本无法企及。” Chaucer (1340-1400)也发出过“生命如此短暂,技能如此高深”的感叹。Hippocrates (c. 400BC)因写下了如下的句子而被人称颂:“ars longa, vita brevis”,该句是来自于一个更长的引用:”Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, 这段话翻译成英语就是:“生命很短暂,但是技艺却很高深,机遇转瞬即逝,探索难以捉摸,抉择困难重重”。这段话是用拉丁文写的。在拉丁文里,ars 可以翻译为“技艺”或者“艺术”,但是在古希腊文里,ars 只能做“技能”的意思,而没有“艺术”的意思。
下面是我列举的程序员成功“食谱”
要掌握上面所说的所有内容,光靠看书学习应该是很难做到的。当我的第一个孩子出生的时候,我几乎阅读了市面上所有的《如何…》指南书籍,但是我读完了以后还是觉得自己是个菜鸟。30个月以后,我的第二个孩子快出生时,我难道还要做一个书虫么?不!相反,我此时更依赖我的个人经验,这些经验相比于那些上千页的书籍,则更加有效和让我放心。
Fred Brooks 所著的著名的论文《No Silver Bullets 没有银弹》里向我们揭示了发现和培养软件设计人才的三步骤:
1. 有组织地辨认顶尖的软件设计人才,越早越好(尽早系统的确定一批顶级设计者队伍。)
2. 安排一个职业导师,为其职业前景指点迷津,并谨慎对待自己的职业履历。(指派一个业务主管来负责前景的发展以及确保职业规划。)
3. 为成长中的设计师们提供机会,让他们能够互相激发促进。(为增进设计师们的互相影响与激励提供足够的机会。)
即使一部分人已经具备了成为优秀软件设计人员的潜质,也需要经历工作的慢慢琢磨,方可展现才华。Alan Perlis 则说得更加直接:“任何人都可以被‘教’成一个雕塑匠,但米开朗基罗则被‘教’如何不要成为一个雕塑匠,因为他要做的是雕塑大师,。这个道理放到编程大师身上同样管用。”Perlis 认为,伟大的软件开发人员都有一种内在的特质,这种特质往往比他们所接受的训练更重要。但是这些特质是从哪里来的呢?是与生俱来的?还是通过后天勤奋而来?正如 Auguste Gusteau(动画电影《料理鼠王》里的幻象大厨)所说,“谁都能做饭,但只有那些无所畏惧的人才能成为大厨!”我很情愿地说,将你生命中的大部分时间花在审慎地练习和提高上,这很重要!但是“无所畏惧”的精神,才是将促使这些练习成果凝聚成形的途径。或者,就像是《料理鼠王》里那个与 Gusteau 作对的刻薄的美食评论家 Anton Ego 说的那样:“不是任何人都能成为伟大的艺术家,不过,伟大的艺术家在成名前可能是任何人。”
所以尽管去书店大买 Java/Ruby/Javascript/PHP 书籍吧;你也许会发现他们真的挺管用。但是这样做不会改变你的人生,也不会让你在整体经验上有什么提高。24小时,几天,几周,做一个真正的程序员?光靠读书可读不出来。你尝试过连续 24 个月不懈努力提高自己么?呵呵,如果你做到了,好吧,那么你开始上路了……
典型 PC 系统各种操作指令的大概时间
execute typical instruction 执行基本指令 |
1/1,000,000,000 sec = 1 nanosec |
fetch from L1 cache memory 从一级缓存中读取数据 |
0. 5 nanosec |
branch misprediction 分支误预测 |
5 nanosec |
fetch from L2 cache memory 从二级缓存获取数据 |
7 nanosec |
Mutex lock/unlock 互斥加锁/解锁 |
25 nanosec |
fetch from main memory 从主内存获取数据 |
100 nanosec |
send 2K bytes over 1Gbps network 通过 1G bps 的网络发送 2K 字节 |
20,000 nanosec |
read 1MB sequentially from memory 从内存中顺序读取 1MB 数据 |
250,000 nanosec |
fetch from new disk location (seek) 从新的磁盘位置获取数据(随机读取) |
8,000,000 nanosec |
read 1MB sequentially from disk 从磁盘中顺序读取 1MB 数据 |
20,000,000 nanosec |
send packet US to Europe and back 从美国发送一个报文包到欧洲再返回 |
150 milliseconds = 150,000,000 nanosec |
很多人曾经问过我,他们应该选择什么编程语言作为入门之用?我想这个问题很难有一个确切的答案,但是下面几点可以用来作为选择的参考。
基于上述的观点,我所推荐的编程入门语言应该是 Phyton 或者 Scheme. 但是读者自身的环境是非常复杂多变的,所以你们也许会其他更好的选择。如果你的年龄还不到两位数,那么你们应该考虑 Alice 语言或者 Squeak 语言(很多成年的初学者也认为他们很有趣)。当然,做出选择并开始行动,这个最重要。
备注 黄小非译注
T. Capey 指出,Amazon 网页上那个 Complete Problem Solver (完全问题求解)页面把《21天搞定孟加拉语》以及《21天学会语法》这两本书移到了“购买此书的用户还购买过这些产品”这个区域内。我估计大部分人就是从这个区域看到这本书的。感谢 Ross Cohen 的帮助。
英文原文:Peter Norvig 编译:伯乐在线 –黄小非