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

高德纳谈计算机程序设计艺术(上)
http://blog.jobbole.com/8397/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

===================

一个人一旦能够喂饱自己并有个安身之所,剩下的就是为别人做点什么了。   ——高德纳

我们从IBM得到的手册上面有一些编程的案例,而我发现自己的方法比上面介绍的好得多。所以我猜自己可能有些天赋。

大学一年级结束以后的暑假,高德纳在学校打工,负责把统计数字画成图表。碰巧他工作室的隔壁就是计算机房,新到了一台IBM650。当时的计算机体积都很庞大,有供输入和调试的控制台,上面排列着一排排的开关和指示灯,计算机工作时指示灯快速闪烁变化出不同的图案,这引起高德纳极大的好奇与兴趣,他接连好几天彻夜不眠地呆在机房,观察它的工作,钻研使用手册,探究计算机的奥秘。一年以后,他终于改学数学,与计算机结缘。这段经历对于高德纳是如此重要和关键,以致他在《计算机程序设计的艺术》第一卷的卷首,不像别的作者那样一般写上“献给自己的父母”或“献给自己的妻子”,而是写着“献给曾经安装在开思理工学院的650型计算机,以纪念那些愉快的夜晚”。他的第一个计算机应用程序也是在650计算机上实现的:他为他所在的校篮球队(高德纳人高马大,也喜爱运动,娱乐)设计了一个复杂的公式,根据球员在每场比赛中的得分、助攻、抢断、篮板球、盖帽等多项统计数字对球员进行综合评估。球队教练根据高德纳的程序挑选和使用球员,使开思理工学院在1960年赢得了联赛冠军,高德纳的“神奇的公式和程序”也被当地报纸和广播传为美谈。球队教练非常欣赏这套程序,宣称球队在联赛夺冠也有它的一份功劳。《新闻周刊》专门为该程序写了一篇报道,IBM也在公司宣传册上刊登了高德纳与650机的合影。

在算法方面,有他和他的学生共同设计的诸如Knuth-Bendix算法和Knuth-Morris-Pratt算法,前者是为了考察数学公理及其推论是否“完全”而构造标准重写规则集(rewriting rule set)的算法,曾成功地用它解决了群论中的等式的证明问题,是定理机器证明的一个范例。后者是在文本中查找字符串的简单而高效的算法。此外,高德纳还设计与实现过最早的随机数发生器(random number generator)。

计算机科学技术中两个最基本的概念:“算法”(Algorithm)和“数据结构”(Data Structure)就是高德纳于29岁时提出来的。

我尝试尽我所能的去熟悉电脑科学里的一些领域,然后把这些知识摘要成大家比较容易了解的方式,让没有那么多时间做这种学习的人也能够吸收它们。为此他常常需要阅读超过20万页的文献,然后将之浓缩为两千页——他无意追赶最流行的内容,而是希望从日新月异的信息中萃取出能够存活到下个世纪的精华。

TEX的版本号不是自然数列,也不是年份,而是从3开始,不断地逼近圆周率 (3.14,3.141…目前最新版本是3.1415926)。高德纳再一次用行动宣告,我这个东西,不可能再有什么大的改进了,最多只能小修小补,使其 趋近完美。他还专门设立了奖金:[3] 谁发现TEX的一个错误,就付他2.56美元,第二个错误5.12美元,第三个10.24美元…以此类推。我们都知道,传 说某个国王就因为这种指数游戏失去了江山,高德纳作为算法大师,更清楚指数增长的可怕性。然而他却敢立此重赏,结果直到今天,他也没有为此付出多少钱,高的另一悬赏是向发现其著作中错误的人发奖,数额依旧是2.56美元始,因为“256美分刚好是十六进制的一美元”。不过寥寥几位获奖者都将有他签名的支票当作文物珍藏,并未打算去银行兑现。可见TEX经过了怎样的千锤百炼。这个耗费十年打造的玩具,让当初质疑图灵奖发错了的人们全部闭嘴了,他们甚至改口说:哦,为了这个TEX,不妨再给高德纳一个图灵碗吧。

高德纳1960年毕业于开思理工学院,因学业特别出色,被破例同时授予学士和硕士学位。

习惯用铅笔而非键盘写初稿,高将原因归咎于打字速度远高于思考速度(每分钟 80 个单词以上),而这会导致思考出现太多停顿,用铅笔可以让思考与输入速度保持一致——“我打字的速度比我思考的速度更快(注:开始还不太敢相信,考虑英文输入法中可能有的自动完成功能,以及英文的特点,也是有可能的)这样当我试图用键盘创作重要内容时,就会产生同步问题。速度通常不会是最重要的标准。科学一般都难以迅速解释或迅速领会……我通常的工作方式是用铅笔和纸先把所有东西都写下来,然后在旁边放一个大废纸篓。然后使用Emacs将所有文本键入到机器中……特定的Emacs快捷键使得写书的过程有点儿像演奏风琴……”

传闻高改作业通常是随机翻到一页认真批阅,有了一个初步印象后,对剩下的内容就只大概看看了。阅读大致也照此办理:遇上大部头先读第316页,如果书比较薄就看第100页;随后就可以作出判断了,据说准确率还八九不离十。如果追随他的人很多,以后著书就要注意了:写到第316页或100页时一定要停下来多推敲下。这或许是高德纳推崇随机算法的结果

有人视高为文艺复兴时期式的天才人物,因其不仅博学,更难得的是具超一流的动手能力——在分工日益细化,专业领域愈来愈狭窄的现代社会,这种博而专,基础与应用兼能,理论和操作并行的人才类型尤为罕见。如同一个人独力设计制造一架飞机,除了需要精通空气动力学理论,还须考虑机身上每一颗螺丝钉的固定方式,这确实不免让人想到欧洲文艺复兴时期列奥纳多·达·芬奇那样的全能巨人。

由小故事探究最伟大的计算机程序员如何诞生的

民间故事中一直把高德纳视作为有史以来最伟大的计算机程序员。我们不妨参考以下艾伦•凯所讲的轶事。

当我在斯坦福大学从事AI项目时(20世纪60年代末),每个感恩节我们都会与在湾区 做研究项目的人们进行一次编程竞赛。奖品是一只火鸡。 麦卡锡为竞赛出题。高德纳参加的那一年,他一举拿下了两个奖项:程序调试所用的 时间最少、算法执行效率最高。而且他用的是所有参赛者中最烂的系统,叫做Wilbur系统,只能远程批处理。可以说他把所有人都打得屁滚尿流。然后他们问他:“你怎么这么牛?”他回答说:“我学编程的时候,一天能摸5分钟计算机就不错了。想让程序跑起来,就必须写得没有错误。所以编程就像在石头上雕刻一样,必须小心翼翼。我就是这样学编程的。”

Knuth: Frequently Asked Questions
http://www-cs-faculty.stanford.edu/~uno/faq.html

http://www-cs-faculty.stanford.edu/~uno/cs.html

转载于:https://my.oschina.net/ray1421/blog/701828

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值