標籤:

SICP 是不是被高估了?

大神們看這本書主要收穫在哪些地方?以前看這本書的時候感覺有點被高估,一直也不敢發言,擔心被噴,今天在V2EX上看到這個話題,就斗膽問一問。

希望大神們不吝賜教,已經做好被噴的準備,希望不要進行人身攻擊。

---

"Welcome to CS61, the best computer science course in the world. Not because o

f me, but because of this book -- SICP -- the best computer science book ever

written. It will change your life.

- Brian K. Harvey

Harvey 在伯克利的 CS61課上說 SICP is the best computer science book ever

written, 對此SICP是不是被高估了?


是,所以你應該看 Software Foundations……


從很多人讀不完這點看,沒被高估。


作為一個從 js 自學入門的前端程序員,我見到過很多人也是通過自學進入到行業,並且慢慢知道了函數式編程以為 js 很不錯。

但是你翻開 js 的教程和書籍,大部分都是語法和前端具體問題的實踐,常常是要個功能加一個新的語法,然後由程序員自己想辦法衍生開去。而且前端大部分場景都是受限宿主環境的 API,程序員其實在寫膠水。

也就是說當遇到新的問題,怎麼辦並沒有教過。js 沒有 scheme 這樣的抽象的靈活度,數據抽象過程抽象雖然也能做,但往往受限。至於語言和 DSL 高低層級之間的抽象就更難形成好的理解了,js 不好元編程,平時也就高階函數或者用對象類形成一下抽象。當然是可以單純通過積累經驗解決工作中很多問題,然而經驗跟理論相比還是差好多靈活度和通用性。

這種場景下 SICP 作為一個腳本語言寫的深入淺出的教程就非常實用和深刻了。即便它只是另一些人的入門教材。至於是不是高估,我更想說這年頭從網頁學編程的人太多,越來越多的人還處於 SICP 這道門檻之下。還在爬門檻的飄過,而且想著脫單的話連跟進前沿技術的時間都不夠,更難說把理論深入挖下去了。每天 feedly 過五百,Twitter 未讀過百,知乎微博未知。


這個世界上有很多書,同一個知識都被寫在了不同的地方,所以SICP並不是一定要看的。再說了,根據我的親身經歷,看SICP並不如直接學Haskell來的性價比高。看完了SICP你要看Haskell仍然需要很多努力,然而反過來卻不需要。

如果你怕Haskell的東西沒有完全覆蓋SICP(當然了),你還可以看一本比SICP簡單好多但是知識量毫不遜色的《The Implementation of Functional Programming Language》,是30年前微軟的一個Researcher寫的。


個人觀點:沒有高估。

我前前後後看了三遍 SICP,前兩次都無疾而終,第三次花了一年半的時間把整本書看完了,習題完成率90%以上,在 [Github 上的筆記與題解](jiacai2050/sicp)也超過200 star。看完這本書,可以讓你了解編程語言的本質,現如今編程語言層出不窮,Scala、Go、ES6、Swift、Rust 等等,每種語言針對的領域不一樣,有的適用於系統級,有的適用於微服務,說白了都是些 DSL,只不過比較 general 而已,我們需要利用這些語言提供的語法糖來寫我們的業務代碼。

SICP 以 Scheme 教學,讓我們可以清晰的認識到各種花哨語法糖背後的原理,有了這些基礎再去學其他語言,就會顯得容易許多。

當然,SICP 也有缺點,裡面很多章節的內容都是電氣相關知識,全書雖然只有5章,但是信息量非常大,一般人我覺得一年內看不完。


前三章太簡單了 第四第五兩章還行 其實很難通過讀書成為大牛的 關鍵是好的機遇實現一些挑戰性的東西 才能有所成長 我覺得更有趣的書是 paradigms of artificial intelligence using Common Lisp 以後打算教我小孩這本書..


它在MIT只是計算機科學入門級別的書。。。要和計算機導論一類的比較。。。

即便是這樣在一本計算機導論級別的書里它從程序就是一層層的抽象入手,甚至講到了一些程序語言和計算機本身的原理。。。自然是很厲害了。。。

而且大多數人計算機入門都是從命令式編程入門的,對於從函數式這個完全不同的角度出發的SICP確實是很有意思。

所以我不知道你說的被高估是指高估到什麼程度,但別忘了它只是MIT入門級別的書,不要期望它能取代別的更專業的教材。

---

補充一下:我不是說SICP不好,而是說它能對沒有基礎的初學者講那麼多證明了它很厲害……好書不就應該是這樣的嗎……深入編程的本質卻又不至於太難……


是的。

特別是被一些自稱是Lisper或者Schemer的傢伙。

理解編程和計算,並不需要這麼複雜的東西,更何況這是入門級的課程。

你看跟著http://i2p.kimleo.net學,get到東西比SICP高效得多。

當然就像絕大部分學LISP的都想看SICP一樣,如果你非要用i2p學C++,就只好當一輩子蠢貨了。


當然被高估了啦。。

現在都21世紀了,SICP 早就被後輩「超越」了。悄悄告訴你一本書:

Concepts, Techniques, and Models of Computer Programming: Peter Van Roy, Seif Haridi


不是,你要知道這本書的讀者應該是沒有 CS 基礎的大一小孩,而且是美國大一小孩,你知道美國大一小孩有多笨么……

這本書他們能看懂(至少是 suppose 能看懂)。夠淺顯了吧?

我的同事,花了一周(不用在評論里問了,是一周)把 SICP 讀完了,然後寫了個 scheme 解釋器,兼容 r5rs, 加入了我們需要的某種數據類型,我們現在還在用。這哥們之前只寫過 C,完全沒有接觸過函數式編程。我們不是程序猿,只是需要用 scheme 而已。這哥們現在正在試圖擼一個新的語言,準備加入自動並行化。他不小心入了語言坑就是因為讀了 SICP.

這大概就是深入淺出吧。


?計算機理論的閉環性教學案例

?通用教學方案是從c開始,然後分兩路,一路向上講述應用的組織,包括各種語言,資料庫組織,網路應用等。一路向下進入操作系統實現。

?sicp教材從lisp語法開始,構成一個包含計算機理論學科的閉環系統,前三章是圓的左上,從基礎語法到應用組織,到達應用的最高點,第四章是右上,從語言應用到解釋器實現到達與開始的水平線。第五章是圓的下半部分,構成理論系統的核心閉環,第五章看完後可接第一章。從而構成一個結束即是開始的閉環效果

?閉環手法在電影中經常出現,電影的最後一個鏡頭和電影的第一個鏡頭重合,盜夢空間,星際穿越都使用了這種手法,營造了觀眾對電影圓性思考,無法脫離,走齣電影院時從頭開始思考整個電影。sicp構思也是這樣,最後lisp的第五章實現說明了第一章lisp語法的由來,看完第五章後重新翻看第一章進入了新的循環

?這種循環手法也可以應用在日常交流中,將談話的結束歸納到談話的開始,話題的參與者會陷入循環思考中。演講,小說,電視劇,電影中經常出現這種手法

?如果把編程書籍看作武林秘籍

其他編程書講的是五嶽劍派具體的招式和武術

sicp就是獨孤九劍,重在破招,無招勝有招

即使會獨孤九劍也不行,你還要熟悉各家兵器招數,

學習具體招式也可闖蕩江湖,如果能學的獨孤九劍一招半式,各路武功皆可對應

參見令狐沖華山頂學習各門各派招式後,才學的獨孤九劍。


一直被低估

從來沒高估


很多人會說高數a簡單,但是能說出高數a簡單的,也肯定知道高數def難。

SICP有沒有被高估是要看階段的,有一些書確實在一個階段是封神的,比如你如果考研的話,像李永樂什麼的,你不得供在桌上么。但大家也都知道,李永樂也不一定吃遍中國全部市場(你懂得)。

SICP確實有替代品的,只是性價比的區別而已。

SICP入門是坑人的,這個不多講,苦下心來看完全冊的,絕對不會說這是門很好的入門書。最起碼我在學校的時候是啃不動的(其實剛畢業那年因為wow出資料片,我也是沒啃完的)。

所以就我個人經歷而言,SICP對新入門、以及從業超過5年以上的猿人來說,重要性不高。

但是在你入門後,承前啟後進行提高的時候,SICP值得看2/3遍,以幫忙鞏固知識,打基礎。

結論是:從作用上來說高估了,從價值上來說低估了。

按國內大學生的尿性,能看完還是有難度的,但是如果在學校里沒看完,工作後看的話,作用確實不大(毛病難改)。


個人覺得SICP算是入門系列裡面比較深入的一本了吧。

可能是國外大學的習慣,學完一本書就讓你順便做個東西出來,讀完龍書寫個編譯器,讀完SICP寫個lisp方言什麼的,我覺得挺好玩。

就書本身來說,就兩句評價,值得看,值得看第二遍。

尤其是當你寫了一大堆東西,卻覺得計算機世界不過如此的時候,看看這類書,會發現原來這裡有一個新世界的&大坑&大門在等著你。


有很多像 SICP 一樣的書,他們不是被高估。

可怕的地方是很多給你推薦這些書的人,他自己就沒有看過。


本質是講的複雜性系統的構造――抽象,模擬,新語言,層次性構造體系,更一般的模型――有限狀態機。

Lisp之根源 保羅格雷厄姆

如果說圖靈代表了演算法和機器,那麼丘奇代表了邏輯和語言。

目前為止只有兩種真正乾淨利落, 始終如一的編程模式:C語言模式和Lisp語言模式。此二者就象兩座高地, 在它們 中間是尤如沼澤的低地。

隨著計算機變得越來越強大,新開發的語言一直在堅定地 趨向於Lisp模式. 二十年來,開發新編程語言的一個流行的秘決是,取C語言的計 算模式,逐漸地往上加Lisp模式的特性,例如運行時類型和無用單元收集。

隨著時間的推移,中級語言,即被中間層程序員使用的語言, 正一致地向Lisp靠 近。因此通過理解eval你正在明白將來的主流計算模式會是什麼樣。

早已有了各種計算模型--最著名的是圖靈機,但是圖靈機程序難以讀懂.。如果你要一種描述演算法的語言, 你可能需要更抽象的, 而這就是約翰麥卡錫定義 Lisp的目標.

他的主要思想是用一種簡單的數據 結構表(list)來代表代碼和數據; 麥稱這種語 言為Lisp, 意為List Processing。

Lisp的不同尋常之處是它能夠自己來編寫自己:在只給定幾個簡單的操作符和一個 表示函數的記號的基礎上, 如何構造出一個完整的編程語言。

七個原始(從公理的意義上說)操作符: quote,atom,eq,car,cdr,cons,和 cond。函數表示為lambda,以及函數調用;同時我們能夠定義函數來連接表,替換表達式等等. 綜合上面, 我們定義了函數eval.,作為我們語言的解釋器:此函 數取任意Lisp表達式作自變數並返回它的值.

僅用quote,atom,eq,car,cdr,cons,和cond, 得到了一個非常優美的計算模型eval.函數. 它事實上實現了我們的語言,用它可以定義任何我們想要 的額外的函數.

LISP不是生來就是一門用於人工智慧, 快速原型開發或同等層次任務的 語言,它是你試圖公理化計算的結果。

所有應用程序的開發過程都可以說是設計語言的過程-Dave Thomas

從這個觀點開看,開發應用程序就是針對應用程序的問題領域定義各種辭彙,最後用這些辭彙來描述解決問題的方法。

聲明性語言---顯式操作---命令性語言---完備化(圖靈機=解釋器)-----複雜的數據結構------Perl,python,Java

As a programming language, LISP is characterized by the following ideas: computing with symbolic expressions rather than numbers, representation of symbolic expressions and other information by list structure in the memory of a computer, representation of information in external media mostly by multi-level lists and sometimes by S-expressions, a small set of selector and constructor operations expressed as functions, composition of functions as a tool for forming more complex functions, the use of conditional expressions for getting branching into function definitions, the recursive use of conditional expressions as a sufficient tool for building computable functions, the use of -expressions for naming functions, the representation of LISP programs as LISP data, the conditional expression interpretation of Boolean connectives, the LISP function eval that serves both as a formal definition of the language and as an interpreter, and garbage collection as a means of handling the erasure problem. LISP statements are also used as a command language when LISP is used in a time-sharing environment.

It owes its longevity to two facts. First, its core occupies some kind of local optimum in the space of programming languages given that static friction discourages purely notational changes. Recursive use of conditional expressions, representation of symbolic information externally by lists and internally by list structure, and representation of program in the same way will probably have a very long life。

Second, LISP still has operational features unmatched by other language that make it a convenient vehicle for higher level systems for symbolic computation and for artificial intelligence. These include its run-time system that give good access to the features of the host machine and its operating system, its list structure internal language that makes it a good target for compiling from yet higher level languages, its compatibility with systems that produce binary or assembly level program, and the availability of its interpreter as a command language for driving other programs. (One can even conjecture that LISP owes its survival specifically to the fact that its programs are lists, which everyone, including me, has regarded as a disadvantage. Proposed replacements for LISP, e.g. POP-2 (Burstall 1968,1971), abandoned this feature in favor of an Algol-like syntax leaving no target language for higher level systems).

LISP will become obsolete when someone makes a more comprehensive language that dominates LISP practically and also gives a clear mathematical semantics to a more comprehensive set of features.

John McCarthy History of Lisp

每一種語言特性都表示了一種基本思想,將所有的語言特性組合起來,我們就寫出有用的程序。

重視語言特性而不是整個語言,語言是語言特性的組合。利用語言特性和標準庫快速構造健壯的程序;語法特性和函數參數化都是為了減少代碼複製粘貼。

沒有語法特性,就需要庫函數,或者直接是硬編碼:演算法和數據結構。


分頁阅读: 1 2