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