十年自学编程
# 十年自学编程
Author:Peter Norvig 原文为英文
# 为什么大家都这么着急呢?
走进任何一家书店,您都会看到如何*在 24 小时内自学 Java,以及提供在几天或几小时内教授 C、SQL、Ruby、算法等的无数变体。亚马逊高级搜索title: teach, yourself, hours, since: 2000 (opens new window),找到了512本这样的书。前十名中,九本是编程书籍(另一本是关于簿记的)。将“自学”替换为“学习”或将“小时”替换为“天”,也会得到类似的结果。
结论是,要么人们急于学习编程,要么编程在某种程度上比其他任何东西都更容易学习。费莱森等人。他们在《如何设计程序》 (opens new window) 一书中承认了这一趋势,他们说“糟糕的编程很容易。白痴可以在21 天内学会它,即使他们是傻瓜。” 《深奥的鹅》漫画也有自己的看法 (opens new window)。
让我们分析一下《24 小时自学 C++》 (opens new window)这样的标题 可能意味着什么:
自学:
在 24 小时内,您将没有时间编写几个重要的程序,并从它们的成功和失败中学习。您将没有时间与经验丰富的程序员一起工作并了解生活在 C++ 环境中的感觉。简而言之,你没有时间学习太多东西。所以这本书只能讲表面的熟悉,而不是深入的理解。正如亚历山大·波普所说,学习一点点是一件危险的事情。
C++:
24小时内你也许能够学习C++的一些语法(如果你已经了解另一种语言),但你无法了解如何使用该语言。简而言之,如果您是一名 Basic 程序员,您可以学习使用 C++ 语法以 Basic 风格编写程序,但您无法了解 C++ 实际上有什么好处(和坏处)。那么有什么意义呢? Alan Perlis (opens new window)曾经说过曾经说过:“一种不影响你思考编程方式的语言,不值得了解”。一个可能的观点是,您必须学习一点点 C++(或更可能是 JavaScript 或处理之类的东西),因为您需要与现有工具交互才能完成特定任务。但这样你就不是在学习如何编程;而是在学习如何编程。你正在学习完成这项任务。
24 小时内:不幸的是,这还不够,如下一节所示。
# 十年自学编程
研究人员(Bloom (1985) (opens new window)、Bryan & Harter (1899) (opens new window)、Hayes (1989) (opens new window)、Simmon & Chase (1973) (opens new window))表明,培养各个领域的专业知识大约需要十年的时间,包括国际象棋、音乐作曲、电报操作、绘画、钢琴演奏、游泳、网球以及神经心理学和拓扑学研究。关键是刻意 练习:不仅仅是一次又一次地做,而是用一项超出你当前能力的任务来挑战自己,尝试它,分析你在做时和做后的表现,并纠正任何错误。然后重复。并再次重复。似乎没有真正的捷径:即使是 4 岁时就成为音乐神童的莫扎特,也花了 13 年时间才开始创作世界级的音乐。在另一种流派中,披头士乐队似乎凭借一系列排名第一的热门歌曲和 1964 年埃德·沙利文秀的亮相而崭露头角。但自 1957 年以来,他们一直在利物浦和汉堡的小俱乐部演出,尽管他们具有广泛的吸引力早些时候,他们的第一个重大成功,中士。 《辣椒》于 1967 年上映。
马尔科姆·格拉德威尔(Malcolm Gladwell) (opens new window)普及了这个想法,尽管他专注于 10,000 小时,而不是 10 年。亨利·卡地亚·布列松(Henri Cartier-Bresson,1908-2004)有另一个衡量标准:“你的前 10,000 张照片是最糟糕的。” (他没有预料到,使用数码相机,有些人可以在一周内达到这一水平。)真正的专业知识可能需要一生的时间:塞缪尔·约翰逊(Samuel Johnson,1709-1784)说“任何部门的卓越只有通过努力才能获得”一生;不能以更低的价格购买。”乔叟(1340-1400)抱怨说“生命如此短暂,学习技艺却如此漫长”。希波克拉底(约公元前 400 年)以摘录“ars longa, vita brevis”而闻名,该摘录是较长引文“Ars longa, vita brevis, occasio praeceps, Experimentum periculosum, iudicium difficile”的一部分,在英语中翻译为“生命”时间短,工艺长,机会转瞬即逝,实验危险,判断困难。” 当然,没有一个数字可以作为最终答案:假设所有技能(例如,编程、下棋、跳棋和音乐演奏)都需要完全相同的时间来掌握似乎并不合理,也不保证所有人都会花费完全相同的时间。正如 K. Anders Ericsson (opens new window)教授所说:“在大多数领域,即使是最有才华的个人也需要花费大量时间才能达到最高水平的绩效。10,000 小时的数字只会让您感觉我们正在谈论数年那些被一些人认为是最有天赋的人仍然需要每周工作 10 到 20 个小时才能达到最高水平。”
# 所以你想成为一名程序员
这是我成功编程的秘诀:
- 对编程感兴趣,并且因为它很有趣而去做一些事情。确保它保持足够的乐趣,这样你才会愿意投入十年/一万个小时。
- 程序。最好的学习方式是边做边学 (opens new window)。更专业地说,“在给定领域中,个人的最高绩效水平并不是随着经验的积累而自动达到的,但即使是经验丰富的个人,也可以通过刻意努力提高绩效水平来提高” ”。(第366页) (opens new window) 和“最有效的学习需要明确的任务,对特定个人有适当的难度,信息丰富的反馈,以及重复和纠正错误的机会。” (第 20-21 页)《*实践中的认知:日常生活中的思维、数学和文化》 (opens new window)*一书是这一观点的有趣参考。
- 与其他程序员交谈;阅读其他程序。这比任何书籍或培训课程都更重要。
- 如果你愿意,可以在大学学习四年(或者在研究生院学习更长的时间)。这将使您能够获得一些需要证书的工作,并且将使您对该领域有更深入的了解,但如果您不喜欢上学,您可以(通过一些奉献)自己或在工作中获得类似的经验。无论如何,仅靠书本学习是不够的。*《新黑客词典》*的作者埃里克·雷蒙德说:“计算机科学教育不能使任何人成为专家程序员,就像学习画笔和颜料不能使人成为专家画家一样。 ”我雇用过的最好的程序员之一只有高中学历;他开发了很多优秀的 (opens new window) 软件 (opens new window),拥有自己的新闻组 (opens new window),并赚了足够的股票期权来购买自己的夜总会 (opens new window)。
- 与其他程序员一起开发项目。成为某些项目上最好的程序员;对其他人来说是最糟糕的。当你成为最优秀的人时,你就可以测试自己领导项目的能力,并用你的愿景激励他人。当你最差的时候,你会了解大师做什么,你会了解他们不喜欢做什么(因为他们让你为他们做)。
- 跟随其他程序员从事项目。理解别人写的程序。看看当原始程序员不在时,如何理解并修复它。考虑如何设计您的程序,以便让您之后的维护者更轻松地维护它们。
- 学习至少六种编程语言。包括一种强调类抽象的语言(如 Java 或 C++)、一种强调函数抽象的语言(如 Lisp、ML 或 Haskell)、一种支持句法抽象的语言(如 Lisp)、一种支持声明性规范的语言(如 Prolog 或 C++ 模板) ,以及强调并行性的一种(如 Clojure 或 Go)。
- 请记住,“计算机科学”中有一个“计算机”。了解计算机执行一条指令、从内存中获取一个字(有或没有缓存未命中)、从磁盘读取连续的字以及在磁盘上寻找新位置需要多长时间。 (答案在这里。 (opens new window))
- 参与语言 标准化工作。它可能是 ANSI C++ 委员会,也可能决定您的本地编码风格是否具有 2 个或 4 个空格缩进级别。无论哪种方式,您都会了解其他人喜欢某种语言的内容,他们的感受有多深,甚至可能会了解他们为什么会有这样的感受。
- 要有良好的判断力,尽快 完成语言标准化工作。
考虑到所有这些,仅仅通过书本学习能走多远就值得怀疑了。在我的第一个孩子出生之前,我读了所有的*《如何做》*书籍,但仍然感觉自己像个无知的新手。 30 个月后,当我的第二个孩子出生时,我是否又回到书本上复习一下?不。相反,我依靠的是我的个人经验,事实证明,这比专家写的数千页内容更有用、更令人放心。
Fred Brooks 在他的文章*《No Silver Bullet》 (opens new window)*中 提出了一个由三部分组成的寻找优秀软件设计师的计划:
- 尽早系统地甄别顶尖设计师。
- 指派一名职业导师负责潜在客户的发展,并仔细保存职业档案。
- 为成长中的设计师提供互动和互相激励的机会。
这是假设有些人已经具备成为一名伟大设计师所必需的品质;工作就是适当地哄骗他们。 Alan Perlis (opens new window)更简洁地说:“每个人都可以被教导雕刻:米开朗基罗必须被教导如何不这样做。伟大的程序员也是如此”。玻璃市说,伟人有一些超越训练的内在品质。但质量从何而来?是天生的吗?还是他们通过勤奋发展的?正如奥古斯特·古斯托( *《料理鼠王》*中虚构的厨师 )所说,“任何人都可以做饭,但只有无所畏惧的人才能成为伟大的人。”我认为它更多的是愿意将一生的大部分时间投入到深思熟虑的实践中。但也许 “无所畏惧”是对这一点的一种总结。或者,正如古斯托的批评家安东·伊戈所说:“不是每个人都能成为伟大的艺术家,但伟大的艺术家可以来自任何地方。”
所以,去买那本 Java/Ruby/Javascript/PHP 的书吧;你可能会从中得到一些用处。但你不会在 24 小时或 21 天之内改变你的生活,也不会改变你作为程序员的真正的整体专业知识。在 24 个月内努力持续改进怎么样?好吧,现在你开始有所进展了......
# 参考
Bloom, Benjamin(主编)《培养年轻人的才能》 (opens new window),Ballantine,1985 年。
弗雷德·布鲁克斯,《没有银弹》 (opens new window),IEEE 计算机,卷。 20、没有。 4,1987 年,第 4 页。 10-19。
Bryan, WL & Harter, N.“电报语言研究:习惯层次结构的习得。心理学评论,1899, 8, 345-375
Hayes, John R.,*完整的问题解决者 (opens new window)*劳伦斯·埃尔鲍姆,1989 年。
Chase, William G. & Simon, Herbert A. “国际象棋中的感知” (opens new window) 认知心理学,1973 年,4,55-81。
Lave, Jean,《实践中的认知:日常生活中的思维、数学和文化》 (opens new window),剑桥大学出版社,1988 年。