(给算法爱好者加星标,修炼编程内功)
来源:机器之心
对计算机科学先驱高德纳(Donald Knuth)来说,良好的编程就相当于美好的表达。现年 82 岁高龄的高德纳老爷子至今仍坚持写作已经持续几十年的计算机科学巨著《计算机程序设计艺术》(The Art of Computer Programming)。近日,《量子杂志》采访了这位孜孜不倦讲述计算机科学故事的计算机科学家,也让我们看到了这位计算机科学先驱的另一面。
高德纳老爷子一生都在用计算机程序讲述计算机程序的故事。图源:Vivian Cromwell
高德纳是一位计算机科学家,他的年龄差不多就和他投身领域诞生的时间一样长。在上世纪中叶计算机编程刚刚诞生的那些年,当地一家名为 Ziegler 的糖果公司举办了一场比赛,这让当时仅 13 岁的高德纳看清了自己的才能。这场比赛是让孩子们确定能用一种糖果名称(即 Giant Bar)的字母组成多少个单词,这是一个界定清晰明确的问题,也正是他所喜欢的那类问题。「我有一种强迫症,而它让我产生了对数字离散问题的兴趣。并且,我也很热爱钻研大量信息。」高德纳说。在他家的地下室中,高德纳系统性地翻阅了他家那本 2000 页厚的 Funk&Wagnalls 无删节版词典。他甚至说服了父母,让相信自己生病了,这样两周时间都没去上学,而是把时间投入到了这个问题上。基于这种糖果名称的字母,他标注了以 Aa、Ab 和 Ba 等可能在单词前面的字母串,并将它们做成了索引卡片。之后,他开始检索词典中满足条件的条目。他发现词典中有些部分可以完全跳过,比如以字母 C 或 BU 开头的单词部分。赛事官方预计最后的胜者能找到大约 2000 个单词,而高德纳整整找到了 4700 多个。他为他的班级赢得了在电视上露脸以及巧克力奖励。在那以后,他还将继续为自己赢得更多「巧克力」,包括第一届 ACM 格蕾丝·穆雷·赫柏(Grace Murray Hopper)奖以及美国国家科学奖章和 1974 年图灵奖。高德纳甚至将自己对离散数字问题和大量信息的热爱融入到了他的皇皇巨著《计算机程序设计艺术》中,这套书从 1962 年他还是一个研究生时就已经开始写了,但到现在还未完成。1968 年他出版了该书的第 1 卷,目前该卷已经印了 27 版。第 2 和 3 卷分别出版于 1969 和 1973 年。那时候他已经是斯坦福大学的一位计算机科学教授了,但他也担心教职工作会妨碍自己写完这套书。因此他在 1990 年告假,接着在 1993 年退休,打算余生都用来完成这套七卷巨著。现在,他已经 82 岁了,仍在努力撰写第 4 卷的 B 部分,他预计这一卷至少有 A 到 F 共 6 部分。
高德纳正努力撰写《计算机程序设计的艺术》第 4 卷 B 部分。他预计这一卷至少还有 4 部分,而整套书还有 5、6、7 三卷要完成。照片来自高德纳的妻子高精兰(Jill Knuth)。
高德纳接受了《量子杂志》的采访,并就提出的问题一一进行了回答。从这些采访中可以瞥见高德纳老爷子的科研理念和人生态度。之前,有人告诉我说现实世界对我而言太难了。我并没有想要发现任何新东西的想法,但我热爱通过写作来表达我享受这些思想的喜悦。
高德纳总是讲述带有科学内容转折的故事。上大学时他写了一篇短篇小说,里面的每个词都是一个化学式。照片来自高德纳的妻子高精兰(Jill Knuth)
上六年级时,我和几个朋友在一台油印机上写了两页的文章,不过内容全是笑话。上高中时,作为新闻报编辑,我每周一晚上都要通宵达旦赶稿子。上大学时,我作为校刊编辑写了自己的第一行文字。在大学三四年级时,我们开始写工程和科学评论。举个例子,我写了《Th_5E_4 CH_3EmIC_2Al_2Ca_3P_4Er》,其中每个词都是一个化学式。这是您撰写这部巨著的原因吗?您是否将其视为又一个故事?
《计算机程序设计艺术》是一个宣言。它讲述了我多么喜欢数学以及我希望的学习方式。从第 1 页开始,我开始讲关于算法的故事。那时候大多数教科书都没有探索科学发现中人的一面。它们只是说「这是化学的工作方式」或「那是物理学的工作方式」。我也讲了一个关于技术的故事。我说:「有些东西是没有效果的,这里有一种可以解决问题的方法。我不只是单纯地陈述事实,我还增加了戏剧性。」如果你知道发现的先后顺序,那么科学学习来就变得容易多了。另外,我也没法拒绝一个好故事。我没把自己视为一个先驱,而是将自己看作是一个记录者。那么除了故事之外,《计算机程序设计艺术》还讲了什么?
在我写了两年书之后,我意识到这套书的新颖之处在于它可以定量地确定一个程序的优劣程度。我不只是想说一个程序比另一个程序更好。我想说的是一个程序比另一个程序好 13.8%,并且对这种比较结果做出了解释。作者 A 会谈论算法 A,作者 B 会谈论他的竞争算法 B。并且,作者 A 从来不写关于算法 B 的东西,作者 B 也从来不写有关算法 A 的东西。另外,作者 A 和 B 使用的计算机也不一样。那么,作为一个中立的记录者,我会从这样一个角度解释这两个算法,即「一个算法究竟有多好?」。提出这样的问题是很有意思的,这就是算法分析。「算法分析」只是「计算机程序设计艺术」的另一种说法吗?
1967 年,我在参加工业与应用数学学会会议(Industrial and Applied Mathematics conference)时,有人问我做了些什么。那时候,计算机科学被划分成了数值分析、人工智能和编程语言几个领域。我意识到我需要为我的工作起个名字。我的书的新颖性在于对算法的优劣程度展开了严格的探究。所以我决定下次有人问我这个问题时,我会回答自己在做「算法分析」。我的定义是:如果我对此感兴趣,那这就是算法分析。这不是一个非常好的定义。但对您而言,程序设计关乎的不仅仅是功能。比如说,当您在设计 TeX 时,您想要找到连接特定点的「最赏心悦目的曲线」。您当时想把美编写成程序吗?
我的程序连接点的方式就像是对优秀书法家的工作进行反向工程(reverse-engineered)。比如字母 S 中有一个点是曲率由正变负的点,然后会稳定一段时间。这个字母的设计者遵循了一些逻辑来让该线条变成字母的形状。我不仅希望体验这种设计结果,还想理解其背后的智力过程。这就像编写一个计算机程序。
1980 年,高德纳与字体设计师 Herman Zapf 在他的斯坦福大学办公室,这时候高德纳的排版程序 TeX 刚发布仅几年时间。图片来自:Chuck Painter / Stanford News Service我与设计师进行了交谈,希望理解他们想要实现什么。这里涉及到的数学是希望能以量化的方式来理解这些设计。借助数学,我在所有东西上都放上了一个小刻度盘。比如对于字母 A,我可以说它的粗细程度、这里的角度是多少、那里逐渐变细、底部有个凸起以及有特定的衬线长度等等。我从没想过取代设计师。我只是想让后代了解我们当时是怎样做的。使用 TeX,我们可以将设计重现出来。当时您是否预见到 TeX 会被全世界接纳或者它的泛化能力?
当时 TeX 只是为了给我的秘书和我自己用。Phyllis(Astrid Benson Winkler)是一位出色的秘书。她能读懂我的手写内容并让它们以更美丽的方式呈现出来。打印技术日渐式微,因为这种方法虽然经过验证,但成本却过于高昂。1970 年代发表的几乎所有数学著作看起来都非常丑陋。在《美国数学月刊(American Mathematical Monthly)》上,下标字体与正文主体字体都不一样。我知道计算机编程能让这些书也变得好看。1973 年 4 月,我完成了 TeX 一个试验版本的调试。5 月份,我有了 10 个用户。6 月份,我有了 100 个用户。7 月份,我有了 1000 个。每个新的用户群都会说:「TeX 必须具有这样那样的功能」。五年之后,我发布了基本上就是现在这样的 TeX。这个软件最早是为美国人设计的,然后欧洲人也开始使用它。所以在 20 世纪 80 年代,我为 TeX 添加了世界语言支持。听起来您的开发过程一直伴随着新的发现。到如今依然如此吗?
我平均每周写 5 个新程序。诗人必须写诗,而我必须写计算机程序。对于我是否理解某些东西,终极测试就是看我能否向计算机解释这个东西。我可以向你解释说明,你可能会点头表示理解,但我不能确定我是否解释清楚了。但计算机「不会点头」,它只会精准地重复我让它去做的事。在生活中的很多时候,你可以虚张声势,但这对计算机不起作用。
「人类之间沟通的最好方法是故事」高德纳说。这种方法让他可以更严格更中立地分析算法。图片来自 Vivian Cromwell
您夜日继日地写作,您还有其它爱好吗?您怎样度过日常的每一天?
杰克·伦敦每天都要写作 1000 词之后才会与人谈话。他完全就是「在我完成 1000 词之前不要打扰我」,然后他剩下的时间就是喝酒或校对。但我不同,我的日程安排原则是优先做我最厌恶的事情。到周末时,我会非常开心。在我看来,这样说很简单:「让我做个天才吧,永远不用清理厕所。」但即使清理厕所也是可以做的。我的妻子 Jill 和我有能放 409 清洁剂插槽的制服。你去厕所打扫然后喷水,清理厕所的感觉非常好。决定一个人生活成功的因素是要有一个较高的最小值,而不是较高的最大值。如果你能很好地做成一些事情,其它事情又会失败,那么后者就拖累了你。但如果你几乎能把每件事都做得不错,那么你就有一个好的人生。所以我尽力去学习其他人可能觉得做起来不愉快的事情。
2020 年,高德纳在自己家中。1993 年他退休了,以便完成自己的巨著《计算机程序设计艺术》。照片来自高德纳的妻子高精兰(Jill Knuth)您也有很多与计算机科学无关的项目,比如您的音乐作品《Fantasia Apocalyptica》。您的房子甚至都是您绕着一组两层楼高的管风琴建造的。这样的活动也让您感到快乐吗?我写了好几本关于神学的书,包括《计算机科学家很少谈论的事情(Things a Computer Scientist Rarely Talks About)》,里面的东西与数学或计算机科学不一样,你没法证明它们。如果我的生活都是分析和厘清事物,那么就会不完整。我不理解的神秘事物给我了谦卑。有一些事情超出了我的理解。在数学领域,我知道定理何时是正确的。我喜欢那样。但如果一切都可做可行,那么生活就毫无意思。这样的知识不会让我绝望。相反,它能确保我的生活不一成不变。您觉得顺利完成《计算机程序设计艺术》是不是非常重要?
哦,我知道计算机科学还会继续长存并发展下去。有一种情况是所有人都不再研究现在的计算机了。他们全都跑去研究机器学习和量子计算机。那么我可以走到非量子计算机的终点。如果我可以说「这就是故事的终点」,我当然很高兴。这是想象我自己会完成的最简单的方法。但我不会回答你的问题。你知道特里斯特拉姆·项狄(Tristram Shandy)吗?18 世纪后期,劳伦斯·斯特恩(Lawrence Sterne)写了一本自传性的书《绅士特里斯特拉姆·项狄的人生和观点》(The Life and Opinions of Tristram Shandy, Gentleman),并以分册或分期的形式发表了它。其中写了他人生第一周的大约 100 页的故事。他想要完成这个人生故事,但当然他最后完不成。斯特恩一直在写特里斯特拉姆·项狄的故事,直到他再也写不动了。我想要以我知道的最好的方式继续写优质内容,介绍那些我有一些原创性看法的事情。我会尽可能地去做,而不会说我要在某个截止日期前完成些什么。我一直都非常幸运,正好赶上了时代的浪潮,出生在了我可以做特别适合我做的事情的时代。现在除了《计算机程序设计艺术》,我已经完成了我所有的人生目标。在现在这种情况下,我还将继续讲述我可以找到的各种故事,并将它们传递下去。原文链接:https://www.quantamagazine.org/computer-scientist-donald-knuth-cant-stop-telling-stories-20200416/
觉得本文有帮助?请分享给更多人
关注「算法爱好者」加星标,修炼编程内功
好文章,我在看❤️