高德纳(Knuth)谈计算机程序设计艺术(上)

  英文原文:The Art of Computer Programming

  高德纳(D. E. Knuth)教授是备受尊崇的系列巨著《计算机程序设计艺术》(The Art of Computer Programming)和数十篇受到高度赞誉的计算机科学论文的作者。2011年6月,结束了在英国的书籍研讨和系列演讲的高德纳教授,跟 BCS 编辑 Justin Richards 畅谈了自己的人生和工作。

  您最广为人知的成就应该是《计算机程序设计艺术》系列著作了。1999年,这个系列被美国科学家(American Scientist)期刊评选为20世纪最重要的12部理学专著之一。这个系列最初是如何创作出来的?您是如何看待美国科学家期刊的这一评价呢?

  这系列书籍大约从1960年代开始创作。那时候,因为没有合适的资源,所以大家都在重新发明一些已有的东西。我一直都很喜欢写作,在学校参与报纸和杂志的工作,认为自己是一个作家。我意识到,需要有人记录下所有已经发表而我们正在遗忘的优秀思想。

  这又要回溯到最初的年代,当时真正研究计算技术的人很可能还不到一千个。我没有把这看作将要影响世界的事情,但仍然觉得这些很酷的资料是值得认真整理的。

  那时候,我就考虑还有什么人合适写作这样的书籍。我能想到的每个人,他们都很可能只会关注自己所研究的那个领域。在我所知道的人当中,只有我自己是没有发明创造过什么东西的,因此我设想自己能够以中立的立场来担任他们的代言人。坦白说,那就是初始动机,我认为存在那样的需求。

  我写作这样的书,还有一个很自然的理由。那就是,我要尝试将很多人的不同想法结合起来。我会看到,A君以某种方式来分析他的方法A,而B君会以另一种方式来分析与之竞争的方法B。因此,我就要用B君的方式来分析方法A,用A君的方式来分析方法B。

  因此,我最终就是以单纯分析以上内容的形式来创作书的雏形。很快,我认识到,有些被我捆绑使用的科学方法,在我所受的教育中其实是不允许同时出现的。然而,一次又一次地,我真的看到只有这样的思维方式才可以正确地阐述问题。

  长话短说,很快我也有了自己的不同意见,并且开始发现新东西,这样就难以继续中立地写作了。不过,我仍然尝试在最大限度内以公允、合理的态度去总结每个人的有价值思想。

  至于这本书入选世纪最佳书籍,我还觉得不太好意思。他们把我推到爱因斯坦和费曼的伟大队列中,而我实际上并不属于那样的级别。这可能仅仅是因为他们必须从计算机科学领域选出一个人,而我又没有太多的竞争者罢了。虽然我也觉得自己在研究领域的努力工作是值得提及的,但这样把我挑选出来代表计算机科学, 总有点关公战秦琼的意味了。

  是什么促使您投身计算机科学这个领域的呢?

  我天生就是一个计算机科学家——我的头脑里有一种组织东西的思维方式,注定让我成为一个好的程序设计员。我觉得任何人都可以学习使用计算机,但是五十个人里面大概只有一个人会成为像我这样的极客。这意味着我们这些人将在这个领域中的不断创新,并与计算机产生共鸣。我们的思维方式会帮助我们更容易地学习如何制造机器。

  您为什么会认为计算机科学是如此重要呢?

  计算机科学之所以重要,是因为它改变了沟通的方式。它还影响了金融业,这是我不太情愿提及的。可惜的是,世人是以我和我的同行们对华尔街产生的影响来衡量我们的工作的。在这个意义上,我是很嫉妒天文学家的,因为世人认为天文学家由自己的兴趣去研究天文学是值得尊重的。其实,我研究计算机科学也是同样出于兴趣啊。

  我对 IT 这个说法并没有太大的共鸣,真正打动我的是科学。对我而言,IT 是不错的东西,但并非我所擅长的领域。我的太太就能比我更快地掌握某个图标的含义、找到要点击什么地方。但要让机器完成复杂、细致的工作,在科学上是有许多难题需要攻克的。我曾经觉得很多问题是无法找到答案的,但事实上我们已经一步步地知道要如何解决它们。对我来说,即便没有任何金钱上的回报,我也会做这些工作。

  所以说您对此充满激情吗?

  那是,就像每天早上醒来我都会想着今天要好好写个程序。

  您是受到缪斯女神的眷顾了吧?

  是啊,有些日子她给予我的要比给予其他人的多。甚至有某个阶段,我几乎认为自己是有个专属的缪斯女神的。

  在您看来,您在计算机科学领域最大的成就是什么?

  我想我的第一个成果是研究编译器的理论。我曾经研究过代数语言的理论,而在我写这本书(第10章)的时候,我正试图描述人们在这个领域的种种发现和成果,然后我突然意识到,可以有一种方法把这些发现和成果都关联起来。由于这个发现过于新奇,我不知道该怎样在书里面阐释它,于是就把它发表成一篇学术论文。后来,其他的人读懂了我的意思并开始应用,最终让这个发现成为了今天所有代数编译器的分析原理。

  不过我觉得我最大的成就是发明了比较算法优劣的数学方法。为了了解一个程序到底好不好,我创造了一种量化的比较方法,例如你可以说一个程序优于另外一个程序2.3倍。这个数学方法叫做算法分析,是我最引以为豪的学术成就,也是成功应用计算机的关键。

  当我发明这套数学方法的时候,我跟我的出版商说,不如把这本书改名作“算法分析”吧。但是他们说不行,这样的话这书就永远卖不出去了!但实际上那就是此书的核心内容,它除了综合总结计算机学者发明的算法,还帮助我们从量化的角度去评价每个算法的优劣。

  在您的网站上有关于“你为何不用 Email”的回覆。“对于那些生活在事务的顶端的人们而言,Email 是个美妙的东西。但那不是给我用的,我的角色是在事件的底层。”您是否可以再解释一下自己对 Email 的立场,以及“在事件的底层”的含义?

  某些人是不能整天聒噪不休的,他们要考虑的事情,需要长时间的专注、对材料进行组织并营造坚实的基础,而不是仅仅对前沿问题的惊鸿一瞥。将某些内容以精确的形式表达出来,是需要很长时间的。要正确地做好事情,我就必须专注地耗费大量的时间。当我被大家当作权威的时候,世上数不清的人们要来问这问那。 因此,用了15年 Email 之后,我觉得真的足够了。

  之前的一位图灵演讲者 Grady Booch 非常主张编程的简洁性,而您在赢取西班牙“知识边界奖”的导言中也有相同的论调。您可否解释一下您为何希望程序保持简单、紧凑、易懂?

  我想我们要先温习爱因斯坦的名言“要让它尽可能的简洁,而又不至于过分简洁”。事实上并非样样事情都存在捷径,都是简单易懂的。然而我发现,如果我们有再三思考的机会,几乎没有一件事情是不能被简化的。正因为如此,人们时不时会说:“好吧,基于我们现有的知识,让我们把旧的东西推到重来吧!”

  几年前在斯坦福有一个名为“清白历史”的项目,口号是“让我们找个更好的方法来实现因特网”。当东西不断地累积,你就会发现已经存在太多的垃圾而实在没有必要再去添加东西了。

  那就像人的阑尾,也许曾经某个时候它是有存在的意义的,但是现在已经不再需要了。我觉得这个项目有潜力,尽管实现的可能性微乎其微,因为整个世界已经离不开现存的因特网了。要一个人跳出来说“让我们重新设计整个因特网,从把程序导入计算机开始”,那是非常困难的。这有点像当时 Linux 的出现,其目的就是尝试去简化操作系统。

  您跟 Grady Booch 还拥有另外一个共同的思想,你们都讲过“不必写代码和编程就能欣赏到程序之美”,您这样讲的真正含义什么呢?

  我是从几层不同的含义来看待“艺术”这个词的。通常,艺术意味着人类创造的某种东西,并非自然的。还有一层含义,那就是赋予美学价值的精致艺术品。

  很多情况下,美感都是在旁观者的眼中产生的。但是,人们会因某个事物本身的优雅和谐调而去创造它,那与评论和欣赏其他人的作品是类似的,我们会觉得自己感受到美。当这个作品达到某种标准的时候,我们会因之而满足。

  对于所谓的“某种标准”,可能 Grady 跟我的意见是不一样的,那就如没有任何两个人能对哪种音乐是最好的问题达成完全一致的意见。但是,音乐家无疑是清楚自己喜欢和不喜欢什么音乐的,也很清楚自己什么时候创造出好音乐。这就很类似我看待程序的方式了。

  我想最终都是个人喜好的问题?

  的确如此。没有一个算法你会在输入以后问自己:这到底够不够漂亮呢?尽管的确有人尝试去这样做——美国最伟大的数学家之一 George [David] Birkhoff 曾经在三十年代写过一本书,名为“美学衡量”。这本书充斥了形形色色的数学公式,还有一页满满的印着各式各样的希腊骨灰瓮,并在每一个旁边都给了一个美的评分。

  他还给很多不同的设计系统评分。其中比较有趣的是,在他的一百强名单里面,排行第二还是第三的是万十字章——他本身是同情纳粹的。我想这个图标的旋转方向要是反过来,对印度教来说可能有更大的宗教意义。我不认为可以衡量这些东西的美丑,但是他的确这样做了,而且也有其他人作了同样的尝试。

  那么说,还没有人编出能评判程序的美丑程度的程序啰?

  实际上还没有。有些软件工程师因评测的需要而尝试做这样的事情,我也不是很清楚。大家都知道,像你这样的记者或作家都有很多题材,你们需要量化数字来充实文字内容。例如,有人在开罗的冲突中丧生,你们就需要弄清楚是300人还是315人,这是新闻报道的必备部分。量化资料可以提升质量。我也在尝试寻找数字化的方法。不过,实际上软件工程师试图衡量的是某个程序员的优秀程度。其实他们去问老板就行了!

  我觉得数字的使用是让人们在心里面能做个比较,例如20个人在这个事件中丧生,50个人在另外一个事件中丧生,那么人们通过对比就会觉得后面这个事件更为严重。

  但这很可能其实是在用苹果和橙子比较。因为一旦涉及到数字,人们就可能篡改某些数据来扭曲事实。你也可以想象教育学生,总想着学生怎么样才能通过考试,然后你就可能会编写一本关于应试的书,而不是一本关于学习科学的书。

  这样一来一切都是为了在学科考试中获取高分。然而问题是这些数字评分并不是总能很好的反映事物的本质。当你把一些事情量化了,假如你想的话你总是可以找到作弊的方法,因而也最终忘记了学习的初衷。

  英文原文链接

it知识库高德纳(Knuth)谈计算机程序设计艺术(上),转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。