• TAOCP研读开篇:为什么要读TAOCP?

    计算机程序设计艺术
    服务器君一共花费 19.327 ms 进行了 3 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    献身于计算机程序设计的人们必须从事大量艰苦的工作,必须掌握许多精微的技术细节,因而在这方面深有造诣者不多,但其回报却是巨大的,因为一个编写得很好的程序完全可以成为一件美丽的艺术品,而且还因为,正是计算机程序使得全世界的人们彼此靠得更近。

    —— Donald E. Knuth

    计算机科学泰斗高德纳教授的这句话很让人深思。学习计算机程序设计,很多人觉得会用PHP/Java/C#写点网站后台,或者用下JavaScript/HTML/CSS写写前端页面,会点SQL,会点时髦的技术,那就是会编程了。个人揣测,在高教授眼里,这仅仅是小孩子把戏。计算机程序可以是艺术品,编写精美的程序可以让世界变得美好,比如Chrome、比如Android什么的,优秀的程序有强大的生命力,可以让全世界的人联系得更紧密。但是,要编写出这样的程序,必须从事大量艰苦的工作,必须掌握许多精微的技术细节,在这方面有很高的造诣。

    那么用一句简单粗俗的话来说:你连数据结构,计算机算法都不懂,你还说你会编程,这不是在逗我么?

    所以,我在这里开始研读高德纳教授的《计算机程序设计艺术(第三版)》(TAOCP,The Art of Computer Programming),并且尽量尝试把每一个细节都理解透,然后写成博文/条目,让大家可以简明易懂地理解TAOCP,这也是简明现代魔法的网站建站目标之一,就是让大家尽量低门槛地学习计算机编程。研读完这套书,可能要1年时间乃至更多,但是我觉得这件事,对我,还有对读者们都应该很有意义。

    为数字计算机编写程序的过程是饶有趣味的,因为它不但具有经济和科学价值,也是犹如赋诗或作曲那样的美学实践。

    关于TAOCP的争议

    对于TAOCP,其实有不少争议。作者高德纳教授并因编写TAOCP获得美国计算机协会1974年图灵奖,此书也各种备受推崇。正面的评价我就不列举了,网上很多很多,或者引用一句话:

    如果你认为你是一名真正优秀的程序员……读Knuth的《计算机程序设计艺术》,如果你能读懂整套书的话,请给我发一份你的简历。--Bill Gates

    但是反对的声音也很多,比如反对派王垠的评价:

    关于Knuth的 TAOCP,我想,大部分人声称看了他的书,或者买了他的书,不过是作为一种炫耀的资本或者摆设。我对门的同学几年前就买了一套三本,全新的精装本,花了 200多块钱。可是呢,他从来就没看。我把它借过来,看了几页就放在那里没有看了。我哪有时间看他用那些一个字节6位的机器语言实现简单的链表!有一天一个师弟走进来,看到那套书在我书架上,显示出一种敬畏感:“挖!师兄!你好牛啊!居然看这么高深的书!” 我一愣。嗯,不错嘛,这套书放在书架上可以让人对我刮目相看。这恐怕就是它对很多人的实际作用。还有人可以帮助神化这套书,同时也神化自己,比如他可以这么说:“谁要是看完了Don Knuth的 The Art of Computer Programming 我就雇用他!” 这样可以显得比一般看过书的人还要高一等。据说Bill Gates就是这么做的。我怀疑他自己看完过没有。

    我讨厌这套书的一个原因就是Knuth故意用一个叫 MIX 的处理器的机器语言来写这本书。虽然在新版的书里他设计了一种新的处理器 MMIX,但是换汤不换药。他以为一部“永恒”的计算机编程书不应该使用高级语言,因为它们很容易过时。但是他错了,机器语言恰恰是最容易过时的东西,看看现在有多少牌子的更新换代的处理器就知道。而世界上确实存在非常高级的语言从60年代到现在都没有过时。我预言,MMIX会在不久的将来被淘汰。很好笑的是MMIX是在MIX上加了一个“M”,代表Millennium(千禧年)。关于它的专著也起名为 MMIXware---A RISC Computer for the Third Millennium。一千年甚至短短一百年,几十年以后,计算机还是不是二进制的集成电路都说不清楚,况且这个处理器其实就是从别的处理器比如RISC II, Sparc之类的捡了一点东西,没有什么大的创新。他就把这个处理器的模拟程序印在纸上卖,曰:“一个优秀的程序要像一部好的小说一样容易读懂。一个优秀的程序员会在将来拿到普利策奖。”

    用机器语言写一点初级的计算机入门部分还可以,但是用来写整整一部书未免容易让读者只见树木不见森林了。看TAOCP最容易出现的一种现象就是,“哇!原来这个程序可以这么写。” 但是你不知道为啥那么写。虽然可以知道一些底层的原因,但是最根本的原理,读者始终不会明白。就像看清楚了一张图片上的每一个像素,却认不出图片上其实是一个熟人。看清楚了棋盘上每一个棋子能走的地方,却不能赢棋。Dijkstra 说计算科学不应该被叫做"computer science",就像外科手术不应该叫做"knife science"。可是这关Knuth什么事呢,他的书名叫做 The Art of...

    我个人不是很赞同反方观点,看上面加粗的文字。如果要看高级语言的算法书,市面上也一大把,比如各种C/C++描述,Java描述什么的。一本书,不可能让所有人都喜欢,我们只需要在书中获得自己需要的知识就行了,比如算法的本质,提高思维方式什么的。

    Knuth选择汇编语言的理由恰恰是因为他认为Computer不是最本质的东西,语言不是最本质的东西。既然这些都不是本质的内容,那么选择什么语言就无所谓了。可是,选择汇编语言却为写作带来了极大的便利,与高级语言相比,汇编语言的进化是相当缓慢的。

    这套著作最初写于20实际60年代,在50多年的时间里,高级语言换了一代又一代,而计算机体系结构又有多少变化呢?如果Knuth在开始写这部著作的时候,选择了当时流行的Algol语言,还不如用汇编的好,不得不说作者是很智慧,很有远见的。另一方面,汇编语言并不代表它就是机器,它代表了一种计算模型,难道当我们说图灵机或者冯诺依曼机就想到了实实在在的机器么?

    有人看了TAOCP,说:“为什么看了好半天全是高数,翻完高数紧接着组成原理,然后汇编……”

    总的原则是:你如果用最难的方式学,你会收获最多。最难的方式就是:你读它,如果遇到一个问题,一个定理,一个例子,没搞懂,不要再继续看,不要看答案,把书合起来,然后绞尽脑汁地想,用几个小时几天时间,把它搞定,然后再继续看书,看答案。这样可以最快地在思维上跟TAOCP看齐。如果组合数学底子不好,不妨先读《具体数学》。假如汇编不过关,可能要倒回去看看汇编语言。

    总之,TAOCP是计算机的辉煌巨著是毋庸置疑的,关键是我们能从这个宝藏获得什么。计算的本质,算法的本质,编程的思维,哪怕做做思维训练,也是很有裨益的。

    最后,这里的目标先定为把书中提到的所有算法都过一遍,当然实现方式是C,或者其它高级语言,比如Python什么的都可以。以后有机会再深入啃啃其它艰深的东西。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [数据库技术] 数据库范式篇 5 个条目
  2. [Python程序设计] Python Web部署的背景知识 9 个条目
  3. [计算机算法] TAOCP与算法 12 个条目
  4. [Python程序设计] Tornado表单处理 3 个条目
  5. [Python程序设计] urls.py设置技巧 8 个条目
  6. [C语言程序设计] 结构体基本知识 1 个条目
  7. [Python程序设计] Tornado 服务器环境配置 3 个条目
  8. [智力开发与知识管理] 整体性学习步骤 9 个条目
  9. [PHP程序设计] Nginx基本操作释疑 7 个条目
  10. [PHP程序设计] PHP数组的遍历 7 个条目
  11. [移动开发] 从代码角度去认识 Handler 4 个条目
  12. [PHP程序设计] PHP中的Hash算法 3 个条目
窗口 -- [八点]