计算机⿐祖-DonaldKnuth(⾼纳德)的传奇李开复说,练内功,不要仅仅花功夫学习各种流⾏的编程语⾔和⼯具,以及⼀些公司招聘⼴告上要求的科⽬。要把数据结构、算法、数据库、操作系统原理、计算机体系结构、计算机⽹络,离散数学等基础课程学好。最好还是试试Donald Knuth的
Art of Computer Programming⾥的题⽬,假设你可以解决当中的⼤部分题⽬,就说明你在算法⽅⾯的功⼒不错了。
Donald Knuth⾃传的开头这样写道:“Donald Knuth真的仅仅是⼀个⼈么?”作为世界顶级计算机科学家之中的⼀个。Knuth教授已经完毕了编译程序、属性⽂法和运算法则的前沿研究。并编著完毕了已在程序设计领域中具有权威标准和參考价值的书⽬的前三卷。在完毕该项⼯作之余。Knuth还⽤了⼗年时间发明了两个数字排版系统。并编写了六本著作对其做了详尽的解释说明。如今,这两个系统已经被⼴泛地运⽤于全世界的数学刊物的排版中。随后。Knuth⼜发明了⽂件程序设计的两种语⾔,以及“⽂章性程式语⾔”相关的⽅法论。
到眼下为⽌,Knuth已经出版发⾏了17部书籍,⼀百五⼗余篇论⽂,包含了巴⽐伦算法、圣经、字母“s”的历史等多⽅⾯的内容。作为⼀名数学家。Knuth曾开创了⼏门新的课程,为纯计算数学做出了⾮常⼤贡献。他所获得的奖项和荣誉数不胜数,当中最值得注⽬的有1974年美国计算机协会图灵奖(ACM Turing Award)。1979年美国前总统卡特授予的科学⾦奖(Medal of Science)以及1996年11⽉因为发明先进技术荣
获的极受尊重的京都奖(Kyoto Prize)。在不多的业余时间⾥。Knuth不仅写⼩说,还是⼀个⾳乐家、作曲家、管风琴设计师。
是Knuth独特的审美感决定了他兴趣⼴泛、富有多⽅⾯造诣的特点。Knuth传奇般的⽣产⼒也是源于这⼀点。
对于Knuth来说,衡量⼀个计算机程序是否完整的标准不只在于它是否可以执⾏,他觉得⼀个计算机程序应该是雅致的、甚⾄可以说是美的。计算机程序设计应该是⼀门艺术,⼀个算法应该像⼀段⾳乐,⽽⼀个好的程序应该如⼀部⽂学作品⼀般。
早期经历
Knuth,1938年1⽉10⽇⽣于美国威斯康星州密尔沃基市。他在模式⽅⾯辨别和熟练操作的能⼒在⼋年级的时候開始显现出来。当时。当地的⼀家糖果制造商举办了⼀项⽐赛。⽐赛要求选⼿⽤其品牌“Ziegler's Giant Bar”中的字母组成新的单词,规定时间内组成单词数量最多者获胜。Knuth參加了⽐赛,并以单词总数4500余个远远超过了裁判的2500个的标准。轻松赢得头奖。赛后,Knuth说道,假设⾃⼰当初想到回答时⽤些省略符号的话。还能写出很多其它。
这次⽐赛Knuth为学校赢得了⼀台电视机,还为每⼀个同学赢得了⼀根糖果棒。
数学上。克努特也⾮常早就表现出天才。
⾼中⼀年级时。他发明了⼀种⽅法,利⽤这样的⽅法,对随意画出的2条相交直线,他能马上给出对应的⽅程。
Knuth多产的出版事业開始于他的⾼中时代,当时他的科技设计被Westinghouse Science Talent Search 光荣提及。他
的“Potzebie System of Weights and Measures ”的基础章节被登在“Mad”杂志第26号,“Power”的基础章节被叫作“whatmeworry”。“Mad”的编辑认识到了年轻的Donald著作的重要性,以25美元买下了他的⽂章,并刊登在了其1957年6⽉的期刊上。
⾼中的时候,Knuth对数学并没多⼤兴趣,⽽是把主要精⼒放在主修的课程:听⾳乐和作曲上。他在⾼中的乐队⾥吹萨克斯、⼤号时,曾把Dragnet、 Howdy Doody Time 和 Brylcream的主题曲联成⼀段新的⾳乐。
这位著名的科学家在最近评论⾃⼰的早期作品时承认:“对于版权,我⼀⽆所知。”
1956年。克努特以各科平均97.5的创记录的⾼分从密尔沃基路德兰⾼级中学毕业。进⼊俄亥俄州克利夫兰的开思理⼯学院
(Case Institute of Technology)攻读物理。这⼀年,他在中学时就创作的⼀篇出⾊的科学幻想⼩说“普茨⽐度量衡体
系”(The Potrzebie System of Weights and Measures)在美国著名的《疯狂》(Mad)杂志上发表,克努特获得了他的第⼀笔稿费25美元,并因⽽获得西屋科学天才的提名奖。
在这篇⼩说中,克努特风趣⽽富于幻想地提出了替代公制的⼀种新的计量制度,⽐⽅以⼀本流⾏杂志的厚度为长度单位。尽管滑稽可笑,却设计得严密周到。天⾐⽆缝。当中甚⾄还包含⼀种新的历法。⽂章刊出后⼤受欢迎,多次重印,1991年还重印过⼀次,其时作者克努特即将退休。
尽管 Knuth的等级平均分是学校历史上最⾼的,可是他和他的指导⽼师还是对他是否能成功学习⼤学数学持怀疑态度。
Knuth说在他⾼中阶段和⼤学早期⼀直有⼀种⾃卑感,这个问题⼀度是他的⼀个障碍。作为⼀个⼤学新⽣,Knuth没有对于失败的恐惧。他花了很多时间攻克额外的数学难题。⼏个⽉后。他在这⽅⾯的能⼒已经远远超过了其它同学。
⾼等教育和早期的计算机⼯作
当Knuth在Case科学院(如今的Case Western Reserve)获得物理奖学⾦时,梦想成为⼀个⾳乐家的计
划改变了。Knuth回去继续研究数学是在⼤⼆,当时⼀个爱出难题的教授提出了⼀个特殊的问题,并说哪个学⽣能解决问题就⽴马记成绩“A”。Knuth跟⼤多数同学⼀样,也觉得那是道解不出来的题⽬。直到有⼀天。他错过了公共汽车,仅仅能步⾏去看⼀个演出,Knuth利⽤路上这点空暇时间决定尝试⼀下。那阵⼦
他运⽓真的是⾮常好,不仅问题⾮常快就解开了。得到了“A”。还成功地常常逃课。尽管 Knuth也承认,逃课让他有负罪感,可是⾮常明显,他全然有能⼒补上落下的功课,接下来的⼀学年,他的离散数学就⼜得了个“A”,并且还获得了给⾃⼰不能參加的课程评定论⽂等级的⼯作机会。
计算机的诞生1956年,作为Case的新⽣,⼀年级结束以后的暑假,克努特在学校打⼯,负责把统计数字画成图表。
碰巧他⼯作室的隔壁就是计算机房,新到了⼀台IBM650。
当时的计算机体积都⾮常庞⼤,有供输⼊和调试的控制台,上⾯排列着⼀排排的开关和指⽰灯,计算机⼯作时指⽰灯⾼速闪烁变化出不同的图案,这引起克努特极⼤的好奇与兴趣,他接连好⼏天彻夜不眠地呆在机房,观察它的⼯作。钻研使⽤⼿冊,探究计算机的奥秘。⼀年以后,他最终改学数学,与计算机结缘。这段经历对于克努特是如此重要和关键,以致他在《计算机程序设计的艺术》第⼀卷的卷⾸,不像别的作者那样⼀般写上“献给⾃⼰的⽗母”或“献给⾃⼰的妻⼦”。⽽是写着“献给以前安装在开思理⼯学院的650型计算机,以纪念那些愉快的夜晚”。
天天与计算机为伍,Knuth说直到⼀年后,⼥孩才进⼊了他的⽣活。这⼜是计算机科学界⼀直以来亏⽋科学家们的⼀个事例之中的⼀个。Knuth 熬夜读IBM 650的说明⼿冊,⾃学主要的程序设计。那时,在⾼等计算机语⾔发明之前。程序编写仅仅能⽤第⼆代或是汇编语⾔。
这个⼯作既耗时⼜困难。由于指令必须依据每台机器特定的构造编写,⽽实际上指令仅仅须⼀步就可从⼆进制0、1系列转存到计算机硬盘上。Knuth说,有了第⼀次使⽤650的经历,他便肯定⾃⼰能编写出⽐说明⼿冊上介绍的更好的程序。
Knuth⾮常快便開始“闲逛”,编写能够运⾏数学函数的程序。
他的第⼀个程序是把数字转化为素数。第三个是做井字游戏(或者说是让计算机在改正每次输的错误的过程来学会玩井字游戏)。
他的第⼀个计算机应⽤程序也是在650计算机上实现的:他为他所在的校篮球队(克努特⼈⾼马⼤,也喜爱运动,娱乐)设计了⼀个复杂的公式,依据球员在每场⽐赛中的得分、助攻、抢断、篮板球、盖帽等多项统计数字对球员进⾏综合评估。球队教练依据克努特的程序挑选和使⽤球员,使开思理⼯学院在1960年赢得了联赛冠军,克努特的“奇妙的公式和程序”也被当地报纸和⼴播传为美谈。
作为学校篮球队的经理,Knuth编写了⼀个依据不同成绩标准评定每个运动员对球队贡献等级的程序。
他的努⼒赢来了那些觉得这样做有助于球队赢得同盟冠军的教练的好评(尽管,⽆庸质疑,不是每个运动员都这样觉得)。
Knuth的成就成了新闻周刊的标志,他和教练、计算机的照⽚也被刊登在IBM650后来的说明⼿冊上,当然这也是Knuth的第⼀个计算机应⽤程序。
1960年,Knuth从 Case毕业时享有着最⾼荣誉。在由全体教员參加的选举上,他因其公认的出众成就不但被授予学⼠学位,还被破例同⼀时候授予硕⼠学位。之后他进⼊加州理⼯学院研究⽣院。1963年获得博⼠学位,留校⼯作⾄1968年。然后转⼊任教。其间1972—1973年以前在奥斯陆⼤学当客座教授。
1963年,Knuth回到加利福尼亚理⼯学院攻取了数学博⼠学位。之后成为了该院的数学教授。
在加利福尼亚理⼯学院任教期间,Knuth作为Burroughs 公司的顾问继续从事软件开发⼯作。
1968年。他增加了斯坦福⼤学,九年后坐上了该校计算机科学学科的第⼀把交椅。1993年,Knuth成为斯坦福⼤
学 “the Art of Computer Programming”(计算机程序设计艺术)的荣誉退休教授。
早期成就和计算机程序设计艺术的开端
计算机程序设计艺术
1962年,Knuth还是个研究⽣的时候就開始了他计算机程序的⼯作。
那时,他已经開始了个⼈咨询,为不同的机器编写编译程序。编译程序是⼀种翻译原始或⾼级语⾔和对象或⼆进制机器语⾔的中间语⾔。在不知道众多软件公司正⾼额寻求成百上千的编辑者的情况下,Knuth编写了⼀个程序,赚得5000美元。他的名字⽴马响誉了整个⾏业。在伯克利毕业的前⼀年,世界上⼀流的出版社Addison-Wesley艾迪⽣-韦斯利出版社约初露头⾓的⾼德纳写⼀本编译器和程序设计⽅⾯的书,这件原本平常的事终于成就了计算机科学史上的⼀个奇观。出版社1962年约稿,可直到1966年还动静全⽆,编辑忍不住去电催促,说都过去4年了,书写到啥程度了啊?⾼答才3000来页。编辑惊呼那⼲嘛还不交稿?答⽈还没进⼊正题呢。编辑崩溃地说,那仅仅能出多卷本了……
当Knuth的出版商计算出他的那3000页的笔迹打印成⽂章⼤约须要2000页时。⼤家才发现这实际上是⼀项多么⼤的project。在3000页的⼿写设计草图中。Knuth发明了⼀种综合⽅法,⽤于分析或决定结构翻译所客观须要的⽂法规则。近期。关于他的那第⼀部著作,Knuth⾃⼰这样评述:“⽤三年半的时间写第⼀章可并⾮件好事。”Knuth决定将它详述,成为⼀部更⼤的关于程序设计科学的纵览。共分为七个部分。⼀部
巨著就这样——诞⽣了。《计算机程序设计艺术》。⾄今仍是各程序类图书书架上标志性的书籍
把⼀件寻常的事做到⼈间极致。这就是⾼纳德。他不是故弄⽞虚,他的⼼⾥攒着⼀股劲⼉。要写⼀部与⽜顿的《⾃然哲学的数学原理》相媲美的巨著。 1968年,《计算机程序设计艺术》(TAOCP)的第⼀卷正式出版了。这⼀卷的标题叫《基本算法》。但难度却并不低。。
微软⾸席运⾏官⽐尔盖茨在1995年接受⼀次採訪时说。“假设你觉得你是⼀名真正优秀的程序猿,就去读第⼀卷。确定能够解决当中全部的问题。”值得注意的是,盖茨本⼈读这本书时⽤去了⼏个⽉的时间。并同⼀时候进⾏了难以置信的训练。盖茨还说:“假设你能读懂整套书的话,请给我发⼀份你的简历。
”⾼纳德本⼈的说法更犀利:要是看不懂,就别当程序猿。
同年,⾼纳德跳槽到斯坦福⼤学。并当上了教授。
⼀年后,TAOCP第⼆卷正式出版。1973年,这本书出到了第三卷。
这三卷书被计算机界惊为“ 神作”,在最初的⼏年内就卖出去100多万套。
依照计划,这套书⼀共是七卷。可是如今刚刚写完三卷,就已是震古烁今。
震到什么程度呢。连图灵奖颁奖委员都坐不住了。依照惯例。图灵奖的获奖者都是成就等⾝。要经过时代的检验。但此时,美国计算机协会便决定马上为其颁发图灵奖。
这对⾼纳德来说,⽆疑是个殊荣。这⼀年他仅仅有36岁。⾄今。他仍保持着图灵奖最年轻获奖者的纪录。
⾼纳德在获此殊荣之后。再⼀次令世界⼤跌眼镜:他宣布从此歇笔了,由于排版⼯具太差。破坏了这套书的美。这⼀动作让外界⼗分震惊。有⼈说。⾼德纳江郎才尽,见好就收;有⼈说。图灵奖对前三卷的评价过⾼了。⾼纳德仅仅好理由撤了;还有⼈说。获奖之后停⽌写作,充分体现了他写书的⽬的就是为了功利。
Tex⽂字排版系统
可⾼纳德在辍笔的10年间竟然创造了三个重要的成果:字体设计系统METAFONT、⽂学化编程(Literate Programming)。以及当中影响最⼤的排版系统TEX。
在Word系统中写科学论⽂是⼀件⾮常⾟苦的事,你须要调整格式,也⾮常难表现数学式。
可是在TEX中,这些⿇烦差点⼉全然不存在。仅仅要加载样式⽂件,排版就⾃⼰主动完毕了。
TEX是⼀场出版界的⾰命,直到如今仍是全球学术排版的不⼆规范。
TEX作为⼀个软件产品,也令⼈叹为观⽌。它的版本号号不是⾃然数列,也不是年份。⽽是从3開始,不断逼近圆周率(眼下最新版本号是 3.1415926)。
⾼纳德再⼀次⽤⾏动宣告,这个东西趋近完美,不可能再有什么⼤的改进了。他还设⽴了奖⾦:谁发现TEX的⼀个错误。就付他2.56 美元,第⼆个错误5.12美元,第三个10.24美元……以此类推。结果直到今天。他也没有为此付出多少钱,可见TEX经过了如何的千锤百炼。他设置的另⼀个奖项是出其著作中错误的⼈能得到2.56美元。由于“256美分刚好是⼗六进制的⼀美元”。据说,获奖者将有他签名的⽀票视为珍宝,并不兑现。
为什么是2.56美元?Knuth 教授的答案是:
“256 pennies is one hexadecimal dollar.”
从1981年夏⾄1996年7⽉1⽇,Knuth 教授给指出错误的⼈回信250多封,当中⼀半以上装有奖励⽀票。
从来看,有⼀位名叫 Axel Böttcher 的⼈,曾先后5次得到两块五⽑六的⽀票,3次得到五块⼀⽑⼆的⽀票,真可谓⽜⼈背后有⽜⼈。
受麦粒与棋盘的故事影响。Knuth 教授宣布。每发现⼀个 TeX 程序或 METAFONT 程序中的错误,奖励从2.56美元開始,每年翻倍。最⾼为327.68美元。
1995年有两⼈领取了这项奖⾦。此后⾄今,还⽆⼈可以认领!
有⽹友戏说。什么是聪明:在 Knuth 的书中到错误;什么是愚蠢:去兑现那张两块五⽑六的⽀票。
歇笔⼗年的⾼纳德。⼿捧这三项成果重出江湖,打消了⼀切质疑。这时他才对⼗年前的歇笔事件做了⼀个轻描淡写的解释:⼀个⼈要想把事情做得美丽,就必需要跟上帝保持和谐。如今。上帝最终让我去写四卷了。
1992年,⾼纳德为了专⼼写作,宣布提前退休,并停⽤电⼦邮箱(此⼈从1975年就開始玩电邮了)。
⾼纳德⼀共带了28位博⼠⽣,他认为28 这个数字⾮常好,于是便宣布不再收学⽣了。虽然如此。他仍然为想要师从于他的⼈们留下了⼀个盼头:他开了⼀门公开课,每次会提出⼀个问题,假设谁能⾼速解出来,⾼纳德就会为他的博⼠论⽂签名。不知道哪位后起之秀可以获得如
此殊荣呢,我们拭⽬以待吧。
2008年,在TAOCP的前三卷⾯市30年之后。第四卷最终⾯世了。⽽⾼纳德⾃⼰却已是⽩发苍苍的古稀⽼⼈了。
他对计算机科学的热爱,使他为这套丛书耗费了⼀⽣的⼼⾎。
依Knuth本⼈所讲,《计算机程序设计艺术》是他毕⽣最重要的事业,其⽬的是“组织和总结所知道的计算机⽅法的相关知识。并打下坚实的数学、历史基础”。Knuth撰写的前三卷被翻译成多种语⾔,到1976年为⽌,已卖出超过⼀百万冊。
他眼下正⽬不转睛地编写第四卷,他期望第四卷的篇幅约为2000页,并分为三个独⽴的章节。
为了完毕丛书的其余部分,Knuth如今进⼊了⼀种引退的状态,全⾝⼼地投⼊这项⼯作。Knuth说,⼀般说来,他更喜欢在⼀段时间内集中精神完毕⼀项⼯作。正像他⾃⼰在书中提出的:按“⼀批”的模式。
Knuth从他基本的⼯作计划中拿出了⼗年,即从1976年起,致⼒于对数字排版的研究,设计了著名的⽂件准备TeX系统,字体⽣成程序METAFONT。这项⼯作带来的值得注意的副产品是⽤于结构⽂件和“⽂章性程式语⾔”附随⽅法论的WEB和CWEB语⾔。
如今,Knuth和他的妻⼦Jill,两个孩⼦John 和Jennifer⼀起。住在斯坦福⼤学校园⾥。他继续着《计算机程序设计艺术》第四卷的编写⼯作。尽管说Knuth是全⾝⼼的投⼊这⼀项⼯作,但他还是能挤出时间研究MMIX的设计。那是⼀台64位RISC(精简指令集计算机)。
⽽他的业余爱好仍然是⾳乐,还⼀直邀请那些可以即兴演奏四⼿联弹钢琴曲的⼈们给他留下便条。以便安排⼀些活动。
成就简要回想
编译程序:
编译程序可以实现⾼级语⾔和⼆进制机器语⾔之间的翻译。⼆⼗世纪六⼗年代初期,Knuth教授致⼒于这⽅⾯的研究,尽管现代的软件已经可以使其变的简单⼀些,但编写编译程序仍被觉得是⼀项极为困难的⼯作。 Knuth教授在这⽅⾯最著名的成就是LR(k)分析的研究,那是⼀个能使确定⼀串字符⽂法规则的过程更加顺畅的值得注⽬的⽅法。
⾼纳德进⼊伯克利攻读数学博⼠学位。
在此期间。他的编程⽣涯也正式開始了。他当时所写的程序中最值得⼀提的,是对ALGOL60编译器提出的測试⽅法。ALGOL60常常会由于编译器不成熟⽽出故障。⾼纳德编写了⼀段很easy的測试程序,江湖⼈称“Man or boytest”。翻译成中⽂就是“是男⼈就得-67”。⾼纳德说。仅仅要⽤ALGOL60编译器来编译我的这段程序。假设执⾏结果等于-67。就说明这个编译器是纯爷们⼉。
属性⽂法:
在编译程序的⼯作之后。Knuth教授⾛上了形式上定义程序语⾔意义、语义的研究道路。他建⽴起⼀个更加经济的⽅法去通译联合规则。他把这样的⽅法称作“属性规则”。该⽅法创⽴的同⼀时候,计算机科学的⼦域被称作“属性⽂法”。
算法:
或许Knuth教授在计算机科学领域最原创的贡献就是他对于算法的分析。”算法”和“数据结构”是Knuth29岁时提出来的。算法是编写⼀个程序,使之能去完毕⼀项任务的基础,⽐如搜索或分类等。
在加利福尼亚理⼯学院时,Knuth教授在⼀个毕业⽣的协作下,开发了⽤来探究数学公理推论的Knuth-Bendix算法。1968年。Knuth教授在斯坦福,和他的⼀个学⽣开发了Knuth-Morris-Pratt算法。该法则使计算机在⽂章中搜索⼀串字符的过程更加连贯。
他所著的《计算机程序设计艺术》是⼀个详尽的算法实践和科学的概观。
数字化排版:
数学书籍和杂志已经不像从前那样美丽了。”Knuth教授在⼀篇早期关于数学排版的⽂章中这样写道。因为对计算机排版的校样的低质量感到⽆法忍受,Knuth教授从他史诗性的七卷集巨著的编写过程中拿出了⼗年时间。来开发⼀个⾼质量的计算机排版系统。其间,Knuth开发了两个⽤于⽂件排版和字体⽣成的软件系统,这两个系统如今已被世界⼤多数出版社运⽤。它们各⾃是TeX。⽤于出版业的科学排版,和“优美⽂章”的产品;METAFONT,⼀个字体⽣成程序。
结构化⽂件和⽂章性程式语⾔:
Knuth教授的排版研究。引领他发明了⽂件构造的两种语⾔和⼀个⽅法论。叫作“⽂章性程式语⾔”。语⾔
各⾃是WEB和CWEB。它们促进了程序编写向“⽂学作品,是⽤来阅读的”这个⽅向发展。这两种语⾔的结合,⼀种是⽂件格式化,还有⼀种是程序设计,这就使程序猿可以同⼀时候创建两个不同的系统程序。⼀个⾯向⼈,还有⼀个⾯向机器。
当⼀条过程清楚地描写叙述程序并促进其维护时,另外⼀个则产⽣⼀个机器可运⾏的程序。
这些⼯作就是Knuth教授在实现其使程序设计为读者易懂、甚⾄感觉美丽的⽬标的过程中。在计算机领域⾥所做出的巨⼤贡献。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论