思维 · 心智模型 · 工程原则

YAGNI

You Aren't Gonna Need It——「你不会需要它」。一句工程里最省钱的纪律:功能等到真正需要时再加,别为「以后可能用到」提前写。它听起来像偷懒,其实是在拒绝一笔几乎注定亏本的投资。

篇幅 5 节 · 约 7 分钟 受众 全员 · 不写代码也能看懂 主线 团队工程纪律 + 脱敏实例

做产品时最诱人的念头是:「这个地方我先做灵活一点,以后要扩展就方便了。」于是多写了一个配置项、多抽了一层框架、多留了三个「万一要用」的接口。半年后回头看,那些为未来准备的东西——大部分从没被用到,剩下小部分等真要用时,需求早已长成了另一副样子。

一句话记住 · YAGNI 不是「不做设计」,也不是「能跑就行」。它只反对一件事:为想象中的、还没发生的需求,提前付出真金白银的代码。下面讲清楚它的成本逻辑、怎么判断该不该做、以及它适用的边界。
01

Section 01 · 它到底在说什么

需要时再建,而不是猜到时就建

YAGNI 出自极限编程(XP),Kent Beck、Ron Jeffries 这批人在 90 年代末总结出来的一条纪律。原话很直白:

YAGNI · 原则
永远在你真正需要一个功能的时候才去实现它,
而不是在你预见到你将会需要它的时候。

Always implement things when you actually need them,
never when you just foresee that you need them.

关键词是「真正需要」对上「预见到会需要」。前者是现在手上就有的、确定的用例;后者是脑子里对未来的猜测。YAGNI 的主张是:只为前者写代码,把后者留到它真的变成前者的那一天。

它和另外两条老原则是一伙的——KISS(保持简单)、「先让它能跑,再让它对,最后才谈快」。三条都指向同一个方向:抵抗「顺手多做一点」的冲动。

02

Section 02 · 为什么「以后用得上」多半是幻觉

提前写的代码,是一笔三重亏损的投资

「多做一点又没坏处」——错。为想象中的未来写的每一行代码,都在同时付三笔账:

脱敏实例 · 不提前套框架 · 给 AI 编排选型时,最省事的念头是先套一个大框架(比如 LangChain / LangGraph)「以后好扩展」。团队评估后没有这么做——编排逻辑用普通代码自己写,只在确实需要「看清 AI 在做什么」时引入 Langfuse。理由正是 YAGNI:框架承诺的「未来灵活性」是想象的,眼下的用例普通代码就够,框架反而白白增加一层依赖和认知负担。对照站内《LangChain · LangGraph · Langfuse》一篇。

这就是 YAGNI 的算术:省下的想象中的收益 < 立即付出的成本 + 长期的维护租金。绝大多数「顺手做的灵活性」,一算账都是亏的。

03

Section 03 · 一条判断线

现在有真实用例 → 做;只是「万一呢」→ 先别做

要不要现在就做,问自己一句话就够了:「此刻有没有一个真实、具体、正在痛的用例,非它不可?」有——做。没有,只是「想象中会有人要」——先别做。

现在就做

已经有真实用户/真实数据在等;不做就有具体的东西跑不起来;痛点当下可见、可描述。

vs

先别做

「以后可能」「万一哪天」「先留个口子」;说不出具体是谁、在什么场景下要用;为一个假设的规模提前搭重基建。

几个一听就该踩刹车的信号词:

反过来用最好用 · YAGNI 天然是删减器。做方案时先按最小可用去想,再逐条问「这一块,现在有真实用例吗?」没有的一律砍掉——这也是团队做需求对齐时的默认动作:先把不需要的删掉,剩下的才值得认真做。
04

Section 04 · YAGNI 不是什么

它砍的是投机,不是砍掉「该做对的事」

YAGNI 最容易被念歪成「别想那么多,能跑就行」。这是危险的误读。它砍的是应对想象中未来的投机,绝不砍应对已知复杂度的必要投入。两者的区别是这篇最该记住的一句:

YAGNI 砍掉

投机未知:为「说不定会来」的需求提前写的功能、通用层、配置口子。

YAGNI 不碰

应对已知:现在就确定会发生、且事后补代价极高的东西。

下面这些属于「已知复杂度」,不在 YAGNI 的射程内,该现在做对就现在做对:

不适用区为什么不能等「以后需要」
安全 · 正确性鉴权、金额服务端校验、失败即拒(fail-closed)——这些当下就必须对,不是「功能」,是底线。等出事再补就是事故。
数据 schema有历史数据包袱,改一次要迁移、要兜底,代价远高于写代码。值得提前想清楚。
对外契约公开 API、给别人依赖的接口边界——一旦有人用上就很难改,边界要先设计。
可回滚 · 可监控「为出错做准备」不是投机,是已知一定会出错。上线就要能回滚、能观测。
一句话分辨 · 问自己:这是在应对一个已经确定的复杂(安全、贵的迁移、对外承诺),还是在投机一个还没发生的未来?前者该做,YAGNI 不拦;后者就是 YAGNI 要你现在放下的。
05

Section 05 · 落到我们团队

很多条我们早就在守的纪律,内核都是 YAGNI

YAGNI 不是一条要额外记的新规矩——团队 CLAUDE.md 里好几条纪律,本质都是它换了个说法:

怎么用起来 · 下次你写下或听到「先做灵活一点 / 以后可能会要 / 顺手也覆盖了」时,停一秒问那句判断线:现在有没有真实、正在痛的用例?没有,就把它记进 backlog,然后删掉——等它真的变成需求,再花那一分钟也不迟。
「以后可能用得上」是工程里最贵的一句话。
为想象中的未来写的代码,几乎都是白写——需要时再建,永远来得及。