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 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
编辑于 2017-06-06

文章被以下专栏收录