代码改变世界

十年学会编程

2009-05-27 07:56  Logic0  阅读(2368)  评论(0编辑  收藏  举报
我顶 字号:

为何每个人都这么心急?

走入任何书店里,你会看到《7天内学会Java》靠在一堆提供在几天或者几小时内学会VB、Windows、Internet...教学的书籍旁。我在Amazon.com上搜索:
      pubdate: after 1992 and title: days and
      (title: learn or title: teach yourself),

得到的书籍有248本,前面78本都是计算机书籍(第79本是《30天内学会孟加拉语》)。我用“hours”代替“days”再次搜索,得到非常相似的结果:多于253本书,接着前面77本计算机书籍的第78本是《24小时内学会语法和语态》,在前面200本书里面,96%是计算机书籍。

我得到的结论是--人们非常急于学习计算机相关知识,或者不知道何故,计算机难以置信的比其他任何东西都要容易学。却没发现一本书是关于在多少天内学会演奏贝多芬音乐、量子物理、甚至学会养狗。

让我们分析一下像《3天内学会Pascal》这样的书名的意味:

  • 学会:在3天内你根本没有时间写出一个像样的程序,不会有使用它编程的成功或失败过程中学习的经历。也不会有时间和一个经验丰富的程序员一起工作,更不会理解程序在实际的编程环境中是怎样的。简而言之, 你没有足够的时间学习更多的。所以这样的书只能谈一些肤浅的知识,不会让你深入的理解。亚历山大说过,肤浅的学习是危险的事情。
  • Pascal:3天内也许你能搞懂Pascal的语法(如果你以前过另外一种类似的语言),但是你不能学会如何利用这样的语法。简而言之,假如你是个Basic程序员,你会用Basic风格写Pascal代码,但不会明白什么是Pascal的优点(或者不足)。为什么有这样的观点?Alan Perlis说过:“一门语言没有影响你的编程思想,它就不值得学习。”另一个观点,你只是学习了Pascal(更像,Visual Basic或者JavaScript)很少的部分知识,因为你只是需要使用这样的工具去完成一个特定的任务。但是你没有学会如何编程;你只是学会如何完成一些特定的任务。
  • 3天内:不幸地,如下节要说的,这根本不够。

10年学会编程

学者们(Hayes, Bloom)研究表明,要想成为业界专家,任何一个宽广的领域,都需要10年的时间,比如下棋、作曲、绘画、演奏钢琴、游泳、网球,和研究神经心理学、地质学。这说明没有捷径:即使莫扎特,在4岁的时候就已经显示了音乐天赋,但在他写出了世界级的音乐作品前,他也花了13年的时间。另外一个例子,披头士乐队,好像是在1964年突然在Ed Sullivan冒出来的,但其实他们在1957年就开始演出了,并在更早就组成了乐队,他们第一张震撼唱片《Sgt.Pepers》(《佩帕军士》)在1967年才发行。Samuel Johnson认为10年可能还不够,“任何领域的卓越成就只有靠穷极一生的努力来获得,别想用更少的代价就取得。”Chaucer感叹到“生命如此短暂,而要学的东西如此多。”

下面是我对如何在编程上取得成功的建议:

  • 保持对编程的兴趣,感觉编程有乐趣。保证你在10年后都能够有乐趣。
  • 和其他程序员交流,阅读其他人的程序,这比读书和培训重要得多。
  • 写程序。最好的学习方法是边做边学。用更加学术的话来讲:“在一个给定的领域中,个人能力的提高并不会是自动的获得,就像经验一样的,把已有经验的延伸、扩展,而是需要通过特别有经验的人经过很大的努力来增长”。“而且对于特定的人,最有效的学习需要一个定义良好的、有一定难度的任务、该任务还要有丰富的信息反馈、有重复和纠正错误的机会。” 书《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life 》(《在实践中认识:心理,数学,和文化在人生中的每一天》)有趣的证明了这样的观点。
  • 如果你愿意,花4年时间呆在大学里(或者在研究院呆更长的时间)。这会让你能得到那些需要学历的工作,并且会让你对这个领域有更深的理解。但是如果你不喜欢上学,你也可以(做一些贡献)在工作中得到类似的经验。无论如何,仅有书本知识是不够的。《The New Hacker's Dictionary》(《新黑客字典》)作者Eric Raymond说,“计算机科学不像绘画,当学会了画笔和颜料技巧就能成为一个专业的画家,计算机科学教育不能让任何人成为专业的程序员。”。我雇佣过的最好的程序员之一就只有中学学历,但他写出了许多绝好的软件,拥有他自己的新闻组,并且因为享有股权比我有钱得多。
  • 和其他程序员一起做项目。在一些项目中做最好的程序员,在其他的一些项目中做最糟糕的程序员。如果你是最好的程序员,就试着领导一个项目以提高你的能力,通过你的远见来激发其他人。如果你是差劲的程序员,就学习其他高手是如何做的,并且去做那些他们不喜欢做的部分(因为他们让你去给他们做这些部分)。
  • 在其他程序员后面接手一个项目,因为需要你理解其他人写的程序是棘手的事情。看看在原作者不在的时候你如何理解和修改他们的代码。考虑如何设计你的程序能让接手你程序的人更容易理解。
  • 至少学会6种计算机语言。包括一种支持class abstractions(比如Java和C++)的语言,一种支持functional abstraction(比如Lisp和ML)的语言,一种支持syntactic abstraction(比如Lisp)的语言,一种支持declarative specifications(比如Prolog和C++模板)的语言,一种支持coroutines(比如Icon和Schema)的语言,一种支持parallelism(比如Sisal)的语言。
  • 记住“计算机科学”中的“计算机”。搞懂你的计算机执行一个指令要多长时间,从内存中取一个字要多长时间(在Cache命中和没命中的情况下),从磁盘上读连续的字要多长时间,在磁盘上搜索一个新位置要多少时间。
  • 参与制定一种语言标准。可以是ANSI C++委员会,也可以是把你周围人的几种编码风格统一起来,该采取几个字符缩进的锯齿状。不管是哪种,你都能弄懂其他人喜欢语言中的什么、有多喜欢、权衡他们为什么有这样的感觉。
  • 对将要开始的语言标准化取得成功充满信心。

做到上面的这些,光靠书籍学习就能得到是值得怀疑的。我第一个孩子降生前,我几乎读了所有的“How To”系列的书,但是还是感觉像个菜无能的初学者。30个月后,等我第二个孩子降生后,我又把这些书都又复习一遍了吗?不,没有,我认识到靠我自己的个人经验要比那些专家写到上千页的书上的东西有用和可靠得多。

Fred Brooks,在他的散文《 No Silver Bullets》(其实,就是《人月神话》中提到的没有银弹…加注)提出分三步的方法,发现优秀的软件设计师:

       1.尽可能早的发现设计天才。
       2.指派一个职业生涯的导师为他的发展前景负责,并且仔细保持一份职业生涯的档案。
       3.为成长的设计师们提供机会,使他们相互激励和影响。

这样做的前提是这些人已经有发展成为伟大设计师所必备的潜质;这样的工作需要一直很有耐心。Alan Perlis更直接:“每个人都需要教雕琢:Michelangelo却被告诉什么不需要做,这个道理也同样适合于伟大的程序员。”

前进一步,买这样的Java书;你会为它耗尽精力。但是你并没有改变你的生涯,你也不会在24小时、一天、几个月内成为卓越的程序员。