我為什么推薦 SICP?
向大家推薦 SICP,不知道有多少人看了,也不知道有多少人明白了,更不知道有多少人驚嘆了。或者你根本不屑一顧,或者你看見(jiàn) Lisp 那層層括號(hào)心生畏懼,又或者你了了一瞥,覺(jué)得沒(méi)什么精彩之處。那我真的很失望。
我為什么要推薦SICP,而且為什么如此執(zhí)著?這本不算厚的書(shū)帶給我的觀念,是從未有過(guò)的,是關(guān)乎于軟件本質(zhì)的。曾幾何時(shí),我覺(jué)得我看到了計(jì)算機(jī)編程書(shū)中沒(méi)有的哲學(xué)觀,但這一次我的夢(mèng)破滅了,那些已經(jīng)被寫(xiě)進(jìn)書(shū)里差不多快 30 年了。
對(duì)于 SICP,我真正算看完的,恐怕只有第一章。我現(xiàn)在就來(lái)談?wù)勎业男牡茫栽俅蜗蚰阏宫F(xiàn)這本書(shū)的魔力。
第一章作為基礎(chǔ),作者并沒(méi)有象后續(xù)章節(jié)寫(xiě)太多的軟件思想,主要還是介紹 Scheme 語(yǔ)言,所以草草看去,沒(méi)什么精辟之處。不過(guò)在第一章中,作者用了大量的篇幅來(lái)探討數(shù)學(xué)問(wèn)題,因?yàn)樗胂蚰憬沂境绦蛟O(shè)計(jì)中的核心哲學(xué):抽象。而數(shù)學(xué)無(wú)疑是最好的例子。
了解數(shù)學(xué)史的人,應(yīng)該知道整個(gè)數(shù)學(xué)史,就是一個(gè)不斷抽象的歷史。古希臘人將字母引入計(jì)算,使數(shù)學(xué)不再只是算術(shù),而且具有表達(dá)抽象規(guī)則的能力。近代數(shù)學(xué)對(duì)函數(shù)和微積分的探求中,用 f(x) 替代了多項(xiàng)式表達(dá)式,函數(shù)更一般了,然后 n 維空間、復(fù)分析、映射、泛函,抽象代數(shù)、群論,等等等等,直到集合論,摧毀了數(shù)學(xué)的基石,使數(shù)學(xué)界再次陷入沉思。
構(gòu)造程序的方法也是抽象。從最簡(jiǎn)單的元素開(kāi)始,基本元素(自演算表達(dá)式,包括數(shù)字,字符串和布爾值),然后定義基本過(guò)程(基本運(yùn)算符,四則運(yùn)算和布爾運(yùn)算),進(jìn)一步,自定義標(biāo)識(shí)符(如同代數(shù)),再自定義過(guò)程(函數(shù)),再將過(guò)程作為值參與運(yùn)算(高階過(guò)程)。一步步的抽象,形成了整個(gè)程序的結(jié)構(gòu)。而我們編程,無(wú)非就是從現(xiàn)實(shí)世界抽象出模型,再將模型不斷的提煉抽象,屬性、方法、類(lèi)、繼承、層次、框架。
編程就是一個(gè)不斷抽象的過(guò)程。我再次把作者在第一章末寫(xiě)下的結(jié)論抄在這里,作為最后的注腳。
“作為編程者,我們應(yīng)該對(duì)這類(lèi)可能性保持高度敏感,設(shè)法從中設(shè)別出程序中的基本抽象,基于它們?nèi)ミM(jìn)一步構(gòu)造,并推廣它們以創(chuàng)建威力更強(qiáng)大的抽象。當(dāng)然,這并不是說(shuō)總應(yīng)該采用盡可能抽象的方式去寫(xiě)程序,程序設(shè)計(jì)專(zhuān)家們知道如何根據(jù)工作中的情況,去選擇合適的抽象層次。但是,能基于這種抽象去思考確實(shí)是最重要的,只有這樣才可能在新的上下文中去應(yīng)用它們。高階過(guò)程的重要性,就在于我們能顯式地用程序設(shè)計(jì)語(yǔ)言的要素去描述這些抽象,使我們能像操作其他計(jì)算元素一樣去操作它們。”