在编程圈,有些视频是“课”,有些视频是“经”。Rich Hickey 2011 年在 Strange Loop 大会上的演讲《Simple Made Easy》(简单 vs 容易)属于后者:它是过去十五年引用率最高的编程演讲之一,被无数工程师称为“改变了我写代码方式的一小时”。它没有演示代码,没有炫技动画,只靠一堂词源课和一张对照表,把软件复杂度这个玄学问题拆成了可操作的工程判断。在今天这个 AI 一句话就能生成上千行代码的时代,它讨论的问题——我们为什么总在制造缠成一团的系统——反而变得比任何时候都尖锐。本文带你完整拆解这场演讲的论证结构、背后的理论谱系、它说对了什么、又在哪里被后来者挑战。
| 项目 | 内容 |
|---|---|
| 视频标题 | Simple Made Easy(中译常作《简单 vs 容易》《简单 made 容易》) |
| 演讲者 | Rich Hickey(Clojure 语言作者) |
| 所属频道 | YouTube 频道 ClojureTV(另有 InfoQ 官方发布的版本) |
| 发布时间 | 2011 年(演讲于 Strange Loop 2011 大会;具体上传日期据频道页面) |
| 热度数据 | 单版本播放量达百万级,各平台镜像版本合计数百万级(据频道页面;本轮抓取受限,未提供实时精确数字) |
| 时长 | 约 62 分钟 |
| 场合 | Strange Loop 技术大会,美国圣路易斯 |
关于数据来源的说明:本轮编辑环境网络抓取受限,以上播放量等动态数据未做实时核验,一律标注“据频道页面”,读者可在 YouTube 搜索标题自行确认。演讲本身的真实性、演讲者身份、举办场合均有多个独立来源交叉印证,属于软件工程领域的公共知识。
值得一提的是,Strange Loop 这个由 Alex Miller 创办的大会在 2019 年宣布停办后,于 2025 年宣布回归举办(据大会官网存档),这波“文艺复兴”让大量老演讲重新进入推荐流,《Simple Made Easy》正是被反复重提的一支。
大多数技术演讲的开场是提纲或段子,Hickey 的开场是词典。他说,要理解为什么我们的软件总是复杂到没人敢动,得先搞清楚两个词的来路:
这三组词源不是修辞装饰,而是整场演讲的分析框架:easy 描述的是“你拿到它的难易”,simple 描述的是“它自身的结构属性”。这两个维度完全正交,却在我们日常语境里被搅成一团——我们说“这个库很好用(easy)”时,常常默认“用它做出来的系统会很简单(simple)”,而 Hickey 的核心论点恰恰是:easy 的原材料,最容易生产出 complex 的系统。
接下来 Hickey 给出区分的意义。easy 是一个相对于观察者的概念:对你 easy 的东西(比如你用了十年的框架),对一个新人可能难如天书;今天 easy 的东西(去年最火的库),明年可能没人维护。它随人、随工具、随时间变化。
simple 则是一个独立于观察者的属性:一段代码是否只做一件事、是否把状态和逻辑缠在一起、是否依赖了一个全局变量——这些判断不因你是新手还是老手而改变。
这个区分的工程含义非常锋利:团队协作和系统演进依赖的是 simple,而不是 easy。因为你的同事和半年后的你自己,都是“另一个观察者”。你随手图快引入的东西(easy),如果结构上缠绕(complex),账单迟早由所有人来付。
Hickey 由此批评了整个行业的默认倾向:我们的工具、教程、招聘标准都在奖励 easy——“上手快”“社区大”“包好装”,却很少有人问一句:这个选择了结构带来了什么?
演讲中最有记忆点的造词是 complect(把不该缠的东西缠在一起,interweave)。Hickey 说,软件复杂度的来源几乎都可以归结为某两种本该分离的东西被“complect”了。他点名了几大惯犯:
注意 Hickey 的论证方式:他不是在说这些构造“难用”(事实上可变对象、继承、直接调用都极其 easy——声明一个变量、继承一个类,一行就搞定)。他在说的是它们结构性缠绕。easy 的入门票,complex 的账单。
拆完病灶,Hickey 给出他自己的药方,也就是一张“把缠住的东西解开”的替换表:
他强调,这些替换在当下往往看起来“绕远了”:定义一个不可变结构再返回新副本,比直接改字段啰嗦;抽一个协议比直接继承麻烦。但这正是整场演讲的题眼——simple 往往一开始不 easy,而 easy 往往一开始不 simple。工程决策要做的是把两者放在天平两端分别称量,而不是被“顺手”绑架。
演讲的收束句是流传最广的一句(意译):“程序员知道一切东西的好处,却对任何东西的代价一无所知。”Hickey 说,他见过无数关于“这个特性多么强大”的布道,却几乎没人愿意做代价陈述。他号召的并不是“永远选 simple”,而是一种职业纪律:在做每个选择时,先明确承认你付出了什么代价、缠住了什么,然后拿着账单做决定。
他也引用了 Dijkstra 的老话作为压舱石:“简单是可靠性的前提(Simplicity is a prerequisite for reliability)。”一个缠成一团的系统,测试无法穷尽它的状态空间,自然也就谈不上可靠。
这场演讲并非凭空发难,它站在一条清晰的思想谱系上,此后又深刻影响了行业实践。
1. Fred Brooks《No Silver Bullet》(1986)。软件工程经典论文,把复杂度分为“本质复杂度”(问题本身固有的)与“偶然复杂度”(工具和方法附加的)。Hickey 的整个论证可以看作对 Brooks 的执行层回应:本质复杂度你躲不掉,但可变状态、继承这些东西制造的全是偶然复杂度——它们不是问题给你的,是你选的原材料给你的。
2. Ben Moseley & Peter Marks《Out of the Tar Pit》(2006)。这篇论文系统分析了软件复杂度的来源,结论尖锐:状态(state)是偶然复杂度的头号来源,其次是控制流。它主张用函数式与关系式方法把系统压到最小复杂度。Hickey 演讲中对可变状态的批判几乎是这篇论文的口语化重演——他自己也在多处推荐过此文。
3. Edsger Dijkstra 的手稿(EWD 系列,1970 年代)。“简单是可靠性的前提”出自 Dijkstra 多年坚持的核心主张:程序的正确性论证能力取决于其结构复杂度,超出人脑推演上限的系统无法被保证正确。
4. John Ousterhout《A Philosophy of Software Design》(2018)。斯坦福教授的这本书是后来与 Hickey 阵营隔空对话的另一极。Ousterhout 把复杂度定义为“让软件难以理解和修改的一切”,提出“深模块”(接口小、功能多)的设计哲学,并直言“simple 不 easy——追求简单的最省力路径恰恰是持续的小重构,而不是一次哲学顿悟”。他 2023 年前后与 Hickey 观点的对比成为社区经典辩题(据社区讨论与相关演讲)。
5. 工程实践的十五年验证。演讲之后,它的主张以各种方式落地:Hickey 自己的不可变数据库 Datomic(2012,Cognitect 公司);React(2013,Jordan Walke)把“UI 是状态的纯函数”变成全球前端的默认范式,Redux(2015,Dan Abramov)把“state is read-only”写进三条原则;Rust(1.0 于 2015)用所有权系统在语言层面消灭数据竞争——本质上也是把“值与时间的缠绕”交给编译器看管。可以说,2010 年代之后主流工程界的大方向,和这场演讲的判断高度一致。
证据充分的部分:词源与概念区分属于语言事实,无争议;“可变状态是复杂度之源”在《Out of the Tar Pit》的分析、并发编程的集体经验和 React/Redux 的工程胜利中得到了三重支撑;“继承深层耦合”的批评也早已是行业共识(组合优于继承甚至写进了《设计模式》1994 年的开篇原则)。
被夸大或有争议的部分,至少有三处:
其一,对 OOP 的打击面偏宽。Hickey 演讲中对面向对象(尤其继承)的嘲讽让不少观众把它听成“OOP 已死”。但可变状态在图形界面、游戏引擎等场景仍是建模成本最低的方式。游戏圈流行的 immediate mode GUI(Casey Muratori 2005 年的同名论文即是源头之一)就是“拥抱可变、每帧重绘”的反例路线,且在特定领域至今运转良好。
其二,simple 的代价被轻描淡写。不可变数据结构的“路径复制”需要持久化数据结构(persistent data structures)支撑,才能把更新开销压到近似 O(log n);而 Clojure 的启动慢、与既有生态互操作的摩擦,多年一直是社区公认的短板(据社区长期讨论)。simple 在结构上省下的账,会在性能和迁移上换一种方式收回一些。
其三,语气与传播的失真。这场演讲在传播中被浓缩成了若干金句,原演讲里 Hickey 其实明确说过“两者都要考虑、都要称量”这样的平衡表述,但在二手传播里“反对 easy”被放大成了标签。另外,部分社区评论认为演讲的布道口吻偏居高临下(据社区讨论),这也是它在当年引发两极反应的原因之一。
还有一类误读值得单独指出:Hickey 从未说“难的就是好的”。选一个难用又缠绕的库,既不 easy 也不 simple,是双输;他要的是把两个维度拆开评分,而不是用一个替换另一个。把《Simple Made Easy》读成“虐自己就是修行”,是对演讲最大的冤枉。
启示一:给每个技术决策做“缠绕审计”。在引入一个依赖、一个可变字段、一层继承之前,花三十秒问一句:这个选择把什么和什么缠在了一起?值和时间?决策和执行?这个模块和它的调度方式?如果缠了,有没有不可变值、接口多态或队列可以解开?把 complect 当作一个具体的、可指认的工程错误,而不是“感觉有点乱”。
启示二:代码评审时问“simple 吗”,而不是“你熟吗”。easy 是相对观察者的,simple 是客观属性——这给了团队一个反直觉但好用的评审标准:不要因为“某人用得很溜”就通过一个缠绕的设计(那是 easy),要问“一个新人能否局部推演这段代码的行为”(那才是 simple)。前者奖励个人熟练度,后者保护团队。
启示三:在 AI 生成代码时代把这张对照表当 Review 清单。2026 年的现实是:AI 能瞬间给你 easy 的代码——能跑、模式常见、就地抄最近的答案,但它对系统的结构性缠绕毫无责任感,大量“会话式代码”正在积累 complex 的债。这时人类工程师的不可替代价值恰恰是 Hickey 式的判断力:逐层审查 AI 产出的状态边界、耦合点和调度假设。十五年前的一场演讲,意外成了 AI 时代最实用的代码评审框架。
flowchart TD
A["Simple Made Easy<br/>2011年Strange Loop演讲"] --> B["开场:词源拆解"]
B --> B1["easy = 邻近<br/>拿到手的难易"]
B --> B2["simple = 一折<br/>结构不缠绕"]
B --> B3["complex = 交织<br/>缠成一团"]
A --> C["行业病灶<br/>奖励easy无视simple"]
C --> D["complect四大惯犯"]
D --> D1["可变状态<br/>值与时间缠绕"]
D --> D2["继承<br/>父子类缠绕"]
D --> D3["巨型分支<br/>决策与执行缠绕"]
D --> D4["直接调用<br/>业务与调度缠绕"]
A --> E["simple工具箱"]
E --> E1["不可变数据"]
E --> E2["按需多态"]
E --> E3["队列解耦"]
E --> E4["声明式表达"]
D1 --> E1
D2 --> E2
D4 --> E3
E --> F["账单思维<br/>好处人人会说<br/>代价没人想听"]
本文由「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 等场景全覆盖。
