首页 › programming › Simple不是Easy:被混用半世纪的两个词

Simple不是Easy:被混用半世纪的两个词

导语:一次15年前演讲,戳破了今天的泡沫

你有没有过这种经历:接手一个项目,发现前任用了最新框架、最炫语法、最“现代”的架构,可你改一行代码要理解五个文件,跑一次测试要起三个容器?这事儿在2011年就被一个人讲透了——Rich Hickey,Clojure语言的作者,在Strange Loop大会上做了一场叫《Simple Made Easy》的演讲。

这场演讲的核心论点只有一句话:easy(容易)和simple(简单)是两码事。我们平时写代码,追求的往往是“容易”——工具熟、上手快、装完就能跑。但容易是主观的、临时的,它服务的是此刻的你;简单是客观的、长期的,它服务的是半年后要改这段代码的人。两者经常互相矛盾:最容易的路,往往通向最不简单的系统。

为什么现在重看这场老演讲?因为今天的问题只会更严重:框架半年一换、抽象层层包裹、配置比业务代码还多。Hickey在15年前给出的那套词汇——complect(交织)、合成物(synthetic constructs)、简化是选择——至今仍是诊断复杂度的最锋利手术刀。这篇文章带你把这场约45分钟的演讲完整拆开,配上今天的现实案例,看看“容易的路”是怎么一步步把系统走死的。

数据说明:本文基于该演讲的长期公开存档撰写。因本轮未能实时联网核验,播放量等数据以定性描述为准,请以视频页面为准。

视频背景卡片

项目 内容
视频标题 Simple Made Easy
频道 Strange Loop(大会官方存档频道,InfoQ亦有发布)
演讲者 Rich Hickey(Clojure语言作者)
场合与时间 Strange Loop大会,2011年9月
时长 约45分钟
播放量 多渠道累计播放为百万级(经典存档演讲,未能实时核验精确数字)
核心主题 区分easy与simple,用“交织”概念重新定义软件复杂度

核心内容拆解

要点一:Easy的真相——它说的其实是你自己

Hickey开篇先解剖"easy"这个词。它来自拉丁语词语根,本义是“近在手边”(near at hand)。什么东西近在手边?你已经会的、装一下就能用的、文档铺天盖地的。所以easy有三个特征:可即刻获得(离你的手和头脑近)、熟悉(你以前的经历里见过)、轻松(不用费力就能操作)。

关键的一刀在这里:easy是主观的。Java对Java程序员是easy的,对一个刚入行的学生就不是;同一个库,对读过源码的人和没读过的人,完全是两个东西。也就是说,当我们说“这个方案容易”,我们其实不是在描述方案本身,而是在描述我们自己此刻的状态。

【延伸分析】这解释了一个行业怪象:技术选型会上吵翻天的“好不好用”,往往不是在评价技术,而是在盘点每个人自己的技能栈。老手说“手写SQL容易”,新人说“ORM容易”——两人在争论两个不同的问题。认识到easy是“以自我为坐标系的度量”,你就能看穿一半的技术争论。

要点二:Simple的真相——简单不是少,是不纠缠

那simple呢?Hickey把它定义为客观属性:simple的意思是“只有一个层次、不交织”(one fold, one braid)。一个simple的东西,它的各个部分没有被拧在一起,你可以单独理解、单独使用、单独替换。反义词是complex——词根意为“编织在一起”。

注意,这个定义里没有任何“数量”的概念。simple不是“代码行数少”,不是“依赖少”,不是“功能少”。一段200行的代码,如果每行只做一件事、彼此独立,它是simple的;一段20行的代码,如果一行里揉了过滤、排序、缓存和日志,它是complex的。

【延伸分析】这一点今天尤其值钱。很多团队把“简化”理解成删功能、砍配置,结果越删越乱——因为真正的问题是纠缠而不是数量。Unix管道是simple的典范:每个命令只做一件事、文本格式统一,你可以自由组合一百个工具;而某些“一站式”平台号称开箱即用,把认证、存储、队列、监控焊死在一起,看起来easy,实则complex到了骨头里。

要点三:Complect——演讲里最值钱的一个新词

整场演讲的核心武器是Hickey自己“组装”的一个古英语词:complect,意为“编织、拧在一起”。他说,软件几乎所有复杂度,都来自不必要的complecting。他点了三个重灾区:

第一,把“做什么”和“怎么做”编织在一起——代码里既有业务策略又有实现细节,改任何一方都牵动另一方。第二,把任务和执行顺序编织在一起——明明结果与顺序无关,代码却强行串行,于是并行化遥遥无期。第三,把状态和身份编织在一起——这是他花后半场重点拆解的,下面单独说。

【延伸分析】用complect的眼光看今天,新案例俯拾皆是:React的useEffect把“渲染后的副作用”和“依赖项列表”交织在一起,依赖数组漏一项就是bug——这是easy(写起来快)换complex(推理困难)的典型;Kubernetes的YAML把“期望状态”和“部署顺序、探针、资源配额”编织在一个文件里,改个副本数都可能踩到别的字段。这些不是要全盘否定这些工具,而是提醒:每接受一次交织,都要确信你换来的好处值这个代价。

要点四:程序员知道一切的好处,不知道任何东西的代价

演讲中引用最广的一句原话大意是:"Programmers know the benefits of every feature, and the costs of none."(程序员知道每个特性的好处,却对它们的代价一无所知。)

Hickey说,每次我们引入一个抽象、一个工具、一个语言特性,我们立刻能感受到benefit——省了代码、爽了手感;而它的cost——多了一层间接、多了一种耦合、多了一类bug——是由未来的读者和维护者承担的,而且往往延迟几个月才显现。作者拿走好处,别人偿还代价,这笔账天然算不清。

所以他给出一个纪律:把每个抽象当作一张代价收益表来填。收益(作者享受)很容易看见,成本(读者支付)需要刻意去想:这个抽象交织了什么?拆开它的难度有多大?我能不能随时绕过它?

【延伸分析】把这句话放到2026年,几乎是对AI辅助编程的预言。AI让“生成代码”easy到了极点,于是项目里涌入了没人读过的抽象、没人验证过的依赖。生成的瞬间人人都是作者,维护的漫长岁月里人人都是买单者。工具越easy,"cost consciousness"反而越稀缺——这是本轮解读我认为最值得每个读者刻在脑子里的点。

要点五:State是合成物——把身份、值、时间和认知拆开

演讲后半场进入了最具哲学味道的部分。Hickey说,面向对象编程最大的原罪,是把四件本该分开的东西焊接成了一个合成物(synthetic construct):identity(身份)、state(状态)、time(时间)和perception(认知)。

想想典型的OO对象:一个bankAccount对象,它的字段随时可变,你看到的永远只是“此刻的一个切片”,而且没有任何记录表明它是怎么从上一个状态变过来的。对象既是它的身份(账号不变),又是它的当前值(余额可变),又被绑定在一个时间线上(改动即覆盖),还被假设成所有观察者看到同一现实。Hickey认为这是四个概念的非必要交织,并且直接导致多线程世界的锁地狱。

他的替代方案(也是Clojure的设计哲学):value(值)是不可变的,identity只是“一个稳定的名字指向不同时间点的值”,时间通过一系列不可变版本体现,观察者各自持有旧版本也不影响别人。你拿到的数据永远是完整的、不变的快照——想看变化,看版本序列,而不是盯着一个被反复改写的盒子。

【延伸分析】这套思想早就溢出了Clojure圈:React的“UI是状态的纯函数”、Redux的“单一不可变状态树”、事件溯源(Event Sourcing)的“存事件不存现状”、Git的“不可变提交历史”,全都是同一个思路的不同皮肤。你没在写Clojure,也在享受(或错过)这场演讲的遗产。

要点六:警惕“借来的easy”——工具箱里的陷阱清单

Hickey在演讲里点名了一批“看似easy实则complex”的东西,大意包括:可变状态(交织了时间)、继承(交织了一整棵决策树)、模式匹配式的枚举耦合(把数据形状和处理逻辑拧在一起)、ORM(把对象模型和关系模型这两个本不兼容的世界硬焊在一起)。

他强调,这些东西的easy是“上手5分钟”的easy,代价是此后每一次改动的难度都在上涨。他给开发者的建议不是“永远别用”,而是:警惕地用。每次伸手去拿那个顺手的家伙,先问一句——它在帮我,还是在帮未来的我挖坑?

【延伸分析】我把它总结成一个实操判断法:判断easy值不值,就看“放弃它”的成本。一个库,明天想换成别的实现,半天搞定——它提供的easy是健康的;一个框架,三个月后想迁走要重写半个系统——它卖给你的easy是高利贷。签约之前,先看违约金。

要点七:Simplicity is a choice——简是选择的回报,不是努力的回报

演讲的落点是一句流传极广的话,大意是:简单不会因为你辛苦工作而自动到来,它只因为你选择了它而来(Simplicity is a choice)。写更多的代码、上更卷的工期、加更多的人,都换不来simple;唯一的路径是在每个岔路口,主动选择那个不交织的构造——哪怕它当下看起来更绕。

他同时提醒:simple是有代价的,它常常意味着放弃“一步到位”的爽感、写更显式的胶水代码、拒绝一些炫技特性。但这是一笔划算的交易:复杂度是复利计息的债,简单是按揭买下的自由。

知识结构图

flowchart TD
    A["两个被混用的词"] --> B["Easy 容易"]
    A --> C["Simple 简单"]
    B --> B1["主观:因人而异"]
    B --> B2["近在手边:熟悉顺手"]
    C --> C1["客观:与观察者无关"]
    C --> C2["不交织:one fold one braid"]
    C2 --> D["Complect 交织"]
    D --> D1["状态与身份交织"]
    D --> D2["策略与机制交织"]
    D --> D3["任务与顺序交织"]
    D1 --> E["State是合成物"]
    E --> F["Identity 身份"]
    E --> G["Value 值"]
    E --> H["Time 时间"]
    B2 --> L["短期提速像借贷"]
    L --> M["利息:复杂度复利"]
    C --> I["Simplicity is a choice"]
    I --> J["主动选不交织的构造"]
    J --> K["长期可维护的系统"]
    M --> K

实战启示

看完这场演讲,能立刻落地的有四件事:

第一,建立自己的“交织探测器”。 评审代码时别只问“对不对”,多问“这行代码把哪两件事拧在一起了?”函数里同时改状态又做计算,配置里同时表达“是什么”和“怎么部署”,接口里同时传业务数据和分页排序缓存策略——都是complecting。拆开它们不需要多高深的技术,只需要在写的那一刻多问一句。

第二,给技术选型加一道“放弃成本”的关卡。 引入任何框架、库、平台之前,做一个假想练习:一年后我们要换掉它,工作量多大?如果答案是“重写”,要么把它隔离在适配层后面(把依赖和业务decouple),要么换一个放弃成本低的。easy的报价单上,违约金是最重要的一栏。

第三,让“不可变”成为默认习惯。 不用换Clojure,从今天的语言就能开始:配置对象不再原地修改而是返回新对象;能用值类型就不要用带副作用的类;状态变更收敛到唯一的入口。你会发现测试变好写了、并发bug变少了——因为身份、值和时间被你亲手拆开了。

第四,警惕AI时代的“easy海啸”。 AI生成代码的成本趋近于零,但理解和维护的成本一分没降。生成的代码越easy,你越要执行“代价意识”:每个AI给出的抽象都要人工审一遍交织程度,每个没人读过的依赖都要过一遍放弃成本测试。工具变了,Hickey那张代价收益表没变。

延伸学习路径

  1. Rich Hickey《Hammock Driven Development》(Clojure Conj 2010)——同一作者,讲如何用“躺椅式思考”替代蛮力编码,与本文主题互为表里。
  2. Rich Hickey《The Value of Values》(2012)——《Simple Made Easy》中“值vs位置”思想的完整展开,直接回答“为什么不可变性是未来的方向”。
  3. John Ousterhout《A Philosophy of Software Design》——斯坦福教授的著作,用“深模块vs浅模块”和“复杂度症状”体系从学术侧回应同一问题,可与Hickey的观点互相校准。
  4. 《The Pragmatic Programmer》(20周年版)——把“正交性”(orthogonality)讲得最透的一章,本质就是不complect的工程化操作手册。
  5. Clojure官方仓库(github.com/clojure/clojure)——想看“演讲理念落地成语言”的样子,直接读它的核心数据结构文档与设计说明。

一句话总结

简不是努力的回报,而是选择的回报——把每一处不必要的“交织”拆开,你的系统才配得上陪你走十年。

参考来源

说明:本轮未能实时联网核验,以下链接为长期稳定存档的经典资源,如个别链接失效,请以标题检索。

  1. Simple Made Easy — Rich Hickey(Strange Loop 2011) — 本文解读的核心视频
  2. Simple Made Easy(InfoQ存档页) — 同一演讲的另一发布渠道,附完整文字整理
  3. Clojure官方仓库 — 演讲理念的工程落地
  4. The Pragmatic Programmer(官方站点) — 正交性与复杂度管理的延伸阅读

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