程序英雄传(一)

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

高爷爷

我床头常年放了套我每年都要心血来潮地捧起来摩挲一番的书,但是每年都是读了不超过50页就放下了,所以这么多年过去了,这三本一套的精装本除了第一本头50页略微有些旧以外,第二本和第三本还基本上是崭新的。不过这并不妨碍我今年会重新再拿起这套书摩挲一遍,并且在将来继续这么做下去。这套书就是高爷爷的《The Art of Computer Programming》。。。

学CS的都知道高爷爷吧?我第一次听说高爷爷的名字还是从我一个清华学计算机的朋友口里听到的。我那阵子心血来潮想学习计算机,让我这位朋友给我介绍些入门的书看看,我这位朋友就让我到他家自己挑。别看我当时P也不懂,我会看那本书装帧比较漂亮呀,结果我就看上了他书柜里的那套《The Art of Computer Programming》了。。。

我的要求当然遭到我的朋友的断然拒绝。两个原因,一是因为那套书是他托人几百美金从国外带回国的,他不外借(去amazon上查了下,不到两百美金,这厮不是故意吓我,就是被人敲了竹杠),第二个原因更充分,那书我根本看不懂(确实看不懂)。。。结果那天的借书的结果是我把我朋友大一的教材抱回了家,以及装了一肚子高爷爷的八卦。。。

我当年最为在意的一个问题就是,如果大学不是学的计算机,半路转行还有没有可能将来做出点成就,我清华的那位朋友给我大灌迷糊汤:能!怎么不能?!高德纳当年上大学的时候还没决定好主修音乐还是主修物理,后来因为拿了物理系的奖学金,所以决定学了物理。后来高爷爷又拿了个数学的PHD,但最后再CS领域做出了卓越贡献。。。

我老人家当初是听得五迷三道,脑袋发烧,原来半路出家也能那么牛逼!我那个时候不知道CS和数学之间的密切关系,更不知道人和人不能比的!哦不,应该说人和牲口(大牛)是不能比的!

高爷爷的传奇故事从初中二年级就开始了,当时他们学校有个比赛,看谁能用"Ziegler’s Giant Bar."这句话里的字母组成最多的单词,比赛组织者准备好的complete list有2500个单词,结果当年的小高同学估计当晚多次了两个汉堡包,一发狠,弄出了4500多个单词。按说当时他还没有机会接触计算机呢,也不知道咋弄出来的。这次比赛小高赢得了一台电视机加上全班每人一根棒棒糖。发奖的那一天,小高被请上主席台发表获奖感言,小高同学的政治觉悟比较低,没有首先感谢国家,也没有感谢父母,只是说,我还可以找出更多的来。。。

高爷爷在Case Institute of Technology上本科,在那儿他才开始了他的编程生涯,在那里他使用的机器是IBM 650,后来他在写TAOCP时还专门提到这一点:"This series of books is affectionately dedicated to the Type 650 computer once installed at Case Institute of Technology, in remembrance of many pleasant evenings."

高爷爷作为物理系学生(后来转为数学系),不务正业,经常接私活给各公司写compiler,要说高爷爷和比尔大叔比,确实没什么商业头脑,他的compiler经常几百美元就卖给那些公司了,而那些公司转手就卖几万甚至十几万美元。。。

高爷爷在加州理工学院读PHD时,John McCarthy(1971年的图灵奖获得者)组织了一个编程大赛,高爷爷参加了比赛并获了头奖。获头奖不是传奇,传奇的是据说高爷爷是在纸上写的程序,程序交出后输入计算机一次编译通过。要知道这可不是写Hello World,竞争对手是一群在Stanford AI的大牛们,其中包括Alan Kay。。。高爷爷针对这个传说后来辟了谣,他说实际上是编译了两次。。。

高爷爷写compiler写得牛的名声立刻就传开了,于是著名的科技图书出版社Addison-Wesley的编辑在高爷爷刚刚屁挨着地的时候,就向他约稿,请他写本compiler方面的书。高爷爷欣然答应了,编辑同学就喜滋滋地回家等去了,这一等就等了三年。。。

后来小编同学等不下去了,给高爷爷打电话说:小高啊,你咋回事捏?都三年了,约你写的书写得怎么样了?高爷爷回答说:绪论写得差不多了。小编一听急了:啥!?三年你就写了个绪论?!你介不忽悠人吗?高爷爷解释道:这个绪论有的长,现在写了3000多页。。。

小编一听傻了,啥?3000多页的绪论,就算1.5页手稿正式出版变为1页的话,也2000多页了,原计划的写一本书肯定是不行了,改多卷本出版吧。高爷爷心里盘算了下,也行,那就暂定为七卷吧。

又过了三年(1968年),在高爷爷30岁的时候,高爷爷的传世之作TAOCP的第一卷《Fundamental Algorithms》面世了。。。

也不知道该说高爷爷太牛了,还是说他他起书名太狠了,这第一卷《基础算法》这几个字害死了不知道多少人啊,包括我和够味这样的。基础算法你总不能不懂吧。再加上比尔大叔当年那句话:"If you think you’re a really good programmer,…read [Knuth’s] Art of Computer Programming….You should definitely send me a resume if you can read the whole thing."

比尔大叔当年其实也只是读完了第一卷而已。相比起高爷爷来,比尔大叔算是厚道的,他说的是你如果想成为一名好的程序员你应该读高爷爷的书,而高爷爷则说:你要读不懂我的书,就不要做程序员了。。。妈的!怎么办?读不懂就不要做程序员了,又想做程序员怎么办,那就买来读吧。

也不知道是不是因为高爷爷这句话,TAOCP的第一卷,以及后来1969年出版的第二卷及1973年出版的第三卷几年内一下卖出去一百多万本(我敢肯定这个世界上肯定没有一百多万个好程序员)。

按原计划的七卷看,那么三卷还没过半,但这已经把整个CS界给震住了,咱一般人被震震也就算了,但是图灵奖评审会也被震得坐不住了,于是在第三卷出版的第二年,也就是1974年,把图灵奖颁给了高爷爷,高爷爷时年36岁,至今保持着图灵奖最年轻的获得者的记录。。。

也不知道是不是这图灵奖发早了,高爷爷自满了,还是别的什么原因,反正正当满世界翘首企盼高爷爷的神作TAOCP第四卷再创辉煌之际,高爷爷宣布下面没有了。。。

我靠!难道真的是好作品都是要太监的!?于是大家开始议论纷纷,说给高爷爷的荣誉太多太早了,这下高爷爷江郎才尽了。但是不管他人的议论是什么,高爷爷对外宣称的原因是,由于在给前三卷的排版时,他很不满意当时的电子排版软件的ugly排版。我们今天不满意啥工具软件所做的第一反应是上网download一个好用的,而高爷爷一怒就决定自己写一个,于是Tex, Metafont诞生了。。。

大概是为了体现出自己是个数学PHD,Tex版本编号是向圆周率无限逼近,现在的最新版本是2008年三月发布的3.1415926。而Metafont的版本编号向自然常数无限逼近,现在的最新版本号是2.718281,也是2008年三月发布的。。。

关于高爷爷给那些在他的程序里发现bug和错误的人发check的事迹很多八卦都说了,就不细说了。要补充说几点的是,高爷爷虽然自视很高,但是作风还是很严谨的,虽然他对自己的Tex很自信,但是不像我们一些“牛逼”的程序员,来不来就宣称自己的程序bug free。有一次针对Tex里的一段code,高爷爷说:“Beware of bugs in the above code; I have only proved it correct, not tested it.” 很多tester都爱拿这就话来说明testing的重要。。。

高爷爷总共给挑错的人发出了2000多张check,据说只有9张去银行兑现了。有个叫Edward O’Connor说:Intelligence: Finding an error in a Knuth text;Stupidity: Cashing that $2.56 check you got. 高爷爷在一次公开演讲时公布了一个去cash check的人的名字,结合Edward的话来开,简直就是公开进行人身攻击嘛。。。

在近30年的时间里,除了TAOCP第四卷不见踪影外,高爷爷还是干了不少事情的。除了写了上百个中小程序外,为那些抱怨TAOCP太深奥的人们,他和Ronald L. Graham还有 Oren Patashnik合著了一本书,帮助大家补习点CS所需要的数学基础,这本书叫做《混凝土数学》(Concrete Mathematics),因为该种数学是CONtinuous and disCRETE数学的混合物。

这本书我也买了,这本书我也没看完。这本书没看完的原因是因为每次把求和那部分看完后,我就觉得已经功力大涨,后面的暂时不用看了。。。

也许是分析complexity分析上瘾了,高爷爷还写了篇论文叫做The complexity of songs,他的研究成果是:如果歌的长度是N,那么歌中的refrain则使歌的复杂度减小至c*N(c < 1),然后他证明出歌的复杂度是O(sqrt(N))。后来一个苏格兰农民把歌的复杂度改进到O(log N)。。。

高爷爷最深得我心的还是他把文章搞得美观得像艺术品一样,把程序搞得美观得像文章一样。所以后来高爷爷提出了Literate programming概念。简单地讲,就是要把程序写得像散文,甚至散文诗一样;Compiler应该根据人的自然语言的逻辑去编译,而不是人根据Compiler的规矩和逻辑去写程序。

Literate programming的概念给了我很大鼓舞,程序能写得怎么样我没谱儿,码字儿我还是有一定信心的。看来以后写程序就当是码字儿就行了,我码的字儿如果通不过编译,不是我写的程序不好,而是compiler写的不好。。。

高爷爷自己就是个写作高手,TAOCP真要慢慢读,并不晦涩深奥,高爷爷的文风清新可人,他是把TAOCP当小说来写的。高爷爷曾经说把文章写给普通人看,那么专家也看得懂,如果把文章写给专家看,别说普通人了,专家也看不懂。

值得说一下的是,CS界很多大牛写文章都是一把好手,Stephen A. Cook当年给我们布置的作业读上去都让人颊齿生香。难怪Joel Spolsky当年写给CS学生的七条建议里的第一条就是:Learn how to write before graduating。。。

我常常想起无知者无畏这句话,越是无知的人,越是觉得自己已经知道了一切,这点在有关政治和宗教方面,尤其正确。前段时间看到一个猛批基督教,猛战风车的同学,就给人这种感觉。斯坦福大学有个规矩,除了宗教系和政治系以外,课堂上不允许谈论政治和宗教。高爷爷在斯坦福任教,每学期的最后一节课都是Q&A,学生们可以问任何政治和宗教以外的话题。

但是高爷爷后来在1999年应邀用了6节课做了一个报告,专门谈Things A Computer Scientist Rarely Talk About。具体内容就是谈信仰与科学的关系。。。高爷爷是个虔诚的基督徒,笃信上帝。也许是意识到基督教和科学教两大教派之间水火不容的关系,Things A Computer Scientist Rarely Talk About是高爷爷第一次,也是最后一次在公开场合谈论宗教信仰的问题。但他的这次报告还是给人留下了深刻印象,后来高爷爷去Google做报告时,好像被问的第一个问题就是:作为一个基督徒,你是怎么做到让科学家们这么喜爱的。。。

其实很多科学家本来后者后来成为虔诚的宗教信仰者,比如说牛顿。也许是学得越多,懂得越多,越意识到人的智慧的局限性,意识到人的渺小。人别说理解世界了,人就连自己的思维是怎么回事都不了解。有一次对高爷爷的访谈,高爷爷被问到对人工智能的前景有何看法,高爷爷表达了很不乐观预测。。。

高爷爷是个完美主义者,他说他的文章里不会出现is faster这样的词句,他要写一定是写is 12% faster。他还说:一个人要把事情做的完美,只有当他跟上帝的意图保持和谐。。。

所幸的是,高爷爷终于再次感觉到天人合一了,他说上帝不让他做太监,上帝让他开始写TAOCP第四卷了。

终于在第三卷出版三十多年之后,第四卷面世了!第四卷是分册写的,现在出版了0,1,2,3,4册。从0开始编号开始并不是因为CS的习惯是从0开始计index,而是写完第一册后高爷爷发现还有东西要加在第一册的前面,于是就有了第零册。

在高爷爷的website上,我看到他的写作计划是2015年完成第五卷。那个时候高爷爷就77岁了。还剩下第六卷和第七卷,希望不会太监吧。。。

Advertisements

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