首页 › programming › 十四年前的神课:简单不等于容易

简单神课深读:为什么“容易”的代码,最后都变成了“难改”的代码

概述

在程序员圈子里,有一场演讲被反复推荐了十四年:Rich Hickey(Clojure语言之父)2011年在Strange Loop大会上的《Simple Made Easy》。它不教任何框架,不演示任何代码,却几乎出现在每一份“程序员必看演讲”清单的前三名。它回答的是一个所有工程师迟早都会撞上的问题:为什么当初明明“很好写”的代码,半年后就变成了没人敢动的泥球?这条视频的价值在于给出了一组锋利的概念工具——“简单”与“容易”根本是两种属性,混淆它们,正是软件腐烂的第一因。2023年Strange Loop大会宣布永久谢幕,这批演讲档案从此成为“绝版遗产”,也让这条老视频每隔一段时间就会在技术社区被重新翻出来讨论一轮。本文逐段拆解它的论证结构,补上它背后的学术脉络,也指出它几处带着时代与立场的偏见。

一、视频基本信息

项目 内容
视频标题 Simple Made Easy
中文译名 简单,而非容易
演讲者 Rich Hickey(Clojure语言设计者,函数式编程领域最具影响力的布道者之一)
场合 Strange Loop 2011大会(美国圣路易斯),2011年9月
时长 约50分钟
流传渠道 InfoQ、ClojureTV等多个官方与半官方上传版本
播放量 各上传版本累计在百万量级,是该主题引用率最高的演讲(据各频道页面历史数据,实时数据请以视频页为准)
数据说明 本篇基于公开流传版本与社区长期引用信息整理;因撰写环境未能实时抓取,播放量与流传数据均为量级描述,精确数字以视频页实时显示为准

二、核心主张拆解:一场没有代码的“词源手术”

这条演讲最反直觉的地方在于:一位语言设计者,讲了一小时“语言”——但不是编程语言,而是英语。整场论证像一台解剖手术,按叙事顺序可以拆成五刀。

要点一:开场之问——我们优化的是“写下来的速度”

Hickey从程序员的日常自省切入:我们选工具、选库、选语言时,嘴里说的是性能和可维护性,手却诚实地投给了“上手快不快”“有没有现成范例”“IDE能不能一键生成”。他点破这层伪装:easy的本义是“近在手边”——熟悉的、顺手能拿来就用的东西,才是easy的。但“获取的难易”与“结果的好坏”在逻辑上毫无关系。留给全场的一句话是:遗留系统里那些没人敢碰的代码,写下它们的当年,每一行都是“容易”的。

这一段的功能是制造不安:观众先承认自己的决策默认值是“easy”,才会真心接受后面那记反转。

要点二:词源手术——simple是“只缠了一层”,complex是“缠成一团”

全场最精彩的部分,是把两个词拆到拉丁词根。Hickey指出:simple来自sim-(一)加上-plex(折叠、编织),本义是“只折叠了一层、只缠了一股”;complex则相反,是“许多股缠在一起、互相盘绕”。由此他给出全场最核心的区分:

转折点在这里降临:代码的真正读者不是此刻的你,而是六个月后接手改动的同事——包括六个月后的你自己。所以一个工程决策该问的不是“这对我现在容易吗”,而是“这让系统变得更简单了吗”。easy服务的是当下的你,simple服务的是未来的改动者。两者常常打架,而行业默认牺牲的总是后者。

要点三:复杂化的三宗罪——他发明了一个动词叫complect

词源铺完后,Hickey自造了一个动词:complect,意为“把本可独立的东西交织在一起”。他点名了程序员日常最常犯的几类“编织”:

  1. 可变状态(state):一个变量随时可能被任何人改写,意味着它的值与“时间线”缠在了一起——你必须脑补它历史上的每一次变化才能推断现在的值。这是最容易上瘾的编织,因为赋值语句写起来太easy了。
  2. 继承与耦合(interdependence):经典面向对象的继承树,把子类与父类的实现细节缠死;模块之间随手import,把本可各自演化的部分焊成一块。改一处、崩八处的根源不是代码量,是编织密度。
  3. 条件分支的爆炸(conditionals):if-else每多一层,程序的可能路径就相乘一次。他提醒:许多分支的存在,只是因为我们把“不同类型的东西”塞进了同一个函数里,逼代码自己分辨。

这一段的锋利之处在于把抽象的“复杂度”翻译成了可自查的具体动作:写每一行代码时问一句——这两个东西,能不能不认识?

要点四:简单的工具箱——不可变数据与“按需取用”的多态

诊断之后开药方。Hickey给出几味解药,每一味后来都在十年间被主流世界大规模验证:

全场被引用最多的一句也出现在这一带:"Programmers know the benefits of everything and the tradeoffs of nothing."——程序员对一切东西的好处如数家珍,对代价一无所知。

要点五:收尾的伦理转向——简单是对队友的义务

演讲的结尾没有停留在技巧,而是完成了一次伦理升级:追求简单不是审美偏好,而是职业伦理。每一个“先这样容易”的决定,都是在给未来某个深夜排障的同事埋雷。Hickey承认:找到简单方案是慢的、费劲的,easy永远在诱惑你抄近路——但这份“找”的成本是一次性投资,而easy欠下的债按月复利。他的结论可以浓缩成一句:接受“找简单解很难”这件事本身,就是工程成熟的开端。

三、知识与理论溯源:这场演讲背后的半部软件史

这场演讲没有列参考文献,但它的每个论点都踩在几十年的学术脉络上。补全这条线,你得到的不只是一场演讲,而是半门软件设计思想史。

Tony Hoare:两种构造软件的方式。1980年图灵奖得主Tony Hoare在获奖演讲《皇帝的旧衣》(The Emperor's Old Clothes)里写下了那句被引用四十年的话:构造软件设计有两种方式——一种让它简单到显而易见没有缺陷,另一种让它复杂到没有显而易见的缺陷。他还断言:可靠性的代价,就是彻底的简单。Hickey整场演讲几乎可以看作这句话的一小时展开版。

Fred Brooks:复杂性是软件的本质属性。1986年,Brooks在《没有银弹》(No Silver Bullet)中把软件的困难分为“本质复杂性”与“偶然复杂性”:前者来自问题本身,无法消除;后者来自工具与实现,随技术进步被压缩。Hickey的立场是对Brooks的直接回应——本质复杂性你躲不掉,但别再用状态和继承给系统“加戏”了,那是在人为扩充偶然复杂性。

John Backus:四十五年前的同一声呐喊。1977年,Backus的图灵奖演讲题目就是《编程能从冯·诺依曼风格中解放出来吗?》。他批评“词地址”把存储状态缠进了程序思维的每个角落,主张转向以值为本位的函数式风格。Hickey对可变状态的批判,几乎是Backus四十年前论点的通俗重演——两场演讲隔了三十四年,说的是同一头怪兽。

David Parnas:信息隐藏。1972年Parnas的经典论文《模块化分解的标准》确立了现代模块化的基石:模块该围绕“设计决策”隐藏信息,而不是围绕流程切步骤。Hickey说的“能不能不认识”,就是Parnas信息隐藏原则的白话版。

Chris Okasaki:不可变数据不是浪漫主义。1998年Okasaki的《纯函数式数据结构》用严格的算法分析证明:不可变结构可以通过结构共享做到接近可变结构的性能。这正是Clojure持久化数据结构(persistent vector等)的理论地基,也是“不可变=慢”这个流行偏见被学术上证伪的起点。

社区十年的“验收”。这场2011年的演讲此后被主流世界大规模追认:React把“状态不可变”写进了前端框架的心智模型;Rust用所有权系统把“让错误无法发生”从口号变成了编译器;Kafka用只追加的日志重造了消息中间件;连最保守的语言也在加入值语义。演讲当年听着像Clojure的广告,十年后回看,更像一份提前兑现的预言书。

四、批判性审查:哪些讲透了,哪些是布道者的偏手

证据充分的部分:“交织产生复杂度”是软件工程界最少争议的共识之一,从Parnas到Brooks到大量关于圈复杂度与缺陷率相关性的实证研究都在支撑;“可变状态是复杂性之源”更有函数式社区四十年的论证与工业界的工程教训背书。这部分内容今天重看,不但站得住,而且被时间加强了。

争议一:“简单是客观属性”是个强主张。Hickey用它来对立“容易的主观性”,但细想之下,简单性同样是相对于读者的:一段高阶函数式的管道代码,对函数式老手简单透亮,对命令式新手就是天书。他真正该说的是“简单是相对于熟悉该范式的改动者的属性”——这一收缩会让论证更稳,但也会削弱它的感染力。神课的代价,是有时把论点讲得比真理更锋利。

争议二:对继承的打击面过宽。继承的滥用确实该批,但把“编织”的主要罪责记在继承头上,略显选择性:过度组合、依赖注入的参数爆炸、层层抽象的“洋葱架构”,同样能把系统缠成绳子。编织的形态会变,编织的冲动才是常量——这一点演讲没有点破。

争议三:后半场难脱“产品路演”之嫌。讲演后半段的解药部分,恰好一一对应Clojure的设计卖点(不可变、协议、map优先)。不能说论证为结论让路,但“简单=函数式”的等式确实是带着立场的销售。听的时候值得多留半个心眼。

时代局限。2011年的演讲躲不开2011年的视野:Hickey对静态类型的冷淡是全场最过时的部分。十年后,Rust、Swift、TypeScript用现代类型系统实现了他说的“让错误无法发生”,而且是在编译期、零运行时开销地实现。他当年把“类型体操”归为easy的一厢情愿,如今看更像是错过了类型系统复兴的起点。

五、认知提升与实用启示:三条可带走的行动指南

第一条:给代码评审加一道“complecting审计”。每次评审,固定问三个问题:这块状态能不能不可变?这两个模块能不能不认识?这个分支能不能用“分开的数据类型”消掉?三问都过不了的地方,就是未来的故障高发区。把它变成 checklist,把“追求简单”从品味变成流程。

第二条:用“六个月后的自己”当读者,而不是“此刻的编译器”。easy永远在讨好此刻的你:现成的例子、顺手的框架、三行搞定的补丁。写下去之前把读者换成半年后回来改需求的自己,再问一次“这个决定会缠住谁”。大多数技术债,在写下那一行时就已经定价,只是账单延迟送达。

第三条:把“找简单解的慢”当作投资而不是浪费。Hickey全场最实用的一句话其实是个授权:允许自己花一周去找到那个“不交织”的方案,哪怕期间代码一行没写。慢找 simple 的一次性成本,几乎总是低于 fast easy 的月供。个人如此,团队排期同理——给设计阶段留白,是管理者能做的最便宜的降本。

六、一张图看懂全片论证结构

flowchart TD
    A[开场自省<br/>我们默认选容易] --> B[词源手术<br/>容易=近在手边]
    A --> C[词源手术<br/>简单=只缠一层]
    B --> D[核心区分<br/>主观的容易<br/>客观的简单]
    C --> D
    D --> E[复杂化三宗罪<br/>状态-耦合-分支]
    E --> F[解药一<br/>不可变数据]
    E --> G[解药二<br/>多态按需取用]
    F --> H[护栏兜底<br/>不如构造免错]
    G --> H
    H --> I[伦理收尾<br/>简单是对队友的义务]

延伸阅读

  1. Rich Hickey:The Value of Values(2012) —— 本场的直接续篇,论证“值”为何应当成为软件的基本货币,可在各演讲平台检索标题观看。
  2. Tony Hoare:The Emperor's Old Clothes(1980年图灵奖演讲) —— “两种构造软件的方式”的原始出处,读完本场演讲再读它,会发现神课的每一句都有出处。

参考来源

  1. InfoQ:Simple Made Easy — 该演讲流传最广的上传版本,可在页面内直接观看
  2. Wikipedia: Strange Loop — 大会历史与2023年谢幕的权威记录
  3. Wikipedia: Rich Hickey — 演讲者与其设计Clojure的背景
  4. Wikipedia: No Silver Bullet — Brooks本质/偶然复杂性划分的原始论述
  5. Clojure官网 — 演讲中解药部分对应语言的官方文档与设计哲学

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