高德纳和计算机程序设计艺术:人物访谈

开始写“The Art of Computer Programming”(即TAOCP)这本书后50年的今天,Don Knuth还在努力的写。他就快完成前面的五卷了。这可是被认为是“塑造了一个世纪的科学面貌的一百本书”之一。下面将由Richard Morris来问问他最近怎样,并对他其他众多成就挖掘一下。

开始写这书后将近50年的时间里,“The Art of Computer Programming”几乎定义了计算机编程的方方面面,一如它定义了作者的地位。Donald Knuth获得了Kyoto Prize (1996)、Turing Award (1974)和National Medal of Science (1979)。他是个与众不同的人。除了提出“文学编程”这一概念外,他还以设计和编写了一个史上最广泛使用的数字排版系统,系统当中的字体也是亲自设 计。他还率先使用“开源”软件。

高德纳和计算机程序设计艺术:人物访谈

Knuth是个很有魅力又热情的人,将自己对历史、音乐、艺术和数学的洞察融合到计算机编程艺术中。

Don Knuth一直将写The Art of Computer Programming视作他人生最重要的部分。

Knuth全天候的写作安排意味着他“很像个隐士。。。同一时间只专注一样东西,不希望被打扰,而不是让好几样东西在自己脑子里进进出出。我不会安排访客时间,不会去参加啥啥大会,不会接受演讲邀请,不会接任何类型的新任务。”

讽刺的是,计算科学界就快要失去这位大师了,因为大师对音乐无比热爱(他的房子是他设计的,两层,像个管风琴),他说写完预想中有七章的The Art of Computer Programming后,他倾向于回归音乐圈。

RM:
     阿德, 上次我们谈到复杂性的问题,你说简约是解决复杂性唯一的答案。为什么寻找简单的解决方案是解决软件问题的关键。

DK:
    不要一找到解决方案就马上停止探索,寻找简单的解决方案是重要的。

    我猜测人们总是过早停止探索的原因是大部分问题没有一个简单的解决方案;所以他们认为没有必要再浪费时间继续探索了。如果开始我们就假设存在一个简单的解决方案,那么我们更可能找到一个简单的解决方案。

RM:
    你写过一篇关于开发TeX的文章,在文中你谈论到激发纯粹的、破坏性的QA个性,全力以赴测试代码。你认为大部分开发人员在这方面做得还好么?

【译者注:关于这篇开发TeX的文章,在Coders at Work的306页也提到过,但是译者一直没有找到原文。】

DK:

很对,只有抱着这种心态写测试用例才能检测出微秒的错误。举例来说,我知道我没有密码学专家或者计算机安全专家所具有的那种狡猾。

另一方面我为软件设计了相当成功的压力测试,这主要是通过

(1) 设想自己是系统的敌人,而不是朋友;

(2) 考虑那些合法但是离奇、不可能被使用的输入;

(3) 将难以置信的复杂的结构嵌入另一个了解更少的结构.

在我能说服自己程序运行正确之前,有时需要花费好几个小时来思考TeX和METAFONT的测试程序。但是在这个过程中我发现了程序漏洞,而且我很确定使用其它我听说的方法是无法发现这些漏洞的。

几个不同的人独立做压力测试大概会获得更好的结果。可以想象,测试是一个令人满意的职业。

可能我倾向于以意想不到的方式使用系统,当发现缺陷时,我会很满足。举例来说,我记得当我拜访我的妹妹的时候,和我外甥玩“shoot-em-up”很有乐趣。

因为我是和平主义者,我尽可能将子弹射击到墙上,而不是试图射杀隐蔽的攻击者。通过使弹孔满足合适的模式,我能够将我的名字拼写在墙上。在游戏中跑来跑去之后,当我回到原来的位置,我的名字不见了!我认为这是软件的一个漏洞。

很久以前当我还是一位少年的时候,可能是1952年或者1953年,我看到了我的第一个“计算机游戏”,那是在芝加哥某个博物馆中的tic-tac-toe的示范,游客们接受挑战来打败机器。

这个展示品是由AT&T设计的,我认为它是由继电器而不是真正的通用计算机来控制的。


高德纳和计算机程序设计艺术:人物访谈
“嗯。这里没有愤怒的小鸟!”
(高德纳和IBM650 1958年)

我很清楚如果做正常的回应我不可能赢;所以我故意做最愚蠢的走法。机器处于可以用两种方式完成三个一排来击败我的状态。我决定不去阻止任意一种可能性。做为回应,机器一次做了两个获胜的走法。。。这明显是违法规则的。所以我取得了道义上的胜利。

所以,鼓励“跳出思维局限”有助于设计测试用例,就像很多其他情况一样。

RM:
   如果在今天让你从头开始设计 TeX 的话,计算机领域或您个人理解的进展会以戏剧性的方式改变它的设计,还是会把它制造成几乎一样的呢?

DK:
    我不知道是否今天有人仍然可以写这样一个程序,而无需为专利想法的许可支付一笔钱。如果我们忽视这些问题,那么我会保持系统基本上是现在这个样子。

    出于对 TeX 的尊重,唯一使我后悔的严重错误是我在内部使用二进制算术而在用户界面中使用十进制算术;我应该用十进制完成所有的计算。

RM:
    你对那些想成为更好的软件设计师的人有什么建议?他们应该怎样决定是要赚钱还是搞学术?你觉得为了做到更好的软件我们需要更好的激励么?

DK:
     我觉得当前的激励已经很好了,当然了,除了我希望更多的人会发现文学编程的好处这点。

RM:
     传说中,有说Chuck Moore对你的算法理念有影响,也有说你对他有影响,哪个是真的?

DK:
    据我所知,我们两人没有交集。

RM:
     当你在进行试探式的编程并准备发表时,你需要什么样的处理

DK:
     我平均每个星期大概写5个程序,接下来就是享受将它们润色的过程。在我知道这个东西是怎样运作的时候,我通常会撕掉开头的一两个草稿,因为算法往往是没 法再加东西了的或者让人感到意外的。我经常深入的学习我在研究的这个方面的权威专家写的代码,但我也会试着从头开始构想问题的方方面面。我犯过不少错误, 但这之后我会试着帮读者避免它们。

RM:
    如何定义设计编程语言的概念?它是一种表达想法的工具,还是表达目标的工具?

DK:
    我认为编程语言是一种将程序员的想法转换为机器可以执行的精确操作的工具。主要的思想是尽可能匹配用户的直觉。因为有很多种用户和很多种应用领域,所以我们需要很多种语言。

    在我最近出版的《计算机语言论文选集》(Selected Papers on Computer Languages)的第11章中,我详细的讨论了语言设计。在20世纪60年代我就被请求撰写这个主题的文章,对于阐释好的设计准则,我能想出的最好的 办法就是全部违反这些准则,提出BL\I(Bad Language One)的设计。但是在公开BL\I之前,我犹豫了四十多年,因为我担心有人可能会去实现它,并且开始使用它。最终,在准备那本书的时候,我决定冒险一 试。

RM:
     我知道这是个很大的东西,但一种语言的设计跟用这种语言写的软件的设计间有着什么样的关系呢?

DK:
     对算法有独到想法的软件开发者需要一种能匹配他们这种想法的语言,使他们能有效的将这些想法转化成能工作的代码。

   不同的思考过程导向不同的结构。

RM:
     计算机行业当前最主要的问题有哪些?

DK:
    呃,我只是个写编程的学者,我从来都不明白工业或经济是怎么运转的。

RM:
     你喜欢自由或秩序吗?你更倾向一种方法做一样事,还是有一千种方法达成同一目的?

DK:
     (a)自由和秩序我都喜欢。(b)我想也许我倾向于三种方法吧,各具不同的特点,当中任一种都具备将自己变成其他两种的知识。

RM:
     你觉得作为一个技术专家你怎样影响了计算机行业?人们能从你的经验中学到些什么呢?

DK:
     我说不准有我能什么影响,但我可以总结一下我职业生涯中我试着完成的东西:我试着将与编程相关的许多好的理念收集起来,并且有效的加以解释,因为我相信计算机科学是一个知识的尤物。