13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

Peter Norvig:自学编程,十年磨一剑

黄小非译注:本文作者Peter Norvig目前任职于Google,其职位是研究主管(Director of Research). Peter Norvig是享誉世界的计算机科学家和人工智能专家。他是 AAAI 和 ACM 的会员,是业界内经典书籍《Artificial Intelligence: A Modern Approach | 人工智能:一种现代方法》的作者之一。在加入Google之前,他曾经是NASA(美国航空航天局)计算科学部门的主要负责人,并在南加州大学以及伯克利大学任教。以下为译文。

你们着什么急?

随意步入一家书店,满目都是《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%是计算机书籍。

从上面的搜索结果可以看出来,要么就是人们对计算机技术的学习如饥似渴,要么就是计算机技术实在太简单,不费吹灰之力就能学会。相比于计算机技术书籍的如此“速成”,在其他领域的书籍里,你却很难找到诸如:“三天学会贝多芬”,或者“五天搞定量子力学”,这种速成教材,甚至连《狗狗喂养手册》这种宠物指南,都鲜有“几天搞定”的说法。Felleisen et al.在他们的著作《如何设计程序》一书中明确指出了这种“速成”的趋势,并评论到:“垃圾的编程技术当然非常容易,***都能在21天之内学会,哪怕他天生就是个白痴。”

让我们来仔细看看《3天学会C++》这种速成教材实际上意味着什么:

●学会:在3天时间里你几乎没有时间去写任何有意义的程序,就更不要谈什么从编程中获得经验和教训这种事情了。你也不可能有时间和有经验的程序员一起工作和交流,也不会体验到在真正的C++环境下工作是什么感觉。长话短说吧,你就是没时间,也学不到什么。所以这种书籍最多也就让你有个粗浅的印象,但是绝对不可能有深入的理解。就像亚历山大教皇说的那样,“浅尝辄止是很危险的”。

●C++: 如果你有其他编程语言的基础,那么3天之内你也许可以学到C++的一些语法,但即使是这样,你还是无法了解如何使用该语言编程。简言之,如果你之前是一个Basic程序员,那么经过3天的学习,你会成为一个“能使用C++语法编写Basic风格程序的程序员”,不过这样是没法发挥出C++语言本身的优势的(说句不好听的,你连怎么犯C++的典型错误都不会)。仅仅知道一点语法意味着什么呢?Allan Perlis曾经说过:“一个无法改变你思维方式的编程语言是不值得学习的。”;另一种可能性是,你可以只学一点点C++知识(类似的,或者一点点JavaScript,或者一点点Flex Script),然后就可以利用现有的工具制作应用接口,完成特定的编程任务了。但是这样的行为并不意味着你“会”编程了,你只是会使用这个工具完成任务而已。

●3天:很不幸,3天是远远不够的,往下看你就知道了。

[[93531]] 
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个月不懈努力提高自己么?呵呵,如果你做到了,好吧,那么你开始上路了……

参考书目

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., The 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系统各种操作指令的大概时间

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的帮助。

***插播一张漫画:《21天自学C++》

英文原文:Peter Norvig

译文链接:http://blog.jobbole.com/22905/


分享标题:Peter Norvig:自学编程,十年磨一剑
标题路径:http://cdbrznjsb.com/article/cdcgsie.html

其他资讯

让你的专属顾问为你服务