<!-- title: SICP第一课：计算机科学的真身 -->
<!-- domain: programming -->
<!-- video: https://www.youtube.com/watch?v=-J_xL4IGJJA -->

# SICP第一课：计算机科学的真身

## 导语

如果你只能看一节编程课，我强烈建议是这一节：1986年，MIT 教授 Hal Abelson 站在黑板前，用58分钟讲了 MIT 传奇课程 6.001《计算机程序的构造和解释》（SICP）的第一课。四十年过去，编程语言换了一茬又一茬，框架迭代了几百轮，但这堂课讨论的问题至今没有过时——**计算机科学到底研究的是什么？程序员的“手艺”本质上是什么？**

这节课最惊艳的地方，是它开场就推翻了几乎所有人对这个学科的认知：计算机科学（Computer Science）这个名称“糟糕透顶”，它既不是科学，也几乎不关于计算机。那它关于什么？关于**如何用形式化语言表达“怎么做”的知识，以及如何在人脑的极限之内控制大型系统的复杂性**。

为什么今天还要安利一门38年前的录像？因为当下 AI 都能写代码了，市面上大量教程仍在教你“怎么用某个工具”，却没人告诉你这门手艺的地基是什么。工具每年更新，地基四十年不变。这一轮我们换个角度，不讲新框架、不追热点，回到源头，看这堂被无数顶级工程师奉为“编程第一课”的录像到底讲了什么，以及它对2026年的开发者还有什么用。

> 小提示：本篇写作环境未联网，播放量等动态数据为写作时估计值，请以视频页面实际显示为准。

## 视频背景卡片

| 项目 | 内容 |
|------|------|
| 视频标题 | Lecture 1A: Functions and Processes（Overview and Introduction to Lisp） |
| 频道 | MIT OpenCourseWare（官方课程录像） |
| 时长 | 约58分钟 |
| 播放量 | 百万级（MIT OCW 长期经典，估计值） |
| 主讲人 | Hal Abelson（与 Gerald Jay Sussman 轮流主讲本系列） |
| 核心主题 | 计算机科学的本质、声明式与过程式知识、黑箱抽象、Lisp 语言设计哲学 |

## 核心内容拆解

### 1. “计算机科学是个糟糕的名字”——两重祛魅

视频原话层面，Abelson 开场就抛出暴论：Computer Science 是 "a terrible name"。他给了两层理由。

第一，它不是科学（science）。天文学研究的是天然存在、人无法改变的天体，那是科学；而计算机系统是**人造物**，研究人造物的学科更接近工程（engineering），甚至像魔法——你的“原料”是想法本身，搭建的是“思想的组件”。

第二，它跟“计算机”这个设备的关系，远没有名字暗示的那么大。Abelson 用了一个绝妙的类比：**几何学（geometry）词源是“土地测量”，但你不会说几何学是研究测量仪器的学问**。几何学真正研究的是空间与形式的抽象规律，测量仪器只是当年催生它的场景。同理，计算机只是催生“过程的形式化表达”这门手艺的载体，而非这门学科的本体。

【延伸分析】这个祛魅在今天格外有价值。2026年大量“学编程”焦虑的根源，是把这门学科误解成了“学会某个工具的操作”——就像把几何学误解成“学会用经纬仪”。工具会被 AI 替代，而“用形式化语言组织‘怎么做’的知识”这种核心能力不会。

### 2. 两类知识：知道“是什么” vs 知道“怎么做”

这是全课最核心的一组概念，Abelson 用平方根举了例子。

**Declarative knowledge（声明式知识）**：说的是“是什么”。比如 √x 的数学定义——“√x 是这样一个 y，使得 y² = x 且 y ≥ 0”。这个定义完美、精确，但它**没告诉你怎么把 √2 算出来**。

**Imperative knowledge（过程式知识）**：说的是“怎么做”。Abelson 引用了亚历山大港的 Heron（Heron of Alexandria）的方法：先猜一个数 g，计算 x/g，取两者的平均作为新的猜测，反复迭代，猜测会越来越接近真值。这才是一个真正可执行的“怎么做”。

数学书里也会教你第二种知识（比如“按如下步骤计算”），但它教的对象是人——人能靠直觉、常识和临场判断糊弄过去。**程序员的独特之处在于：必须把过程式知识形式化到“机器可以毫无歧义地执行”的程度**——机器没有常识，不容许任何“大概如此”。Abelson 称这门手艺是介于数学和工程之间的 "meta-technical" 技艺。

【延伸分析】用今天的话说：声明式知识是“接口语义/规约（spec）”，过程式知识是“实现”。AI 时代这个区分反而更锋利了——大模型擅长生成“某种实现”，但判断“这个实现是否真的满足规约”的责任，依然落在人身上。

### 3. 真正的敌人：不是机器，是复杂性

Abelson 明确说了这门课关心的核心问题：**techniques for controlling the intellectual complexity of very large systems**——控制超大型系统在智力上的复杂性。

他做了一个精彩的对比。数学里的困难问题（比如数论中的未解难题）往往具有“本质复杂性（essential complexity）”——那是问题本身带来的。而大型软件系统的复杂性多半是**我们自己造出来的**：机器执行任意复杂的指令集毫无怨言，“受不了”的是人的大脑。既然复杂性是人造的，我们就有理由相信可以用系统化的技术手段去驯服它——这正是这门课要教的“手艺中的手艺”（discipline of discipline）。

【延伸分析】熟悉软件工程史的读者会联想到 Fred Brooks 1986 年的名篇《No Silver Bullet》中 essential/accidental complexity 的二分——这套话语在此类课程思想中已见雏形（Brooks 的著名论断可视为这一思想脉络的延伸，具体出处请以原文为准）。近年的《A Philosophy of Software Design》把复杂性定义为“让软件难以理解和修改的一切”，也完全在这条延长线上。

### 4. 一切从三件事开始：primitive、组合、抽象

课程给出了描述一切语言的通用框架，也是全课的骨架。任何强大的语言——不管它面向编程、面向数学还是面向电路设计——都靠三样东西构建：

- **Primitive expressions（基本实体）**：语言里不可再分的最小积木，比如数、基本过程；
- **Means of combination（组合手段）**：把积木拼成复杂对象的方法，比如 Scheme 里 `(square (+ 2 3))` 这种可无限嵌套的前缀表达式；
- **Means of abstraction（抽象手段）**：给组合物命名、把它当整体操作的规则，比如 `define`。

Abelson 强调这个框架不是 Lisp 特有的，而是贯穿整个课程的"lens"：后面所有内容，从数据抽象到元语言抽象（写解释器），都是在更高层面反复玩这三件事。

【延伸分析】这套框架放今天依然是评估语言和框架的利器。React 的组件 + props + hooks、SQL 的表 + JOIN + 视图，都可以拆成“积木/组合/抽象”三件套。当你学一门新语言时，有意识地去找这三样东西，学习速度会明显加快——这就是“好的框架能压缩知识”的直接体现。

### 5. 黑板演示：用“愿望思维”写出平方根

课程后半段，Abelson 在黑板上现场用 Scheme 写 sqrt 程序，演示了 SICP 方法论中最动人的技巧——**wishful thinking（愿望思维）**。

他先假设 `square`、`average` 这些“还没实现”的过程已经存在，直接写出主逻辑：`(define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x)))`。逻辑清晰得像在描述 Heron 的原始算法本身。然后再回过头逐个实现 `good-enough?` 和 `improve`。

这一手打破了很多初学者的写作惯性——从“我能用的积木”出发往下凑。SICP 的主张恰恰相反：**先从问题出发写出“理想中的代码”，再让积木去满足愿望**。每一步程序都保持可读，因为它在每一层都直接“说人话”。

【延伸分析】这就是现代软件工程里 “interface-first design” 和测试驱动开发（TDD）的思想源头之一：先定义接口契约，再填充实现。你在 review 代码时感觉“这段逻辑读起来像散文”的舒适感，本质上就是愿望思维被贯彻到位的结果。

### 6. 黑箱抽象：魔法背后的契约

写完 sqrt 后，Abelson 画出了那张著名的盒子图：`sqrt` 包着 `sqrt-iter`，`sqrt-iter` 又调用 `good-enough?` 和 `improve`。每个盒子之间只靠**接口契约**连接。

他抛出的观点是：作为使用者，**你不需要知道盒子里是什么**，甚至不妨“相信魔法（believe in magic）”。这种“局部无知”不是缺陷，而是巨型系统能被人类智力驾驭的唯一途径——每个盒子的设计者只需对自己的契约负责，使用者只依赖契约而非实现。课程的整个路线图（过程抽象 → 数据抽象 → 模块与对象 → 元语言抽象）就是不断升维地重复这个游戏。

【延伸分析】这四十年间软件工程的所有主流实践——函数库、API、微服务、开源依赖、云服务——本质上全是“盒子与契约”的不同粒度变体。你调用 `fetch()` 时从不关心 TCP 窗口如何滑动，这就是黑箱抽象在替你的大脑省内存。反过来说，排查线上问题时“分层收敛”（先怀疑哪个盒子违反了契约）也正是这张图的工程化应用。

### 7. 为什么是 Lisp：一门为“思想”设计的语言

课中 Abelson 被问及 Lisp 与 Pascal 的选择（这几乎是当年课堂上的必答题），他的回答点出了语言设计的历史语境：Pascal 诞生时，机器资源极其有限，语言设计优化的目标是**编译成高效机器码**；而 Lisp 的根是 Lambda calculus，从血统上就是为“把过程当数据摆弄、表达递归与高阶函数”而生的。这门课关心的不是让机器跑得快，而是**让思想被表达得清晰**，所以选 Lisp。

他还引用了 Knuth 式的文学编程精神，其中最著名的一句也写在 SICP 扉页上："Programs must be written for people to read, and only incidentally for machines to execute."（程序首先是写给人读的，只是顺便能在机器上执行。）

【延伸分析】不必抬杠“那我该学 Lisp 吗”——这不是本课的重点，Abelson 自己也说了技术是载体。真正值得带走的是判断标准：**评估任何语言/工具时，问它让哪一类思想变得更容易表达，又压抑了哪一类**。当年 Lisp 与 Pascal 之争，放到今天是“AI 辅助编程时代，代码的可读性与可验证性如何排序”的同构问题。

## 知识结构图

```mermaid
mindmap
  root((SICP 1A<br/>计算机科学的真身))
    祛魅：这门学科是什么
      不是科学，更像工程/魔法
      几何学类比：不关于测量仪器
      核心是形式化表达过程知识
    两类知识
      Declarative 声明式
        √x 的定义：y² = x 且 y ≥ 0
        只说是什么
      Imperative 过程式
        Heron 迭代法
        必须形式化到机器可执行
    学科核心问题
      控制大型系统的智力复杂性
      复杂性多半是人造的 → 可驯服
    语言三要素
      Primitive 基本实体
      Means of Combination 组合
      Means of Abstraction 抽象
    方法论演示
      Wishful Thinking 愿望思维
      黑箱抽象与接口契约
      程序写给人读
    课程路线
      过程抽象
      数据抽象
      模块与对象
      元语言抽象：写解释器
```

## 实战启示

**如果你是初学者**：别再把“学编程”等同于“学某门语言的操作”。看完这节课，给自己立三条规矩——第一，每写一个函数，先能用一句“人话”说清它的契约（输入什么、承诺什么输出），再动手写实现；第二，写不出来时试试愿望思维：先假设理想中的辅助函数已经存在，把主逻辑写顺，再回头填坑；第三，学新语言时主动找它的 primitive/组合/抽象三件套，用框架代替死记。

**如果你是有经验的工程师**：这节课给你的最大增量是“复杂性观”。大型系统让人头疼的复杂度，绝大多数不是问题本质带来的，而是我们自己堆积的——这意味着它原则上可被设计消解。下次 review 时，与其纠结某行代码的写法，不如问两个更根本的问题：这个盒子的契约是否清晰到使用者可以“相信魔法”？这层抽象是压缩了复杂性，只是搬运了它？

**如果你在 AI 时代思考自身定位**：这堂课的四十年前预言正在应验——机器（现在还包括大模型）能执行过程，但“选择哪个过程、验证它是否满足规约、控制整体不失控”依然是有品味的工程师的价值所在。AI 把“生成代码”的成本打到近零之后，稀缺的恰恰是这门课教的东西：契约思维、复杂性品味、以及把模糊需求形式化的能力。

## 延伸学习路径

1. **SICP 全书在线版**（sarabander 社区重排的 HTML 版，搜索 "SICP sarabander" 即可，长期稳定可用）——看完 1A 直接读第一章，衔接度极高；
2. **MIT OCW 的 6.001 课程页**（ocw.mit.edu 搜索 6.001）——本视频所在系列共约 20 讲，Lecture 2A 讲 substitution model 的边界，是 1A 的直接续篇；
3. **Berkeley CS61A**（cs61a.org）——用 Python 重新演绎 SICP 思想的现代课程，适合不想碰 Scheme 的读者，作业系统公开可自练；
4. **《The Little Schemer》**——用一问一答把递归和高阶函数讲到婴儿学步级友好，与 SICP 互补；
5. **Fred Brooks《No Silver Bullet》**（1986 年论文）——理解 essential/accidental complexity 二分的完整论述，与本课第3点对照阅读。

## 参考来源

1. [Lecture 1A: Overview and Introduction to Lisp — MIT 6.001 (1986)](https://www.youtube.com/watch?v=-J_xL4IGJJA) — 本文分析的核心视频（MIT OpenCourseWare 官方频道）
2. [Structure and Interpretation of Computer Programs 在线全书（sarabander HTML 版）](https://sarabander.github.io/sicp/) — SICP 原书，视频内容的文本底本
3. [MIT OpenCourseWare: 6.001 Structure and Interpretation of Computer Programs](https://ocw.mit.edu/courses/6-001-structure-and-interpretation-of-computer-programs-spring-2005/) — 课程官方页与后续讲次
4. [Berkeley CS61A 课程主页](https://cs61a.org/) — SICP 思想的现代 Python 化重制

> 注：本篇写作环境未联网核验，参考来源均为长期稳定的官方/知名站点地址；播放量、时长等动态数据为写作时估计，请以页面实际信息为准。

## 一句话总结

这堂四十年前的课最大的价值，是把“编程”从一门工具手艺还原成一种思维能力——用形式化语言表达“怎么做”，再用黑箱契约把复杂性关进人类大脑装得下的盒子里。

---
> 本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵**爱卫生**（微信ID: gprshome201101）维护，聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。
> 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
