我为什么推荐 SICP?
向大家推荐 SICP,不知道有多少人看了,也不知道有多少人明白了,更不知道有多少人惊叹了。或者你根本不屑一顾,或者你看见 Lisp 那层层括号心生畏惧,又或者你了了一瞥,觉得没什么精彩之处。那我真的很失望。
我为什么要推荐SICP,而且为什么如此执着?这本不算厚的书带给我的观念,是从未有过的,是关乎于软件本质的。曾几何时,我觉得我看到了计算机编程书中没有的哲学观,但这一次我的梦破灭了,那些已经被写进书里差不多快 30 年了。
对于 SICP,我真正算看完的,恐怕只有第一章。我现在就来谈谈我的心得,以再次向你展现这本书的魔力。
第一章作为基础,作者并没有象后续章节写太多的软件思想,主要还是介绍 Scheme 语言,所以草草看去,没什么精辟之处。不过在第一章中,作者用了大量的篇幅来探讨数学问题,因为他想向你揭示程序设计中的核心哲学:抽象。而数学无疑是最好的例子。
了解数学史的人,应该知道整个数学史,就是一个不断抽象的历史。古希腊人将字母引入计算,使数学不再只是算术,而且具有表达抽象规则的能力。近代数学对函数和微积分的探求中,用 f(x) 替代了多项式表达式,函数更一般了,然后 n 维空间、复分析、映射、泛函,抽象代数、群论,等等等等,直到集合论,摧毁了数学的基石,使数学界再次陷入沉思。
构造程序的方法也是抽象。从最简单的元素开始,基本元素(自演算表达式,包括数字,字符串和布尔值),然后定义基本过程(基本运算符,四则运算和布尔运算),进一步,自定义标识符(如同代数),再自定义过程(函数),再将过程作为值参与运算(高阶过程)。一步步的抽象,形成了整个程序的结构。而我们编程,无非就是从现实世界抽象出模型,再将模型不断的提炼抽象,属性、方法、类、继承、层次、框架。
编程就是一个不断抽象的过程。我再次把作者在第一章末写下的结论抄在这里,作为最后的注脚。
“作为编程者,我们应该对这类可能性保持高度敏感,设法从中设别出程序中的基本抽象,基于它们去进一步构造,并推广它们以创建威力更强大的抽象。当然,这并不是说总应该采用尽可能抽象的方式去写程序,程序设计专家们知道如何根据工作中的情况,去选择合适的抽象层次。但是,能基于这种抽象去思考确实是最重要的,只有这样才可能在新的上下文中去应用它们。高阶过程的重要性,就在于我们能显式地用程序设计语言的要素去描述这些抽象,使我们能像操作其他计算元素一样去操作它们。”