首页 › programming › 代码不是最难的:先写数学才能抓光bug

代码不是最难的:先写数学才能抓光bug

一、导语:为什么这部纪录片值得每个程序员看两遍

我们这一代程序员有个根深蒂固的迷信:bug 住在代码里。所以我们写单元测试、做代码评审、上 fuzzing、买 SonarQube,以为只要覆盖率够高、静态分析够狠,bug 就无处藏身。

Quanta Magazine 这部播放量超过 350 万的纪录片《The Man Who Revolutionized Computer Science With Math》,请出了 2013 年图灵奖得主、分布式系统的"祖师爷" Leslie Lamport,给这个迷信浇了一盆冷水。他的核心论断只有一句:代码是最简单的部分,真正难的、也真正会出人命的,是你在写代码之前有没有想清楚自己到底要做一个什么东西。

而"想清楚"这件事,Lamport 的答案不是画 UML 图、不是写注释、不是画时序图——是数学。他花了二十年打造的工具 TLA+,让亚马逊、微软、太空飞船团队抓出了一大批任何测试都抓不到的致命 bug。这部片子不是科普小品,它是在挑战整个行业的工程文化:也许我们一直在用最贵的方式,debug 一个其实发生在脑子里的问题。

二、视频背景卡片

项目 内容
视频标题 The Man Who Revolutionized Computer Science With Math
频道 Quanta Magazine
时长 约 24 分钟
播放量 约 354 万次
发布日期 2022 年 5 月 17 日
核心主题 Leslie Lamport 与 TLA+:把编程重新定义为数学,在写代码之前先"证明"系统

三、核心内容拆解

1. 编程不是写代码,是做数学

这是整部纪录片的总纲,也是 Lamport 一辈子在反复讲的一句话。他在这部片子里把"编程"(programming)和"写代码"(coding)做了一个很多人从未意识到的区分:写代码只是把已经想清楚的东西翻译成机器能跑的形式,那一步是机械的、简单的;真正的"编程"发生在你想清楚之前。

而"想清楚一个状态会怎样变化、一个并发系统在所有可能的交错执行下会发生什么"——这本质上就是数学。Lamport 甚至有一句在圈内被反复引用的话(纪录片里有呼应):如果你不能用数学精确描述一个系统,那你其实还没真正理解它。(以上为纪录片核心论点)

我的延伸判断是:这句话之所以刺耳,是因为它戳破了"软件工程 = 写代码 + 写测试"的集体幻觉。我们习惯了用"能跑"来定义"对",但"能跑"和"对"之间隔着整片叫做"设计错误"的雷区。

2. 最危险的 bug 不在代码里,在设计里

纪录片用大量篇幅讲了一个反直觉的事实:有一类 bug,无论你写多少测试、做多少次代码评审都抓不到,因为它压根不是"实现错了",而是"想法本身就是错的"——某个竞态条件、某个死锁、某个在极端时序下才暴露的不变量被破坏。

Lamport 的破局工具是 TLA+(Temporal Logic of Actions,时序行为逻辑)。(纪录片核心案例) 最有说服力的证据来自亚马逊。2014 年那篇被奉为经典的论文《Use of Formal Methods at Amazon Web Services》记录了 AWS 团队用 TLA+ 验证 DynamoDB、S3、分布式锁管理器等核心服务的过程:他们用 TLA+ 找出了十几个隐藏极深的 bug,而这些 bug 此前已经通过了所有常规测试和代码评审。也就是说,模型检查器(model checker)在几小时内,揪出了整个团队几年都没发现的逻辑漏洞。

这是全文最值得记的一句话:测试只能证明"我想到的那些路径上没 bug",而 TLA+ 能证明"系统所有可能的路径上都满足某个性质"——前者是采样,后者是穷举。

3. TLA+ 到底是什么:一个"逼你想清楚"的思考工具

很多人第一次听说 TLA+ 会以为它又是一门编程语言。恰恰相反——它是用来描述"系统应该是什么样"的规格语言(specification language),它不告诉你怎么实现,只要求你说清楚两件事。 (视频 + 我的拆解)

第一件:系统有哪些变量、它能做哪些动作(actions),每一步它如何从一个状态变到下一个状态。第二件:系统在所有时间里必须永远满足哪些"不变量"(invariants)和安全属性(safety)与活跃属性(liveness)。

写完之后,你把这份"数学规格"丢给一个叫 TLC 的模型检查器,它会像一个不知疲倦的偏执狂,把系统可能进入的所有状态、所有并交错的执行顺序,一格一格地穷举遍历。只要有一条路径违反了你声明的不变量,它就停下来告诉你:第几步、什么状态、怎么坏的。

这个机制最妙的地方在于:它检查的不是你的代码,而是你的"想法"本身。代码可以骗过测试,但想法骗不过穷举。

4. 状态空间爆炸,以及模型检查的"魔法代价"

穷举所有状态听起来美好,但每个变量多一个取值,状态数就指数级膨胀——这就是臭名昭著的状态空间爆炸(state space explosion)。(我的延伸分析,纪录片点到为止)

TLA+ 的实战智慧在于:你不需要建模整个系统,只需建模那部分"逻辑上容易出错"的核心(比如一致性协议、锁、选举),把它抽象到足够小的状态空间,让模型检查器在合理时间内跑完。这也是为什么 TLA+ 从来不试图替代代码测试,而是替代"人类拍脑袋设计协议"这一步。

换句话说,TLA+ 的哲学是:在写一行代码之前,先把那个最关键、最并发、最容易死锁的算法,用数学"跑"一遍。跑通了再写代码,这时候代码反而几乎不会错——因为逻辑已经被证明过了。

5. Paxos 的寓言:聪明的代价是没人看得懂

纪录片非常生动地讲了分布式系统圈最著名的"段子"。1998 年,Lamport 写出了解决分布式一致性问题的 Paxos 算法,但他把它包装成一个虚构希腊小岛"Part-Time Parliament"(兼职议会)的故事,论文像考古文献一样晦涩。结果呢?整整几年没人看得懂,更没人用。 后来他不得不在 2001 年补了一篇只有几页的《Paxos Made Simple》,把算法老老实实重新讲一遍,大家才恍然大悟。(纪录片重点章节)

这个故事的隐喻比算法本身更深刻:再天才的想法,如果表达不清,价值就归零。 Lamport 自己后来反复强调 clarity(清晰)的重要性——这跟他推崇 TLA+ 是一脉相承的:TLA+ 本质上就是逼你把想法表达清楚的工具,因为你写不清楚,模型检查器就跑不出来,你骗不了数学。

6. 逻辑时钟:连"时间"在分布式系统里都不是你以为的那样

纪录片回顾了 Lamport 1978 年那篇被引用最多的论文之一《Time, Clocks, and the Ordering of Events in a Distributed System》。(纪录片核心回顾) 他提出了一个颠覆性的观点:在分布式系统里,判断"事件 A 是不是发生在事件 B 之前",根本不能靠物理时钟,而要靠一个纯逻辑的 happens-before 关系(因果序)。

这件事为什么重要?因为它是后来所有分布式系统理论的基石——从向量时钟、因果一致性,到 Paxos、Raft、区块链的排序,背后都是这套逻辑时钟思想。一个 1978 年的洞察,定义了今天每一台服务器集群"如何对齐真相"的方式。

7. 一个彩蛋:学术界每天在用的 LaTeX,是他顺手做的

片子还抛出一个小彩蛋:全世界理工科学生写论文离不开的 LaTeX,那个 "La" 就是 Lamport 的缩写——他在 Donald Knuth 的 TeX 基础上做了这套宏包。(纪录片花絮) 一个顺手做的排版工具统治了学术写作三十多年,这从侧面说明 Lamport 的风格:他关心的从来不是"炫技",而是"把事情表达清楚"。LaTeX 如此,TLA+ 如此。

8. 为什么这么好的东西,没什么人用?——我的批评

看完纪录片我最大的反思是:如果 TLA+ 这么神,为什么绝大多数团队连听都没听过?(我的观点,非纪录片内容) 我能看到三个原因。

第一,门槛。TLA+ 要求你具备一定数学成熟度,能用集合、谓词逻辑、不变量来思考,而这恰恰是大多数程序员教育里最薄弱的一环。第二,文化。敏捷、快速迭代、"先跑起来再说"的工程文化,天然抵触"在写代码前先花两天写数学规格"这种慢节奏。第三,反馈周期。它的收益是"避免了一次线上事故",而事故没发生时你感受不到它省下的钱——这是一种看不见的功劳。

但讽刺的是,正是那些"出一次事就上头条"的系统——AWS、Azure Cosmos DB、SpaceX、芯片验证——都在偷偷用它。普通业务系统可以靠重启续命,关键基础设施只能靠数学保命。

四、知识结构图

flowchart TD
    A["Lamport 的总纲:<br/>编程 = 数学"] --> B["问题根源:<br/>最危险的 bug 在'设计'里,不在'代码'里"]
    B --> C{"工具: TLA+ (规格语言)"}
    C --> D1["第一步: 写下系统所有动作<br/>与状态转移"]
    C --> D2["第二步: 声明不变量<br/>(safety + liveness)"]
    D1 --> E["模型检查器 TLC<br/>穷举所有状态/执行顺序"]
    D2 --> E
    E --> F{"是否违反不变量?"}
    F -->|"是"| G["✅ 在写代码前<br/>抓出致命设计 bug"]
    F -->|"否"| H["✅ 逻辑已被证明<br/>再写代码几乎不会错"]
    G --> I["典型案例:<br/>AWS DynamoDB / S3 / Azure Cosmos DB"]
    B -.->|思想源头| J["1978 逻辑时钟 happens-before<br/>→ Paxos 一致性<br/>→ TLA+ 形式化验证"]
    J --> K["延伸哲学: clarity > cleverness<br/>(Paxos 寓言 / LaTeX)"]
    style A fill:#fff3cd,stroke:#d39e00,stroke-width:2px
    style C fill:#d1ecf1,stroke:#0c5460
    style G fill:#d4edda,stroke:#28a745
    style H fill:#d4edda,stroke:#28a745

五、实战启示:普通人怎么用上"先写数学"

你不需要立刻学 TLA+ 才能享受这套思想红利。Lamport 给的真正启示,是一个思维方式,可以分级落地:

第一级:不变量思维。 下次写并发或状态机代码之前,先用一句话逼自己写下"系统在任意时刻必须永远满足什么"——比如"账户余额永远 ≥ 0""任一时刻最多一个 leader"。这句话就是你未来 debug 的标尺。写不出这句话,说明你还没想清楚,这时去写代码就是在给未来的自己埋雷。

第二级:状态机草图。 对付复杂逻辑,先画出状态转移图,标出每个状态、每个事件,再问自己"有没有哪个状态之间能死循环、能不能卡住、两个事件并发会撞车吗"。这就是 poor man's TLA+——成本几乎为零,却能挡掉八成设计 bug。

第三级:对真正关键、并发、易死锁的子系统,上 TLA+。 比如自研的一致性协议、分布式锁、消息队列的 exactly-once 语义、选举算法。这正是 AWS、Cosmos DB 的用法:只验证最贵、最容易出事的那 5% 逻辑。其余 95% 普通业务代码,老老实实写测试就够。

对教育者的启示: 分布式系统课程如果只教"怎么用框架",不教"怎么写规格、怎么证明不变量",那培养出来的人永远只能当 Paxos 的使用者,当不了 Paxos 的设计者。

六、延伸学习路径

  1. 纪录片本体:《The Man Who Revolutionized Computer Science With Math》(YouTube),先看一遍感受思想冲击。
  2. Lamport 的 TLA+ 教程:learn.tla.io 上有 Lamport 亲自录的 TLA+ Video Course,免费,从零开始。
  3. 圣经级教材:《Specifying Systems》(Lamport 著,官网免费 PDF),TLA+ 的完整体系。
  4. 最值得读的工程论文:《Use of Formal Methods at Amazon Web Services》(Newcombe 等,2014/2015),看亚马逊怎么在真实业务里用 TLA+ 抓 bug。
  5. 理论源头:Lamport 1978 年《Time, Clocks, and the Ordering of Events in a Distributed System》,分布式系统的开山论文。

七、一句话总结

你最大的 bug 从来不在代码里,而在你没想清楚的设计里——Lamport 用一辈子证明:写代码之前先用数学把想法"跑"一遍,才是性价比最高的 debug。

参考来源

  1. The Man Who Revolutionized Computer Science With Math — 本文分析的核心纪录片(Quanta Magazine)
  2. How Amazon Web Services Uses Formal Methods (Newcombe et al., CACM 2015) — AWS 用 TLA+ 抓 bug 的工程实证
  3. Specifying Systems (Lamport, 官方免费 PDF) — TLA+ 体系教材
  4. Time, Clocks, and the Ordering of Events in a Distributed System (Lamport, 1978) — 逻辑时钟开山论文

本文由「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学通信知识星球海报-扫码加入