为什么每个人都这么着急?
信步走进任何一家书店,你会看到名为《如何在 24 小时内学会 Java》的书,还有各 种各样类似的书: 在几天内或几小时内学会 C,SQL,Ruby,算法等等,一眼望不到 尽头。我在 Amazon 上做了如下的高级检索 :【标题:教授:自己:小时:从:2000】得到了512 本这样的书。在前十本中有九本是关于编程的书(其它的是关于记账的)。把自学换成 “学” 或者用 "小时" 换成 "天",可以得到了类似的结果。
从上面的搜索结果可以看出来,要么就是人们对计算机技术的学习如饥似渴,要么就是计算机技术实在太简单,不费吹灰之力就能学会。
Felleisen 以及其它人在他们的著作《程序设计方法》一书中明确指出了这种“速成”的趋势,并评论到:“垃圾的编程技术当然非常容易,傻子都能在 21 天之内学会,哪怕他天生就是个白痴。” Abtruse Goose 的漫画中也有类似尝试。
让我们分析一下,像一本名为《24 小时内学会 C++》的书意味着什么:
- 学习: 在 24 小时里,你没有时间写一些重大的程序,并从成功或失败中得益。你没有时间与有经验的程序员合作,并理解在 C++ 的环境下工作是怎么回事。一句话,你不会有时间学到太多东西。因此他们只能谈论一些肤浅的东西,而不是深入的理解。正如亚历山大教皇所说,浅尝辄止是危险的事情。
- C++: 在 24小时的时间里,你可能学会 C++ 的语法(如果你 已经学过类似的语言),但你学不到更多的如何使用这些语法的知识。也就是说, 假如你曾是个 BASIC 程序员,你可以学着用 C++ 语法写出 BASIC 风格的程序,但你不可能了解 C++ 真正的好处(和坏处)。那么关键是什么? Alan Perlis 说过:“一种不改变你编程的思维方式的语言,不值得去学。” 一种可能的情况是:你必须学一点儿 C++(更有可能的是 JavaScript 或 Processing 之类),因为你为了完成某种特定的任务,需要与一个现存的工具建立接口。不过那不是学习如何编程,而是在学习如何完成那个任务。
- 24 小时内: 很不幸,这不够,原因后面我会告诉你。
十年学会编程
研究人员(Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973))一系列调查显示,在各个领域内,要想获得专业级别的水平,大约需要 10 年时间的努力。参与此项调查的领域包括:国际象棋,作曲,发报,绘画,钢琴演奏,游泳,网球以及对神经心理学和拓扑学的研究。若要在某一领域内达到专家级的水平,其关键在于“刻意练习”,也就是说,并非是机械地,一遍又一遍地练习,而是要不断地挑战自我,试图超越自身当前的水平,通过不断的尝试挑战,并在尝试的过程中对自身的表现进行分析和总结,汲取经验,改正错误。把这一过程不断重复,才能取得成功。所谓的“捷径”是不存在的,即使对于莫扎特这种天才来说,也没有捷径可走,尽管 4 岁就开始作曲,可是他也花了 13 年的时间,才真正地写出了世界级的作品。再举一个例子,甲壳虫乐队(The Beatles),他们似乎在 1964 年凭借一系列热门单曲和其在艾德沙利文秀(The Ed Sullivan show)上的演出一炮而红,但是你也许不知道,他们早在 1957 年就在利物浦和汉堡两地进行小规模演出了,而在此之前的非正式演出更是不计其数。甲壳虫乐队的主要成名曲《Sgt. Peppers》,则是 1967 年才发行的。
Malcolm Gladwell 推广了这个理念,尽管他的重点在 10000 个小时而不是 10 年。Henri Cartier-Bresson (1908-2004)说过,“你所拍摄的前 10000 张照片都是最糟糕的”。(他没有预料到,有了数码相机后,有些人可以在一周内达到这个数量~)真正的匠人或许需要花费一生的时间。Samuel Johnson (塞缪尔·约翰逊 1709-1784)说:“在任何一个领域要想做到顶尖的水平,势必穷尽一生的精力,否则根本无法企及。” Chaucer (乔叟 1340-1400)也发出过“生命如此短暂,技能如此高深”的感叹。Hippocrates (希波克拉底,约 400BC)因写出这样的句子而被人称颂:“ars longa, vita brevis”,该句是来自于一个更长的引用:”Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, 这段话(拉丁文)翻译成英语就是:“生命很短暂,但是技艺却很高深,机遇转瞬即逝,探索难以捉摸,抉择困难重重”。
显然,没有一个确定的值可以作为标准答案:假定所有技能(比如编程,国际象棋,跳棋,音乐)都需要同样的时间来成为专家,或者假定任何人都需要一样的时间,是不合理的。正如 K. Anders Ericsson 教授所指出的那样:“在绝大多数领域,哪怕是最有天分的个人,他们达到最高水平所耗费的时间也是极为显著的。10000 小时这个数字,只是想让你意识到,即便是人们口中的那些最具天赋的个体,想达到最高水平也需要年复一年持续稳定的投入。”
你想当程序员吗?
这是我成功的原因:
- 设法对编程感兴趣,并且因为它有趣而编一些程序。确保编程一直充满足够乐趣,这样你才愿意投入十年/10000 小时宝贵时间。
- 写程序。 最好的学习方式是 从实践中学习。 用更技术性的话说,“在一个特定的领域内,个人的能力不是自然地由经验的积累取得的,但即使是相当有经验的人,也可以通过刻意练习来提高自己的能力” 。“最有效的学习是因材施教,比如适当难度,目标明确的任务,丰富的信息反馈,反复练习和对错误进行修正。” 此书 Cognition in Practice: Mind,Mathematics,and Culture in Everyday Life 是阐明此观点的令人感兴趣的参考文献。
- 与其他程序员交流; 阅读别人写的程序。这比任何书本或训练课程都重要。
- 如果有机会,在大学里呆上 4 年(或更长,在研究生院里)。因为有一些工作需要更高的文凭,而且你会对此领域有更深的理解。如果你不喜欢学校, 你可以(会有所牺牲)通过自学或在工作中获得类似的经验。在任何情况下,光啃书本是不够的。Eric Raymond,The New Hacker's Dictionary 一书的作者,说过,“计算机科学不能把任何人变成编程专家,就象只研究画笔和颜料不会使人变成画家一样。” 我雇佣过的最好的程序员之一,仅有高中文凭,他做出了许多优秀的软件,有他自己的私人论坛, 而且通过股票和期权买到了自己的酒馆。
- 和其他程序员一起做项目。在其中的一些项目中作为项目负责人, 而在另一些项目中协助他人。当你是项目负责人,可以测试你的领导力,用你的言行去激发别人。当你仅仅是参与者,你可以默默学习别人是怎么做的,了解他们不喜欢做什么(因为他们吩咐你做事)。
- 维护他人的项目。使自己理解别人写的程序。 当程序的原作者不在的时候,研究和尝试理解,最后修改它。思考如何设计你的程序以便后来者的维护。
- 学习至少半打的编程语言。包括一种支持类抽象的语言(像 Java 或 C++),一种支持函数化抽象的语言(像 Lisp 或 ML 或 Haskell),一种支持语法抽象的语言(像 Lisp),一种支持声明规格说明的语言(像 Prolog 或 C++ 的模板),以及那些强调并行的语言(像 Clojure 或 Go)。
- 请记住“计算机科学”中有“计算机”一词。了解你的计算机要花多长时间执行一条指令,从内存中取值(有cache),从磁盘中读取连续的值,和在磁盘中找到新的存储位置。
- 参与一种语言标准化的工作。它可以是 ANSI C++ 委员会, 也可以是决定你周围小范围内的编程风格,是应该两个还是四个空格缩进。任何一种方式,你都会了解到其他人在特定语言中的想法,他们的理解深度,甚至一些他们这样想的原因。
- 具备良好的判断力,能尽快地从语言的禁锢中脱身。
明白了这些,你应该就能明白,你在书本中能够得到的知识非常有限。在我第一个孩子出生前, 我读了所有的(关于育儿的)How to 书籍,仍然感觉是个手足无措的新手。30 个月以后,我的第二个孩子出生前,我回头温习这些书了吗? 没有。相反,我根据我的个人经验,发现它比专家写的数千页的书籍更有用和可靠。
Fred Brooks在他的《人月神话》 中定出了一个寻找优秀软件设计者的三步计划:
- 尽可能早地,有系统地识别顶级的设计人员。
- 为设计人员指派一位职业导师,负责他们技术方面的成长,仔细地为他们规划职业生涯。
- 为成长中的设计人员提供相互交流和学习的机会。
此计划假设某些人已经具备了杰出设计者的必要才能; 要做的只是如何恰当地诱导他们。 Alan Perlis 说得更简明扼要:“每个人都能学会雕刻:对米开朗其罗而言, 反倒是告诉他哪些事不能做。同样的道理也适用于优秀的程序员。”
Perlis 认为,伟大的软件开发人员都有一种内在的特质,这种特质往往比他们所接受的训练更重要。但是这些特质是从哪里来的呢?是与生俱来的?还是通过后天勤奋而来?正如 Auguste Gusteau(动画电影《料理鼠王》里的幻象大厨)所说,“谁都能做饭,但只有那些无所畏惧的人才能成为大厨!”我把“将你生命中的大部分时间花在刻意练习上”视作为一种选择!但或许“无所畏惧”才是更关键的。或者,就像是《料理鼠王》里那个与 Gusteau 作对的刻薄的美食评论家 Anton Ego 说的那样:“不是任何人都能成为伟大的艺术家,不过,伟大的艺术家可以来自任何地方。”
所以你大可以买几本 Java/Ruby/Javascript/PHP 的书,从中学到点儿东西。但作为一个程序员,你不会在 21 天内或 24 小时内改变你的人生,或你实际的水平。你尝试过连续 24 个月不懈努力提高自己么?呵呵,如果你做到了,好吧,那么你开始上道了…
网友评论