程序英雄传(二)

Posted: October 25, 2010 by lefteyefocus in 侃大山

迪爷爷

今天开始八迪爷爷。谁是迪爷爷?就是那个和老婆和咖啡,一不小心喝出了个最短路径算法的Edsger W. Dijkstra爷爷。之所以想起先八他,是因为他在很多方面是高爷爷的死对头,当然,不是在个人恩怨方面,而是学术观点方面。

迪爷爷名字的发音也困扰了我将近半年,每次和同学谈到迪爷爷,我都是含混其词,或者用the creator of the shortest path algorithm来代替。和NND不同的是,我倒没有以为迪爷爷是印度人,我以为他是德国人,因为我当时的印象里,德国专产数学和物理大牛,像爱爷爷和冯爷爷。

第一次听说迪爷爷,当然是在学习迪爷爷的最短路径算法的时候,当时的印象就是:这厮真TMD聪明!怎么想出来的?当然,那个时候是我最初接触算法这个概念的时候,所以难免大惊小怪。事实上,迪爷爷算法虽然可称得上是最短路径算法的一个里程碑,但确实是迪爷爷的妙手偶得而已。据迪爷爷自述,那个算法是他和迪奶奶在一家咖啡馆的露台上喝咖啡时灵机一动想到的。我不厚道地猜测,迪爷爷是不是因为太专注自己的工作被迪奶奶骂,于是迪爷爷就想怎样找到一条最短的路迅速跑回家,于是就有了迪爷爷算法。。。

后来在学习操作系统时,又接触到了迪爷爷提出的五个团团围着圆桌坐的哲学家在餐桌上因为筷子不够而抢筷子的问题。这牛人的思维就是不一样,要是我碰到这样的问题直接就叫服务员:请帮我们拿几双筷子来,而迪爷爷想的是怎么样让五个人用五只筷子吃饱吃好。。。

后来又接触了无数由迪爷爷首创的概念,偶对迪爷爷的葱白与日俱增。尤其是迪爷爷在一些关于computer programming的基本看法上,和高爷爷针锋相对,看他们对对方的见解的辩论就像看绝世高手过招一样精彩,于是我从此走上了对迪爷爷的追星之路。。。

有趣的是,和高爷爷一样,迪爷爷大学本科也是学物理的。由于理论物理要进行大量的数值运算,所以迪爷爷也不可避免的在修习物理的同时,开始接触计算机,然后同样不可避免地发生了移情别恋。

在要不要和自己的原配物理离婚,把computer programming这个小三扶正这个问题上,迪爷爷当年还是进行了一番艰苦的思想斗争的。和今天很多人在纠结做programmer有没有前途一样,迪爷爷当年也不知道programmer能不能成为一个让人尊敬的职业。

在和programming私通了三年后,迪爷爷再也坐不住了,敲开了他当时在阿姆斯特丹数学中心的老板A. van Wijngaarden办公室的门,和老板进行了一次长谈。。。

当年22岁的迪爷爷搓着双手坐在老板的对面,谈论的中心话题就一个:是不是应该把小三扶正。迪爷爷当时的担忧是,原配physics毕竟是名门闺秀,这样的婚姻让人尊重,而小三programming虽然貌美如花,但是出生来历不明,娶进门来怕是要被人笑话。。。

在耐心地听完小迪同学的纠结后,老A深沉地对小迪说:虽然还没有什么辉煌的生世来历,计算机已近来到了这个世界上,你难道就不能做一个给她辉煌生世的缔造人?

年轻人的特点就是心比天高,牛人更是这样,小迪被老A这么一忽悠,变得热血沸腾,是啊,吃软饭和养活养好一个尤物之间的成就怎么能够相比?!在走出老A办公室时,小迪已经和几个小时前走进办公室时判若两人了,走进办公室的小迪心里只有一个字:乱。走出办公室的小迪心里还是一个字:离!

迪爷爷后来谈到这次谈话,他承认这次谈话对他的一生产生了不可磨灭的重要影响。而且所幸得是,是正面的影响。迪爷爷语重心长地对其他老牛人们讲:以后我们在给年轻人什么人生建议时,一定要慎之又慎,因为有的时候他们真的会照着去做的。(开复GG你别东张西望,就是说你呢!)。。。

迪爷爷的担心不是没有道理的,当时programmer根本就不能算是一种职业,在迪爷爷的祖国荷兰更是少有人知道programmer是啥东东,以至于1957年迪爷爷新婚大喜的时候,去政府部门登记结婚,在要求填写职业时,迪爷爷填了一个programmer,被公务员一把把表格扔了回来:捣什么乱?!啥是programmer?没这个职业,重填!迪爷爷只好郁闷地重新填了个理论物理学家,才算顺利地把迪奶奶娶进了门。迪爷爷后来不无骄傲地说,他是荷兰进入computer programming领域的第一人。。。。

迪爷爷最初的编程训练是从在剑桥大学的一个夏季课程开始的,这个课程教授一些机器语言的编写。当时教授这门课的是英国计算机界的大牛 M. V. Wilkes。老M还要求迪爷爷从老板老A处要了封推荐信,证明他的数学足够了才允许迪爷爷选了这么课。

不知道当初老A忽悠迪爷爷选了programming为终身职业是不是出于私心,反正迪爷爷在上完了老M的夏季编程课程后,老A把迪爷爷招回数学中心refactor自己当年写的程序,于是迪爷爷就成数学中心的一名小程序员。

在发表了最短路径算法后,迪爷爷声名大噪。但是没过多久,迪爷爷就向世人证明了迪爷爷算法不过是一只大牛的牛刀小试而已。。。

从上个世纪50年代开始,随着需要计算机解决的问题渐渐开始不仅仅局限于数值运算,所需要解决的问题越来越复杂,迪爷爷算就是一个例子。于是对于一个更加结构化得语言的呼声渐趋强烈,Algol 60就在这个时候应运而生。。。

Algol语言是继Fortran语言之后的第二个高级程序语言,迪爷爷婚后第二年就投身到Algol 60的标准制定中去了。虽然参加很多次标准制定会议,但在Algol 60标准定义的最终报告发布时,在13人的作者名单里却看不见迪爷爷的名字。原因是我们的迪爷爷长脾气了,因为对其中的很多标准的不认同,迪爷爷拒绝把自己的名字加到作者名单里。从这个时候开始,迪爷爷在开始扮演CS界的双重身份,一方面是个软硬通吃的大牛(当然主要还是吃软),另一方面就是一个语不惊人死不休的CS愤青。。。

从1962年开始,迪爷爷被TH Eindhoven (Eindhoven Polytechnic)聘为终身教授,虽然在米国同类职位已经被称为计算机科学系教授,但是迪爷爷反对这种叫法。他认为计算机科学的专业基础是数学,所以他应该是数学系教授。他的所有学生也要经过三年的系统的数学训练。(估计滑铁卢大学采取的也是迪爷爷的主张,当年偶想报滑铁卢大学的CS系,结果被招生办告知:我们没有计算机科学系,我们只有数学系。。。)

不久,迪爷爷就被他在TH Eindhoven数学系的同事们惹怒了。原因是迪爷爷带了一个PHD学生,该学生是迪爷爷的得意门生,结果该同学的毕业论文被迪爷爷数学系的同事们判了死刑,迪爷爷的得意门生屁挨不着地。TNND,打狗还要看主人呢,哦不,不看僧面还得看佛面呢,从此,迪爷爷死瞧不上他的那些数学系同事们。

他后来在“How do we tell truths that might hurt?"一文里说:Programming is one of the most difficult branches of applied mathematics; the poor mathematicians had better remain pure mathematicians. 他这句话就是挤兑他的那些数学系同事们的。

数学系的教授们反驳说:切!programming有啥牛逼的?我们个个也都会编程做数值运算呀,迪爷爷接着说:The easiest machine applications are the technical/scientific computations. 反正就是他那帮数学系同事怎么看怎么是怂人。。。

迪奶奶后来说,那段时间迪爷爷过得是相当地郁闷,但是迪爷爷这样的大牛是不会让自己被郁闷淹没,而是把有限的郁闷投入到无限的工作中去,正是这个时候,迪爷爷开始写他著名的 Notes on structured Programming.

于是Structured Programming的理论横空出世了。大概是为了报复迪爷爷,迪爷爷的数学系同事们对于Notes on structured Programming的发表反应表现得相当冷淡。不但没人给迪爷爷打电话索要签名版留作纪念,很多更是装着都没听说有这回事。迪爷爷哪吃这一套,他把自己的notes印了几十份,给自己欧洲加美国的同事们每人寄了一份去。。。

关于Structured Programming,具体内容就不八了。要提的一个八卦是,有一次迪爷爷笑话高爷爷写的程序是”没结构“(instructed program),高爷爷当时也没敢反驳,不过后来高爷爷提出Literate Programming时,终于报了一箭之仇,他说迪爷爷写的程序那叫一个”没文化“(illiterate program)。。。

迪爷爷勇于得罪人,特别是勇于得罪同行是出了名的。一次他应邀旁听另外一名很有名的教授讲课关于computer network的课,迪爷爷拿了大堆问题把人家炸得晕头转向,然后他大摇大摆地课半中间走了。还有一次MIT的一位很牛掰的科学家去迪爷爷的学校客座讲课,这位教授讲得非常卖力,累得她说了句:I am losing my voice。也不知道她说的啥观点惹了迪爷爷不高兴,迪爷爷接下茬儿地回答到:Thank God。结果是系里面赶紧给迪爷爷擦屁股,系主任赶紧发了封道歉信向人家道歉。

迪爷爷在CS界就是一个坑王,随随便便几句话,就往往引起业界的激烈讨论和争论。其中非常有名就是GOTO大战,他的一个两页的笔记”GOTO considered harmful“一石激起千层澜。他的语言经常辛辣得让人难以接受,比如说他讲:It is practically impossible to teach good programming to students that have had prior exposure to BASIC,as potential programmers they are mentally mutilated beyond hope of regeneration。

这这这,太伤人感情了!不知道比尔大叔看到这句话是什么感受(比尔大叔就是从BASIC开始写程序的),反正N多当时正在用BASIC的,以及以前曾经用过的,不管是票友还是专家,都坐不住了,像迪爷爷抗议,抗议他严重伤害了BASIC爱好者和使用者的感情。。。

迪爷爷才没功夫和反对者打嘴仗,他在我心目中像邪派顶级高手任我行一样,昂然一笑又开始挖新坑了。迪爷爷的paper大都很短,很多就2-3页,但是这些个只言片语,最后很多都成了CS界的一个专门的研究领域,真是随手成坑啊!

这些发表的paper还只是迪爷爷武功的一小部分,大部分武功他只在自己写的程序中去验证,发表论文往往是为了应景,还要加上句:请勿置顶。。。

牛人就是牛人,得罪再多的人他也是牛人,甚至是更牛的人,为了表彰迪爷爷在compiler construction, operating systems, distributed systems, sequential and concurrent programming, software engineering,以及graph algorithm这样广泛的领域做出的卓越贡献,1972年的图灵奖决定颁发给迪爷爷。

迪爷爷在图灵奖颁奖感言的时候做了个名为The Humble Programmer的演讲。当底下的业界同行们惊奇迪爷爷居然也学会Humble了?看来给他发图灵奖还是有好处的。十分钟过去后,底下的人慢慢咂摸出滋味来了,这哪里是个humble programmer,这简直就是个BSO programmer嘛!

整个演讲简直就是迪爷爷给他的学生们上课一样,迪爷爷以不容置疑的口吻对computer science, computer programming的过去进行了总结,并指定了未来的发展方向。整个演讲里大概和humble扯得上一点关系的就那么一句:The competent programmer is fully aware of the strictly limited size of his own skull…

也许是意识到肯定会有很多人不买账,在演讲结束前,迪爷爷说:In principle I leave it to you to decide for yourself how much weight you are going to give to my consideration, knowing only too well that I can force no one else to share my beliefs.

听见没有,是”原则上我应该这样那样“,实际上你要不听我的,嘿嘿。。。

拿了图灵奖后的迪爷爷依然是我行我素,他每星期二去一次大学,后来这天就成了著名的”星期二俱乐部“,星期二俱乐部相当于一个研讨会,不过他们没有固定的议题,有点像”太太的客厅“一样,大家啥都聊,虽然很多专业上的讨论,但也不乏八卦花边。

参加俱乐部的有他的PHD学生,但是也有一些业界知名的同行,迪爷爷又了自己虽然不大但是很稳定的粉丝团,很多人模仿他文风,模仿他用自来水笔,甚至模仿他穿的拖鞋。。。

说到迪爷爷的自来水笔,要好好八一八。迪爷爷一生数千篇文章,没有一篇是计算机里打出来的。迪爷爷先是用打字机,后来干脆他的Mont Blanc自来水笔抄。每篇文章都编为EWD****,EWD是他名字的initials,CS界把他的文章称为EWD reports。迪爷爷最后用自来水笔来写文章有可能有BSO的成分在里面,因为迪爷爷的字那是相当地漂亮。后来有人在Macintosh机上设计了Dijkstra字体,字体设计好后,有人用这个字体打了封信给迪爷爷寄去,把迪爷爷给吓了一跳:我不记得我写过这么篇东西啊???

和高爷爷一样,迪爷爷的文章也写的好。有意思的是,提倡literate programming的高爷爷专门为了文章中的公式排版去写了Tex,而主张structured programming的迪爷爷却尽量不在文章中用任何公式,他那篇著名的Cooperating sequential processes就一个公式都没有,他还极力反对用图来表达概念以及解释算法。一个精于graph algorithm的人,居然反对使用graph,矛盾吧?

不光是字和文章写得有特点,迪爷爷说话也有特点。初次和迪爷爷说话的人很不习惯,你一个问题问完了,迪爷爷那边啥反应没有。你正怀疑他是不是耳背,准备把话重复一遍时,迪爷爷开开口回答问题了。他没句话出口前都要经过思考,从而可见,迪爷爷是个主张三思而后行的人。

关于迪爷爷对三思而后行的拥护,还有个八卦,是我们上Software Engineering课的时候教授讲过给我们听的。说是有记者采访迪爷爷,问他对于Software Engineering有些什么看法。迪爷爷跟记者说,在他们家乡有个软件公司,公司里有一条规矩,那就是如果项目的时间还没有耗过70%,开发人员不允许写任何code,只允许不断地做设计,修改,再设计,再修改。有一次在项目时间过去一半多的时候,有一个dev去问项目经理:咱可以开始写code了吗?项目经理回了句:你就不能找一件有意义的事情做吗?迪爷爷的故事让记者听得一楞一楞的。迪爷爷补充道:这个公司做得很成功。

关于testing,迪爷爷也有一个很牛的见解。他说:Program testing can be very effective way to show the presence of bugs, but is hopelessly inadequate for showing their absence. 就是说测试查出了bug,说明了这个程序有bug,但是测试查不出bug,不代表没有bug。然后他说真正有效的抓bug的方法是用证明来显示程序的正确性。照迪爷爷的要求来看,tester就太牛了,因为不但要有理解程序中的结构和算法的能力,更要有证明结构和算法正确性的能力。。。

高爷爷大概对这点不以为然,所以高爷爷说了那句著名的:Beware of bugs in the above code; I have only proved it correct, not tested it。这俩爷爷就这样经常你来我往地过招。很多人都爱拿高爷爷和迪爷爷做对比。有一次有人说到高爷爷带过24个PHD,然后问迪爷爷:你带了几个PHD啊?迪爷爷倒也没怒,笑着说:2个,so what? 爱因斯坦还一个都没有呢。。。 (注:后来迪爷爷又带出来两个PHD,所以迪爷爷总共带了4个PHD。)

自上世纪70年代起,迪爷爷就开始致力于程序正确性证明的研究,他反对程序全部写完后再弄个又臭又长的证明,因为你还得证明你证明的正确性。所以他主张编程和证明相辅相成,携手共进,边编边证。这个主张可能是来源于小时候迪爷爷妈妈的教诲。迪爷爷的妈妈是个数学家,而且是为很有个性的数学家。迪爷爷小时候妈妈教他学数学,妈妈对迪爷爷讲:儿啊!任何一个证明,如果你的证明要超过六行,或者说明你的问题可以分解为子问题,或者说明你已经证错了。。。

从发现算法到证明算法,显示了迪爷爷从一流高手到超一流高手的转变。王国维在《人间词话》说:“古今之成大事业、大学问者,必经过三种之境界:‘昨夜西风凋碧树。独上高楼,望尽天涯路’。此第一境也。‘衣带渐宽终不悔,为伊消得人憔悴。’此第二境也。‘众里寻他千百度,蓦然回首,那人却在,灯火阑珊处’。此第三境也。” 这个说法也同样适用于computer programming,尤其是算法领域。

第一重境界是大部分本科毕业生就应该能够达到的理解算法和应用算法;第二重境界则应达到迪爷爷早年那样发明算法,改进算法;第三重境界则不但能够证明算法的正确性,而且能证明算法的最优性,甚至先证明了可能的最优级别,然后根据证明逆向发现算法。

正当大家屏息等待迪爷爷再次在CS界搅起巨澜的时候,迪爷爷因癌症在自己荷兰的家中与世长辞了,不知道当时全体CS界是长长的叹息,还是长舒了一口气。于我,网上有篇悼文完全能代表我的心情,现在全文抄录如下,用它来结束我对迪爷爷的八卦:

2002年8月8日,我象往常一样查看自己在extremeprogramming电子小组上订阅的newsletter。突然看到这个小组上的稀客、OO教父Grady Booch的发言,题目是Dijkstra。我以为大家在讨论Dijkstra教授提出的什么难题,定睛一看,才知道是一篇类似生平介绍式的讣告——在与癌症进行了多年的斗争之后,伟大的荷兰计算机科学家Edsger Wybe Dijkstra已经于2002年8月6日在荷兰Nuenen自己的家中与世长辞!终年72岁。

原来如此!

这个Dijkstra,就是那个提出“goto有害论”的Dijkstra,就是那个提出信号量和PV原语,解决了有趣的“哲学家聚餐”问题的Dijkstra,那个Dijkstra最短路径算法的创造者,第一个Algol 60编译器的设计者和实现者,THE操作系统的设计者和开发者,那个与D. E. Knuth并称为我们这个时代最伟大的计算机科学家的人。

阿兰图灵的自杀是在办个世纪之前,冯诺依曼去世也已经多年,作为这个相对新兴的行当中的从业者,我们似乎已经很习惯于从相信,从书上读到的每个名字都是仍然在世的活生生的人,都是我们这个时代的骄傲。

无论是仍然健硕的D. E. Knuth,Fred Brooks,Dennis Ritchie, Ken Thompson, Brian Kernighan, 还是正当盛年的Bjarne Stroustrup,Grady Booch,Steve McConnell, Andy Koenig, Robert Martin, Kent Becker, Martin Fowler, James Gosling, 再或者是青春年少,意气风发的Linus Trovalds,Andrei Alexandrescu,我们似乎都习惯于认为,只要一封email,这些书本上的名字就会立刻成为你的朋友。Internet把地球变成了一个大村庄,每个人的距离都那么的近。

但是可惜,Internet却无法缩短跨越生与死的冥界。今天,一颗真正的巨星在我们的眼前陨落!作为一名普通的程序员,我从内心感到惋惜和悲痛。这种悲痛,两年半前在我最初得知Richard Stevens的逝世时,也曾感受过,然而却不如今天来得这么强烈。毕竟,当我对编程还是懵懵懂懂的时候,就知道有个叫Dijkstra的人劝告大家不要滥用goto,而在那之前,goto在我看来就是编程的全部奥秘所在。之后我在学习算法、数据结构、操作系统等课程的时候,Dijkstra这个名字一次又一次从书里跳出来,我对于这个名字的崇敬也越来越深。我知道他晚年疯狂的迷恋C++,这也几乎是我这个C++ Fan所能感受到的最大荣幸。我曾想过,有朝一日,我会给他写一封email,什么也不说,只想表达我个人对他的感谢和敬意。没想到,如今连这个机会也没有了!

Dijkstra引导了并且将继续引导这个星球上所有的程序员,他的贡献和影响将与世长存,让我们祝他安息!

Advertisements
Comments
  1. jinseting says:

    你好,我遇到了很奇怪的问题,我注册账号后,为什么出现的是你的blog

  2. lefteyefocus says:

    嗯?你注册的啥账号?你重新连一下你自己blog的URL,还是被forward到这里么?

    • jinseting says:

      我的账号是jinseting
      因为space.live要改版还是升级 我就按指示注册登陆 然后出现的就是你的blog.. 我还是没研究出来为啥

      ps…我想你是西版的左眼吧 🙂

  3. JJ72 says:

    大侠的码工生活怎么不接着写了呢?实在是喜欢阿喜欢。

  4. jiankentwo says:

    貌似第三篇 “大卫叔叔” 一直没有转过来么。
    另外有时间 8 一 8 Anders Hejlsberg 吧。一直觉得这位老兄满诚恳的,没什么花唿哨儿。

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s