这篇文章已经有很多人翻译过了,我之所以再搞一次,首先是我觉得这文章真的很好,值得一搞再搞,其次,几乎所有的版本都漏掉了一些语句,我猜可能是英文版更新过,但是,中文版没有与时俱进。
为何每个人都急于求成/strong>
随便走进一家书店,都会看到类似《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》这本书里。
和其他的程序员交流,阅读别人的代码。这比看书或者参加培训课程要重要。
和其他的程序员一起参与一些项目。在一些项目中成为最出色的程序员;在另一些项目中当最差劲的程序员。在当最出色的程序员的时候,要测试你领导项目的能力,用你的视野来启发别人。如果你是项目中最差的那个,要学习牛人们在做什么,如果他们不喜欢做的,你要拿来做。
接手并推进别人的项目。理解其他人写的代码。如果有别人没有考虑到的问题,你能理解并修复它们。思考并设计你的软件,让这些软件也容易被他人维护。
学习至少6种(我不太清楚英语中的half dozen是什么意思,是虚指还是就是6种)编程语言。这6种语言中,包括一种支持抽象类的(例如Java或者C++),一种支持函数的(Lisp, ML或者Haskell),一种支持语义抽象的(Lisp),一种支持声明规范的(Prolog或者C++模板),还有一种支持并发的(Clojure或Go)。
记住,在“计算机科学”中在“计算机”这个词语。理解执行一条指令要花多长时间,从内存中取一个字(要考虑缓存有没有命中的情况)要多久,从硬盘中连续读字节要多久,在硬盘中寻址定位要多久/p>
参加语言的标准化工作。这可能是有关 ANSI C++ 委员会,也可能是缩进的风格是两格缩进或四格缩进。无论如何,你能从中学到其他人对语言的喜好,也能了解到他们热爱的程度,甚至也许能知道一点他们为什么他们会这样认为/p>
知道何时能从标准化语言的工作中脱身,越快越好。
很难说能从书本中学到多少东西。我第一个小孩出生的时候,我读了所有的“如何做”系列的书,但是,没有什么头绪。30个月以后,当我的第二个孩子出生,我还要重温一下那些书么然不用了!我都已经是老司机了,我完全靠我自己的经验,事实也证明我自己的经验要胜过那些专家们写的上千页的书。
弗雷德·布鲁克斯在他的书《没有银弹》中给出了三条建议:
-
尽早地系统地识别出顶级设计师
-
每个人给分配一个职业规划的导师
-
让成长中的设计师有机会互相切磋武艺
此处的假设是有一些人天生有成为伟大设计师的潜质,然后,就是正确的去引导他们。艾伦·佩里斯一针见血地说:”假如每个人都可以学会雕刻,那就得教米开朗基罗哪些事不要去做。对于伟大程序员,也是如此。”
Perlis认为,伟大的人有一种内在的特质,这种特质往往比接受训练更重要。但是,这些特质是从哪里来的呢生俱来的是通过后天勤奋而来的/p>
正如动画片《料理鼠王》里的幻象大厨Auguste Gusteau说的那样:“谁都能做饭,但只有那些无所畏惧的人才能成为大厨!”我认为“把你生命中的大部分时间花在有针对性的练习上”这种精神,看作一种自愿奉献的精神!但或许“无所畏惧”才是体现这种精神的真谛。或者,就像是《料理鼠王》里那个与 Gusteau 作对的刻薄的美食评论家 Anton Ego 说的那样:“不是任何人都能成为伟大的艺术家,不过,伟大的艺术家可以来自任何地方。”
所以,尽管买本 Java/Ruby/Javascript/PHP 的书吧。你可能会从中学到点儿有用的东西。但作为一个程序员,在 21 天内或 24 小时内改变你的人生,或者提高你实际的编程水平,这是不可能的。你尝试过连续 24 个月不间断的努力提高自己么吧,好吧,你该上路了……
往期精彩回顾
我是一个线程
我是一个Java Class
面向对象圣经
函数式编程圣经
TCP/IP之大明邮差
CPU阿甘
我是一个 卡
我是一个路由器
一个故事讲完HTTPs
编程语言的巅峰
Java:一个帝国的诞生
JavaScript:一个屌丝的逆袭
负载均衡的原理
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!