【猿传奇 | 6】Donald Knuth:要是看不懂我的书,就别当程序员了

现代科学的发展离不开各个学科巨人们在学术上的不断突破,他们的学术理论和专著引导着全人类突破更多的未知,狄拉克的量子力学、爱因斯坦的相对论、冯诺伊曼和摩根斯坦的博弈论,在计算机科学领域当然也有这样的巨人和理论,那就是 Donald Knuth 和他的《计算机程序设计艺术》。

比尔盖茨说过这样的一句话:如果你认为你是一名真正优秀的程序员……读Knuth 的《计算机程序设计艺术》,如果你能读懂整套书的话,请给我发一份你的简历。这足以看出 Donald Knuth 在计算机科学界的地位,而他更被中国程序员们所熟悉的是他的中文名:高德纳。

高德纳这个名字是 1977 年 Donald Knuth 访华时,2000 年图灵奖得主姚期智的夫人姚储枫为他起的中文名,这在 Donald Knuth 的个人主页上也有说明:

高德纳 1938 年 1 月 10 日生于威斯康辛州密歇根湖畔的密尔沃基。这是一个山灵水秀、人才辈出的地方,“人工智能之父”、诺贝尔奖获得者西蒙也是在这里出生的。高德纳的父亲是一个多才多艺的人,有研究生学历,当过小学和中学教师,星期天在教堂演奏风琴,还在自家地下室办了一个小印刷厂。

受父亲影响,高德纳从小喜欢学习和音乐,并表现出与众不同的才能。高德纳上 8 年级时,当地的 Ziegler 糖果厂为了促销其称为 Giant Bar 的一种棒棒糖,在学校中搞了一个比赛,看谁能用 Ziegler’s Giant Bar 中的字母排列组合出最多的单词。高德纳假装胃疼,在家里呆了两个星期,利用一部大字典,得出了 4500 个单词,比裁判掌握的 2000 个单词还要多出一倍多,一举为他所在的班夺得冠军,赢得一台电视机和每人一块 Giant Bar ,而高德纳本人则赢得一副雪撬。

1956 年,高德纳以各科平均 97.5 创记录高分从密尔沃基路德兰高级中学毕业,进入俄亥俄州克利夫兰的开思理工学院攻读物理。这一年,他在中学时就创作的一篇出色的科幻小说“普茨比度量衡体系”( The Potrzebie System of Weights and Measures )在美国著名的《疯狂》杂志上发表,高德纳获得了他的第一笔稿费:25 美元,并因而获得西屋科学天才的提名奖。在这篇小说中,高德纳风趣而富于幻想地提出了替代公制的一种新的计量制度,比如以一本流行杂志的厚度为长度单位,虽然滑稽可笑,却设计得严密周到,天衣无缝,其中甚至还包括一种新的历法。文章刊出后大受欢迎,多次重印, 1991 年还重印过一次,那时高德纳已经到了快要退休的年纪了。

大学一年级结束以后的暑假,高德纳在学校打工,负责把统计数字画成图表。碰巧他工作室的隔壁就是计算机房里新到了一台 IBM650 。当时的计算机体积都很庞大,有供输入和调试的控制台,上面排列着一排排的开关和指示灯,计算机工作时指示灯快速闪烁变化出不同的图案,这引起高德纳极大的好奇与兴趣,他接连好几天彻夜不眠地呆在机房,观察它的工作,钻研使用手册,探究计算机的奥秘。一年以后,他终于改学数学,与计算机结缘。这段经历对于高德纳是如此重要和关键,以致他在《计算机程序设计的艺术》第一卷的卷首,不像别的作者那样一般写上“献给自己的父母”或“献给自己的妻子”,而是写着“献给曾经安装在开思理工学院的 650 型计算机,以纪念那些愉快的夜晚”。

高德纳熬夜读 IBM 650 的说明手册,自学基本的程序设计。那时,在高等计算机语言发明之前,程序编写只能用第二代或是汇编语言。这个工作既耗时又困难,因为指令必须根据每台机器特定的构造编写,而实际上指令只须一步就可从二进制 0、1 系列转存到计算机硬盘上。高德纳说,有了第一次使用 650 的经历,他便肯定自己能编写出比说明手册上介绍的更好的程序。

他的第一个计算机应用程序也是在 IBM 650 上实现的:他为他所在的校篮球队设计了一个复杂的公式,根据球员在每场比赛中的得分、助攻、抢断、篮板球、盖帽等多项统计数字对球员进行综合评估。球队教练根据高德纳的程序挑选和使用球员,使开思理工学院在 1960 年赢得了联赛冠军,高德纳的神奇的公式和程序也被当地报纸和广播传为美谈。

就在他们赢得冠军那年,高德纳在开思理工学院毕业,不但被授予学士学位,还被破例同时授予硕士学位。之后他进入加州理工学院研究生院学习。

1962 年,当高德纳还是个研究生的时候就开始了他计算机程序的工作。那时,他已经开始了个人咨询,为不同的机器编写编译程序。编译程序是一种翻译原始或高级语言和对象或二进制机器语言的中间语言。毕业的前一年,世界上一流的出版社 Addison-Wesley 出版社约初露头角的高德纳写一本编译器和程序设计方面的书,这件原本寻常的事最终成就了计算机科学史上的一部巨著。出版社1962 年约稿,可高德纳直到 1966 年还动静全无,编辑忍不住打电话催促,都过去 4 年了,为什么一点动静都没有,高德纳回答说才 3000 多页。编辑惊呼那干嘛还不交稿?答曰还没进入正题呢。

当高德纳的出版社计算出他的那 3000 页的手稿打印成文章大约需要 2000 页时,大家才发现这实际上是一项多么大的工程。在 3000 页的手写设计草图中,高德纳发明了一种综合方法,用于分析或决定结构翻译所客观需要的文法规则。关于他的那第一部著作,高德纳在几年前自己这样评述:“用三年半的时间写第一章可并不是件好事。”高德纳决定将它详述,成为一部更大的关于程序设计科学的纵览,共分为七个部分。一部巨著就这样诞生了。 1968 年,《计算机程序设计艺术》的第一卷正式出版了,这一卷的标题叫《基本算法》,但难度却并不低。除了文章开头那句话,比尔盖茨在 1995 年接受一次采访时也谈到了这卷书,“如果你认为你是一名真正优秀的程序员,就去读第一卷,确定可以解决其中所有的问题。”

(《计算机程序设计艺术》的第一卷)

就在第一卷出版的那一年,高德纳转入了斯坦福大学任教,其间 1972 至 1973 年曾经还在奥斯陆大学当客座教授。一年后,《计算机程序设计艺术》第二卷正式出版;1973 年,这套书出到了第三卷。这三卷书被计算机界成为“ 神作”,在最初的几年内就卖出去 100 多万套。按照计划,这套书一共有七卷,但是现在刚刚写完三卷,就已是震古烁今,连图灵奖颁奖委员都坐不住了。按照惯例,图灵奖的获奖者都是成就等身,是要经过时代的检验的。但此时,美国计算机协会便决定立即为其颁发图灵奖。这对高德纳来说,无疑是个殊荣, 这一年他只有36 岁至今,他仍保持着图灵奖最年轻获奖者的纪录。

第四卷第一册的《计算机程序设计的艺术》出版已经是在多年后的 2008 年了,这期间高德纳都在忙些什么呢?原来,高德纳在获得图灵奖之后,宣布从此歇笔,原因竟然是排版工具太差,破坏了这套书的美。

这一动作让外界十分震惊。有人说,高德纳江郎才尽,见好就收;有人说,图灵奖对前三卷的评价过高了,高德纳只好找理由撤了;还有人说,获奖之后停止写作,充分体现了他写书的目的就是为了功利。

高德纳在辍笔的 10 年间创造的三个重要的成果彻底让那些怀疑他的人闭上了嘴:字体设计系统 METAFONT 、文学化编程 (Literate Programming) ,以及其中影响最大的排版系统 TEX 

对学术界尤其是数学和物理界的学者来说在 Word 中写科学论文是一件很辛苦的事,你需要调整格式,数学式的表达也很难完成。但是在 TEX 中,这些麻烦几乎完全不存在,只要载入样式文件,排版就自动完成了。TEX 是一场出版界的革命,直到现在仍是全球学术排版的不二规范。

TEX 作为一个软件产品也是令人叹为观止的。它的版本号不是 1.1、1.2 这样的自然数列,而是从 3 开始,不断逼近圆周率(比如某一版的版本号是  3.1415926 )。高德纳再一次用行动宣告,这个东西趋近完美,不可能再有什么大的改进了。他还设立了奖金:谁发现 TEX 的一个错误,就付他 2.56 美元,第二个错误 5.12 美元,第三个 10.24 美元……以此类推。结果直到今天,他也没有为此付出多少钱,可见 TEX 经过了怎样的千锤百炼。他设置的另一个奖项是找出其著作中错误的人能得到 2.56 美元,为什么是 2.56 美元?高德纳的答案是:256 美分刚好是十六进制的一美元。

(国内编辑提交《计算机程序设计艺术》内勘误后收到的支票   来源:黄志斌)

从 1981 年夏至 1996 年 7 月 1 日,Knuth 教授给指出错误的人回信 250 多封,其中一半以上装有奖励支票。从奖励支票清单来看,有一位名叫 Axel Böttcher 的人,曾先后 5 次得到 2.56 美元的支票,3 次得到 5.12 美元的支票,真可谓牛人背后有牛人。也有网友开玩笑说,什么是聪明:在高德纳的书中找到错误;什么是愚蠢:去兑现那张 2.56 美元的支票。

歇笔十年的高德纳,手捧这三项成果重出江湖,打消了一切质疑。这时他才对十年前的歇笔事件做了一个轻描淡写的解释:一个人要想把事情做得漂亮,就必须要跟上帝保持和谐,现在,上帝终于让我去写四卷了。

1992年,高德纳为了潜心写作,从斯坦福提前退休,同时停用电子邮箱。2008 年,《计算机程序设计的艺术》前三卷出版 30 年后,第四卷在千呼万唤中终于面世,此际的高德纳已然是满头白发。对计算机科学的倾心热爱,使他为这部作品耗费了毕生心血:从及冠之年直至古稀老人。

作为开源代码运动最早的倡导者之一,高德纳将 TEX 和 METAFONT 无偿贡献给了世界,自己没有从中获取任何报酬。这比理查德·斯托尔曼在 1984 年发动自由软件运动早了约 5 到 6 年。高德纳说:“我写这两个程序是出于对书籍的热爱,也想给这个领域以必要的推动。我已经有些名气了,我的书卖得也不错。所以我不需要为我出于热爱而做的事保留专卖权。此外,数学家通常是不为他们发现的定理获取报酬的”。

高德纳和他的《计算机程序设计的艺术》注定会被历史所铭记,在百年之后仍然会被后人向我们今天学习牛顿一样研究,他曾经说过: “我尝试尽我所能的去熟悉电脑科学里的一些领域,然后把这些知识摘要成大家比较容易了解的方式,让没有那么多时间做这种学习的人也能够吸收它们”。为此他常常需要阅读超过 20 万页的文献,然后将之浓缩为两千页。他无意追赶最流行的内容,而是希望从日新月异的信息中萃取出能够存活到下个世纪的精华。

斯坦福大学曾让高德纳为自己选择一个头衔,他确定的是“计算机程序设计艺术名誉教授”。高德纳认为“计算机科学”不是科学,而是一门艺术。它们的区别在于:艺术是人创造的,而科学不是;艺术是可以无止境提高的,而科学不能;艺术创造需要天赋,而科学不需要。