首页 › programming › 程序员圣经第一课:抽象才是地基

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

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

如果你问一个写了二十年代码的老程序员“哪门网课最值得花一小时”,很大概率会得到同一个答案: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 等合作)。一门课“离开课表、进入文明”,大概是对它最高的评价。)

知识结构图

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 — 本文分析的核心视频
  2. MIT OCW 6.001 课程主页 — 官方课程页面与讲义
  3. SICP 免费全文(sarabander 版) — 原书第 1 章对应本讲内容
  4. Paul Graham: Beating the Averages — 关于 Lisp 思维价值的商业视角
  5. SICP JavaScript 版官网 — 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学通信知识星球海报-扫码加入