Structure and Interpretation of Computer Programs,简称: SICP,非常著名的一本书(中译本叫《计算机程序的解释与构造》,由裘宗燕老师翻译的),Scheme 的鼻祖 Gerald Jay Sussman 和计算机教育专家 Hal Abelson 合写的,20 年来影响整个计算机科学教育的著作,著名的 MIT 课程 6.001(计算机科学专业的入门课程) 的教材,全世界有超过100所大学在使用这本书做为教材。
本书曾经是MIT本科第一门课的教材。前两年被Python取代,在geek中引发了轩然大波。有兴趣可以Google一下[sicp mit python]。
- 本书在Amazon上的评分严重两极分化,五星(>90)和一星(>50)为主,彻底反正态分布。
- 本书在Amazon上排名最高的书评出自Peter Norvig,当然是强烈推荐,顺便狠狠地鄙视了给一颗星的同学们;第二篇出自Paul Graham,还是强烈推荐。
- 本书别名紫书(The Purple Book),巫师书(The Wizard Book),或者干脆The Book。
「这是一本什么样的书?」
前言说,这是一本给MIT学生的入门级(entry-level)计算机科学教材。作者的出发点有两条:
- 语言首先是写给人看的,只是恰巧(incidentally)能够运行。这当然是个修辞,格外强调代码之可读。
- 语言的语法,漂亮的算法,数学的分析,这些统统都不重要。最打紧的是如何控制复杂度(The techniques used to control the intellectual complexity of large software systems)。
在本书成书的年代(1984),以上言论即使不算正邪不两立,也够的上离经叛道了。
通俗的说,这本书教你如何用最基本的构造和原则,解决复杂和多样的问题。用摄影打比方,这本书不比较尼康和佳能,不介绍繁杂的机型和参数,不介绍后期处理的技巧。这本书只讨论光线、色彩和构图,以及如何在不同场景拿捏这些基本原则组合出美妙的照片。
「这本书适合初学者吗?」
不好说。Amazon上的一颗星评价大多鄙视本书已经过时或者太过高深。我个人看法,它很适合一部分初学者,但是需要满足几个条件:
- 热爱计算机科学
- 有时间和耐心
- 受过(高中水平)数学和抽象思维的训练
所以,如果只是想领一份程序员的薪水,这本书完全可以略过。并不是说这本书有多么不实用,只是计算机科学与写代码并不是一码事。
这本书广而不深,讨论到了非常多重要的思想,有些甚至冷不丁出现在注释里(比如Y算子)。内容安排很照顾初学者,循循善诱;语言直白简单;代码大多简明自然。
至于习题,个人认为大多不难,需要耐心多于智力。有时间不妨多做几道。
「这本书适合有经验的程序员吗?」
还行。如此庖丁解牛般的讲解,其他书中不多见;内容简单,思想却不过时。另外,国内绝大部分程序员都从命令式语言入门,不妨接触一些函数式思想,开开眼界。如果时间不多,至少看看前两章,学习一些解决复杂问题和编写优雅代码的技巧。
「Scheme好学吗?」
其实Scheme是一门异常简单的语言。直来直去,除了括号多,基本没有旁门左道(比如指针)和撕心裂肺的语言构造(比如模版、多重继承、Monad)。再者,这本书的内容和具体的语言基本没有关系,思想才是重头戏。如果实在有顾虑,推荐先读两本薄薄的小册子:The Little Schemer和The Seasoned Schemer。
「这本书到底讲什么?」
第一章讨论程序设计的最基本原则:原语(primitive expressions)、组合(means of composition)和抽象(means of abstraction),以及如何利用这些基本原则化解复杂度。重点是过程抽象和高阶过程(high-order procedures)。本章的例题十分精彩,抽象和组合的过程十分清晰。有关递归和迭代的讨论也非常耐读。
第二章讨论数据抽象,即利用基本数据构造复杂结构。Scheme里的基本构造能力只有cons,但由此可以组合出所有实用的结构。图像语言、符号运算、集合表示、哈夫曼编码和复数系统都是经典实用的例子。顺带还介绍了data-directed方法,与面向对象中的封装有异曲同工之妙。
即使没有太多时间,我觉得前两章也值得值得细读。尤其是例子。
第三章主要讨论了状态(local state)和环境(environment model),可变数据结构(mutable data),以及状态和时间的交互(concurrency和laziness)。前两章用到语言是Scheme的一个没有副作用的子集,从这一章开始涉及解释器的核心机制,尤其是状态的管理,及其优缺点。
第四章用Scheme实现了一个简单的Scheme解释器。重点是讨论语言的解释过程,以及如何针对问题(领域)创造和修改语言,从中可见DSL(Domain Specific Language)的思想。后三节各自讨论一个工程中不常见但高效解决特定问题的语言变种及其实现。
第五章介绍将Scheme编译为现实中的寄存器机器模型(register machine)。重点不是编译技巧(Scheme压根不需要文法分析),而是基本构造(条件、过程,等等)对应于寄存器模型的实现。略带讨论了最简单的垃圾回收。
后三章较深,最好略有一点语言、编译和体系结构的基础,或者多些耐心。