让我大呼过瘾的编程书

知乎上有一个问题,“有哪些你看了以后大呼过瘾的编程书”, 以下是我的回答:

SICP, 《Structure and Interpretation of Computer Programs》, 中文名是《计算机程序的构造和解释》。

当年在某号称养老院的大厂, 有充足的时间学习喜欢的技术和看书。某次网上看到有人推荐此书,到亚马逊一看,不仅评分高,关键是评论的前两条分别是Peter Norvig和Paul Graham两大神的五星好评(评论参见这里这里),于是立刻下单购买了。

虽然已经过了两年多了,但是自己还记得读它时给自己带来的惊喜。

惊在于这本80年代写的书,哪怕过了30年在知识爆炸各种新技术层出不穷的今天,书中的内容不但没有过期而依然保持高价值,因为它讲的不是术而是道,即不是某一项具体的技术,而是通过scheme这门lisp方言和相关的例子,解释了计算机程序的本质和特征。还记得当时看到书中一个例子,通过scheme写出了getter和setter,以此来增加一层抽象,隔离底层的具体实现,自己心中十分激动。因为可能大部分人(包括我)学习getter,setter的概念是通过Java等面向对象编程语言, 而理解面向接口编程的原则也是通过OOP, 但是scheme这门“简单”(指一眼看去只有括号和极少关键字的观感)的lisp方言,一样能够实现setter和getter, 以此展示抽象这一计算机程序的重要特征。另一方面也印证了《Code Complete》里面强调的”programming into a language rather than programming in a language”原则, 即我们应该把编程的通用原则和规范应用到具体编程语言中,而不是受某门编程语言的限制而忽略了编程的通用原则。另一个印象深刻的例子展示出了代码即数据,这种统一性比上一个例子更有广泛的意义。因为程序就是一种数据的表达形式,和0代表否1代表是本质上没区别,只是表达内容更为复杂表达形式更加丰富。

喜在于虽然阅读过程十分烧脑,要理解书上的scheme例子,特别是后面越来越复杂的例子,并不简单。 但是整个过程下来,通过例子所引导思考过程,让自己更加深入理解了作者想要表达的东西。重重思考而“悟道”带来的欣喜,就是所谓的“思考的乐趣” 。

坦白而言,从功利的角度,看《XXX实战》等类型的技术书,对我们工作或面试的实际帮助更大,可以帮我们解决工作中某个问题,或者工作面试多答对一个问题。 但是,如果你热爱编程,热爱思考,充满好奇心,那么我将此书隆重推荐给你。