程序员的十年之功(经典文章翻译)

程序员的十年之功

原文链接: Teach Yourself Programming in Ten Years
原文作者:Peter Norvig

为什么大家都如此急于求成?

走进任何一家书店,你都会看到教你如何在24小时内自学Java的书,还有许多无止境的类似于教你在几天甚至几个小时内自学C、SQL、Ruby、算法等科目的书。亚马逊公司对自2000年以来,对所有搜索的关键字为“自学”、“小时”的记录进行了高级搜索,并找到了512本书,在这个榜单的前十名中,有9本书是编程书(另一本是关于簿记的)。替换掉“自学”为“学习”,“小时”替换为“天”后,也获得了相似的结果。

结论是,人们要么就是急于学习编程,要么就是学编程这件事比学习其他东西要更简单。Felleisen等人在他们的书《How to Design Programs(程序设计方法)》中对这一趋势表示赞同,他们表示“写出糟糕的程序很容易,即使是傻瓜也可以在21天内学会”。Abtruse Goose(国外一个另类漫画网站)也对此表达了他们类似的想法。

让我们来分析一下,当一本书的标题为《24小时内自学C++》这意味着什么:

- 自学:
在24小时内你将没有足够的时间去编写一些重要的程序,然后从你成功和失败的经验里汲取教训。你将没有时间去和一个有经验的程序员共事,去体会一下在C++环境中生活的感受。简而言之,你将没有时间去学习很多东西。所以这本书只能谈一些肤浅的了解,而不是一种深刻的感受。正如Alexander Pope说的那样,“拥有一点点学问是很危险的事”。
Alexander Pope(亚历山大·波普)

- C++:
在24小时内你可能能够学习一些C++的语法(如果你已经学过另一种语言的话),但是你不能学到很多关于如何去使用这门语言的知识。举个栗子,如果你是一个Basic程序员,你能够学到如何用C++语法去编写Basic风格的程序,但是这样你就不知道C++语法这么做的好处(和坏处)在哪。所以这有什么意义呢?Alan Perlis曾经说,“一个不能影响你思考编程方式的语言,是不值得学习的”。你看这种书的一个可能的原因是,你不得不学一点C++(或者是JavaScript或Processing)去和现有的工具接口一起完成一个特定的任务。但是此时你就不是在学习如何编程,而是在学习如何完成任务。

- 在24小时内:
很不幸,正如下一节所示,这点时间完全不够。

程序员的十年之功

一些研究人员(Bloom(1985年)、BryanHarter(1899年)、Hayes(1989年)、SimmonChase(1973年))已经表明,在任何一个广泛的领域里,如国际象棋、音乐制作、电报操作、绘画、钢琴演奏、游泳、网球以及神经心理学和拓扑学的研究中,人们都需要大约十年的时间来发展专业知识。其中的关键就是经过深思熟虑的练习:这不只是一次又一次重复的练习,而是用一个超出你目前能力的任务来挑战自己,尝试完成它,在做的过程中和做完之后去分析你的表现,及时纠正任何错误,然后重复,再重复。

这似乎没有真正的捷径可言——就连4岁的音乐天才莫扎特也花了13年时间才开始创作世界级的音乐作品。同样地,在另一个流派中,披头士乐队似乎以一串一首的热门歌曲以及在1964年的Ed Sullivan的节目中崭露头角。但他们从1957年起就在为Liverpool and Hamburg的小俱乐部效力了。即使他们很早就在大众中有足够的吸引力,但他们的第一个重大成功,《Sgt. Peppers(佩珀斯中士)》,是在1967年发行的。

Malcolm Gladwell也推广了这个想法,尽管他认可的说法是10000小时,而不是10年。Henri Cartier-Bresson(1908-2004)有另一个衡量标准:“你拍的前10000张照片是你最差的照片。”(他没有意识到有些人拥有数码相机,这些人在一周内就能达到这个标准。)真正的专业知识可能需要花费一辈子的时间去习得:Samuel Johnson(1709-1784)说:“任何一个优秀的部门都只能通过部员们一生的努力去获得,而不是以一个较低的价格购买到。” Chaucer(1340-1400)也抱怨道:“人生很短,但是技术需要花很长的时间去学习。”

希波克拉底(公元前400年)有一段著名的话:“生命短暂,艺术长远(大意)”,这是一段较长的话的一部分,原文是拉丁文的“Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”,翻译成中文就是“生命短暂,艺术长远,机会稍纵即逝,经历变化莫测,抉择困难重重。”
希波克拉底

当然,最终答案并不是一个具体单一的数字:假设所有技术(如编程,下棋和演奏)都需要一个确切且相同的时间来完全掌握,这肯定是很不合理的,而且就一门技术而言,也不是所有人所需的学习时间是完全相同的。正如K. Anders Ericsson教授所言,“在大多数领域里,我们所要关注的是那些最有天赋的人需要多少时间去达到最高的水平。10000小时的说法只是为了给你一种主观的感受,实际上我们说的是那些最有天赋的人要想达到最高的水平,仍然需要每周花费10-20小时来学习,并且年年如此。”

你想成为一名程序员吗?

以下是我在编程方面获得成功的秘诀:

对编程保持兴趣,然后你就会因为获得乐趣而去做一些编程方面的事。并且确保你对编程能保持足够的兴趣,这样你才会乐于在这方面花费你的10年时间(或是10000小时)。

去动手编程,最佳的学习方法就是实践。正如《实践中的认知:日常生活中的思维、数学和文化》这本书中提出的一些有趣的说法,“一个人要想在某个领域获得的最高水平并不是随着经验的增长而自动达到的,即使是最有经验的人也可以通过更努力的实践去提升他的专业水平。”(第366页)和“最有用的学习方式需要一个明确的任务,且这个任务对学习者有一定的难度,此外还需要及时的学习反馈,以及重复练习和反复纠错的机会。”(第20-21页)

与其他程序员交流;去阅读别人写的程序。这比读那些编程书和训练课程重要得多。
编程

如果你想的话,可以去大学里度过4年的时间(或者去研究院)。这样的话你就可以胜任一些要求拥有学历证书的工作了,这将使你在这个领域获得更深的理解,但是如果你不喜欢上学,你也可以带着一些奉献精神去自学或通过工作的方式获得同样的经验。无论如何,光从书本上获取知识是远远不够的。“计算机科学教育不能使一个人成为程序员专家,就好像学习画笔和颜料的使用不能使人成为一个出色的画家一样。” 《The New Hacker’s Dictionary(黑客辞典)》的作者Eric Raymond如是说。

我曾雇佣过的最出色的程序员之一仅有高中的学历,但是他创造了很多很棒的软件,他有他自己的新闻组,并且他赚取了足够的股票期权去买下了他自己的夜总会。

和其他程序员一起完成项目。在一些项目中尝试去成为最好的程序员;在另一些项目中做一名最差劲的程序员。当你是项目里最厉害的人时,你就可以测试你领导团队的能力,然后用你的愿景去激励其他成员。当你是组里最烂的程序员时,你能够了解到那些大师们在做什么,以及他们最不愿意做什么(因为他们会让你去做这些事)。

去尝试维护其他程序员的工作。去理解其他人写的程序。看看当原作者不在的时候,你将如何去理解和维护代码。然后再去想想如何设计一个让后来者更容易去维护的程序。

至少学习6种编程语言,其中包括一门强调类抽象的语言(如Java或C++),一门强调函数抽象的语言(如Lisp、ML或Haskell),一门支持声明性规范的语言(如Prolog或C++模板),以及一门强调并行性的语言(如Clojure或Go)。

记住“计算机科学”中有一个“计算机”。了解你的计算机去执行一条指令、从内存中获得一个单词(有没有缓存丢失)、从磁盘中获取一个单词以及查找磁盘上的新位置所需要的时间是多少。

参与语言标准化工作。它可能是ANSI C++委员会,它或者可以决定你的本地编码风格是有2个还是4个空格的缩进。不管是哪种方式,你都可以了解到其他人对一种语言的喜好,他们对此的感受有多深,甚至可以了解一点他们为什么会有这样的感受。

拥有足够的判断能力去尽早脱离语言标准化工作

考虑到以上这些,对于你仅通过书本学习能够走多远这点是很值得怀疑的。在我的第一个孩子出生之前,我阅读了所有关于“怎么做”的书,然后还是觉得自己是一个一无所知的新手,过了30个月,当我的第二个孩子出生后,我有没有回到书本上去复习?没有。相反,我依靠的是我个人的经验,事实证明,这比读专家们写的几千页的书有用的多,也更令我放心。

Fred Brooks在他的书《没有银弹》中提出了一个由三部分组成的寻找优秀软件设计师的计划:

1. 尽早系统地确定顶尖的设计师;
2. 指派职业导师负责潜在客户的发展,并认真保存职业档案;
3. 为成长中的设计师们提供互相交流和互相激励的机会。

《没有银弹》

这就假设这些人已经具备了成为一个伟大设计师所必需的素质,领导者要做的是适当地引导他们前进。

Alan Perlis对此说的更简洁:“每个人都可以像被雕刻一样地去教导:而对米开朗基罗来说,他反而必须得学会如何不去雕刻。所以,这是伟大的程序员们的事”。他说,伟大的人之所以伟大,是因为他们有一些超越了他们所做的事之外的内在品质

但是这些品质来自于哪里?难道是天生的?或者是他们通过勤奋获得的?正如Auguste Gusteau(来自Ratatouille(电影:美食总动员)中的虚构厨师)所说的,“任何人都可以做饭,但只有无畏者才能做得很出色。”我认为,这更像是一位愿意将他一生中的大部分时间投入到实践中的人。无畏或许是优秀品质的获得方法。或者,正如他的批评家Anton Ego所说:“不是每个人都能成为一个伟大的艺术家,但一个伟大的艺术家可以来自任何地方。”

所以,假如你继续买一本Java/Ruby/Javascript/PHP书,你可能会从中获得一些用处。但是这并不会改变你的生活,因为你作为程序员,真正的专业知识必然不能够在24小时或21天内得到

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值