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