首页 › programming › SICP第一课:计算机科学的真身

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、组合、抽象

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

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 辅助编程时代,代码的可读性与可验证性如何排序”的同构问题。

知识结构图

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) — 本文分析的核心视频(MIT OpenCourseWare 官方频道)
  2. Structure and Interpretation of Computer Programs 在线全书(sarabander HTML 版) — SICP 原书,视频内容的文本底本
  3. MIT OpenCourseWare: 6.001 Structure and Interpretation of Computer Programs — 课程官方页与后续讲次
  4. Berkeley CS61A 课程主页 — 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学通信知识星球海报-扫码加入