一、慢下脚步,戒骄戒躁
今天,当我们进入一个书店,来到计算机类书架旁边,书架上摆放最多的是关于类似《xxx天学会某种编程语言》的速成类书籍;或者当你在网络上搜索怎样学习编程语言时,这样速成类的书籍更是数不胜数。
结论:要么人们都在急急忙忙地学习计算机,要么计算机比其它任何东西都 容易学。没有书籍教你在几天内学会古典音乐、量子物理,或者是养狗。
让我们分析一下,像一本名为《三天内学会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在他的随笔 《没有银弹》 中定出了一个寻找优秀软件设计者的三步计划:
- 尽可能早地,有系统地识别顶级的设计人员。
- 为设计人员指派一位职业导师,负责他们技术方面的成长,仔细地为他们规划 职业生涯。
- 为成长中的设计人员提供相互交流和学习的机会。
此计划假设某些人已经具备了杰出设计者的必要才能; 要做的只是如何恰当地诱 导他们。 Alan Perlis 说得更简明扼要:“每个人都能被教会雕刻:对米开朗其罗而言, 反倒是告诉他哪些事不要做。同样的道理也适用于优秀的程序员。”
所以尽管买那本Java的书吧。你可能会从中学到点儿东西。但作为一个程序员,你不会在 几天内或24小时内,哪怕是几个月内改变你的人生,或你实际的水平。
三、语言的选择
首先该学哪种编程语言。没有绝对的答案,不过请考虑以下几 点:
- 用你的朋友的。当被问起“我该用哪种操作系统,Windows,Unix, 还是Mac?”,我总是回答:“你朋友用什么,你就用什么。” 你从朋友那能学 到知识,这种优势可以抵销不同操作系统或语言之间本质的差异。也考虑你将来 的朋友:程序员社区 — 你将成为它的一部分如果你继续往前走的话。你选择的 语言是否有一个成长中的社区,还是人数不多、即将消亡? 有没有书籍、网站、 在线论坛回答你的问题? 你喜欢论坛里的那些人吗?
- Keep it simple, stupid. 像C++和Java这样的语言是为经验丰富的 程序员组成的团队进行专业开发而设计的,他们专注于代码运行时的效率。因此, 这些语言有些部分非常复杂。 而你关注的是如何编程,不需要那些复杂性。你 需要的是这样的语言: 对单个的编程新手来说,它易学易记。
- 练习。你偏爱哪种学弹钢琴的方式:通常的交互式的方式,你一 按下琴键就能听到音符;还是“批量”模式,你只有弹完整首曲子才能听到音符? 显然,用交互模式学习弹钢琴更容易些,编程也一样。坚持用交互模式学习并使 用一种语言。
有了上面的准则,我推荐的第一个编程语言是Python或Scheme。因人而异,还有其它 好的选择。如果你的年纪是10岁以下,你可能更喜欢Alice。关键是你要选择并开始实践。
四、学习态度
- 如果你把一个技术搞精搞深,你的知识面自然会很广的。
- 面对于各种比较深的东西(比如C++的奇技淫巧),作为一个实用主义者可能很不屑,但是你也会为此而失去开阔眼界的机会。
- 为明天做一些技术储备,因为你不知道你所缺的东西。多多阅读,多多交流,最好能把自己的心得写下来强化自己的认识和记忆。
- 不要只寄望于在工作中学习,工作没有覆盖的地方你就不学了。真正的高手在工作之余都会花很多时间去自己研究点东西的。
- 永远和高手一起工作。如果你面试的公司的面试太简单了,那就不要去,因为简单的面试通常意味着平庸。去那样的公司工作只会让你的学习速度变慢,甚至倒退。
- 很多东西在概念上是相通的,在哲学层次上是相通的,这是你需要去追求的学习知识的境界。
- “很多时候,你缺少的不是知识而是热情”!