3650 天自学编程

Wenzhao,translationChinese

这篇文章翻译自 Peter Norvig 的 Teach Yourself Programming in Ten Years点击这里阅读原文 (opens in a new tab)

为什么大家都这么着急?

走入任何一家书店,你都能看到诸如《24 小时自学 Java》这样的书,还有数不胜数的有关 C、SQL、Ruby 或者算法的类似书籍。使用 Amazon 的高级搜索功能:title: teach, youself, hours, since: 2000 (opens in a new tab),你能找到 512 本书。最前面 10 本中,有 9 本和编程相关(另外一本是关于簿记的)。把 teach youself(自学)替换成 learn(学习),或者把 hours(小时)替换成 days(天)也会得到类似的结果。

所以,要么人们都急着想学编程,要么编程和其他技能相比尤其简单易学。Felleisen 等人在他们的著作 How To Design Programs (opens in a new tab) 中就用到了这个梗,他们写道:“如果不计较代码的质量有多糟糕,编程是很简单的,傻瓜都能在 21 天内学会。”Abtruse Goose 漫画有一辑也拿这个开涮 (opens in a new tab)

让我们来详细分析一下“24 小时自学 C++”(Teach Youself C++ in 24 Hours (opens in a new tab))这样的标题到底意味着什么

3650 天自学编程

研究者们(Bloom (1985) (opens in a new tab), Bryan & Harter (1899) (opens in a new tab), Hayes (1989) (opens in a new tab), Simmon & Chase (1973) (opens in a new tab))已经发现,在许多领域中——包括下棋、游泳、网球、神经心理学和拓扑学等——要想达到专家级的水平,大约要花 10 年时间的努力。关键在于刻意学习:不是简单的重复,而是选择一个具有挑战性的、稍稍超出现有能力的任务,尝试完成它,分析你的表现和成果,纠正失误,然后不断重复再重复这个过程。银弹似乎不存在:即使天才如莫扎特,4 岁开始作曲,在创作第一首世界级音乐之前也积淀了 13 年的时间。披头士在 1964 年接连空降音乐榜单首位,登上 Ed Sullivan 秀并成为现象级乐队,似乎是一夜之间发生的事情,但他们从 1957 年起就开始在利物浦的小俱乐部里表演。尽管他们早年就征服了乐迷,但直到 1967 年发表了 Sgt. Peppers 后才受到音乐批评界的褒扬。

Malcolm Gladwell (opens in a new tab) 让这个理念广为人知,尽管他具体到了 10000 个小时而不是含糊的 10 年。Henri Cartier-Bresson(1908-2004)也发表过类似的言论:“你的头一万张照片是你最废的照片”(他并没有预料到数码相机的出现,现在有的人一周就能拍这么多)。达到大师级水平则可能需要一生的时间,Samuel Johnson(1709-1784)曾说,“只有奉献一生的时间和精力,才能在某个学科成就卓越”。乔叟抱怨过:“吾生也须臾,学海也无涯”。希波克拉底(c. 400BC)的名言更是广为人知 “ars longa, vita brevis”,这一句其实节选自 “Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”,翻译成中文就是“生也有涯,知也无涯,灵光稍纵即逝,实验变幻莫测,判断殊为困难”(英文原文为 “Life is short, [the] craft long, opportunity fleeting, experiment treacherous, judgment difficult.”)。当然,并不存在这样一个神奇的数字——不同的人精通不同的技艺(比如编程、象棋、跳棋、演奏乐器)需要的时间都是一样的,怎么可能!但是像 K. Anders Ericsson (opens in a new tab) 教授说的那样:“在大部分领域中,即使是最天才的人为了达到最高水平,所需花费的时间也是十分巨大的。10000 小时这个数字只是给受众一个概念:我们这里谈论的是每周 10 到 20 小时,持续数年的不断投入。”

如果你想成为一名程序员

如果你想成为一名成功的程序员,我这里有一些建议:

知道了以上这些,很难不令人怀疑仅仅通过书本学习,一个人能在编程这条路上走多元。在我第一个孩子出生之前,我读了所有“如何……”这样的书,但最终还是免不了变成一个一无所知的新手爸爸。30 个月后,我的第二个孩子临盆时,我重新读了一遍那些书吗?不,相反,我依赖自己的经验,最终事实证明经验比育儿专家们写的大部头更有效。

Fred Brooks 在他的论文没有银弹(No Silver Bullet (opens in a new tab))中提出了一个培养优秀软件架构师的三部曲:

  1. 尽早开始系统地寻找顶级程序员。
  2. 给候选人指定一个导师,负责他的职业发展,并仔细记录其成长轨迹。
  3. 给这些成长中的程序员机会来交流并互相激励。

这个方法假定候选人已经具备了某些成为优秀架构师所必须的特质,用人方所需要做的仅仅是把他们发掘出来。Alan Perlis (opens in a new tab) 以一种更简明的方式陈述了这一观点:“人人都可以学会雕塑,但米开朗琪罗只能学习如何不会雕塑“,他的意思是说卓越的人都有一些内在的特质来帮助他们超越他们所接受的训练。但这种特质是哪里来的?是天生的,还是通过后天的勤奋养成的呢?就像《料理鼠王》的古斯图大厨所言:“人人都能烹饪,但只有无所畏惧的人才能成为大厨”,我更愿意把这句话理解为:要成就非凡,人需要有把一生的大半时间都奉献给这件事的意愿。但是无所畏惧这个词可能仅仅只是其中的一种表达。或许像古斯图的美食批评家安东说的那样:“不是所有人都能成为伟大的艺术家,但是伟大的艺术家可能来自任何地方。”

所以尽管去买 Java、Ruby、JavaScript、PHP 教程书吧,你或许能学到一些有用的东西,但是绝不可能在 24 小时或者 21 天内改变人生,或者是让自己的开发水平有什么质的改变。你说通过 24 个月持之以恒的努力能不能做到呢?嗯,你已经开始上道了……

参考文献

Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.

Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.

Bryan, W.L. & Harter, N. "Studies on the telegraphic language: The acquisition of a hierarchy of habits. Psychology Review, 1899, 8, 345-375

Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.

Chase, William G. & Simon, Herbert A. “Perception in Chess” (opens in a new tab) Cognitive Psychology, 1973, 4, 55-81.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

答案

常见 PC 上各种操作大致所需的时间:

执行的常见操作1/1,000,000,000 秒 = 1 纳秒
从 1 级缓存取数0.5 纳秒
分支预测5 纳秒
fetch from L2 cache memory7 纳秒
Mutex lock/unlock25 纳秒
fetch from main memory100 纳秒
通过 1Gbps 网络发送 2K 内容20,000 纳秒
从内存顺序读 1MB 内容250,000 纳秒
磁盘读寻道时间8,000,000 纳秒
从磁盘顺序读 1MB 内容20,000,000 纳秒
从美国往欧洲发包并返回150 毫秒 = 150,000,000 纳秒

附录:选择编程语言

有几个人问过我第一门编程语言应该选择哪个。没有标准答案,但你可以从这些方面考虑:

基于以上原则,我像编程新手们推荐的第一门编程语言是 Python 或者 Scheme。另外一个可选项是 JavaScript,并不是因为它对新手友好,而是因为有很多在线教程,比如可汗学院的这一套教程。如果学习者的背景比较特殊的话,还有其他一些好的选择。儿童可能会更喜欢 Alice、Squeak 或者 Blockly 这些语言(老年学习者或许也会喜欢)。重要的是做出选择之后马上开始学习。

, CC BY-NC 4.0 © Wenzhao.