# 十年学会编程

作者:Peter NorviG,翻译:Hector

这篇文章已经有很多人翻译过了,包括很多大神,因为首先是我们觉得这文章真的很好,值得反复体会,其次,想给自我一些警示,因为技术的道路很漫长,不应该急于求成。

# Why is everyone in such a rush?

为何每个人都急于求成?

随便走进一家书店,都会看到类似《24小时学会Java》这样的书,旁边摆着的是大量诸如在几天,几小时之内学会C语言、SQL、Ruby以及算法这样的书。

如果使用Amazon上的高级搜索,搜索以下关键字来搜索:

title: teach, yourself, hours, since: 2000

将会返回512本书。最靠前的10本书中,有9本是编程的书(唯一的例外是一本记账的书)。如果把关键字"teach yourself"替换成"learn",或者将"hours"替换成"days",返回的结果大同小异。

很明显,人们在学习编程的时候喜欢大跃进,或者认为编程比起其它事情来,是小菜一碟的事。Felleisen在他的《How to Design Program》里说:"编写烂程序一点也不难。傻瓜也可以在21天内学会,即使他们是傻瓜。"在搞笑漫画网站Abtruse Goose也在这个漫画中表达了同样的看法。

我们来看看类似《24小时自学C++》这种标题党,到底说的什么鬼东西:

  • 自学:24小时之内,你没有时间写几个有意义的程序,也就无法从成功或失败中学到经验。24小时之内,你没有时间和一个有经验的程序员合作交流,也就无法理解使用C++编程的真实场景。简单来说,时间太短,你啥也学不到。因此,有这种干货标题的速成书,只是让你走马观花的瞧一下,绝非深入的理解。18世纪的英国诗人亚历山大·蒲柏曾说过:一知半解最危险。

    这里看过一些一知半解的翻译将亚历山大·蒲柏翻译为亚历山大教皇,这是不对的,详情参考《达芬奇密码》中的片段。亚历山大·蒲柏主持了牛顿葬礼,并写了最出名的墓志铭之一:"自然和自然律隐没在黑暗中;上帝说,让牛顿去吧!遂一片光明。"所以一知半解最危险。

  • C++:如果你有一定的编程基础,在24小时之内,能学会一些C++的语法,但是仅此而已。如果你以前是个Basic语言的程序员,你可以写一些语法是C++,但是风格是Basic的程序。当然24小时之内,C++语言的精华或糟粕,你都学不到。

    所以,Alan Perlis曾说过:"不能影响你编程思维方式的语言,是不值得学习的。"

    Alan Perlis是首届图灵奖得主。

    what?图灵奖是什么?你可以理解是计算机的诺贝尔。

    一个更加可能的场景是,在工作中,你不得不学习C++(或者JavaScript,Processing之类)的一小部分,来调用一些原有的接口,完成某个特定的任务。这不是在学习如何编程,而是在学习如何完成任务。

  • 24小时内:很不幸,24小时太少了,原因下一节告诉你。

# Teach Yourself Programming in Ten Years

十年学会编程

研究表明,想在任何领域成为专家,大概需要10年的时间,这些领域包括下棋、作曲、发电报、弹钢琴、游泳、打网球、研究神经心理学和拓扑学。

关键在于有针对性的训练,也就是说,并非是机械地,一遍又一遍地练习,而是要不断地挑战自我,试图超越自身当前的水平,通过不断的尝试挑战,并在尝试的过程中和尝试之后对自身的表现进行分析和总结,吸取经验,纠正之前犯过的各种错误。把这一过程不断重复,才能取得成功。所谓的"捷径"是不存在的,即使对于4岁就能成为音乐天才的莫扎特(Mozart)来说,他也花了13年的时间,才真正地写出了世界级的作品。在流行音乐上,甲壳虫乐队(The Beatles),他们似乎在1964年凭借一系列热门单曲和其在艾德沙利文秀(The Ed Sullivan show)上的演出一炮而红,但是你也许不知道,他们早在1957年就在利物浦和汉堡两地进行小规模演出了,而在此之前的非正式演出更是不计其数。甲壳虫乐队的主要成名曲《Sqt. Peppers》,则是在1967年才发行的。

马尔科姆·格拉德威尔(Malcolm Gladwell)尽管他说的的是10000个小时而不是10年,但也是一样的理论。法国现实主义摄影大师亨利·卡蒂埃-布列松也说过,你的前10000张照片是你最差的。(当然,这个摄影大师没有意思到数码相机的出现,很多人能在一周内就可以拍10000张照片)真正的大师要用一生来完成,英国作家,文学评论家和诗人塞缪尔·约翰逊说过:"在任何领域取得卓越的成就都需要用一生的努力,不要妄想可以投机取巧。"英国的诗人乔叟也曾说过:"吾生也有涯,而知也无涯。"同样,公元前400年的希波拉克底也表达过类似的意思,他也认为艺术没有境,生命却有尽头。他说的这句话有个更长的版本,翻译出来的意思是:"生命有尽头,艺术无止境,机遇转瞬即逝,练功走火入魔,决定优柔寡断。"

当然,不会有一个确定的答案告诉你需要多长时间,毕竟,假设掌握所有的技能(比如编程,下棋,跳舞和音乐)需要相同的时间也不合适,不同的人也会用不同的时间。K.Anders Ericsson教授说过:"在绝大多数领域,哪怕是最有天分的个人,他们达到最高水平所耗费的时间也是极为显著的。10000个小时这个数字只是想让你意识到即便是人们口中的那些最具天赋的个体想达到最高水平也需要年复一年的每周花上10到20小时。"

# So You Want to be a Programmer,Here's my recipe for programming success

所以你想成为一个程序员,这就是我编程成功的秘笈

兴趣使然,因为乐趣而写程序。确信你自始至终都能乐在其中,这样才能让你花10年光阴也不觉得枯燥无味。

动手编程。最好的学习方法是从实践中学习。用更技术性的话说,"在一个给定的领域内,个人的最大能力不是自动地由扩展了的经验取得的,但即使是高度有经验的人也可以通过有意识的努力来提高自己的能力"和"最有效的学习需要因人而异的适当难度,目标明确的任务,丰富的信息反馈,以及重复的机会和错误修正。"引用自《Cognition in Practice:Mind,Mathematics,and Culture in Everyday Life》。

和其他的程序员交流,阅读别人的代码。这比看书或者参加培训课程更重要。

如果你愿意,在大学里花上四年时间(或者再读个研)。这能让你获得一些工作机会,也能让你在这个领域有更深入的了解。但是,如果你一上学就头痛,直接去工作也能获得相同的经验。无论是什么情况,读死书肯定是不行的。计算机科学不会让你成为编程专家,就像学习画笔和颜料不可能让你成为画家一样。这是Eric Raymond说的,他是《New Hacker's Dictionary》的作者。我雇佣过的最好的程序员之一仅有高中文凭,他做出了许多优秀的项目,有他自己的新闻组,而且通过股票期权买到了自己的夜总会。

和其他程序员一起做项目。你可能在项目中是最出色的程序员,也可以是普通程序员。当你是最出色的,要尝试着领导项目,用你的视野来启发别人。当你是普通开发,要学习牛人们在做什么,了解他们不喜欢做什么(因为他们吩咐你做事)。

接受并推进别人的项目。理解其他人写的代码。如果有别人没有考虑到的问题,你能理解并修复它们。思考并设计你的软件,让这些软件也容易被他人维护。

学习至少6种编程语言。这6种语言中,包括一种支持抽象类的(例如Java或者C++),一种支持函数的(Lisp,ML或者Haskell),一种支持语言抽象的(Lisp),一种支持声明规范的(Prolog或者C++模板),还有一种支持并发的(Clojure或者Go)。

记住,在"计算机科学"中包括"计算机"这个词语。理解执行一条指令需要花多长时间,从内存中取出一个字(要考虑缓存有没有命中的情况)要多久,从硬盘中连续读字节需要多久,在硬盘中寻址定位要多久?

参加语言的标准化工作。这可能是有关ANSI C++委员会,也可以是缩进的风格是两格缩进或四个缩进。无论如何,你能从中学到其他人对语言的喜好,也能了解到他们热爱的程度,甚至也许知道一点他们为什么会这样认为?

知道何时能从标准化语言的工作中脱身,越快越好。

很难说能从书本中学到多少东西。我第一个小孩出生的时候,我读了所有的"如何做"系列的书,但是没有什么头绪。30个月以后,当我的第二个孩子出生,我还要重温一下那些书么?当然不用了!我都已经是老司机了,我完全靠我自己的经验,事实也证明我自己的经验要胜过那些专家们写的上千页的书。

弗雷德·布鲁克斯(Fred Brooks)在他的书《没有银弹》中给出了三条建议:

  • 尽早地系统地识别出顶级设计师
  • 每个人给分配一个职业规划的导师
  • 让成长中的设计师有机会相互交流和学习

此计划假设某些人已经具备了杰出设计者的必要才能,然后,就是正确的去引导他们。Alan Perlis说:"每个人都能被教会雕刻,普通人学习雕刻学的是常规技法,了解怎么去做,而米开朗基罗这样的人还会琢磨,哪些做法是不可取的。对于伟大程序员,也是如此。"

Perlis认为,伟大的人有一种内在的特质,这种特质往往比接受训练更重要。但是,这些特质是从哪里来的呢?与生俱来的?还是通过后天勤奋而来的?

正如动画片《料理鼠王》里的幻象大厨Auguste Gusteau说的那样:"谁都能做饭,但只有那些无所畏惧的人才能成为大厨!"我认为"把你生命中的大部分时间花在针对性的练习上"这种精神,看作一种自愿奉献的精神!但或许"无所畏惧"才是体现这种精神的真谛。或者,就像是《料理鼠王》里那个与Gusteau作对的刻薄的美食评论家Anton Ego说的那样:"不是任何人都能成为伟大的艺术家,不过,伟大的艺术家可以来自任何地方。"

所以,尽管买本Java/Ruby/JavaScript/PHP的书吧。你可能会从中学到点有用的东西。但作为一个程序员,在21天内或24小时内改变你的人生,或者提高你实际的编程水平,这是不可能的。你尝试过连续24个月不间断的努力提高自己么?呵呵,如果你做到了,好吧,那么你开始上路了.....

原文链接: http://norvig.com/21-days.html (opens new window)

翻译参考: https://mp.weixin.qq.com/s?... (opens new window)

最近更新时间: 2021/12/22 20:56:02