2008年9月25日

重提The Art of Computer Programming

前几日看到一位朋友的帖子里提到工作多年的人读研时需要看什么书。主要提到了三本书:

SICP: Structure and Interpretation of Computer Programs

TAOCP: The Art of Computer Programming

Computer Architecture: A Quantitative Approach

遗憾的是这三本书我都没有看过,开始怀疑自己是怎么学习计算机的了。好在第二本TAOCP我读过第一卷,但是卡在了Knuth发明的MIX。随后便未能坚持学下去。现在想来感觉有点遗憾。

今 天看到对面师弟桌子上放了TAOCP的第二卷,顿时又想起了这段往事。于是心里有个默默的计划,那就是有空时多读读这三本书,尤其是TAOCP。这绝对是 意志和耐力的考验,也是增强计算机本质水平的途径。就把这三本书的学习看成是计算机学习方面的马拉松吧。不积圭步无以至千里啊!

这里转载豆瓣上对TAOCP的两条自觉非常不错的评论:

------------------------------------------------------------------------------------

应该怎样读TAOCP http://www.douban.com/review/1319513/

  谈谈我自己读这套书的心得。抛砖引玉。
  首先要清楚这套书的定位:它是古典的算法分析的工具书。
  1.古典(classic)体现在模型和问题上。
  模型就是顺序算法(sequential algorithms)的经典模型。大名鼎鼎的MIX并非是个程序设计语言这么简单,而是一个计算模型:即标准指令集RAM。这是个非常经典,也是非常符合现实的上界(upper bounds)模型。
  该书涉及到的问题是计算机科学诞生之初就自然面对的几个基本的算法和数据结构的问题。时至今日,这些问题还在应用中扮演着重要角色;在很多研究课题中,它们是基础或原型。
  2.算法分析(analysis of algorithms)是此书的核心。
   TAOCP并没有综述算法设计(design of algorithms)的各种思想;也没有介绍证明问题下界(lower bounds)的各种技巧;也并没有对问题、模型、复杂度这些专题作出体系性的阐述。可以说,TAOCP的几乎所有的篇幅都放在了对具体算法的性能分析 上,并把这条路走到了极致。
  3.工具书。这最有争议,因为毕竟还有习题。一些介绍也饶有趣味,不太符合大家对工具书的枯燥这一成见。
  但把TAOCP看作工具书还是教材,这就关系到怎么去读这本书。
   (一)该顺着读还是跳着读:个人认为,没有哪本专业书是不能跳着读的。但前提是你对整个书的结构比较清楚,对它的内容也一定程度的熟悉。知道自己想要查 阅的部分。如果是初学者,则不建议这么作,至少还是老老实实的把第一章顺序读下来。可是TAOCP并不是给初学者看得。
  (二)初学者适合 读TAOCP吗:不太建议。但也要看如何定义初学者——吾生而有涯,而知也无涯。一定程度上,每个人都是初学者。读 TAOCP的前提,就是自己至少比较清楚轻重缓急,可以大概判断那些是根本,那些过时,那些是炫技。这根据每个人的需要,都有各自的具体情况,但至少心里 要有点数。如果读书时觉得前路茫茫,完全不知哪里重要。那么去正经的选一门算法基础课才是更应该作的。
  (三)MIX值得用心学吗:这要首 先清楚Knuth为什么要在这个讲算法的书里搞出个MIX。个人理解,原因有三。其一,如上所述,计算模型;其二,作者个人的审美品味;其三,用于描述算 法的语言。第一条里MIX是桥梁作用,确保数学上的严谨,同时也足以代表现实中典型的计算机体系结构。第二条是美学意义。第三条的作用等于伪码。算法用 MIX写一遍,这是为了确保上界算法在模型内的严谨性。整个书都没有用MIX模型来证明任何下界,因此除了确保严谨性,MIX没有在数学上起到实际的用 途。因此,过分钻研MIX对于理解书中算法没有太多帮助。但如果纯粹只是个人兴趣则另说。
  (四)习题该怎么对待:TAOCP是为数不多的计算机专著里面能出这么多高水平习题的了。如果有大块的时间,能做一做当然最好不过。但如果只是一般的查阅,习题并非必要。不过有的习题本身就是经典问题。如果正文里没有找到想要的东西,不仿看看习题。
   (五)如何读正文里的算法分析:TAOCP里面的算法分析,算是古典算法分析里面的原教旨主义。始作俑者就是Knuth本人,后面还有 Sedgewick和Flajolet等一干人等给他发扬光大。这一派的作风可以说分毫必究,连常数都不放过。但数学工具却无外乎初等的《具体数学》的工 具。这是很好很强大的东西,掌握好了,无论研究还是工作都很方便。但其实TAOCP的数学都不算太难,仔细倒是真的。因此,如果时间不是特别充裕,对书中 结构的了解,要比具体分析步骤重要。这些经典内容多少年就没变过,每次有用时都可以回来查查看,每查一次说不定会有新的收获。
   (六)TAOCP的不足:前面已经提过了,下界(lower bounds)介绍的不够。下界结果,大多数只在章节结束的讨论部分引用一下。第三卷的查找(searching)一章,一些近些年的下界方面的新进展都 没有被引用,Knuth可能没有想到,数据结构这个经典方向这么多年来都在不温不火的不断前进着,尤其是下界。类似的也有第二卷的随机数(random numbers)一章,可以说连上界都严重过时,错过了去随机(derandomization)的黄金时代。好在其他几章这么多年来无甚进展,没怎么过 时。
  许多人对TAOCP的推崇是无条件的,这里难免有人云亦云的成分。其实大可不必,读的人尽管放轻松。这么说不是因为TAOCP不值得推崇,而是就算把一切溢美之词都抛于脑后,随着岁月流逝,反复的阅读,你也一定会越来越喜欢这部书的。它的魅力经的起时间的考验。

------------------------------------------------------------------------------------

不要把它想象成葵花宝典,否则你就会走火入魔 http://www.douban.com/review/1294615/

  书自然是好书,况且就算不是,也不是我这种级别的人能够评论的。
  但看之前,请先端正自己的态度。
  如果想通过这本书达到一个绝对的境界的人,可以歇歇了。
  我虽不是科班出身的,但毕竟也看过几本书,基本上大家最好不要认为哪一本书能够让你成为一劳永逸的一族,即使这本书也不能。
  国内对这本书的吹捧,估计主要因为盖茨老兄的那句话吧。
  须知,盖茨并非因编程出名,Windows也并非盖茨所写。
  想要发财学盖茨,趁早做生意去,学编程,只能误了你的前程。
  总而言之一句话,书是好书,但是看之前请端正态度,彻底放下那种“看了这本书我就如何如何了,我是高手了”的思想。
  曾有高手说过(针对什么十日内学会什么什么语言的书)“十年内学会编程”。
  我想说,用一生学习计算!
  ps(我未看过此书)

------------------------------------------------------------------------------------

没有评论: