高纳德,圣经,

“电脑教学中什么东西是最难的?”如果在电脑老师中搞个调查,您会怎样回答呢?很多人的答案可能不谋而合:是“编程”;如果在学习电脑的学生中做个调查,答案可能也是如此。那电脑学习中最有意思的东西是什么呢?可能很多人的选择还是编程。提起编程,我们很容易想到信息学奥林匹克竞赛拿大奖,但学生热爱电脑,学习编程,更多的激励源于一些编程名人的故事。程序越来越已经不是什么神秘的东西了,许多程序员的故事几乎可以达到家喻户晓的程度:世界首富比尔.盖茨,一个根本不用多介绍的人物;中国金山WPS老总求伯君,很老的一个亿万富翁故事;现在的QQ作者马化腾,是学生们耳熟能详的明星。他们都有一个统一的称呼:程序员——通过几行代码,一个小小的软件,改变了世界,也改变了自己的命运! 
通往程序员的大路是什么样子的呢?有没有走向这里的终南捷径呢?比尔盖茨的一句名言能说明一些什么:
如果你认为你确实是一个好程序员,读一读Knuth的《计算机程序设计艺术》吧,要是你真把它读通了,你就可以给我递简历了。
——Bill Gates
从一些顶级程序员的身上,或许会给我们更多一点启示。Pascal之父对于编程,源于一种纯洁的学术追求,也源于他儿时就有的制造飞机的梦想;STL之父告诉我们要学好数学;C++之父告诉我们注重实际……每一个人都有自己的道理,象不同的大侠有自己独门的秘技一样,因为他们的人生经历是不同的。
但不论比尔.盖茨还是其他顶尖语言大师们告诉我们的事实只有一个:一个人和一本书,高德纳(Donald E. Knuth)和他的《计算机程序设计艺术》。


高德纳的中国缘
高德纳,英文名Donald E. Knuth,不论高德纳还是Knuth,对于大多数人来说是一个陌生的名字,它不是商业明星而是一位学术奇才。
从“高德纳”这个意味深长的名字里,我们不难看出Knuth先生的中国缘。提起他的名字,还有一段典故,还要把计算机界的诺贝尔奖之称的图灵奖拉出来。1974年,34岁的他获得计算机科学最高奖——图灵奖,“高德纳”这一中文名是由现在香港科技大学的姚储枫教授给取的,她正是姚期智教授的夫人,姚期智是著名华人图灵奖第一人、现清华大学教授。早在1977年,高德纳还曾到访过中国。
他是世界公认的计算机科学方面的顶尖学者,《计算机程序设计艺术》 是他利用业余时间,四十年如一日的杰作,被称作程序员的《圣经》。写作此书的过程中,他还用四年时间发明了一套计算机辅助排版系统TEX和字体系统METAFONT。他是开放源码运动积极的偿导者,他的上面的两个系统都是开放源码的优秀作品。不仅如此,他还是一位娴熟的管风琴演奏家,作曲家和小说家。四十多年来,他出版了超过150种以上的各种出版物。他获得的誉更是数不胜数。
高德纳,是斯坦福大学“计算机程序设计艺术教授”,1938年生于美国密尔沃基,1960年,高德纳(Don E. Knuth)获得Case技术学院数学学士,作为一项崇高荣誉,同时获得硕士学位,1963年,他获得加利福尼亚技术学院的数学博士,1979年,他41岁时,从卡特总统手中接过了美国科技界的最高奖——美国国家科学奖。
高德纳先生网站:http://www-cs-faculty.stanford.edu/~knuth/
程序员的前三板斧
程序员是编程序的。高德纳先生,作为一名不折不扣的程序员,甚至可以说是程序教父,有许多属于他的独特的精彩的东西。在他的《计算机程序设计艺术》中,有许多程序员们梦寐以求的算法;他在斯坦福大学的课堂,也是学生们非常向往的地方。这些都暂时先不说,先看一下他编的前几个程序。
据说高德纳三岁时就接触打字机键盘,但正式接触编程,高德纳写的第一个电脑程序并不比我们开始时的第一个强多少。他的第一个程序是用于分解质因数的,从控制台输入一个十进制数,将会在卡片上得到打孔数据。源程序大约有70条指令,但是从70条中冒出100多条错误!象任何刚编程的人一样,他编程时也犯了不少错。但正是这些错误,使高德纳受益匪浅,程序刚开始是无法运行的,他就继续调试,直到它能运行为止。
第二个程序是做进制转换的。而非常有意思的是他做的第三个程序。
第三个程序是Tic-tac-toe,也就是我们常说的三连棋游戏,又叫井字游戏,比赛双方谁能在一条直线上将三个棋子连上串,谁就赢了。他的这个程序还能学习如何玩Tic-tac-toe,在编这个程序时,高德纳非常用心。如何学习呢?通过如下的原则,如果在一场游戏中,电脑获胜,则每一个位置的参数将增加一点,如果电脑一旦输掉,则将全部位置标为坏点。这是自适应的存储方法,一场游戏中,每个位置通过0-9的数字来表示该点的优劣;4代表中游水平,因而平局游戏各点参数趋向4。他还写了另一个可以很精彩地玩此游戏的程序,并将这两个程序一同较量。90局结束后,自学习的程序学会了如何战平后一程序。
在另一试验中,300场对战结束后,两个自学习的原本空白记录的程序学会了如何战平对手,他们走棋非常保守,并不令人振奋,出现 “两个生手相互引领学习”,是很值得我们回味的事情。
程序员在我们许多学生眼中,是眼皮睡眼朦胧的“异类人”,他正式接触编程时,是在1957年,那时他19岁,还是一个没有女朋友的光棍汉,但就是在迷上编程后的暑假过后,他也有了自己的女朋友了。
后来,美国著名的程序员杂志DDJ请高德纳给程序员提建议时,他总结了两点:
“第一,写程序时将其想象成一件文学作品,你写的东西正是别人要读的,不要将其想象成电脑照着做的,只要程序的可读性有多高,它就会有多有效,今天、明天、后天你都能读懂,后来的维护者也能读懂。”
“第二点,自然界的数学定理是世界的财富而不是发现者个人的,我倾向于将所有的而不只是古老的算法向公众开放,……因为,软件设计者需要的最基本的构件是算法、语言和数学。”
在教学方面,他有许多独到的方法,最有意思的考试前的最后一课,学生们可以问各式各样的只要是和考试无关的问题,他自豪地说,斯坦福的教育模式就是最理想的,还推荐给读者看他的另一本书《Concrete Mathematics》。
再精明的程序员都是从菜鸟起步的,但永远是菜鸟的程序员是任何人都不想当的。高德纳的编程历程又是如何的呢?


创造精神和程序员
每到NBA比赛的时候,我们都会为火箭队的精彩上演而期待和苦苦等待,因为里面有一个中国人的面孔——主角姚明,那是什么使得您在观看赛事时,对比赛情况一目了然呢?是各种积分表排名表统计数据,令我们对比赛的任一细节都一清而楚。为什么要提一下NBA篮球呢?因为高德纳最精彩的一个程序正和篮球统计数据相关。
在他的大学生涯,还有一个程序不能不提,Case大学篮球队是1960年的联赛冠军,而据说高德纳是这次夺冠的绝对秘密武器。但他不是球员,凭什么成为秘密武器的呢?是程序!
他编了一个评价球员的程序,使得整个球队焕发出比其他队伍更强的生命力,这可能是他最精彩的程序之一。他回忆说:“我设计出一个连我自己都不太相信的复杂公式,这一系统可通过一个神奇的数字来评价每一位球员。这一神奇数字用来说明每一球员对比赛的贡献,不仅是他的得分,如果有球员没能进球,我们球队不能拿到这个球,有一个可能的机率,也就是另一方将得球,这样,他将为每一个失球而失去一些分值。相反地,当球员偷球成功,我们球队赢得了先机,这自然可以得到一些分值。”
的确,观看一场篮球赛并判断每一次得球点可能的得分情况是十分有意思的。这种判断在最后的时间更是变幻莫测,但是在比赛的大部分时间里却逃不出这一规律:你的球队占有球的优势,便是得分的胜势。换句话说,当得分牌上是90比85,你可以给任何一个拿球的一方加1分,这倾向于给自己对现有分数的乐观估计。如果你用这种方式看球,当某一方投篮命中,得分并没有真正改变,因为此方得到两分的同时也失去了球权,别忘了另一方得到了球,就这样这两分有些相互抵消了。如果另一方回到半场并得分,我们又回到了我们讨论过的起点上。但是当有人偷球成功,才真正加分。
通过他的神奇公式,球势转化为胜利的分数在大部分比赛中是1比0.6。正象前面高德纳说的,他对这个公式现在已不再相信了,但这个公式的确包括了对诸如截断,失球等的统计数字,可以套用它然后得出数值,教练非常喜欢这些数字,他说数字同他对球员表现的评价有共同联系;球员从追求最高直接得分,转向尽量得这样一个评价的高分。教练认为这是件非常棒的评价机制,他的这个程序在《新闻周刊》等报刊上都有报道。
上面的程序是他的初级作作品,他的比较成型的软件很多,最有名的有两个,一个是计算机辅助排版系统TEX,以用来处理数学和科技论文,并作为文献交流的一种标准。另一个是字体系统METAFONT,这两个系统都是开放源码的代表作品。
在第一个作品中,高德纳还采用他书中现金悬赏的方式激励其他程序员寻找他程序中的错误,从2.56美金,每年一递增,直至655.36美金,当然,悬赏的金额越高,从程序中找出错误也就更难了。
正是基于上面的总结,高德纳提出了“可读式程序(Literate Programming)”,并创造了自己的CWEB语言。当记者问到他“您使用什么计算机语言?有没有学编程的好方法?学编程的工具是不是必需的?”他说:“每周我都通过CWEB写几个程序,它是C和TEX的结合体。我的书《可读式程序》解释了它为什么可以节约时间,写出的程序比其他方式可靠性高、易修改和维护。另一本书《斯坦福图形基础》有一些较小的CWEB程序,而《MMIX软件》中有几个中等规模的程序。还有两本书《TEX:程序》和《METAFONT程序》,则包含了相当大的程序的全部源代码。在我的网站上还有很多在线示例。”
每个想成为程序员的学子和现在的程序员们可能都有自己独特的有趣的编程故事,但要发生故事不是坐在屋子里空想就能写出程序的,老师们要做的除了培养学生观察的意识,还要提醒学生们留心生活中的示例,编程解决实际问题;而另外一点,对于想成为一个职业程序员的人,高德纳的提醒也非常有见地,他不只在一个场合反复表达自己的观点:
“我要提醒那些想以编程为职业的年轻人能意识到此项工作的困难程度,它需要‘独特的思考方式’,只有1/50的人拥有此素质,不具有此特殊素质的人最好选择其他的职业。”


持之以恒的精神和写作的原则
《计算机程序设计艺术》是一部伟大的著作,这部书从1962年开始写,到目前为止已持续了45年时间了,而且它还在继续,这部书更值得一提的是,在他退休之前,写书全是利用他的业余时间完成的,为了专心写书,他将自己的电子邮件现在都停用了!
高德纳先生的写作,可以一直追溯到小学。他教育自己的孩子时,也尽量要求他们每周写一篇文章。如果他们下周想看电视,前一周就要交上他们的习作。到大学高德纳发现,写作占了他50%的时间,而另一半则是数学。
“在教育中的一个很大的问题是,学生们没有学到怎样写作。这是非常严峻的。”学生们过早地专业化了,没有意识到学习的写作的这一面是非常危险的。人们对生活中的各类事物都要保持开放的态度是很有必要的,如果对某一亚文化群投入过多,势必会限制以后的发展。
写作时独特的方法,也是高德纳有意思的地方,对于我们的学习工作也有很好的借鉴意义,主要有四点:“批处理式的工作方式”,有目的的阅读,引用名言,做好笔记。
批处理方式是早期电脑处理问题方式之一,将很多任务打包在一起,集中处理;这些完成后,再完成其他的打包任务,高德纳写作的方式正基于此。
“当我写书时,我将写作相关的材料放在身边,其他东西都放在一边,研究某一领域时,我能保证自己专心致志地阅读,当我结束这部分工作时,它们就从我的大脑中溜走了,我再将其它的工作移入。这也就是计算机科学中的‘批处理方式’,同‘交换输入输出’和‘颠簸’正相对应。”
“我不是随机阅读资料的,我先阅读标题和大纲,将这些资料归类后再读,引用名言也一样,我将名言记下以备用,例如下面的的Beatles的一句:‘没有人在我的树上。’用来表示分叉式搜索方式真是太棒了。我想自己之所以希望活得更长一点来完成这项工作,可能就是由于我记录了大量的伟大名言。”
“当我研究某一专题时,我将阅读60篇相关资料。前两篇我会慢慢研读,但后面的58篇我已知道要讲的是什么内容。当我读这前两篇时,原则上是先看问题后看答案,为后面58篇将出现的词汇和思想做准备。”
“我还有一本小笔记本,每一天我都在其上写下一天的工作小结,它可以帮我更好地安排自己的时间表,也帮我意识到工作的困难程度以提前做好准备。如果连续很多天里持续记录我很累,非常想睡觉,或者记着‘Today I goofed off(今天一事无成)’,它可以帮我调整到合理的进度上去。”

这些是他写作的原则,也是他书写成伟大著作《计算机程序设计艺术》的准则。除了创新,还有一种持之以恒的精神。而他童年时发生的一个故事,是对这种精神最好的诠释。
1952年,当时高德纳是小学8年级学生,有一家叫Ziegler’s Giant Bar 的糖果公司举办了一场竞赛,竞赛内容是看看谁能用“Ziegler’s Giant Bar”名字里面的11个英文字母组成尽量多的单词。它对小高德纳很有吸引力,于是,他想了个办法,专心做这件事。他和父母撒谎说胃不好,请假两周,专门备战这场比赛。在两个周里,他利用一本完整的词典,从中找出了所有能找到的单词,总计找出了大约4500个单词,而比赛的答案只有2500个。很显然,他是最后的胜出者,事后他意识到如果用’号还能找出更多的单词。高德纳的爸爸妈妈也为他的投入程度而感动,帮着把写好的答案打印出来。那时还不可能在小学里用上电脑,可能有了电脑,会是另外的一种做事方式。

而对于他的作品,除了程序,书籍的现金悬赏的方法也是不可不提的:高德纳先生的多部英文原版作品,都是通过现金悬赏的方式找错,包括《计算机程序设计艺术》,以2.56美元为基数,对第一个找出书中错误的人员进行悬赏,可以是印刷错误,也可以是逻辑错误。

高德纳先生现在是美国斯坦福大学计算机程序设计艺术荣誉退休教授,在斯坦福大学宁静的校园里,继续他的《计算机程序设计艺术》旅行。在他带给我们的旅行中,让我们的老师们更多更快地发现程序的奥秘,也帮助我们更多的学生走向成功!

posted @ 2014-04-18 15:10  路在脚下,  阅读(970)  评论(0编辑  收藏  举报