`
kidneyball
  • 浏览: 326837 次
  • 性别: Icon_minigender_1
  • 来自: 南太平洋
社区版块
存档分类
最新评论

SICP读书笔记 (1)

阅读更多
关于SICP

SICP,Structure and Interpretation of Computer Programs,计算机程序的构造和解释,是美国麻省理工学院(MIT)的计算机科学(CS)与电子工程(EE)本科的一门必修课。这本书在1984年出版,而自从1980年开始,20多年来此书的内容一直是MIT的计算机编程入门课程,并且被世界各地百余所大学效仿。SICP是基于LISP语言展开论述的,直到2008年,才被另一门基于python语言,但原理相同的课程(MIT 6.00 Introduction to Computer Science and Programming)取代( http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00-introduction-to-computer-science-and-programming-fall-2008/ )。

许多人,特别是已经有命令式风格编程基础的人,在第一次拿起这本书随便翻翻时,第一印象是觉得这本书是讲述一种语法怪异,包含大量括号的新奇语言和算法与数学原理的书。08年初,师傅强烈推荐我看这本书时,这就是我对此书的全部感觉。焦头烂额地看完前三章后(师傅说重点看前三章),总有一种似懂非懂的感觉。虽然,书中的知识对我后来学习和使用函数式编程,以及JavaScirpt、Python时起到了很大作用,网上有很多童鞋把此书作为函数式编程和LISP的经典读物,如果你说自己是搞函数式编程的而又没看过SICP,你都不好意思跟人打招呼。但总觉得此书的精粹不在于此,作为计算机系必修的导论课程,不应该把视角放在某种固定的编程范式和某种特定的语言上。试想一下,20多年来,世界各地的本科生冲上来劈头盖脸就是函数式编程和LISP。学这门课前,他们中很多人还是用两个手指头打键盘的菜鸟,却要面对一本有多年编程经验的人都看得焦头烂额的的课本。学这门课后,他们很多在实际工作中再不会使用函数式编程和LISP。那么MIT要求学生们必修这样一门课意义何在?20年后,MIT用python替换了lisp,却认为新课程与原来的课程能达到同样的效果,那么这两门课程的共性是什么?

最近跟师傅喝酒,他再一次建议我好好再看一次SICP。三年前他说,你现在还是看山是山,看云是云的阶段,等哪一天你看山不是山了,看云不是云了,就算是看懂了。正好,最近看了一本《软件随想录》,其中“Java语言学校的危险性”一章说道:

“对于许多计算机系的青年学生来说,另一门有难度的课程是有关函数式编程(functional programming)的课程,其中就包括递归程序设计(recursive programming)。MIT将这些课程的标准提得很高,还专门设立了一门必修课(课程代号6.001[2]),它的教材(Structure and Interpretation of Computer Programs,作者为Harold Abelson和Gerald Jay Sussman Abelson,MIT出版社1996年版)被几十所、甚至几百所著名高校的计算系机采用,充当事实上的计算机科学导论课程。(你能在网上找到这本教材的旧版本,应该读一下。)

“这些课程难得惊人。在第一堂课,你就要学完Scheme语言的几乎所有内容,你还会遇到一个不动点函数(fixed-point function),它的自变量本身就是另一个函数。我读的这门导论课,是宾夕法尼亚大学的CSE 121课程,真是读得苦不堪言。我注意到很多学生,也许是大部分的学生,都无法完成这门课。课程的内容实在太难了。我给教授写了一封长长的声泪俱下的Email,控诉这门课不是给人学的。宾夕法尼亚大学里一定有人听到了我的呼声(或者听到了其他抱怨者的呼声),因为如今这门课讲授的计算机语言是Java。

“我现在觉得,他们还不如没有听见呢。

......

“除了上面那些直接就能想到的重要性,指针和递归的真正价值,在于那种你在学习它们的过程中,所得到的思维深度,以及你因为害怕在这些课程中被淘汰,所产生的心理抗压能力,它们都是在建造大型系统的过程中必不可少的。指针和递归要求一定水平的推理能力、抽象思考能力,以及最重要的,在若干个不同的抽象层次上,同时审视同一个问题的能力。因此,是否真正理解指针和递归,与是否是一个优秀程序员直接相关。

“...Java语言学校的教学也还是失败的,因为学校没有成功训练好学生的头脑,没有使他们变得足够熟练、敏捷、灵活,能够做出高质量的软件设计(我不是指面向对象式的"设计",那种编程只不过是要求你花上无数个小时,重写你的代码,使它们能够满足面向对象编程的等级制继承式结构,或者说要求你思考到底对象之间是"has-a"从属关系,还是"is-a"继承关系,这种"伪问题"将你搞得烦躁不安)。你需要的是那种能够在多个抽象层次上,同时思考问题的训练。这种思考能力正是设计出优秀软件架构所必需的。

( http://www.ruanyifeng.com/blog/2008/12/the_perils_of_javaschools.html )

原来如此,SICP的目的,并不是教会我们如何去用LISP实现具体的算法,而是指导那些具有基本数学能力的学生,如何对“计算过程”(Computational Process)进行抽象,而具体的算法和LISP语言,只是作为一种示例,一种展开论述的工具而已。并且,SICP的内容设置,采用了从无到有的思路来阐述编程语言的设计。换句话说,它不像其他教授具体编程语言的书籍那样,先假定某种语言已经合理存在,冲上来就开讲数据类型,关键字,语法。而是从数学算法与程序设计的原始需求出发,逐步讲述为了实现这样的需求,编程语言应该提供什么样的特性。只要抓住这些具有普遍性的关键需求,在学习任何一种新的语言时,就有一个基本的脉络可循。反过来,在设计任何程序、开发框架,或新的语言时,也可以从这些计算过程的基本要素上去展开思考。从这种思路出发再去读SICP,果然觉得原本一些淹没在具体算法和语言特性中的文字,会更加清晰起来。

相关资料
在线全文(英文): http://mitpress.mit.edu/sicp/full-text/book/book.html
chm全文(英文): http://chanson.iteye.com/blog/287235
pdf中文版全文:http://ishare.iask.sina.com.cn/f/5595185.html
中文版翻译一般,一些关键语句翻译不到位,最好结合英文版一起看。

MIT 6-001课程主页(含SICP在线文本,讲授视频):http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of-computer-programs-spring-2005/
优酷在线视频:http://www.youku.com/playlist_show/id_4307703.html
由原书作者讲授,视频比较模糊,有一节(4b)课前半段音频录得不清。目前网上没有完整的字幕(只有第一集)

MIT 6.00课程主页(2008年新课程,基于python,含教学视频):http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00-introduction-to-computer-science-and-programming-fall-2008/
优酷在线视频:http://www.youku.com/playlist_show/id_4209207.html
视频和语音都很清晰,但课堂上操作演示的投影比较难看,课程主页上有完整视频语音文本。讲师很有趣,学生答对题目了会扔给他一颗糖。

加利福尼亚大学SICP讲课视频(很长):http://webcast.berkeley.edu/course_details_new.php?seriesid=2008-D-26263&semesterid=2008-D

一个以色列人的读书笔记:http://eli.thegreenplace.net/category/programming/lisp/sicp/

编程环境
Racket:http://www.racket-lang.org/   (一个工业级的LISP环境,对于SICP书中的一些高级例子可能不兼容)
MIT Scheme:http://mitpress.mit.edu/sicp/scheme/index.html  (MIT的教学环境,可以完美运行书中的例子)
分享到:
评论
1 楼 whg333 2011-07-12  
多谢提供这么完全的资料~

相关推荐

Global site tag (gtag.js) - Google Analytics