掘金者说-第12期-硬核之十年自学编程

1,367 阅读11分钟

第一季-思想篇

第二季-工作篇

您好,今天掘金者说和您一起分享的文章翻译版:十年自学编程。诸多大神都翻译过不同的译本,我不太喜欢重复找轮子,学习StackOverflow提问题方式,重复了那就直接跳转关闭,链接 中英对照版本十年学会编程 或者原版Teach Yourself Programming in Ten Years。原谅我为了在此资源整合、资料汇总,把文章进行了继承打包SDK记录(思想篇-第一季-第12期-精简之十年自学编程)。好的文章就好比一首经典老歌,翻唱的人很多,每个人都会添加自己的元素或者情怀。金铁霖先生曾经说过:“歌唱者的歌唱表现不只是凭声音技巧,而必须首先理解歌词的内容,找到歌曲的主题思想,理解歌词作家写他们作品的时代背景和思想情况,深入挖掘作品的内涵。”,这篇文章也当如此。我只是思想的搬运工,价值的传递者。让我们一起感受下吧!

为何每个人急于速成

随便走进一家书店,都会看到类似《24小时学会Java》这样的书,旁边摆着的是大量诸如在几天,几小时之内学会C语言,SQL,Ruby以及算法这样的书。如果使用Amazon上的高级搜索,使用title: teach, yourself, hours, since: 2000这个关键字来搜索,将会返回512本书。最靠前的10本书中,有9本是编程的书(唯一的例外是一本记账的书)。如果把关键字“自学”替换成“学习”,或者将“小时”替换成“天”,返回的结果大同小异。

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

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

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

  • C++: 在24小时之内,能学会一些C++的语法,但是,仅此而已了。如果你以前是个Basic语言的程序员,你可以写一些语法是C++,但是风格是Basic的程序,但是,24小时之内,C++语言的优点(或缺点),你都学不到。重点是什么?(首界图灵奖得主)Alan Perlis曾说过:“不能影响你编程思维方式的语言,是不值得学习的。”一个更加可能的场景是,在工作中,你不得不学习C++(或者JavaScript,Processing之类)的一小部分,来调用一些原有的接口,完成某个特定的任务。这种情况下,表面上说是在学习如何编程,其实只是在应付一下手上的活。

  • 在24小时内: 不幸的是,这还不够,如下一节所示。

十年自学编程

研究表明,想在任何领域成为专家,大概需要10年的时间,这些领域包括下棋,作曲,发电报,弹钢琴,游泳,打网球,研究神经心理学和拓扑学。关键在于有针对性的训练,而不是漫无目的重复,训练的内容要刚好超过你现有的水平,练习以后要分析你的表现,改正发现的错误,然后重复,再重复。没有什么捷径可走,即使是Mozart,一个4岁就能弹琴的音乐天才,也是用了13年的时间,才真正的写出世界级的音乐作品。在流行音乐上,Beatles好像是在1964年访美期间一夜成名的。实际上,他们从1957年就已经开始在利物浦和汉堡的小酒馆里唱歌了,他们组建乐队的时间就更早了,他们第一张取得巨大成功的专辑《佩帕军士》,是在1967年发行的。

马尔科姆·格拉德威尔让这个理论广为人知,虽然他说的是另一个说法,10,000个小时而不是10年(这本书有中文翻译版异类 : 不一样的成功启示录)。法国现实主义摄影大师亨利·卡蒂埃-布列松有另外一个标准,他说你的前10,000张照片是你最差的。(当然,这个摄影大师没有意识到数码相机的出现,很多人能在一周内就可以拍10,000张照片)真正的大师要用一生来完成,英国作家,文学评论家和诗人塞缪尔·约翰逊说过:“在任何领域取得卓越的成就都要用一生的努力,不要妄想可以投机取巧。”英国的诗人乔叟也曾经说过:“吾生也有涯而知也无涯。”同样,公元前400年的希波克拉底也表达过类似的意思,他也认为艺术没有止境,生命却有尽头。他说的这句话有个更长的版本,翻译成英语的意思是:“生命有尽头,艺术无止境,机遇转瞬即逝,练功走火入魔,决定优柔寡断。”当然,不会有一个确定的答案告诉你需要多长时间,毕竟,假设掌握所有的技能(比如编程,下棋,跳棋和音乐)需要相同的时间也不合适,不同的人也会用不同的时间。K.Anders Ericsson教授说过:“值得注意的是,在大多数领域,即使你是个天才,要达到专家级别的高水平仍然需要时间。10,000个小时只是给你一个概念,一个天才,如果每周练习10到20个小时的时间,仍然需要数年时间才能达到专家级别的水平。”

所以你想成为一个程序员

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

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

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

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

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

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

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

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

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

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

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

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

  1. 尽早地系统地识别出顶级设计师
  2. 每个人给分配一个职业规划的导师
  3. 让成长中的设计师有机会互相切磋武艺

此处假设有一些人天生有成为伟大设计师的潜质,然后就是正确的去引导他们。艾伦·佩里斯一针见血地说:“假如每个人都可以学会雕刻,那就得教米开朗基罗哪些事不要去做。对于伟大程序员,也是如此。”Perlis认为,伟大的人有一种内在的特质,这种特质往往比接受训练更重要。但是,这些特质是从哪里来的呢?与生俱来的?还是通过后天勤奋而来的?正如 动画片《料理鼠王》里的幻象大厨Auguste Gusteau说的那样:“谁都能做饭,但只有那些无所畏惧的人才能成为大厨!”我认为“把你生命中的大部分时间花在有针对性的练习上”这种精神,看作一种自愿奉献的精神!但或许“无所畏惧”才是体现这种精神的真谛。或者,就像是《料理鼠王》里那个与 Gusteau 作对的刻薄的美食评论家 Anton Ego 说的那样:“不是任何人都能成为伟大的艺术家,不过伟大的艺术家可以来自任何地方。

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

文章:
彼得·诺维格 原文
中英对照版本