30 秒看懂
图灵奖得主、《计算机程序设计艺术》的作者 Donald Knuth,在他称为“魔法发生之地”的斯坦福办公室里,与 Lex Fridman 对谈。他讲了让人成为极客的两种天赋,讲了 1962 年那份目录如何膨胀成七卷,也讲了为什么一个多项式时间的算法可能存在,而没有人知道它长什么样。他至今仍用铅笔在四十年前于加拿大买的纸上写字。因为受不了页码里那个难看的 2,他做出了 TeX。他认为,一个设计良好的人生,幸福度应该是 0.8,而不是 1.0。
- 1650 的内存只有 2000 个字,每个字是十个十进制数位外加一个符号。做一次加法要花约 3 毫秒,原因是得等磁鼓转到位,而它每 5 毫秒才转一圈。
- 2按 Knuth 的说法,极客的大脑会做两件不寻常的事:在不同抽象层次之间自由跳转,并能与不统一共处。十个步骤各做各的事,无须一条通用规则。
- 3他说,他的人生是英语与数学的凸组合。文学化编程是同一种押注:从形式和非形式两方面反复看一个程序,直到它牢牢印进脑子里。
- 4在组合算法里,一个好主意就可能让程序快上 100 万倍以上。显而易见的方法与精巧的方法之间的差距,正是计算机科学真正获得回报的地方。
- 5Knuth 倾向于认为 P = NP,但紧接着又削弱了这一判断:存在的算法远比任何人将来能找到的要多,因此即便证明了它,也不会直接交给你一个可用的求解器。
- 60.8 就够了一个大约 80% 的时间里感到快乐的有机体,才是好的设计。他说,若是 100%,就好像人人都在吸毒,整个系统会崩溃。
按章节阅读完整文稿
IBM 650 占满的是一扇窗的闪烁灯光,而不是整个房间
这段对谈是在 Knuth 的办公室里录制的。房间拥挤,不便于摆放摄影机,但对 Knuth 来说,这里是他完成大部分工作的地方。为了在这里录制,颇费了一番巧思。Knuth 不看电子邮件。Fridman 介绍他是 1974 年的图灵奖得主、多卷本《计算机程序设计艺术》的作者、渐近大 O 记号的推广者,也是 TeX 排版系统的创造者,科学家至今仍在用它把论文排得漂亮。
Knuth 想讲的故事,始于 1957 年的凯斯理工学院(Case Tech)。当时他是大一新生,在统计小组打工,负责打孔卡,并在另一台机器上整理数据,就在这时 IBM 650 到了。它并没有占满一个房间,但体型不小,而且很吵。他第一次是隔着窗户看到它的,灯光一闪一闪。他有这栋楼的钥匙,于是可以进去看看那台机器,再把一本手册带回家。
650 的体型不小,能力却很有限。它有 2000 个字的内存,每个字是十位十进制数字加一个符号。做一次两数相加,大约要 3 毫秒。这个数字本身没有什么神奇之处。磁鼓转一圈要 5 毫秒。停在某个位置的指令,得先等数据;如果下一条指令不在预期的槽位上,还得再等一次。直到大四,它根本没有随机存取存储器。后来终于有了 50 个字的,他们觉得珍贵得不得了。他们会把任务分成 60 个字一组往上搬,运行一个子程序,然后重新开始。
六十年后的计算机,他能预见到吗?有一次,一位采访者问他什么让他感到惊讶,他一口气说了二十来件。她把问题反过来问:什么是*没有*让他惊讶的?他想了五分钟,一件也说不出来。他指出,650 是第一款批量生产的机器,一共生产了一千多台。IBM 以十分优惠的条件把它们租给大学,一代学生就是这样第一次接触到计算机的。
极客在抽象层次之间跳转,不需要一条简单的规则
Knuth 把那些自然倾向计算式思维的人称为极客,包括他自己在内。他认为,自己的成长经历在某种程度上塑造了他的大脑,让它与计算机产生共鸣。他长期估计,这类人约占总人口的 2%。这个比例在他职业生涯的大部分时间里相当稳定,不过,如今的孩子是在不同的机器中长大的,这个比例也许正在变化。1950 年代,IBM 注意到了这类人,还在广告里招人:如果你会下国际象棋,就来麦迪逊大道面试。
极客觉得容易、别人却觉得难的是什么?首先是跨越抽象层次的能力:既能从宏观上看问题,也能从微观上看问题,并且能在两种视角之间来回切换,而不需要刻意思考。你知道解决一个大问题,意味着给某个寄存器加一。你不会一直深入到电子层面,但你知道 650 磁鼓上那几毫秒的等待是什么感觉,也知道它如何对应到分解质因数或求根上。调试走的也是同一段台阶:打孔错误、指令写错、寄存器里装错了东西。每一层都不一样,而你能进入其中的每一层。
这也是他的书把底层细节与高层论证混在一起的原因。有读者说,他应该把书写得更好读;也有人说,如果你的头脑本来就是这样运作的,那么混合不同层次,正是训练它的方式。第二种天赋,是能坦然面对不统一:情形一、情形二、情形三,而不是用一两条规则统治一切。一个有十个步骤、每一步都做不同事情的算法,并不让他烦恼。许多纯数学都追求放之四海而皆准的规则。他承认,像他这样的人,有时会把系统搭得比必要的更复杂,因为没能找到简单的规则,并不会让他觉得是危机。
他说,19 世纪的数学家,比如 Jacobi、Bolzano 和 Abel,可能已经有了极客的症状。第一位 100% 正宗的极客是图灵。Knuth 读本科时,只知道可计算性理论和图灵机,听上去是纯形式化的东西。多年后他才了解到,图灵亲手设计过机器,为曼彻斯特的机器写过一本出色的手册,还发明了子程序,是一个真正双手沾满油污的黑客。图灵甚至习惯把数字从左往右倒着写,比如 π 写成 9 5 0 1 4 小数点 3,因为他所用的计算机就是这样处理数字的。他把自己训练成了像机器那样思考的人。
文学化编程,是英语与数学的凸组合
Fridman 指出了一个看似矛盾之处:Knuth 实践的是计算机科学中最优雅的形式化方法,同时他又创造了文学化编程,让描述更接近自然语言。Knuth 不认为这是一场对立。他不认为一种尺码适合所有人,也不认为所有真理都只属于一种专业技能。他说,自己的人生是英语与数学的凸组合。他对此不只是坦然接受。他希望自己的孩子也是这样:左脑和右脑同时发达。
他直到三十多岁才开始为了乐趣读文学。那些能流传下来的书,内里都有一套经过琢磨的生活方式。托尔斯泰的《安娜卡列尼娜》,吸引他的与其说是情节,不如说是人物之间的哲学讨论。陀思妥耶夫斯基他不喜欢:写得潦草,常常忘了自己起过的头,从不打磨。Knuth 欣赏那些把 i 上的点、t 上的横都照顾到的人,即便在译本里,他也喜欢语言的韵律。Raymond Chandler 的句子读起来行云流水;Dashiell Hammett 的句子则不然。Ian Fleming 能把一局高尔夫或一盘桥牌写得尽可能扣人心弦,而且讲得很美。他与 Philip Roth 在同一天从哈佛拿到荣誉学位,两人因此相识。Knuth 回忆说,Roth 当时就知道,计算机书永远不会畅销。
他说,文学化编程是一种理解复杂事物的方法:至少从两个角度去看,一个是形式化的,一个是非形式化的。一位好的技术作者,不动声色地把每件事说两遍,甚至三遍,好让读者把概念装进自己的脑子里。作者的工作,是在脑海中想象一位读者:预判读者接下来会想什么,并努力让自己觉得有趣的东西,也让读者觉得有趣。程序不只是写给计算机的指令。它也是写给日后维护它的人,以及正在调试它的程序员的洞见,告诉他们这件事*为什么*要这样做。如果程序不是一次性丢弃的,老师常用的讲解技巧,会让你成为更好的程序员。
问他这种混合有多难,并不是合适的人选,因为他是极客,对极客来说,这件事很容易。他不会宣称任何人都能学会某种特定技能。写作占据了他人生的一半;他把写作和编程结合在一起。即便是一次性的程序,他也会用文学化的方式来写,因为这样他能更快写对。他举的例子是一个自我指涉的日本箭头谜题:方格分别指向北、东、南、西,每个方格要填入它所指向的不同数字的个数。一位通信者寄来一堆形式化的析取式。Knuth 把它们改写成非形式化的对话,比如“我包含一个 3,而我指向的方格里包含 1、2 和 6”,直到那串抽象变量终于在脑中归位。
原本要讲编译器的书,变成了七卷
Fridman 转向神经网络:用数据来构造算法,而不是用语言把算法写出来。Knuth 认为,这种工作方式适合某一类不统一的头脑,这大概就是这个领域能起飞的原因。它也很难让人放心,因为连训练这些系统的人,也不知道它到底学到了什么。Fridman 指出,这或许会让算法以另一种方式被另一类头脑所理解,就像文学化编程那样。Knuth 不认为任何人都能被教成出色的程序员,或者出色的滑雪者。他在一些事情上动力十足,却从来没有突破某个水平。他无法在脑海中想象三维物体,必须做一个模型,从各个角度去看。他说,物理学家则擅长处理四维。
1962 年,他定下了后来成为《计算机程序设计艺术》的那份目录。原本计划是一本 12 章的书。57 年后,他正处于七卷中的第 4 卷,确切地说是 4B。被问到能不能用电梯演讲的方式概括,他说,这要看这栋楼有几层。第 1 卷《基本算法》,是缺了就不行的东西:什么是程序,什么是算法,一台低层机器,让你能想象正在发生什么,还有输入、输出、子程序、归纳法和数学预备知识。这本书的不同之处在于,他不只是给出一个算法,还对它做定量分析。不仅要说明它行得通,还要说明它能快到什么程度。这就是他需要数学的原因。
第 2 卷《半数值算法》,讲的是处理数字的程序:算术、矩阵、随机数、幂级数,以及计算机如何看待浮点数和高精度运算。第 3 卷《排序与查找》,是他喜欢带着笑容来介绍的一卷。排序的对象不只是数字,还有字母;而查找,正是我们如今一直在做的事,比如用谷歌搜索。每一卷都不是围绕某个具体应用写的;正是那些应用,让人们想要了解排序或随机数。
第 4 卷是组合算法,是一个数量多到数不清的领域。在这里,一个好主意就可能让某件事快上 100 万倍以上。这些问题大概永远无法被高效地解决,但这并不意味着就该放弃。这些正是 Knuth 一直最喜欢的算法,因为在这里,编程技巧最能派上用场:显而易见的第一种方法,与那种能把它远远甩在身后的精巧方法之间,差距就在这里。许多方法最早出现在人工智能或密码学中;而在他这里,它们更多与谜题联系在一起。图之所以好,是因为它能为现实世界中的大量事物建模,而图上的数字,就构成了一张网络。
第 12 章原本要讲编译器,然后组合学爆发了
1962 年那份大纲,甚至不是一本泛泛讲计算机编程的书。一家出版社请他讲清楚如何编写编译器。世界上只有几十个人做过这件事,而他恰好是其中之一。他还为校园报纸写过文章。他想,自己认识的人里,大概只有他写过编译器而没有发明新技术,因此他正好可以当那个记者,去讲述别人那些精彩的想法,而不只是讲自己的。
目录越长越大。数据结构必须有一章。查找也需要一章,因为编译器的作者要在符号表里查找变量,并判断两个名字是否指同一个东西。他又加上了算术,还加了一章组合学,因为那是他最喜欢编程的领域,尽管 1962 年可以拿来写的组合算法并不多。原计划第 12 章讲编译器,把第 1 章到第 11 章的内容全部用上。1970 年代,整个组合学领域经历了一场巨大的爆发,不只是案例数量的爆发,还有思想的爆发。他敢打包票,到 1975 年,超过一半的计算机科学期刊都在讨论组合方法。
图论当时占据主导地位,还有人人都挂在嘴边的 NP 难问题:哈密顿路径、旅行商问题。运筹学里有一小类问题存在高效解法,通常与拟阵(matroid)理论有关。一旦从两两看待事物变成三三看待事物,一切就都变难了。每个子句含两个文字的可满足性问题,可以在线性时间内判定。若允许一个子句含三个变量,就没人知道该怎么办了。那个时代的论文,都在寻找更好的途径,去处理密码学和图论问题,而这些问题往往数据很多,却不知道该如何找出最优的子集。
如今,以组合学为主题的会议可能有六个左右。他不必像 1970 年代那样,每个月就得重写一遍书,但工作量依然巨大,而人们对那些仍缺少真正高效解法的问题,还在不断提出更好的想法。他正在完成的这一卷,包含了一些全新的方法,据他所知,别的书都没有收录。他想先探一探冰山一角,尝试大量方法,并在找到更好的方法时不断改写。
在加拿大纸上用铅笔写,然后站起来,打字比思考还快
Fridman 正在看的那把椅子,就是魔法发生的地方。它出自一位瑞典制造商之手,是 Knuth 唯一能坐上好几个小时、却不会意识到自己在坐椅子的那一把。旁边是一张可以站着用的桌子。一个想法的雏形,先用铅笔和橡皮写下来。然后他站起来,敲字,修改,重写。他大概每周写五个文学化程序。在书里描述某样东西之前,他总是先把它编成程序,看看它到底怎么运作。
1 月底,他得知四位日本研究者取得了突破,他们扩展了他的一种方法。他花了五天时间,把他们的做法实现出来,然后又把他们没有涵盖的部分推广开来,并将他们的方法用在二十来个他此前已经用旧方法解决过的问题上。这又花了两个多星期。朋友们解决了其中一些新的数学问题,这些后来成了书中的习题。一个月后,他消化完了这一个想法。这本书原定 300 页,结果涨到了 350 页;这件事就占了 10 页。他暂时还不想再学一个这样的突破。
有些日子里,他会问自己,为什么非要定这么高的标准,为什么不能马虎一点,只把答案报上去就算了。他咬紧牙关把活干完;结果好的时候,快乐随之而来,而当有人真的读懂了那一页,并告诉他怎样改得更好时,快乐就更多了。他至今还留着大约四十年前去加拿大看妹妹时买的那一本大开本、线格很密的本子。他手里的手稿可以追溯到 1960 年代。他在高中时上过打字课,所以打字比他思考得还快;文风与节奏是在打字的速度里出现的,而屏幕上的版本,与纸上的版本也不一样。他用 TeX 打字。他不会在脑子里想宏,但需要时也会写一个。为了省下一行,他会像写俳句那样改写一句话,因为在纸上看起来更好。他很清楚,这大概只占 3% 的时间,本该省下来,可他忍不住。
他每周有一天在花园里干活。他说,这正是他生活的写照:拔除杂草,清除程序里的虫子。乐趣在于,把两个彼此不知道对方存在的人的想法拼在一起。他或许是第一个同时看到两者的人,接着就可以做出综合,这正是发挥创造力的机会。苦差事则是把每件事都追到根源,这会把他带进梵语的世界,写感谢信给作者,或者写给认识那些已故作者的人,把数学算对,并在读者试图找漏洞之后重写程序。死胡同也时常出现。他曾在一个大型棒球案例上花了很长时间,还计划做成可以展开的折页,然后他问自己,一个在板球或足球环境里长大的读者会怎么想,以及他真正在教的算法究竟是什么。他把整个案例全删了。保龄球也一并删去了。
Art 的本意是人造之物,后来又指做得足够好、能带来愉悦的东西
书名里的“art”是什么意思?他的图灵讲座就是围绕这个词展开的。Art 的词根,指的是不在自然中出现的东西,与人工智能(artificial intelligence)中的 artificial 同源,是人类创造出来的东西。后来,这个词又引申出美术、美、优雅和愉悦之意。又要说到托尔斯泰与陀思妥耶夫斯基。艺术正是人类特别擅长的事情。人们说人工智能时,是想模仿人类,但这个词里也含有艺术的成分。这正是他一直想表达的:你完全可以写一个程序,并把它做成一件艺术品。
被问到有没有哪个想法改变了他看待一类问题的方式,他开玩笑说,每次出现漏洞,他都会感到惊讶。最具转折意义的例子是二元决策图(binary decision diagram,BDD)。他从 1950 年代就开始编程,原本以为布尔函数早已是板上钉钉的东西。逻辑是我们一切可描述之物的底层。然后,Randy Bryant 在 1986 年找到了一种表示布尔函数的方法,彻底改变了这一领域。到 1990 年代初,它已经有了价值 10 亿美元级别的应用,成为设计计算机的标准方式,直到大约 2000 年 SAT 求解器出现。
这一发现迫使书里多出了一整节,那是他原本从未打算写的内容。第 4B 卷中间的三分之一,超过 300 页,讲的就是这片领域,其中大部分材料是本世纪才发现的。他从零开始,结识了这一领域的人,在准备过程中写了 15 个不同的程序,书中描述了其中 7 个,另外 8 个则是为了他自己理解。随后,理论学者把 BDD 做不到的事情统统列了出来,这种结构因此落下了坏名声,因为它无法解决所有问题。他预计,未来 10 年里,理论学者会证明,机器学习同样解决不了一切。他并不只担心最坏的情况。解决一个此前解不了的问题,即便它又引出了新的问题,也会让他感到无比快乐。他知道自己比从前强多了。
他推广渐近记号,是因为他需要一种方法,把某样他并不完全知道的东西写下来,他只知道其中一部分。想象一下,在高中里被允许在公式中间写上“0 或 1 或 2”,然后再学习如何做这类表达式的乘法。大 O 记号也是同样的思路:这里有某个东西,它不超过某个常数乘以 n 的平方。你要学会把 n 的平方的大 O 与 n 的立方的大 O 相加,也要学会把大 O 放进对数里。事实证明,这极有价值。在实践中,组合算法的最坏情形几乎总是很可怕。不过,SAT 求解器依然能解实例;那一部分的最后几道习题之一,是找一个仍然很难、含有 100 个变量的问题,尽管 2^100 种可能性听上去根本无从下手。
P 也许等于 NP,但你仍然可能拿不到那个算法
Knuth 近年来说过,他认为 P 可能等于 NP,但即便证明了这一点,也不会直接给你一个解决难题的算法。流行的看法是,如果存在某个算法,总会有人找到它。他认为,存在的算法远比任何人能理解或能发现的要多得多。这个总数大得令人难以想象。我们已经遇到过这样的情况:我们知道某个算法存在,却连一点头绪都没有,不知道它长什么样。
六角棋(Hex)是一个干净利落的例子。两人轮流在六边形棋盘上放置棋子。白方尝试连出一条从左到右的路径,黑方则尝试连出一条从下到上的路径。没有吃子,也不会和棋:棋盘下满时,必有其中一条路径存在。这局棋是有限的,因此不是先手胜,就是后手胜。一个配对策略证明,它不可能是后手胜,因此先手必胜。但没有人知道那套获胜算法,甚至不知道先手第一颗子该下在哪里。
再深一层的例子来自图论中的 Robertson–Seymour 定理。一类图若在取子式下封闭(closed under taking minors),也就是说,对其中任一张图收缩一条边成点、或删去一条边之后,结果仍属于这一类,那么判断某张图是否属于它的多项式时间算法必定存在。证明告诉我们,禁止子式的极小清单是有限的。以平面图为例,两个“坏图”分别是 K5 和公用事业图。把待测的图逐个与清单上的禁止子式比对,每次比对都耗时多项式,有限次比对合起来依然是多项式时间。难点在于,你只知道清单是有限的,却未必知道它有 21 个还是 25 个。于是,你拥有一个多项式时间的算法,而它的具体面目,你并不清楚。
这正是 P = NP 的证明未必有用的原因。你必须排除一个巨大而古怪的算法空间:把图编码成质数,相乘,取按位与,然后碰巧撞上某种巧合。数人头发是个很好的类比。一个国家的人口比一个人头上的头发要少,所以必然有两个人的头发数目相同。这里并没有什么神秘之处,只是抽屉原理。组合学里充满了这种碰撞。有人说 P 不可能等于 NP,理由是那么多聪明人,还有 100 万美元的奖金,都没能找到那个算法。他可以把这句话倒过来说:那么多聪明人,都没能证明 P ≠ NP。同一套逻辑无法同时支持两种结论,这意味着它两种都不支持。他不把时间花在那些他永远无从得知的问题上,比如宇宙中是否有智慧生命,不过他很高兴,有些问题本来就没有答案。证明上帝存在与否,都会破坏那份神秘。世界就会变得太乏味了。
人工智能的危险,在于以为自己理解了,其实只是假装理解
Knuth 说,从 1960 年代起,人工智能界一直是计算机科学最大的灵感来源之一,或许比任何其他群体都要多。那些试图模仿智能、或者想要达到它最伟大成就的人,不断突破边界,带出了源源不断的好问题、部分答案,以及越来越成功的成果。该领域的许多重大发现,都是从那里开始的。他本人对于“制造智能的回响”这种可能性,并不像该领域的大多数人那样着迷。这只是个人偏好,并不是说他们错了。
让他担心的,是人们开始以为自己真的成功了。真正理解某样东西,与能够假装理解、给人一种理解的错觉,两者之间有巨大的鸿沟。你能在不理解的情况下创造吗?他自己常常这样做,比如他喜欢随机数。但那道鸿沟依然存在。他不会说真正的智能是不可能的。他没看到有什么东西接近他认为算得上智能的那种东西。
《计算机程序设计艺术》主要讲的是单处理器算法,因为那份目录是在 1962 年定下的。他庆幸自己没有等到 1965 年,因为一本书无法涵盖一切。他曾说,理解蚁群如何完成极为有序的工作,也许是理解人类认知的一把钥匙。蚂蚁的好处在于,我们能看到哪只蚂蚁在和哪只蚂蚁交流。大脑则更难:我们并不知道神经元之间传递了多少信号。他倾向于把一个蚁群看作单一的认知主体,就像他把自己看作一个人,尽管他的脑细胞和体内的微生物群都是相互作用的个体。如果我们想破解认知,那么模仿蚂蚁是怎么做到的,比如信息素、触碰和视觉,或许比测量颅骨中的电流更容易量化。
生命游戏(Conway's Game of Life)可以模拟任何可计算的过程,但这并不是它最强大的地方。神奇之处在于,它的单元是分布式的,并且极其简单。我们完全清楚它的基本单元是什么,比蚁群还要简单。这仍然不意味着他理解了生命。它让人洞察到一个确定性宇宙意味着什么,也让人看清自由选择对我们意味着什么。上帝会掷骰子吗?会的。他认为,没有理由禁止上帝使用最有效的方法,而我们知道,随机性对许多算法都至关重要。有些事情没有它就做不好。在他看来,物理学不应该限制这一点。
题目太大时,就抽一个随机子集,把信息挂在上面
1999 年,Knuth 在 MIT 做了一系列关于宗教与科学的讲座,后来结集出版成书。他认为,面对超出人类理解范围的主题,你不应该放弃,也不应该只研究别人指定的那一部分。要用随机抽样的办法。挑出一个力所能及的子集,仔细研究。他挑了大约 3000 节经文中的 60 节左右,约为 500 分之一。然后他去了一些索引足够好用的图书馆。他一年里每周坐在波士顿公共图书馆里一次,也去了哈佛。他能查到某节经文是否在某本学术著作的第 205 页被提及,因而不仅学到了《圣经》本身,也学到了围绕它的二手文献。
这种方法给了他一些牢固的钉子,可以把各种信息挂上去。他不会说“因此这是真的”。在他读来,主旨在于如何在假定上帝存在的前提下,与上帝的旨意保持和谐地生活,而非人们通常引用的那些诫命。他很高兴,这件事没有证明。他要是把证明过一遍,记住了,就不会再去对精神性的事物和奥秘进行揣测,他的人生也就不完整了。即便是那些说上帝不存在的人,这个问题对他们来说依然重要。他研究过的一节经文可以被解读为:做一个无神论者,远比完全不在乎要好得多。
Fridman 问,如果 Knuth 是上帝,他会如何向地球上的人们呈现自己。Knuth 提到一本他记得叫《Blasphemy》的小说,书中的上帝通过洛斯阿拉莫斯的一台计算机显露自己。那是他读过的唯一一本,笑点落在最后一个词上,并且这一个词解释了整个构思。他不肯剧透。如果上帝认为,过去的沟通方式已经不适合 21 世纪,那么上帝选择书中描述的那种方式,也不是不可想象的。这个思想实验更大的教训是谦卑。解决了一个问题,并不会让其他问题消失。有些事情超出了我们的能力。Fridman 说,他到处都看到傲慢(hubris)。Knuth 表示同意。
幸福感打出 1.0 的人生,是一次系统故障
Fridman 让他对自己的人生做一次程序分析:正确性、运行时间、渐近资源消耗。此前从没有人这样问过。Knuth 说,他的起点是库和子程序,他学的是做一个听话的自动机。他有一个很大的优势:失败了也没有可以怪罪的对象。如果某件事他没听懂,他知道自己应该停下打乒乓球了;那是他自己不够用功,而不是因为受歧视。他不知道如何消除世界上的偏见,但他知道,那份额外的负担,是他不必承受的。
他从父母那里学到了利他主义,即服务他人比什么都重要。后来他意识到,自己必须足够快乐,才能去服务别人。他最终提炼出的哲学是“0.8 就够了”,这句话借用了一部名为《Eight Is Enough》的电视剧的名字。如果他有一套给幸福打分的办法,那么一个设计得当的有机体,大约 80% 的时间是快乐的。如果是 100%,就像人人都在吸毒一样。一切都会崩溃。什么都运转不起来,因为每个人都太快乐了。
他做到 0.8 了吗?有些时候,他也会情绪低落。他知道,自己的身体被设定好了,会在一定比例的时间里感到低落。如果这种比例失衡了,他会发现自己在问:今天该生谁的气?然后他意识到,那其实是化学物质在让他去生某个人的气。他把这种情绪放到一边,去睡一觉,就会好起来。不能做到 100% 快乐,并不意味着他该在街上找个人冲他大吼。他能接受自己快乐到足以融入一种可持续的状态。这就是他的数值分析结论:人生会收敛到 0.8 附近。
2006 年,他被诊断出患有前列腺癌。不过,他第一次真正直面死亡,是在父亲去世的时候。他花了一个月的时间,才慢慢接受自己终有一死这一事实。那一个月里,他觉得还好,但他唱不出歌,也做不了原创研究。过了三四个星期,他想出了一个技术性的念头,既说得通,又有一点创意,那时他感到有什么东西又开始动了起来。在那之前,他觉得自己空空如也。后来他才知道,这是一个标准的哀伤过程。到接受采访的时候,他的目标几乎都已经实现,只有《计算机程序设计艺术》还没有写完。他一生都想写出某一类音乐作品,至少是作为概念验证。他完成了。这部作品的世界首演,安排在他 80 岁生日那天;加拿大还有另一场演出,欧洲也有人在谈。现在,它已经成为世界音乐的一部分,好与不好,都是如此。他做到了自己所希望的。确诊癌症时,他想:我这一辈子运气一直不错,没什么可抱怨的,也许这就是终点。他没有做任何计划。术后要重新学走路、忍受疼痛,回到家时他才意识到,自己还没想过接下来要做什么。然后他想:哦,我还活着,还能再写几本书。他已经得到了超出他那份的东西。
他受不了页面上那个 2,于是做出 TeX,并一直做到 0.98
1970 年代,Knuth 创造了 TeX 排版系统、用于描述形状的 METAFONT 语言,以及 Computer Modern 字体族。它们决定了数学、物理学、计算机科学以及更多研究领域的论文在页面上的样子。美很难量化。George David Birkhoff 在 1930 年代写过《Aesthetic Measure》,书中印出花瓶的图片,每只下面都标着一个数字,表示它有多美,他也谈到了音乐。Knuth 曾想过把 Birkhoff 的算法编成程序,让一首作品能拿到最高分。但这对计算机来说不够严谨。他认为,这是迄今为止对美赋予数值的最认真的一次尝试。他对字母的看法则简单得多:他希望字母打动他本人。
那次测试是在他原本以为会是人生中最快乐的一天时失败的:第 2 卷出了新的印刷版。封面一样,内页也一样,但看起来并不好看。页码里的那个 2 尤其难看。他无法忍受。任何一个画家都会把页码里的 2 画得像样。他做了测量,用各种方式观察字母,手头有很好的技术,但他还没有做完。1961 年之后,他不得不把整个系统重写一遍。最后它让他快乐了吗?是的。有这么多书,若没有这个系统,根本不会存在。坐在办公室里,看着上面那些页面,他不喜欢的话,就可以改。别人没有这种能力,只能接受他给他们的东西。
谈到字间距与留白,你总是可以再往前走。他没有停在 0.8,而是从 0.98 左右开始。这看起来像是违背了他的幸福法则。他说并不是。日本的侘寂(wabi-sabi)美学认为,最美的作品往往有瑕疵,因为观者会自行添加自己的欣赏。对他来说,排版恰恰相反:在绝大多数情况下,他希望它尽可能好看。排版不好看,就要多花 2% 的功夫,由作者来承担。他不希望自己的工作达到 100%,把作者的活全都抢走。这才是他所说的“0.8 就够了”,它适用于那些你不该替别人做完的事。
人类究竟理解了多少现实的本质?微乎其微:就是一个点,后面跟着若干个零。我们一路摸索,不断前进,却也不会整天宣布我们还没到终点。隔壁办公室里的数学家们,从来没有想过比可数无穷更小的东西;他自己几乎也没有走到那么远,因为他处理的是有限的东西。即便局限于有限,宇宙也可能只包含有限数量的夸克,而人类能够理解的所有数字,仍然远远小于几乎所有的有限数。在一篇名为《Supernatural Numbers》的论文中,他使用了康威箭头表示法(Conway chained arrow notation):不带箭头是乘法,一个箭头是乘幂,再往上是 tetration(超幂)及更高级的运算。一个带四个箭头的 10 再加一个 3,已经超出了想象,但与一个典型的有限数相比,仍然显得微不足道,因为你可以把箭头的数量本身设为这个巨大的值。有限与无限之间的界限,是无法理解的。无穷是思考极大之物的一种有用工具。我们永远无从知道,宇宙是否接近它。我们知道自己知道得有多少,即便是在这个很小的宇宙里,我们发现的东西也比任何一个人能掌握的还多。“我们做得还不错。”如果他上了天堂,能问上帝一个问题,他会问:你们那边用的是什么浏览器?他不认为这是一个有意义的问题。他希望天上的互联网还不错。
同频道的其他文章
3:36:56EN
5:15:51EN → 简体中文
3:12:58EN
3:46:18EN → 简体中文
3:51:47EN → 简体中文
2:53:42EN → 简体中文