打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
十年学会编程

作者:Peter NorviG

翻译:刘延栋 ,公众号“软件那些事儿”

这篇文章已经有很多人翻译过了,我之所以再搞一次,首先是我觉得这文章真的很好,值得一搞再搞,其次,几乎所有的版本都漏掉了一些语句,我猜可能是英文版更新过,但是,中文版没有与时俱进。

如果再有人在我的公众号里问我如何学习编程的话,我就可以把这个发给他了。

为何每个人都急于求成?

随便走进一家书店,都会看到类似《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曾说过:“不能影响你编程思维方式的语言,是不值得学习的。”一个更加可能的场景是,在工作中,你不得不学习C++(或者JavaScript,Processing之类)的一小部分,来调用一些原有的接口,完成某个特定的任务。这种情况下,表面上说是在学习如何编程,其实只是在应付一下手上的活。

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

十年学会编程

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

关键在于有针对性的训练,而不是漫无目的重复,训练的内容要刚好超过你现有的水平,练习以后要分析你的表现,改正发现的错误,然后重复,再重复。

没有什么捷径可走,即使是Mozart,一个4岁就能弹琴的音乐天才,也是用了13年的时间,才真正的写出世界级的音乐作品。在流行音乐上,Beatles好像是在1964年访美期间一夜成名的。实际上,他们从1957年就已经开始在利物浦和汉堡的小酒馆里唱歌了,他们组建乐队的时间就更早了,他们第一张取得巨大成功的专辑《佩帕军士》,是在1967年发行的。

马尔科姆·格拉德威尔让这个理论广为人知,虽然他说的是另一个说法,10000个小时而不是10年(这本书有中文翻译版《异类 : 不一样的成功启示录》)。

法国现实主义摄影大师亨利·卡蒂埃-布列松有另外一个标准,他说你的前10000张照片是你最差的。(当然,这个摄影大师没有意识到数码相机的出现,很多人能在一周内就可以拍10,000张照片)

真正的大师要用一生来完成,英国作家,文学评论家和诗人塞缪尔·约翰逊说过:“在任何领域取得卓越的成就都要用一生的努力,不要妄想可以投机取巧。”英国的诗人乔叟也曾经说过:”吾生也有涯 而知也无涯。”

同样,公元前400年的希波克拉底也表达过类似的意思,他也认为艺术没有止境,生命却有尽头。他说的这句话有个更长的版本,翻译成英语的意思是:“生命有尽头,艺术无止境,机遇转瞬即逝,练功走火入魔,决定优柔寡断。”

当然,不会有一个确定的答案告诉你需要多长时间,毕竟,假设掌握所有的技能(比如编程,下棋,跳棋和音乐)需要相同的时间也不合适,不同的人也会用不同的时间。

K.Anders Ericsson教授说过:“值得注意的是,在大多数领域,即使你是个天才,要达到专家级别的高水平仍然需要时间。10000个小时只是给你一个概念,一个天才,如果每周练习10到20个小时的时间,仍然需要数年时间才能达到专家级别的水平。”

所以你想成为一个程序员

这是我编程成功的秘笈:

要对编程感兴趣,要从中能获得快乐。保证编程足够有趣,这样才能让你花10年的时间或者10,000个小时在上面也不觉得枯燥无味。

动手编程。最好的学习方法是边学边做。常言道:“人的最高功力并不能通过做一天和尚撞一天钟这样的重复经验获得,但是,最高的功力可以通过有针对性的日复一日年复一年的训练来获得。”并且,“最有效果的学习需要有针对性的任务,这些任务的难度还要因人而异,并且有合理的反馈渠道,并能够根据这些反馈作出相应的改进。”这些观点引用自《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》这本书里。

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

如果你愿意,在大学里花上四年时间(或者再读个研)。这能让你获得一些工作机会,也能让你在这个领域有更深入的了解。但是,如果你一上学就头痛,直接去工作也能获得相同的经验。无论是什么情况,读死书肯定是不行的。计算机科学不会让你成为编程专家,就像学习画笔和颜料不可能让你成为画家一样。这是Eric Raymond说的,他是New Hacker’s Dictionary字典的作者。我雇佣过的最好的程序员是个高中毕业的学生,他创造了伟大的软件,Mozilla,他拥有自己的新闻组,赚到了足够多的钱买了自己的酒吧。

和其他的程序员一起参与一些项目。在一些项目中成为最出色的程序员;在另一些项目中当最差劲的程序员。在当最出色的程序员的时候,要测试你领导项目的能力,用你的视野来启发别人。如果你是项目中最差的那个,要学习牛人们在做什么,如果他们不喜欢做的,你要拿来做。

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

学习至少6种(我不太清楚英语中的half dozen是什么意思,是虚指还是就是6种)编程语言。这6种语言中,包括一种支持抽象类的(例如Java或者C++),一种支持函数的(Lisp, ML或者Haskell),一种支持语义抽象的(Lisp),一种支持声明规范的(Prolog或者C++模板),还有一种支持并发的(Clojure或Go)。

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

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

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

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

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

  • 尽早地系统地识别出顶级设计师

  • 每个人给分配一个职业规划的导师

  • 让成长中的设计师有机会互相切磋武艺

此处的假设是有一些人天生有成为伟大设计师的潜质,然后,就是正确的去引导他们。艾伦·佩里斯一针见血地说:”假如每个人都可以学会雕刻,那就得教米开朗基罗哪些事不要去做。对于伟大程序员,也是如此。”

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

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

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

特别提醒: 本文还有中英文对照版

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
十年学会程序设计
3天学会C ,对,就3天
Teach Yourself Programming in Ten Years——用十年教会自己编程
7天学会一个编程语言,可能吗?
Peter Norvig:自学编程,十年磨一剑
神级程序员10多语言编译‘helloworld’,你又能看懂几种?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服