十年内教会自己编程(翻译)
1.为什么大家都这么浮躁?
走进书店,你就能看到一本《24小时自学Java》的书,与它摆在一起的,还有许许多多短时间内学会C,SQL,Ruby或算法的书。我在亚马逊上,做了这样的高级搜索 “书名:自学 小时 ”,发现2000年后出版的这样的书就有512本!这其中,销量前10的书中有9本是关于编程的(还有一本是关于记账的)。
所以我们可以得出结论:要么人们学编程时太浮躁了,要么编程实在太容易了,比其他任何技能都要容易学会。Felleisen在他的著作《如何设计程序》中提到了这种“速成”的趋势,并且指出:“糟糕的编程当然很容易学会,白痴也能在21天内学会,哪怕他们天生有智力缺陷。”
2.十年内教会自己编程
研究人员((Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973))发现,在很多领域内,如果你想获得专家级别的水平,大概需要十年的时间。这些领域包括了下象棋、作曲、绘画、弹钢琴、游泳、打网球、对神经心理学和拓扑学的研究等等。这其中的关键是刻意练习:并不是一遍又一遍的重复,而是给自己设定一个稍微超过自己当前能力的目标,尝试着去完成它。在尝试的过程中以及尝试结束后,分析自己的表现,并纠正自己的错误。然后再把这个过程不断的重复。所谓的“捷径”是不存在的:即使是莫扎特这种4岁就能作曲的音乐奇才,也花了13年时间,才能创作出世界级的作品。
Malcolm Gladwell 使得这个观点广为人知,尽管他关注的重点是1万小时,而不是10年。Samuel Johnson 也说过:“在任何一个领域要想做到极致,势必要花一生的精力,否则根本无法企及。”
当然,没有哪个数字能给你最终答案:假设熟练掌握每个技能(例如编程、下棋、演奏)所需的时间相同,或者假设每个人学会这些技能的时间相同,这完全是不合理的。正如 K. Anders Ericsson 指出的那样:“在很多领域,即使是那些最有天赋的个人,为了达到最高水平,也花费了难以想象的时间。1万小时这个数字只是想让你意识到即便是人们口中的那些最具天赋的个体想达到最高水平也需要年复一年的每周花上 10 到 20 小时。”
3.你真的想当程序员吗?
我有一份成功学会编程的秘诀:
- 对编程感兴趣,并且因为有趣而去编写一些程序。只有保证它足够有趣,这样你才愿意投入10年或是1万小时。
- 写程序。最好的学习方法是从实践中学习。用更专业一点的话来说:“某个人在特定领域内的最高水平,不是因为经验的积累而自动获得的。即使是经验非常丰富的人,也可以通过刻意练习来提高自己的水平。”(p. 366)以及“最有效的学习方式,需要一个明确定义的目标,而且这个目标要有一定的难度;需要及时的信息反馈;需要有机会重来和纠正错误。”(p. 20-21)《实践中的认知:日常生活中的思维、数学和文化》这本书提供了上述的观点。
- 和其他程序员交流;阅读他们的代码。这比任何一本书或者训练课程都重要。
- 如果你愿意,花四年上个大学(或者更久,读个研究生)。这会让你有机会得到一份需要文凭的工作。而且这也会让你对这个领域有更深层次的理解。但如果你不想呆在学校,你也可以通过自学或经验获得类似的经验(但需要付出一定代价)。无论如何,仅仅是书本上的学习是不够的。《新黑客字典》的作者Eric Raymond曾说过:“计算机科学教育并不能使任何人成为编程专家,就像学习笔刷和颜料并不能使得任何人成为一个专业画家。”我曾经雇佣过一个员工,只有高中文凭,却是我们最好的程序员之一。他做出了许多优秀的软件,有他自己的新闻组, 而且通过股票期权买到了自己的夜总会。
- 与其他程序员一起合作。在一些项目中,你可能是最好的程序员;在另一些项目中,你可能是最差的程序员。当你是最好的程序员时候,你能测试下自己领导一个项目的能力,并能用自己的观点去激发别人。当你是最差的程序员时候,你可以学到那些牛人们是怎么做的,他们不喜欢做什么(因为他们会把不喜欢的事情丢给你去做)。
- 接手别人的项目。理解别人所写的程序。看看当程序的原作者不在的时候,理解并改正他的程序需要花费什么。思考一下,如何设计程序,能让其他人维护你的程序变得容易些。
- 学习至少6门编程语言。包括一门支持类抽象的语言(例如Java或C++)。一门支持函数化抽象的语言(例如 Lisp 或 ML 或 Haskell),一门支持语法抽象的语言(例如 Lisp),一门支持声明规格说明的语言(例如 Prolog 或 C++ 的模板),以及那些强调并行的语言(例如 Clojure 或 Go)。
- 记住在“计算机科学”中有“计算机”这三个字。你需要知道你的计算机执行一条指令会花费多长时间?从内存中读取一个单词(包括在缓存中和不在缓存中两种情况)会花费多长时间?从硬盘中连续地获取数据会花费多长时间?在硬盘上定位一个新的位置会花费多长时间? (答案在这儿)。
- 尽量参与到语言标准化的过程中。这可以是加入ANSI C++委员会;也可以是决定你周围人的编程风格:缩进采用2个空格还是4个空格?无论用哪种方式,你都能知道别人对于一门语言的看法和喜好程度,甚至你可以知道为什么他们会这样看。
- 有良好的意识,尽快适应编程语言标准化的成果。
Fred Brooks 在他的论文《没有银弹》中向我们揭示了找到卓越软件设计师的三个步骤:
- 有组织地鉴定出顶尖的设计者,并且越早越好。
- 为他指派一位职业生涯的导师,负责规划他未来的发展,并且让他谨慎地对待自己的职业履历。
- 为成长中的软件设计师提供机会,让他们相互交流,相互激励。
这个方式假定了有些人已经具备了成为一个卓越的软件设计师的潜质,要做的只是去引导他们。Alan Perlis 说的更简洁一些:“每个人都能被教会如何雕塑,但米开朗琪罗应该被教会如何不去雕塑。对于优秀的程序员来说,同样如此。”Perlis 的意思是说,那些大师们都有一些内在的特质,这些特质比他们接受的训练更为重要。但是这些特质从哪里来呢?它是天生的吗?还是可以通过后天的努力习得的呢?正如《料理鼠王》中说的那样:“每个人都能做饭,但只有无所畏惧的人才能成为大厨。”我认为“把生命中大部分时光用于刻意练习”是心甘情愿的。但也许无所畏惧才是对它最好的总结。或者正如《料理鼠王》中说的那样:“不是每个人都能成为伟大的艺术家,但伟大的艺术家可以来自于任何一个地方。”
所以,尽管去买那些速成的编程书吧。也许你会发现它们还有点用,但这不会改变你的人生。也不会让你在24小时或21天内,在编程领域上,有真正的整体上的提高。试试连续24个月努力提高自己的编程能力怎么样?如果你做到的话,你已经开始迈向成功之路了……
注:由于时间原因,没有一字一句翻译。省略了部分我认为不重要的内容。
原文:
Peter Norvig “Teach Yourself Programming in Ten Years ”