SICP 中有意思的東西(一):SICP 介紹

wiki 里的一些介紹

  1. 《計算機程序的構造和解釋》(Structure and Interpretation of Computer Programs, SICP)[1]是一本關於計算機程序設計的總體性觀念的基礎教科書。
  2. 書中使用程序設計語言 Lisp 的方言 Scheme 來解釋計算機科學的核心概念,包括抽象,遞歸,解釋器,以及元語言抽象它由宏觀到微觀地給出計算機程序的輪廓與脈絡
  3. 本書被廣泛地認為是計算機科學的經典教材,在計算機科學的教學領域產生了深刻的影響。諸多的經典教材都是由本書間接催化,值得一提的是,幾乎所有的派生作都直接或間接地抱怨 SICP 「太難」;甚至連 SICP 自身於第二版也試圖補充了一些讓學習曲線更平滑的材料。
  4. 此外本書的讀者群給了本書十分兩極化的評價,但不論好壞都非常有道理,其中彼德·諾米格的讀後感:〈Its the Best! Its the Worst! Why the split?〉總結了造成這種現象的各種原因並給了讓人信服的統合性結論。
  5. 〈Its the Best! Its the Worst! Why the split?Amazon.com: Peter Norvig』s review of SICP〉部分摘要(原文英文,下面是我翻譯的):「這是令人著迷的,為什麼人們對 SICP 的態度有這麼大的分歧。對於大多數書籍,(亞馬遜)評分應該是是一個鐘形的星級曲線(就像正態分布一樣),而本書有一個峰值在1分,一個峰值在5分,其他的評分很少很少,這是為什麼呢?我認為這是因為,只有當讀者願意成為一個計算機科學家(ps:SICP 中有句話是 「計算機科學」並不是一種科學,這裡的意思是不是 code monkey)時,閱讀這本書,才是有意義的。所以我同意,如果你有一些經驗之後再看這本書,效果會更好。我們來類比一下,如果SICP是關於汽車的,閱讀它,你就可以了解到汽車如何工作,如何建造,以及如何設計節能、安全、可靠的二十一世紀車輛。討厭 SICP 的人是那些只想知道如何在高速公路上開車的人,他們認為在閱讀所需的時間內,它並沒有教會讀者實用的編程方法(例如常用語言語法、面向對象、web 編程、移動應用編程等等)。相反,SICP 會告訴你一些編程的原則是什麼,如何設計代碼, SICP 會給你一種可以成功的方法,但它是一種基於原則和智慧的方法,而不是一個清單。如果你不明白這些原則,或者如果你是一個想要被給予食譜(填鴨式教育)的人,而不是創造性思考的人,如果你不會並且不喜歡舉一反三,那麼 SICP 的做法對你來說不會奏效。

對上面內容總結一下,SICP 是 MIT 多年前的編程基礎教科書,主要內容為抽象,遞歸,解釋器,以及元語言抽象它由宏觀到微觀地給出計算機程序的輪廓與脈絡。對它的評價非常兩極分化,這個現象的原因以下幾點:

  1. 對於入門而言,這本書實在是有點難。
  2. SICP 並沒有教實用的編程方法,它不是填鴨式教育。
  3. 它教的是原則和智慧,對於讀懂了、並會創造性思考的人,你絕對會對本書打 5 分。

我的介紹

有了 wiki 的介紹作鋪墊,我就簡單說幾句。

舉個自己的例子:我大二上學期的時候閱讀了 SICP 的第一章,只看懂了 30%,於是放棄了後面的閱讀。上個月有了重讀的想法,花了兩天讀完了第一章,目測看懂了 80%。

我個人認為,這本書的適合群體有以下特點:

  1. (必選) 立志於成為一個高級 xx 工程師的人,而不是 code monkey。
  2. (可選) 剛入門編程的人,並且很聰明。(其次,最好不要學過並只學過靜態語言,我大一就是基本只會靜態語言,SICP 書中的 scheme 是一門動態語言,思維切換會很困難,當然如果你足夠聰明也是 ok 的。)
  3. (可選) 擅長動態語言的人,閱讀 SICP 你就不會拘泥於 scheme 的語法細節了。
  4. (可選) 有大量編程實踐的人。

來自書中的一些內容和我的筆記

  1. 帶著憧憬和讚美,將本書獻給活在計算機里的神靈。
  2. 你需要大量地讀或者寫計算機程序。
  3. 編寫計算機程序中的重要的事情: 性能,如何更優雅地構造更大的程序。
  4. 本書討論的各種問題會設計三類對象:a. 人的大腦 b. 計算機程序 c. 計算機本身。大腦創造思維,思維創造程序,程序由計算機運行,計算機必須遵循物理定律。我們可以發現思維是非常重要的,計算機科學並不是一種科學,它的中心是如何去思考(待解決的問題),以及如何去表達自己的思考(即寫出運行在計算機上的程序),如何編寫性能好的大型程序是一個非常需要「靈魂力」的活。
  5. 程序必須寫得能夠供人們閱讀,其次才是去供計算機執行。計算機科學,最本質的是一些能夠用於控制大型軟體系統的智力複雜性的技術。
  6. 本書的目標:a. 使學生對程序設計的風格要素和審美觀有一種很好的感覺 b. 掌握了控制大型系統中的複雜性的主要技術 c. 能夠閱讀 50 頁長(2k 行以上)的程序,只要這個程序寫的不爛,學生應該知道在什麼時候程序里哪些部分不需要讀,他們應該很有把握去修改一個程序,同時又能保持作者的精神和風格。

學生應該知道在什麼時候程序里哪些部分不需要讀,他們應該很有把握去修改一個程序,同時又能保持作者的精神和風格」,這句話說得太好了,我上班的時候已經無數次見證師姐做到這一點的了,而且即便代碼寫的爛、代碼量遠高於 2k 行,她都能光速閱讀,光速修改(光速是對比我的速度),一兩撥千金。

我的計劃

這本書曾被譽為計算機歷史中最重要的一本教科書,我準備這個月讀完,並將筆記、思考寫到專欄里,命名為《SICP 中有意思的東西》系列。

更多

來自知乎的一些評價

沒被高估,SICP 神奇在於其間風景蔚為大觀卻能講解地平易近人,包容各大流派卻又不失入木三分。作者深知未來的開拓者需要怎樣的眼界和能力,所以把它定位為編程世界的地圖(導引書)。旨在提醒初學者重點修鍊以下幾項工程師的特質和能力並且端正前行的心態:懂得解釋和應用那些用於控制大型軟體系統複雜度的機制,特別的

  1. 構建抽象
  2. 通過約定介面來控制模塊間的交互
  3. 設計領域特定語言

作者:xuyan鏈接:SICP是不是被高估了? - 知乎來源:知乎著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

另一篇

如果籠統地概括SICP全書的主題,那麼不外乎「抽象」二字。SICP全書不過五章,其中有三章的標題就直接帶有「抽象」這個字眼,其餘兩章則是暗含了「抽象」這個主題,不妨讓我們來看下這五章的名稱:構造過程抽象(Building Abstractions with Procedures)構造數據抽象(Building Abstractions with Data)模塊化、對象和狀態(Modularity, Objects, and State)元語言抽象(Meta-Linguistic Abstraction)寄存器機器里的計算(Register Machine Model of Control)那我們為什麼要去建立抽象呢?很簡單:控制複雜度。作者:DeathKing鏈接:zhihu.com/question/2654來源:知乎著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

推薦閱讀:

同意 「目光長遠的程序員都不會輕易加班」 么?
哪款滑鼠非常適合編程寫代碼?
如何用 C 語言在 Windows 編寫一個遊戲?
手把手教你實現 Google 拓展插件
ISR處理時間不能為什麼不能太長?

TAG:编程 | SICP | 计算机科学 |