你一定见过(或者亲手养大过)这样一种项目:没有人敢动核心代码,改一行崩三处;新人上手三个月才能摸清一个函数的调用链;连原作者自己都说“这块我也看不懂了,别碰”。大家习惯把这归咎于“祖传代码”“历史包袱”“上一个程序员跑了”——但斯坦福教授 John Ousterhout 会告诉你:烂代码从来不是一次事故,而是一万次“算了,先这样”的总和。
今天要深读的,是 Ousterhout 围绕他的书《A Philosophy of Software Design》(软件设计哲学)做的那场演讲。这场演讲在 YouTube 上有多个官方上传版本(Talks at Google、斯坦福讲座等),常年被开发者社区列为“软件设计入门必看”。它解决的问题非常根本:软件复杂度到底是怎么长出来的,以及它能不能被系统性地产出控制。 无论你写的是 5G 核心网的控制面代码、还是一个小脚本,这套方法论都能直接上桌用。
说明:本篇写作时视频页无法直接抓取核验,播放量、时长为公开资料常见量级,未经精确核实;文首链接为 YouTube 检索入口,可直达多个版本。演讲主线与原书前几章高度重合,文中关键论点均可在原书对应章节找到出处。
| 项目 | 内容 |
|---|---|
| 视频标题 | A Philosophy of Software Design(多个版本,含 Talks at Google 等) |
| 频道 | Talks at Google / 斯坦福讲座等 |
| 时长 | 约1小时(各版本略有差异,未经精确核实) |
| 播放量 | 各版本累计数十万+(未经官方核实) |
| 核心主题 | 软件复杂度的成因、症状与系统性解法 |
| 作者背景 | 斯坦福计算机系教授,Tcl/Tk 之父,曾主导 Berkeley Sprite OS 与日志结构文件系统(LFS)研究 |
顺带说一句这位教授的分量:Ousterhout 不只是“写书的人”。他上世纪八九十年代在伯克利做操作系统研究,后来一手创造 Tcl/Tk 脚本语言;他的博士生 Diego Ongaro 发明的 Raft 共识算法,至今仍是绝大多数分布式系统“选主”的事实标准。换句话说,讲复杂度的人,自己造过语言、写过内核、带出过改变行业的算法——这是这门课最硬的底气。
视频开篇就给出一个极其克制、也极其锋利的定义(书中原话意译):“复杂度,就是软件中一切让软件难以理解、难以修改的东西。” 注意,这个定义里没有“代码行数”、没有“用了什么框架”、没有“架构图多复杂”——评判标准只有一条:下次改需求的时候,你疼不疼。
这是全场我认为最有价值观的一处(延伸分析):业界谈“复杂度”常常谈成玄学,比谁的模式新、谁的分层多。而 Ousterhout 把它拉回到唯一真实的度量衡上——改动的成本。一个只有三千行但每改一处都要全局大脑重构的项目,比十万行但模块边界清晰的项目“复杂”得多。以改动成本为锚,后面所有方法论才有了统一坐标。
复杂度不会自我报告,但会留下三种典型症状(视频原话,对应原书第2章):
三种症状里,前两种至少是“知道疼”,第三种是“不知道哪里会疼”(延伸分析)。这也是为什么老系统的故障经常出现在“看起来八竿子打不着”的模块——不是玄学,是未知未知在收利息。
症状确认了,病因是什么?演讲给出两个词:依赖(Dependencies) 和 晦涩(Obscurity)。
依赖本身不是恶——软件本来就是模块的组合,模块之间必然有关系。真正的罪是不必要的依赖和不必要的显式依赖:改 A 的时候不得不连带理解 B,而 B 其实本可以被藏在 A 的肚子里。晦涩则更隐蔽:一个命名含糊的变量、一个没写出来的隐含约定、一个“大家都知道”的潜规则,都是未来的地雷。
(延伸分析)这两个根源其实对应了工程师的两项基本功:做减法的能力(砍掉可砍的依赖)和做表达的能力(把必须存在的东西说清楚)。很多人以为软件设计拼的是智力,其实拼的是这两样更朴素的功夫。
这是整场演讲里我反复回味的一个论点(视频核心观点):复杂度从来不是某个灾难性的设计决定造成的,而是增量累积的。 没有哪一行代码独立搞垮系统——每个 PR 单独看都“只是加了一个小特判”,合起来就是泥球(Big Mud Ball)。
由此推出全场最狠的一句话(原话意译):“拒绝下一个增量,比修复已有的烂摊子更重要。” 因为烂摊子你可以慢慢还,但只要你容忍“下一个小特判”,偿还速度永远追不上产生速度。
(延伸分析)这个视角把“代码质量”从道德问题变成了会计问题:每一次偷懒都是一笔小额负债,单笔无所谓,问题是它自动滚息。所谓技术债,真正的可怕之处从来不是本金,是复利。
演讲里有一个让人脊背发凉的人物画像:战术龙卷风(Tactical Tornado)——那种产出惊人、永远在赶工期、代码“能跑就提交”的明星工程师。龙卷风本人不是坏人,他甚至常常是团队效率最高的人;但他路过之处,系统复杂度显著上升,留下一地需要别人收拾的残骸。
Ousterhout 给出的对照解法是战略式编程(Strategic Programming):承认“能工作”只是最起码的起点,把大约 10%-20% 的时间持续投资在设计和结构改善上(书中的建议比例)。按他的算法,这笔投资在一两个项目周期内就能靠“下次改动的成本下降”赚回来。
(延伸分析)这条对管理者尤其扎心:如果你考核工程师只看“交付了多少功能”,你就是在批量制造战术龙卷风。组织激励不改,Code Review 写再多规矩都是白搭——你奖励什么,就得到什么。
方法论的正面出场:Deep Module(深模块)——最好的模块,接口很小,功能很深。接口是“你必须理解的东西”,功能是“它替你藏起来的东西”。好设计的本质就是:用最小的理解成本,换最大的功能收益。
演讲里的经典案例是 Unix 文件系统(视频原话举例):open() / read() / write() / close(),寥寥几个系统调用,背后藏着磁盘块管理、缓存、并发、崩溃恢复的海洋级复杂度。几代程序员不需要懂硬盘也能写出正确的文件程序——这就是“深”的力量。
反面教材是“浅模块”:接口一大堆,功能一点点。比如 Java 传统 I/O 里要自己组装 FileInputStream 套 BufferedInputStream 那类设计,每多一层就多一份你必须理解的耦合(书中案例,细节以此为准)。
(延伸分析)判断模块深浅有个偷懒但好用的口诀:看它的函数签名,数一数“调用者必须知道多少东西才能正确使用它”。 必须知道的越少,模块越深。写代码时默念这一句,能挡掉一半的烂接口。
演讲的后半段给了几件趁手的兵器:
(延伸分析)这三件事的共同点是:全都不需要“更聪明”,只需要“多花一点耐心”。这呼应了整场演讲的世界观——软件设计不是天才的艺术,而是纪律的复利。
客观说,这套哲学在社区里并非没有争议(延伸分析)。常见的讨论有两条线:一是它与“重构流派”(先堆代码再靠重构收紧)的关系——Ousterhout 的立场更偏向“设计时就想清楚,别指望事后重构救场”;二是它与 Rich Hickey 那场著名的《Simple Made Easy》演讲的呼应与差异——两人都反复杂,但 Hickey 更强调“simple 与 easy 的语义区分”,Ousterhout 更强调“模块深浅的工程度量”。两条线不冲突,搭配着看,对“复杂度”的理解会立体很多。
另外要提醒:书中部分案例带有强烈的系统软件视角(文件系统、网络协议那类),做业务系统的读者不必逐条硬套——把“深模块、拒增量”当世界观,把具体手法当工具箱,按需取用即可。
flowchart TD
A["软件复杂度:改动为什么这么难"] --> B["三大症状"]
B --> B1["改动放大"]
B --> B2["认知负荷"]
B --> B3["未知未知"]
A --> C["两大根源"]
C --> C1["依赖过多"]
C --> C2["晦涩难懂"]
A --> D["恶化机制"]
D --> D1["增量累积"]
D --> D2["战术龙卷风"]
A --> E["解法:战略式投资"]
E --> E1["深模块"]
E --> E2["信息隐藏"]
E --> E3["设计两次"]
E --> E4["注释即设计"]
E1 --> F["降低下一次改动的成本"]
E2 --> F
E3 --> F
E4 --> F
看完这场演讲,下面五件事是普通人明天就能上手的:
一句话概括这套打法的底层逻辑:复杂度是货币贬值的通胀,设计是唯一的紧缩政策——每一天你都在选择,是让它涨,还是把它摁住。
复杂度不是命运,是选择的总和——这场演讲教你的不是怎么写好代码,而是每一次都选那个“让明天更容易”的选项。
本文由「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 等场景全覆盖。
