这个学期花了大量的时间在这本书上,同时旁听了裘宗燕老师(本书译者)以本书为教材开的课“程序设计技术和方法”,到学期末,总算是把这本书看完了。
现在终于把这本书看完了,在这总结一下。
---时间---
本书共有5章,每章都有近100道习题。前三章的习题我做了90%,后两章太难,大概只做了70%。
这本书可以说是时间黑洞。每章分为4-5节,每节有几个小节,全书有一百小节(即X.X.X)左右。我以小节为单位进行了估算,包括完成习题,每小节大约需要一个小时。当然不同小节难度不同,有的耗时长些,有的短些。于是读完本书并做完大部分习题需要上百个小时。再加上听课或看视频教程的时间则会更长。所以我觉得恐怕只有在校学生才有时间和精力来完成这本书的学习。
---内容---
本书按照内容可以分为三个部分:过程抽象(第一章);数据抽象(第二、三章)和语言抽象(第四、五章)。
过程抽象部分比较简单,先介绍了Scheme的基本语法,让读者初步领略函数式编程的风采。对于有一定编程基础(相信国内极少有人入门就读这个)的读者来说,会有耳目一新的感觉,原来递归和迭代可以有另一种表现形式,但并不难理解。习题也比较简单,不会用掉太多的时间。过程抽象的概念也很简单,就是编程语言中的函数,目的是封装计算过程的细节。关于何时应该用过程抽象的原则是:一切可以定义为过程的计算片段都应该定义为过程。
数据抽象是我认为的本书的核心,也是最值得我们仔细研读的部分。关于数据抽象最直接的理解就是面向对象编程,如C++,而Java和C#则是更彻底的数据抽象。把一组过程抽象(类的方法)集中考虑,并加入内部状态(类的变量),就是一个数据抽象。每个数据抽象都应该把自己的内部对象状态和对象的实现隐藏起来,对外通过一组接口进行消息传递。这样听起来好像本书与一般的面向对象书没有区别,但实际上,这些都是我自己的总结,书里面不会把这些概念直接罗列出来,而是通过一个个巧妙的例子,让读者一步步深入,感叹原来A还可以这样抽象,原来B还可以这样封装。个人认为如果时间有限,读完前三章已经可以领会本书大部分思想了,后两章可以不读。
语言抽象是指自己发明一门语言,以解决某一特定应用领域的问题。在这一领域中,自己发明的语言会比其他通用语言更方便。定义了新语言的语法后,就要自己去实现该语言的编译器或解释器,可以通过现有的语言去构造。这一部分包含了许多编译方面的知识,但又与编译原理中的构造方法有不少区别,自己看书很容易看得云里雾里,听老师讲课才好一些。大部分习题很难做,一部分习题非常难。
---原因---
为什么我们要学习这本书?因为这本书告诉我们如何抽象。为什么我们要学习如何抽象?因为抽象是我们控制软件复杂性的重要手段。
软件是人类有史以来最复杂的系统。其一、软件系统本身规模庞大,参与人手众多,难以管理;其二、环境和需求不断变化,且错误难以避免。
人类无法驾驭过于复杂的事物,于是只能寻找方法简化软件系统:把系统分为许多子部分,人们开发一个部分的时候,系统其他部分都是一种抽象,无需了解其细节。
本书讨论的就是系统的组织和设计,有哪些方法可以帮助我们控制软件的复杂度。
---收获---
除了贯穿全书的抽象思想外,我们还能从本书中学到(摘抄自老师ppt。。。):
从另一个角度看程序和程序设计中的问题
函数式程序设计
多种多样的程序组织方式
丰富多彩的编程模式
对一些基础问题的理解
---资源---
这本书相关的资料有不少,包括MIT的官方视频教程和非官方习题答案。
另外就是书不好买,几大网上书店都没了,我还是在学校的教材中心买到的。
MIT的视频教程:
http://swiss.csail.m
it.edu/classes/6.001
/abelson-sussman-lec
tures/
课后答案版本1:
全。很多题不是用书中的Sheme而是 Common Lisp,但没有太大影响。
http://eli.thegreenp
lace.net/category/pr
ogramming/lisp/sicp/
课后答案版本2:
排版好,每一题给出多种语言的解答。
前3章比较全。第四章缺的太多,第五章完全没有。
http://sicp.org.ua/s
icp/FrontPage
PS:
MIT开始用python教授此课,代替了原本的Scheme:
http://www.wisdomand
wonder.com/link/2110
/why-mit-switched-fr
om-scheme-to-python
现在终于把这本书看完了,在这总结一下。
---时间---
本书共有5章,每章都有近100道习题。前三章的习题我做了90%,后两章太难,大概只做了70%。
这本书可以说是时间黑洞。每章分为4-5节,每节有几个小节,全书有一百小节(即X.X.X)左右。我以小节为单位进行了估算,包括完成习题,每小节大约需要一个小时。当然不同小节难度不同,有的耗时长些,有的短些。于是读完本书并做完大部分习题需要上百个小时。再加上听课或看视频教程的时间则会更长。所以我觉得恐怕只有在校学生才有时间和精力来完成这本书的学习。
---内容---
本书按照内容可以分为三个部分:过程抽象(第一章);数据抽象(第二、三章)和语言抽象(第四、五章)。
过程抽象部分比较简单,先介绍了Scheme的基本语法,让读者初步领略函数式编程的风采。对于有一定编程基础(相信国内极少有人入门就读这个)的读者来说,会有耳目一新的感觉,原来递归和迭代可以有另一种表现形式,但并不难理解。习题也比较简单,不会用掉太多的时间。过程抽象的概念也很简单,就是编程语言中的函数,目的是封装计算过程的细节。关于何时应该用过程抽象的原则是:一切可以定义为过程的计算片段都应该定义为过程。
数据抽象是我认为的本书的核心,也是最值得我们仔细研读的部分。关于数据抽象最直接的理解就是面向对象编程,如C++,而Java和C#则是更彻底的数据抽象。把一组过程抽象(类的方法)集中考虑,并加入内部状态(类的变量),就是一个数据抽象。每个数据抽象都应该把自己的内部对象状态和对象的实现隐藏起来,对外通过一组接口进行消息传递。这样听起来好像本书与一般的面向对象书没有区别,但实际上,这些都是我自己的总结,书里面不会把这些概念直接罗列出来,而是通过一个个巧妙的例子,让读者一步步深入,感叹原来A还可以这样抽象,原来B还可以这样封装。个人认为如果时间有限,读完前三章已经可以领会本书大部分思想了,后两章可以不读。
语言抽象是指自己发明一门语言,以解决某一特定应用领域的问题。在这一领域中,自己发明的语言会比其他通用语言更方便。定义了新语言的语法后,就要自己去实现该语言的编译器或解释器,可以通过现有的语言去构造。这一部分包含了许多编译方面的知识,但又与编译原理中的构造方法有不少区别,自己看书很容易看得云里雾里,听老师讲课才好一些。大部分习题很难做,一部分习题非常难。
---原因---
为什么我们要学习这本书?因为这本书告诉我们如何抽象。为什么我们要学习如何抽象?因为抽象是我们控制软件复杂性的重要手段。
软件是人类有史以来最复杂的系统。其一、软件系统本身规模庞大,参与人手众多,难以管理;其二、环境和需求不断变化,且错误难以避免。
人类无法驾驭过于复杂的事物,于是只能寻找方法简化软件系统:把系统分为许多子部分,人们开发一个部分的时候,系统其他部分都是一种抽象,无需了解其细节。
本书讨论的就是系统的组织和设计,有哪些方法可以帮助我们控制软件的复杂度。
---收获---
除了贯穿全书的抽象思想外,我们还能从本书中学到(摘抄自老师ppt。。。):
从另一个角度看程序和程序设计中的问题
函数式程序设计
多种多样的程序组织方式
丰富多彩的编程模式
对一些基础问题的理解
---资源---
这本书相关的资料有不少,包括MIT的官方视频教程和非官方习题答案。
另外就是书不好买,几大网上书店都没了,我还是在学校的教材中心买到的。
MIT的视频教程:
http://swiss.csail.m
课后答案版本1:
全。很多题不是用书中的Sheme而是 Common Lisp,但没有太大影响。
http://eli.thegreenp
课后答案版本2:
排版好,每一题给出多种语言的解答。
前3章比较全。第四章缺的太多,第五章完全没有。
http://sicp.org.ua/s
PS:
MIT开始用python教授此课,代替了原本的Scheme:
http://www.wisdomand