用十年时间教授自己编程(Peter Norvig)

这篇文章是Google研究总监皮特·诺维格(Peter Norvig )发表在他的个人网站上的一篇文章。文章原名是《Teach Yourself Programming in Ten Years》。

此文章澄清了很多关于学习编程的一些误解。很多人在一开始总是急匆匆的想要快速学会一门编程语言,包括我在内。因此,总是在用错误的方式去学习,总想更快。但想要编写出易于维护、可读性高、代码复用性高的代码,甚至能独立设计一个优良的系统,是需要很长时间的经验积累的,并且在这个过程中不断实践,不断总结才可能达到的。

对于我这个刚入行一年左右的编程新手来说,这篇七年前的文章依然有很大的指导作用,让我看清楚自己对编程的一些误解,以及如何更正错误的认知,走上正确的道路。

因为自己平时也在学习英语,索性在看这篇文章的过程中,把这篇文章的主体部分做了翻译。因为自身翻译能力还比较差,所以很多地方的句子结构看起来或者理解起来可能比较别扭,见谅哈,有英语阅读能力还是尽量去看原文吧!链接我已经贴在上面啦。

目录

为什么每个人都这么匆忙?

用十年时间教授自己编程

你想成为一名程序员


为什么每个人都这么匆忙?

走进任何书店,你会看到如何在24小时内自学Java,以及在几天或几小时内教授C、SQL、Ruby、Algorithms等的无穷变体。亚马逊高级搜索:title: teach, yourself, hours, since: 2000,发现有512本这样的书。前十本书中,九本都是编程书籍(剩下那一本是关于记账的)。使用“ learn"替换”teach yourself"或者“days"替换”hours"得到同样的结果。

结论要么是每个人都想要急切地学习编程,要么是编程比其他任何东西都要容易的多。Felleisen et al.等人在他们的《如何设计程序》一书中对这一趋势表示了赞同,当他们说“ 糟糕的编程是容易的。白痴可以在21天内学会,即使他们是傻瓜。” Abtruse Goose的漫画也有他们的看法

让我们来分析一下,在24小时内教自己C++的标题意味着什么:

  • 教你自己:在24小时内,你不会有时间去写几个重要的程序,并且从你编写程序过程中的成功与失败中学习。你没有时间与一位富有经验的程序员一起工作并且理解在C++环境中生活是什么样的。简而言之,你没有时间了解太多。所以这本书只能谈论一个肤浅的熟悉程度,而不是深刻的理解。正如亚历山大·波普所说,懂一点点是危险的事情(a little learning is a dangerous thing.)。

  • C++:在24小时内,你可能有时间学习一些C++的语法(如果你已经了解其他语言),但是你不能学习到很多关于如何使用该语言的经验。简言之,如果你是,比方说,一个初级程序员,你可以学习使用C++的语法用最基本的风格编写程序,但是你不能学习到C++真正擅长(或不擅长)什么。那么这有什么意义呢? Alan Perlis 曾经说过:“一种语言如果不影响你对编程的思考方式,就不值得了解”。一个可能的观点是,你必须学习一丁点的C++(或者更有可能是 JavaScript 或 Processing 之类的东西)因为你需要使用现有工具的接口完成特定的任务。但是你不是在学习如何编程,而是在学习如何完成那项任务。

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

用十年时间教授自己编程

研究人员(Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) 的研究已经表明,在任何一个广泛的领域发展专业知识都需要十年的时间,包括下棋、作曲、电报操作、绘画、弹钢琴、游泳、网球,以及神经心理学和拓扑学的研究。关键是刻意练习:不仅仅是一遍又一遍的做,而是要用超出你当前能力的任务挑战你自己,尝试它,在这个过程之中以及之后分析你的表现,并且纠正任何错误。然后,重复。再重复。似乎没有真正的捷径:即使是莫扎特,他在四岁就是一个音乐神童,他花了13年时间才开始创作世界级的音乐。在另一个流派中,1964年,披头士乐队似乎以一连串的冠军歌曲和在埃德-沙利文(Ed Sullivan)节目中的亮相而突然出现在舞台上。但他们从1957年开始就在利物浦和汉堡的小俱乐部演出。虽然他们很早就吸引了大众,但他们的第一次伟大成功,Sgt. Peppers,是在1967年。

马尔科姆-格拉德威尔(Malcolm Gladwell)普及了这一观点,尽管他专注于10,000小时,而不是10年。亨利·卡地亚·布列松(Henri Cartier Bresson,1908-2004)还有一个度量标准:“你的前10,000张照片是你最糟糕的。”(他没有预料到,有了数码相机,有些人可以在一周内达到这个目标)。真正的专业技能可能需要一生:塞缪尔·约翰逊(1709-1784)说过:“任何一个部门的杰出成就都只能通过一生的努力获得;不能更少了。”乔叟(1340-1400)抱怨说:"时间这么短,工艺这么长"。("the lyf so short, the craft so long to lerne.")。希波克拉底(约公元前400年)因摘录 "Ars longa, vita brevis "而闻名,这是更长的引文 "Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficultile "的一部分。英文译为 "生命短暂,[技艺]漫长,机会稍纵即逝,实验变幻莫测,判断困难"。当然,没有一个数字可以作为最终答案:假设所有技能(例如,编程、下棋、下跳棋和演奏音乐)都需要完全相同的时间来掌握,也假设所有的人都需要完全相同的时间,这似乎并不合理。正如K. Anders Ericsson教授所说的那样,“在大多数领域,即使是最有才华的人也需要多少时间才能达到最高的表现水平,这一点很值得注意。10000小时的数字只是给你一种感觉,我们说的是十年每周20小时,有些人会争辩,那些与生俱来拥有天赋的人也仍然需要这个时间达到最高水平。”

你想成为一名程序员

以下是我编程成功的秘诀:

  • 对编程感兴趣,并因为它很有趣而做一些东西。确保要让它保持足够的乐趣,这样你才会愿意投入你的10年/10000小时。

  • 编程。最好的学习是通过实践学习learning by doing)。说得更专业一点:”个人在给定领域的最佳表现水平不是由于经验的扩展而自动获得的,但即使是经验丰富的人也可以通过刻意的努力来提高表现水平。“(第 366 页) 和 ”最有效的学习需要一个明确的任务,对特定的个人有合适的难度水平,有信息性反馈,以及重复和纠正错误的机会。“(第 20-21 页)《实践中的认知:日常生活中的思维、数学和文化》( Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life)一书是这一观点的有趣参考。

  • 与其他程序员交谈;阅读其他人的程序。这比任何书籍或培训课程都重要。

  • 如果你愿意,可以在大学呆四年(或在研究生院再多呆几年)。这会让你接触到一些需要证书的工作,也会让你对这个领域有更深的了解,但如果你不喜欢学校,你可以(通过一些努力)自己或在工作中获得类似的经验。无论如何,仅靠书本学习是不够的。"计算机科学教育不能使任何人成为专家级的程序员,就像研究画笔和颜料不能使人成为专家级的画家一样" 埃里克·雷蒙德说,The New Hacker's Dictionary的作者。我雇佣过的最好的程序员之一只有高中学历;他制作了很多很棒的软件,有自己的新闻组,并赚取了足够的股票期权来购买他自己的夜总会。

  • 与其他程序员一起在一个项目工作。在某些项目上成为最好的程序员;在其他项目上成为最差的程序员。当你是项目中最好的程序员时,你获得了测试你领导项目的能力的机会,并且用你的愿景激励别人。当你是项目中最差的程序员时,你学会大师喜欢做什么,同时你也学会了它们不喜欢做什么(因为他们让你帮他们做那些)。

  • 在其他程序员之后进入项目工作。理解由其他人所编写的程序。看看当原作者不在时,理解和修复它需要什么。想想如何设计你的程序才能让那些之后维护它们的人更容易理解。

  • 学习至少六种编程语言。包括一种强调类抽象的语言(就像Java或C++),一种强调函数式抽象的语言(如Lisp或ML 或 Haskell),一种支持句法抽象(syntactic abstraction)的语言(如Lisp),一种支持声明式规范的语言(如Prolog或C++ templates),一种强调并行性(parallelism)的语言(如Clojure或Go)。

  • 记住,“计算机科学”中有一个“计算机”。了解让你的计算机去执行一条指令,从内存中取一种词(有无缓存未命中),从硬盘中读取连续词(consecutive words),并且在硬盘中寻找一个新的位置需要花多长时间。

  • 参与语言标准化工作。它可以是ANSI C++ 委员会,或者它可能决定您的本地编码风格是否有 2 或 4 个空格缩进级别。无论哪种方式,你都可以了解其他人喜欢哪种语言,他们的感受有多深,甚至可能有一点关于他们为什么如此感受。

  • 有良好的意识尽快完成语言标准化工作。

  • 有良好的意识尽快完成语言标准化工作。

考虑到所有这些,仅仅通过书本学习你能走多远是值得怀疑的。在我的第一个孩子出生之前,我读了所有的“怎么做”的书,仍然觉得自己是一个无知的新手。30个月后,当我的第二个孩子出生的时候,我又回到书本上复习了吗?没有。相反,我依靠我的个人经验,这对我来说比专家们写的几千页书更有用,更让我放心。

Fred Brooks 在他的文章 No Silver Bullet 中确定了寻找优秀软件设计师的三部分计划:

        1. 尽可能早系统地确定顶级设计师。

        2. 指派一位职业导师负责潜在客户的发展,并仔细保存职业档案。

        3. 给正在成长的设计师提供机会相互影响与激励。

这是假设有些人已经具备成为一名伟大设计师所必需的素质;工作就是适当地哄他们。Alan Perlis 说得更简洁:“每个人都可以学会雕刻:米开朗基罗必须学会如何不雕刻。伟大的程序员也是如此。”Perlis 说,伟人有一些超越他们训练的内在品质。但是那种品质来自哪里呢?它是与生俱来的吗?或者他们通过勤奋发展了它?正如奥古斯特·古斯托(虚构的杂烩厨师)所说,“任何人都会做饭,但只有无所畏惧的人才能成为伟人。”我认为这更像是愿意将一个人一生的大部分时间投入到深思熟虑的实践中。但也许无畏是一种总结。或者,正如古斯托的批评家安东·伊戈所说:“不是每个人都能成为伟大的艺术家,但是伟大的艺术家能来自任何地方”。

那就去买那本Java/Ruby/Javascript/PHP的书吧;你可能会从中得到一些好处。但不会在24小时或21天内改变你的生活,也不会改变你作为一名程序员真正的整体专业技能。在24个月内努力工作,不断提高,怎么样?很好,现在你开始有所进展了...

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值