摘要:快捷似乎成为这个时代的必须,但是有些事真的可以更快捷吗?可能让许多人失望,有些事真的没有办法快捷, 比如编程!在几千年前,古老的中国有一个智者,他看出这个道理,并把这个道理通过一个故事让人们记住,这个故事就是《拔苗助长》, 可是数千年之后的今天,人们却把“拔苗助长”发挥至极致,并出现全民化的态势。出处
十年学会编程
著者: Peter Norvig
翻译: Dai Yuwen
为何人 人都这么着急?
信步走进任何一家书店,你会看到名为《如何在7天内学会Java》的书,还有各 种各样类似的书: 在几天内或几小时内学会Visual Basic, Windows, Internet等等,一眼望不到 尽头。我在Amazon上做了如下的强力检索:
pubdate: after 1992 and title: days and(title: learn or title: teach yourself)
得到了248个结果。前78个都是计算机类书籍(第79个是Learn Bengali in 30 days)。我用"hours"替换"days",得到了类似的结果: 更多的253书。前77本是计算机类书籍,第78本是Teach Yourself Grammar and Style in 24 Hours。在前200本书中,有96% 是 计算机类书籍。
结论是:要么人们都在急急忙忙地学习计算机,要么计算机比其它任何东西都 容易学。没有书籍教你在几天内学会古典音乐、量子物理,或者是养狗。
让我们分析一下,象一本名为《三天内学会Pascal》的书意味着什 么:
- 学习: 在三天里,你没有时间写一些重大的程序,并从成功或失败中 得益。你没有时间与有经验的程序员合作,并理解在那样的环境下工作是怎么回 事。一句话,你不会有时间学到太多东西。因此他们只能谈论一些肤浅的东西,而 不是深入的理解。正如亚力山大教皇所说,浅尝辄止是危险的事情。
- Pascal: 在三天时间里,你可能学会Pascal的语法(如果你 已经学过类似的语言),但你学不到更多的如何使用这些语法的知识。也就是说, 假如你曾是个BASIC程序员,你可以学着用Pascal语法写出BASIC风格的程序,但你不 可能了解Pascal真正的好处(和坏处)。那么关键是什么? Alan Perlis 说过:“一种不改变你编程的思维方式的语言,不值得去学。” 一种可 能的情况是:你必须学一点儿Pascal(或可能性更大的象Visual Basic 或 JavaScript之类),因为你为了完成某种特定的任务,需要与一个现存的工具建立 接口。不过那不是学习如何编程,而是在学习如何完成那个任务。
- 三 天内: 很不幸,这不够,原因由下一节告诉我们。
在十年里学会编程
研究表明 (Hayes,Bloom)在 任何一种领域内,象下棋、作曲、绘画、钢琴演奏、游泳、网球、以及原子物理学和拓 扑学,等等,要达到专家水平大约都要化十年时间。没有真正的捷径:即使是莫扎 特,4岁时就是音乐神童,13年后才开始写出世界级的作品。在另一方面,披头 士似乎在1964年的Ed Sullivan表演上一炮走红。但他们从1957年就开始表演,在 获得大众青睐后,他们的第一个重大成功,Sgt. Peppers,是1967年发 行的。Samuel Johnson (塞缪尔·约翰逊,英国辞典编纂家及作家)认为要花比十年更长的时间:“在任何领域中出类拔萃都 要用毕生的劳作来取得;它不可能用较低的代价获得。” 而Chaucer(乔叟,英 国诗人)感叹到:“人生短暂,学海无涯。”
这是我为编 程成功开出的方子:
- 设法对编程感兴趣,并且因为它有趣而编一些程序。确保编程一直充满足够 乐趣,这样你才愿意投入十年宝贵时间。
- 与其他程序员交流; 阅读其它程序。这比任何书本或训练课程都 重要。
- 写 程序。 最好的学习方式是 从实 践中学习。 用更技术性的话说,“在一个给定的领域内,个人的最大能力不 是自动地由扩展了的经验取得的,但即使是高度有经验的人也可以通过有意识的 努力来提高自己的能力” (p. 366)和 “最有效的学习需要因人而异的适当难度,目标明确的任务,丰富的信息反 馈,以及重复的机会和错误修正。” (p. 20-21) 此书 Cognition in Practice: Mind,Mathematics,and Culture in Everyday Life是阐明此观点的令人感兴趣的参考文献。
- 如果愿意,在大学里呆上4年或更长(在研究生院里)。你会接触到 一些需要学历证明的工作,你会对此领域有更深的理解。如果你不喜欢学校, 你可以(通过一 些贡献)在工作中获得相似的经验。在任何情况下,光啃书本是不够的。Eric Raymond,The New Hacker's Dictionary一书的作者,说过,“计算机科学不能把任何人变成编程 专家,就象光研究刷子和颜料不会使人变成画家一样。” 我雇佣过的最好的程序员 之一仅有高中程度;他做出了许多优秀的软件,有 他自己的新闻组, 而且通过股票期权,他无疑比我富有的多。
- 和其他程序员一起做项目。在其中的一些项目中作为最好的程序 员; 而在另一些项目中是最差的。当你是最好的,你能测试领导项目的能力,用你 的观点激发别人。当你是最差的,你学习杰出者是怎么做的,了解他们不喜欢做 什么(因为他们吩咐你做事)。
- 在其他程序员 之后接手项目。使自己理解别人写的程序。 当程序的原作者不在的时候,研究什么需要理解并且修改它。思考如何设计你的 程序以便后来者的维护。
- 学 习至少半打的编程语言。包括一种支持类抽象的语言(象Java 或C++),一种支持函数化抽象的语言(象Lisp或ML),一种支持语法抽象的语 言(象 Lisp),一种支持声明规格说明的语言(象Prolog或C++ 的模板),一种支持 共行程序(coroutine)的语言(象Icon或Scheme),一种支持并行的语言(象Sisal)。
- 请记住“计 算机科学”中有“计算机”一词。了解你的计算机要花多 长时间执行一条指令,从内存中取一个字(有cache),从磁盘中读取连续的字, 和在磁盘中找到新的位置。(答 案)
- 参与一种语言标准化的工作。它可以是ANSI C++委员会, 也可以是决定你周围小范围内的编程风格是应该两个还是四个空格缩进。通 过任何一种方式,你了解到其他人在某种语言中的想法,他们的理解深度,甚至一 些他们这样想的原因。
- 找到适当的理由尽快地从语言标准化的努力中脱身。
明白了这些,仅从书本 中你能得到多少就成了一个问题。在我第一个孩子出生前, 我读了所有的(关于育儿的)How to 书籍,仍然感觉是个手足无措的新手。30个月以后,我 的第二个孩子快要出生了,我回头温习这些书了吗? 没有。相反,我依靠我的个人 经验,它比专家写的数千页书更有用和可靠。
Fred Brooks在他的随笔 《没有银弹》 中定出了一个寻找优秀软件设计者的三步计划:
- 尽可能早地,有系统地识别顶级的设计人员。
- 为 设计人员指派一位职业导师,负责他们技术方面的成长,仔细地为他们规划 职业生涯。
- 为成长中的设计人员提供相互交流和学 习的机会。
此计划假设某些人已经具备了杰出设计者的必要才能; 要做的只是如何恰当地诱 导他们。