本书的内容,以及我们能从中学到什么
这个学期花了大量的时间在这本书上,同时旁听了裘宗燕老师(本书译者)以本书为教材开的课“程序设计技术和方法”,到学期末,总算是把这本书看完了。
豆瓣上关于本书的评论大多是形而上的,都说这本书怎样怎样好,但很少说明为什么好。我读这本书之前看了很多豆瓣上的评论,依然不知道这本书要讲什么。现在终于把这本书看完了,在这总结一下。
---时间---
本书共有5章,每章都有近100道习题。前三章的习题我做了90%,后两章太难,大概只做了70%。
这本书可以说是时间黑洞。每章分为4-5节,每节有几个小节,全书有一百小节(即X.X.X)左右。我以小节为单位进行了估算,包括完成习题,每小节大约需要一个小时。当然不同小节难度不同,有的耗时长些,有的短些。于是读完本书并做完大部分习题需要上百个小时。再加上听课或看视频教程的时间则会更长。所以我觉得恐怕只有在校学生才有时间和精力来完成这本书的学习。
---内容---
本书按照内容可以分为三个部分:过程抽象(第一章);数据抽象(第二、三章)和语言抽象(第四、五章)。
过程抽象部分比较简单,先介绍了Scheme的基本语法,让读者初步领略函数式编程的风采。对于有一定编程基础(相信国内极少有人入门就读这个)的读者来说,会有耳目一新的感觉,原来递归和迭代可以有另一种表现形式,但并不难理解。习题也比较简单,不会用掉太多的时间。过程抽象的概念也很简单,就是编程语言中的函数,目的是封装计算过程的细节。关于何时应该用过程抽象的原则是:一切可以定义为过程的计算片段都应该定义为过程。
数据抽象是我认为的本书的核心,也是最值得我们仔细研读的部分。关于数据抽象最直接的理解就是面向对象编程,如C++,而Java和C#则是更彻底的数据抽象。把一组过程抽象(类的方法)集中考虑,并加入内部状态(类的变量),就是一个数据抽象。每个数据抽象都应该把自己的内部对象状态和对象的实现隐藏起来,对外通过一组接口进行消息传递。这样听起来好像本书与一般的面向对象书没有区别,但实际上,这些都是我自己的总结,书里面不会把这些概念直接罗列出来,而是通过一个个巧妙的例子,让读者一步步深入,感叹原来A还可以这样抽象,原来B还可以这样封装。个人认为如果时间有限,读完前三章已经可以领会本书大部分思想了,后两章可以不读。
语言抽象是指自己发明一门语言,以解决某一特定应用领域的问题。在这一领域中,自己发明的语言会比其他通用语言更方便。定义了新语言的语法后,就要自己去实现该语言的编译器或解释器,可以通过现有的语言去构造。这一部分包含了许多编译方面的知识,但又与编译原理中的构造方法有不少区别,自己看书很容易看得云里雾里,听老师讲课才好一些。大部分习题很难做,一部分习题非常难。
---原因---
为什么我们要学习这本书?因为这本书告诉我们如何抽象。为什么我们要学习如何抽象?因为抽象是我们控制软件复杂性的重要手段。
软件是人类有史以来最复杂的系统。其一、软件系统本身规模庞大,参与人手众多,难以管理;其二、环境和需求不断变化,且错误难以避免。
人类无法驾驭过于复杂的事物,于是只能寻找方法简化软件系统:把系统分为许多子部分,人们开发一个部分的时候,系统其他部分都是一种抽象,无需了解其细节。
本书讨论的就是系统的组织和设计,有哪些方法可以帮助我们控制软件的复杂度。
---收获---
除了贯穿全书的抽象思想外,我们还能从本书中学到(摘抄自老师ppt。。。):
从另一个角度看程序和程序设计中的问题
函数式程序设计
多种多样的程序组织方式
丰富多彩的编程模式
对一些基础问题的理解
---资源---
这本书相关的资料有不少,包括MIT的官方视频教程和非官方习题答案。
另外就是书不好买,几大网上书店都没了,我还是在学校的教材中心买到的。
MIT的视频教程:
http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/
课后答案版本1:
全。很多题不是用书中的Sheme而是 Common Lisp,但没有太大影响。
http://eli.thegreenplace.net/category/programming/lisp/sicp/
课后答案版本2:
排版好,每一题给出多种语言的解答。
前3章比较全。第四章缺的太多,第五章完全没有。
http://sicp.org.ua/sicp/FrontPage
PS:
MIT开始用python教授此课,代替了原本的Scheme:
http://www.wisdomandwonder.com/link/2110/why-mit-switched-from-scheme-to-python
豆瓣上关于本书的评论大多是形而上的,都说这本书怎样怎样好,但很少说明为什么好。我读这本书之前看了很多豆瓣上的评论,依然不知道这本书要讲什么。现在终于把这本书看完了,在这总结一下。
---时间---
本书共有5章,每章都有近100道习题。前三章的习题我做了90%,后两章太难,大概只做了70%。
这本书可以说是时间黑洞。每章分为4-5节,每节有几个小节,全书有一百小节(即X.X.X)左右。我以小节为单位进行了估算,包括完成习题,每小节大约需要一个小时。当然不同小节难度不同,有的耗时长些,有的短些。于是读完本书并做完大部分习题需要上百个小时。再加上听课或看视频教程的时间则会更长。所以我觉得恐怕只有在校学生才有时间和精力来完成这本书的学习。
---内容---
本书按照内容可以分为三个部分:过程抽象(第一章);数据抽象(第二、三章)和语言抽象(第四、五章)。
过程抽象部分比较简单,先介绍了Scheme的基本语法,让读者初步领略函数式编程的风采。对于有一定编程基础(相信国内极少有人入门就读这个)的读者来说,会有耳目一新的感觉,原来递归和迭代可以有另一种表现形式,但并不难理解。习题也比较简单,不会用掉太多的时间。过程抽象的概念也很简单,就是编程语言中的函数,目的是封装计算过程的细节。关于何时应该用过程抽象的原则是:一切可以定义为过程的计算片段都应该定义为过程。
数据抽象是我认为的本书的核心,也是最值得我们仔细研读的部分。关于数据抽象最直接的理解就是面向对象编程,如C++,而Java和C#则是更彻底的数据抽象。把一组过程抽象(类的方法)集中考虑,并加入内部状态(类的变量),就是一个数据抽象。每个数据抽象都应该把自己的内部对象状态和对象的实现隐藏起来,对外通过一组接口进行消息传递。这样听起来好像本书与一般的面向对象书没有区别,但实际上,这些都是我自己的总结,书里面不会把这些概念直接罗列出来,而是通过一个个巧妙的例子,让读者一步步深入,感叹原来A还可以这样抽象,原来B还可以这样封装。个人认为如果时间有限,读完前三章已经可以领会本书大部分思想了,后两章可以不读。
语言抽象是指自己发明一门语言,以解决某一特定应用领域的问题。在这一领域中,自己发明的语言会比其他通用语言更方便。定义了新语言的语法后,就要自己去实现该语言的编译器或解释器,可以通过现有的语言去构造。这一部分包含了许多编译方面的知识,但又与编译原理中的构造方法有不少区别,自己看书很容易看得云里雾里,听老师讲课才好一些。大部分习题很难做,一部分习题非常难。
---原因---
为什么我们要学习这本书?因为这本书告诉我们如何抽象。为什么我们要学习如何抽象?因为抽象是我们控制软件复杂性的重要手段。
软件是人类有史以来最复杂的系统。其一、软件系统本身规模庞大,参与人手众多,难以管理;其二、环境和需求不断变化,且错误难以避免。
人类无法驾驭过于复杂的事物,于是只能寻找方法简化软件系统:把系统分为许多子部分,人们开发一个部分的时候,系统其他部分都是一种抽象,无需了解其细节。
本书讨论的就是系统的组织和设计,有哪些方法可以帮助我们控制软件的复杂度。
---收获---
除了贯穿全书的抽象思想外,我们还能从本书中学到(摘抄自老师ppt。。。):
从另一个角度看程序和程序设计中的问题
函数式程序设计
多种多样的程序组织方式
丰富多彩的编程模式
对一些基础问题的理解
---资源---
这本书相关的资料有不少,包括MIT的官方视频教程和非官方习题答案。
另外就是书不好买,几大网上书店都没了,我还是在学校的教材中心买到的。
MIT的视频教程:
http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/
课后答案版本1:
全。很多题不是用书中的Sheme而是 Common Lisp,但没有太大影响。
http://eli.thegreenplace.net/category/programming/lisp/sicp/
课后答案版本2:
排版好,每一题给出多种语言的解答。
前3章比较全。第四章缺的太多,第五章完全没有。
http://sicp.org.ua/sicp/FrontPage
PS:
MIT开始用python教授此课,代替了原本的Scheme:
http://www.wisdomandwonder.com/link/2110/why-mit-switched-from-scheme-to-python
© 本文版权归作者 空气 所有,任何形式转载请联系作者。
有关键情节透露
MARK下,大一围观
能完成前三章习题的90%,真是牛人。
我也看看,相信不错.....
在学校的人可真有时间啊
想读
评论的思路很清晰,受教了。
我觉得已经是程序员的人就不要在这本书上花很多时间了。
「内容不可见」
@emlaiy6 我觉得译的很好。
「内容不可见」
@emlaiy6
@emlaiy6 不客气~
mark。。很好的评论和资源
「内容不可见」
mark
mark
m
mark
mark
mark
不错,准备读一下。。。
mk.xiexie lz
mark下
谢谢LZ细致的分析尼玛呀,外教讲了2张,我还在赶第一张的习题。
想问下哪里可以看到《程序设计技术和方法》的视频
@Gentleman mimi
MIT的视频教程: http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/
mark ``很感谢楼主分享资源
mark
绝对时间黑洞,我花了大一下+大二上=前三章……
@空气 谢谢啊!
「内容不可见」
mark
我是自学了几个月的Common Lisp才发现这本书的,但是这本貌似是scheme的,所以请教一下,我应该以怎样的方式去读这本书呢?
@西粉 正常读就好了
「内容不可见」
感谢楼主的分享,活到老学到老
「内容不可见」
谢谢楼主啊
学习
mark
楼主是个认真的孩子。
mark
现在北大还开这门课么?@空气
应该开吧,这是本科生的课。 你可以去教务系统里面查查。
我完成了前3章练习的100%,因为我非常喜欢这本书,还向喜欢这本书的朋友推荐其它三本:
mark
标记下,有时间,再以此帖子的经验开始阅读...
mark
楼主,我想问问,这本书是什么时候看比较好,相对于程度而言。
@默写本 MIT以前是拿这本当编程入门书籍的,所以什么时候都可以看。 当然我觉得还是有一定编程基础和代码量再看收获会比较大。
@空气 谢谢~我准备初学一门编程语言再看~~
楼主好强大啊 准备看这本书
MARK,,,非在校学生时间伤不起
必须mark
mark too
mark
mark
mark
mark
不错啊,一定要看看
能听译者直接讲真是幸运,希望以后能有机会去旁听,坐台阶上都成,呵呵
准备读下
@空气 查到了……最近才想起来要选课……
有用。
谢谢分享,Mark
@希望找回自我 我觉得工作了一两年的程序员反而更应该读这本书,虽然里面说的东西看上去我们在编程开发时很多已经用到, 但其实我们并不懂得系统地使用其中的方法和思想,而且我们往往只是接触了些零散的认识,以为这些就够用了。要提高程序设计的洞察力,我觉得此书必读。
收藏一下
mark
@空气 你觉得从本书中学到的有价值的东西是什么?顺便问一下,有没有老师的PPT,求一份—>ffff0h@126.com
mark
mark
good Mark
mark
http://www.math.pku.edu.cn/teachers/qiuzy/progtech/
make
请问想学编程,从哪些书入门哪?
m
m
「内容不可见」
mark
围观
mark 技术流
已购,mark一下
mark
mark
根据 lz 对过程抽象和数据抽象的总结看来基本没读懂此书
mark 以后慢慢体会
谢谢。
此乃神书
hello
mark,膜拜大神
拜读评论,决定购来一阅
大二前来围观~
看哭了 时间黑洞
有这么多资源大赞!
mark 一下
不明觉腻。
mark
这本书的翻译实在是太烂了
mark