<!-- title: 程序员圣经第一课：抽象才是地基 -->
<!-- domain: programming -->
<!-- video: https://www.youtube.com/watch?v=-L6gtp7c6Fk -->

# 程序员圣经第一课：抽象才是地基

## 导语：一部四十年前的课，为什么今天还在被疯转

如果你问一个写了二十年代码的老程序员“哪门网课最值得花一小时”，很大概率会得到同一个答案：MIT 的 SICP，也就是《计算机程序的构造和解释》（Structure and Interpretation of Computer Programs）1986 年那套公开课的第一讲。

这不是什么新视频。它拍摄于 1986 年，是 Harold Abelson 和 Gerald Jay Sussman 两位教授在企业培训场合录制的一整套课程，后来被 MIT OpenCourseWare 官方搬上 YouTube。按理说，一门讲 Lisp 的、画面分辨率只有几百线的老课，早该被时代扫进故纸堆。但现实恰恰相反：它至今仍常年出没在 Hacker News 和 r/programming 的推荐帖里，累计播放量在主频道就有百万级，还不算各类课堂引用和搬运版本。2022 年，MIT Press 甚至专门出了 SICP 的 JavaScript 改写版，让这门用 Scheme 讲课的老课换了新衣裳继续流传。

为什么？因为在 2026 年这个 AI 抬手就能生成几百行代码的时代，“怎么写代码”越来越不值钱，“怎么组织代码、怎么驯服复杂性”反而成了稀缺能力。而 SICP 第一课讲的恰恰不是任何语言，而是一件更底层的事：**什么是程序？什么是抽象？工程师的知识和数学家的知识有什么本质区别？**这些问题不解决，你学再多的框架都只是在背咒语，而不懂咒语为什么灵。

这节课约 54 分钟，没有一行幻灯片炫技，两块黑板、一支粉笔，却把一个程序员一辈子要用的地基打得干干净净。下面我们把这门“圣经第一课”逐段拆开。

## 视频背景卡片

| 项目 | 内容 |
|------|------|
| 视频标题 | Lecture 1A: Overview and Introduction to Lisp |
| 频道 | MIT OpenCourseWare（官方） |
| 时长 | 约 54 分钟 |
| 播放量 | 百万级（主频道累计，另有大量课堂引用与搬运版，约数） |
| 核心主题 | 黑箱抽象、陈述性知识与过程性知识、为什么用 Lisp 学编程 |

## 核心内容拆解

### 一、开场三分钟：给“计算机科学”祛魅

Sussman 的开场白堪称整门课最著名的段落之一。他说，“计算机科学”是个 terrible name（糟糕的名字）——这门学问**既不是科学，也不是关于计算机的**。

为什么不是科学？因为科学处理的是“真实世界里本来就在的东西”，而计算机科学处理的是人造物，是工程师一笔一笔构造出来的东西。为什么不是关于计算机的？他给了一个流传四十年的类比：几何学（geometry）的词源是“丈量土地”（geo = 土地，metry = 测量），起源于古埃及尼罗河泛滥后重新划定地界的需求——但今天的几何学家显然不是在研究测量仪器的使用。同样道理，计算机只是这台学科碰巧使用的一个“仪器”，而不是它的本质。

那这门学科的本质是什么？Sussman 给出他自己的定义：它是**一种工程——专门处理“怎么做”（how-to）知识的工程**。数学陈述“什么是”对的东西，而程序陈述“怎么一步一步做出来”。这个开场定位，直接引出了后面全课最精彩的一组概念区分。（以上是课程原意的复述；把“计算机科学”译为“过程性知识的工程学”是我的概括。）

### 二、程序是咒语：程序员是现代巫师

第二个奠基性比喻：程序就是咒语（spell）。Sussman 说，程序员的工作方式像巫师念咒——用一种形式语言，精确地组合出一串“咒文”，让机器去执行。这个比喻有两层含义，一层明亮，一层幽暗。

明亮的一层：咒语和巫术的区别在于，**好的程序可以由被充分理解的部件构造出来**。每个部件的行为可控、可组合、可推理，所以工程巫师能建造出远超自己直觉驾驭能力的复杂系统。这也是整门课的核心方法论——复杂性必须被拆解成能被理解的小盒子。

幽暗的一层：这些咒语的威力可能远超建造者的预期。课程里 Sussman 提醒学生，他们在学一门能“吟诵出危险之物”的手艺——程序一旦跑起来，后果不完全受建造者控制。放在 2026 年看，这段话简直像预言：一个仓促上线的推荐算法、一段没人读得懂的遗留代码、一个被大模型批量生成却无人复查的模块，都是“失控咒语”的现代版。这个比喻不是我加的，是课程原意；但它对今天的适用程度，值得每个读者自己掂量。

### 三、一张课程地图：三大主题

第一课的后半段实际上是在画整门课的地图。Sussman 说，这门课关注三件大事：

1. **黑箱抽象（Black-box Abstraction）**：如何把复杂性封装进盒子里，让使用者不必打开它。包括基本元素、组合手段、抽象手段，以及用高阶过程捕获公共模式。
2. **通用接口（Conventional Interfaces）**：如何为大规模系统约定统一的操作界面，让模块之间能以标准方式拼接（整门课后面讲的通用运算、数据抽象、流式处理都归入这一主题）。
3. **元语言抽象（Metalinguistic Abstraction）**：语言本身也可以是思维的载体——课程后半段会带学生**用 Lisp 手写一个 Lisp 解释器**，甚至写逻辑式编程语言。这一主题的潜台词是：当现有语言表达不了你的问题时，就造一门能表达的。

这张地图的价值常被低估。大多数编程课程是“知识清单”式组织——学完语法学算法，学完算法学框架；SICP 的组织方式是“能力阶梯”式——每一级都在回答“如何驾驭上一级驾驭不了的复杂性”。理解了这张地图，你就明白为什么有人说 SICP 不是一本编程书，而是一本关于“思维工具的制造工艺”的书。

### 四、黑箱抽象：三个问题定义一门语言

第一主题里，Sussman 给出了一套极具普适性的分析框架：**任何一门表达力强的语言，都要回答三个问题**——它的基本元素是什么？允许怎样的组合手段？提供怎样的抽象手段？

基本元素是语言的“原子”：数、字符串、过程。组合手段决定原子能否搭成分子：Lisp 里几乎任何表达式都能互相嵌套组合。抽象手段则决定你能否给组合物起名字、把它当新原子用——这就是 define 的意义。

真正出神入化的是第四点：**捕获公共模式（capturing common patterns）**。当你发现一堆过程长得几乎一样、只是某一步不同，普通的命名抽象帮不了你——你需要把“过程本身”当数据传递，也就是高阶过程。Sussman 在黑板上把“求和”“求积”这类计算模式逐步提炼成带参数的通用模板，让观众亲眼看到：抽象不是命名一个函数那么简单，而是把散落在千百处的重复上升为一件“被命名的思想”。这是从“会写函数”到“会设计语言”之间那道真正的门槛。

### 五、sqrt 案例：陈述性知识与过程性知识

这是整节课最锋利的一刀。Sussman 用“求平方根”展示了两种知识的鸿沟。

**陈述性知识（Declarative）**回答“是什么”：“x 的平方根，是那个满足 y² = x 且 y ≥ 0 的 y。”这是一个完美、精确的数学定义——但它一个字都没告诉你怎么算出来。你把它丢给计算机，机器只会瞪着你。

**过程性知识（Imperative）**回答“怎么做”：想求 x 的平方根，先猜一个数 G；如果 G² 足够接近 x，就用它；否则用 G 和 x/G 的平均值作为新猜测，反复迭代。这就是牛顿法式的 successive approximation——一段真正可执行的“怎么做”。

Sussman 的观点是：传统数学教育几乎只训练陈述性知识，而程序员的日常恰恰是**把陈述性知识翻译成过程性知识**。更妙的是，好的翻译方式不是一上来就闷头写循环，而是先用“wishful thinking（许愿式思维）”做分解：我假装已经有一个“定点搜索”过程和一个“求平均”过程，sqrt 就成了它们的组合。这种“先假设神仙工具存在，再回头实现它”的设计手法，是整门课反复示范的工程直觉——也是今天所谓“自顶向下设计”和“接口先行”的思想源头。

### 六、定点搜索：把“方法”本身当积木

沿着 sqrt 的案例往下走，Sussman 演示了点睛之笔：定点搜索（fixed-point search）本身是一个完全通用的过程——给它任何函数 f，它都去找满足 f(x) ≈ x 的点。于是求平方根这个问题被重组为：“寻找 y ↦ x/y 这个函数的定点，再加上一点平均阻尼让迭代收敛。”

注意这里发生的事：**求平方根的知识被拆成了两层**——通用方法（定点搜索，与平方根毫无关系）和领域知识（“x 的平方根是 x 除以它的猜测的定点”）。通用方法可以被缓存、复用、单独推理。这就是“把过程当数据”的威力，也是几乎所有现代编程范式的共同祖先：回调、闭包、函数式接口、甚至今天 AI Agent 里的“把工具函数传给规划器”，本质上都是这一招的变奏。

（补充一个视频之外的背景：这种“方法即积木”的思想后来滋养了整个函数式编程复兴。Paul Graham 在《Beating the Averages》里把 Lisp 称为创业时的秘密武器，Eric Raymond 在《How to Become a Hacker》里说学 Lisp 的价值在于“顿悟的那一刻会让你此后成为更好的程序员，哪怕你从此不再用它”——两段话都在说同一件事：这门语言训练的是抽象肌肉，不是语法记忆。）

### 七、为什么用 Lisp：小语言，大思维

最后回到学生的必然疑问：为什么 1986 年的 MIT 要用一门“冷门”语言教这门课？Sussman 的回答坦率：Lisp 由 John McCarthy 在上世纪 50 年代末设计（1958 年前后提出、1960 年发表核心论文），是仅次于 Fortran 的现存第二古老的主流语言——选它不是因为流行，而是因为**它把“元素—组合—抽象”这套机制压缩到了极致**，语法规则少到一页纸写得下，学生可以把全部脑力花在思想而不是标点上。用他的原话说，Lisp 是表达这些计算思想最自然的媒介。

（延伸分析，非视频内容：约 2008 年前后，MIT 把 6.001 课改版为基于 Python 的 6.01，SICP 退出必修。Sussman 后来接受采访时解释过原因：今天的工程师更多是在装配现成的库和组件，调试与集成成了核心技能。这段公案至今在技术社区争论不休——但有趣的是，被移出课表的 SICP 反而在工业界越活越旺，2022 年还出了 JavaScript 版（与 Martin Henz 等合作）。一门课“离开课表、进入文明”，大概是对它最高的评价。）

## 知识结构图

```mermaid
flowchart TD
    A["CS不是研究计算机的学问"] --> B["程序是咒语：操纵知识"]
    A --> C["课程地图：三大主题"]
    C --> D["黑箱抽象"]
    C --> E["通用接口"]
    C --> F["元语言抽象"]
    D --> H["高阶过程：捕获公共模式"]
    D --> I["sqrt案例：两种知识"]
    I --> K["过程性：猜-验-改"]
    K --> L["定点搜索"]
    L --> M["平均阻尼"]
    M --> H
    F --> N["eval-apply：自己造语言"]
```

## 实战启示

看完这节课，你能带走什么？给你四条可以直接落地的行动指南。

**第一，用“三个问题”体检你的代码。**打开你最近的一个模块，问：它的基本元素清晰吗？组合是自由的还是处处受限？有没有给反复出现的模式起名字？大多数烂代码不是语法烂，而是缺了第三问——十处重复的样板调用没有上升成一个被命名的抽象。下次写代码前先问“这堆逻辑的公共模式是什么”，比多学一个框架有用得多。

**第二，文档和 API 阅读用“两种知识”切换。**读技术文档时先分清哪些是陈述性承诺（“这个函数返回什么、保证什么性质”），哪些是过程性描述（“它内部怎么迭代”）。面试、写设计文档、给团队讲方案时同理：先给“是什么”的精确陈述，再给“怎么做”的可行路径，缺前者叫糊涂，缺后者叫空谈。

**第三，练习一次“许愿式设计”。**下个小需求，先只写主流程，把所有还不存在的依赖当成神仙工具直接调用，让主流程读起来像最终形态，然后再回头一个个实现那些“许愿”来的函数。这个顺序强迫你先设计接口再关心实现，是 Sussman 反复示范的手法，也和今天 TDD 的“先写调用方”异曲同工。

**第四，警惕抽象的教条化。**别忘了第七节的公案：连 MIT 都在“抽象思维训练”和“工程实用”之间做过抉择。黑箱是好东西，但过度封装、为抽象而抽象同样是复杂性。SICP 教的是“何时以及如何造盒子”，不是“永远造盒子”——这层分寸，恰恰要靠你自己读完书练出来。

## 延伸学习路径

1. **SICP 原书免费全文**（sarabander 制作的 HTML/PDF 版）：https://sarabander.github.io/sicp/ —— 社区公认排版最好的免费版，配合视频逐章食用。
2. **SICP JavaScript 版官网**（2022 年官方新版，NUS 团队维护）：https://sicp.comp.nus.edu.sg/ —— 不想装 Scheme 环境的读者，用 JS 直接开跑。
3. **MIT OCW 课程主页**（6.001 Spring 2005，含全部视频与讲义索引）：https://ocw.mit.edu/courses/6-001-structure-and-interpretation-of-computer-programs-spring-2005/
4. **Berkeley CS61A**（课程官网 https://cs61a.org ）—— 从 SICP 血统传承下来的现代版课程，用 Python 讲同样的抽象思想，习题资源丰富。
5. **Paul Graham《Beating the Averages》**（https://paulgraham.com/avg.html ）—— 理解“语言影响思维能力”这一命题最著名的商业证词。

## 一句话总结

SICP 第一课教的不是一门语言，而是一门手艺——**把复杂性装进盒子、把方法当积木传递**，这门手艺四十年不过时，在 AI 代写代码的今天反而更值钱了。

## 参考来源

1. [Lecture 1A: Overview and Introduction to Lisp — MIT OpenCourseWare](https://www.youtube.com/watch?v=-L6gtp7c6Fk) — 本文分析的核心视频
2. [MIT OCW 6.001 课程主页](https://ocw.mit.edu/courses/6-001-structure-and-interpretation-of-computer-programs-spring-2005/) — 官方课程页面与讲义
3. [SICP 免费全文（sarabander 版）](https://sarabander.github.io/sicp/) — 原书第 1 章对应本讲内容
4. [Paul Graham: Beating the Averages](https://paulgraham.com/avg.html) — 关于 Lisp 思维价值的商业视角
5. [SICP JavaScript 版官网](https://sicp.comp.nus.edu.sg/) — 2022 年官方改写版

---
> 本文由「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)
