本系列不推荐解决方案。不教 FastAPI、不教 LangChain、不拆 Transformer、不带你调 PyTorch 的 API。本系列只讲算法原理与设计判断——目标是让你在设计信息系统时,尽可能把复杂度砍到最低,而不是为了"用上流行框架""让客户觉得高大上"去堆一套看起来很重、其实活不长的架构。
一、先从一句"扎心"的话说起
1986 年,Fred Brooks 写了一篇文章,叫《没有银弹——软件工程中的本质与偶然》(No Silver Bullet — Essence and Accidents of Software Engineering)。它后来成了软件工程史上被引用最多的文章之一。
文章里最著名的那句结论是:
没有任何单一的技术或方法,能在十年内让软件工程的生产力提升十倍。[ref:1,2,12]
二十年过去了,四十年也过去了。从 1986 到现在,每一波"银弹"都来过了:面向对象、UML、敏捷、SOA、低代码、微服务、云原生、中台……到今天的 AI 编程。每一波都有人拍胸脯说"这次不一样,这次是银弹" [ref:11]。
但 Brooks 的判断至今没被推翻。为什么?
因为他讲的不是"技术不够好",而是一个更底层的东西——软件的复杂度,有一部分是"天生的",你用什么框架都消不掉。
二、他把复杂度分成了两类,这是全系列的地基
这是本章、也是整个系列最重要的一张表:
| 本质复杂度(Essential) | 偶然复杂度(Accidental) | |
|---|---|---|
| 来源 | 问题本身 | 实现手段 |
| 具体是 | 业务规则、例外情况、领域本身固有的难度 [ref:6] | 语言、工具、平台的不完善或低效 [ref:6] |
| 能不能消除 | 不可化简,必然存在[ref:5] | 可以大幅削减 |
| 谁来消除 | 只能"管理",不能"消灭" | 组件化、高级语言、更好的 IDE、更好的框架 [ref:3] |
翻译成人话:
- 本质复杂度= “这个业务本来就难”。比如打样单逾期要判原因、订单口径要对齐、客户随时改需求——这些难,是问题本身难,不是你代码写得差。你换个语言、换个框架、加十个人,它还是那么难。
- 偶然复杂度= “我们自己搞出来的难”。比如为了显得专业,硬套了一套分布式的架构;为了用上某个流行框架,把本来一张表能表达的东西拆成五个服务。这种难,是我们额外加的。
Brooks 的核心洞察:
过去几十年所有的技术突破,解决的都是偶然复杂度;而本质复杂度,几乎原封不动。[ref:3,9]
框架、语言、IDE、云——它们让"实现"变简单了,但没有让"问题"变简单。也就是说:框架能干掉的是"偶然复杂度",干不掉"本质复杂度"。这就是本章标题那句话的出处,也是它二十年、四十年都成立的原因。
三、为什么"单靠一种技术/框架,不可能让生产力翻十倍"
因为框架动的是"偶然复杂度"那一半,而"本质复杂度"那一半它碰都不碰。[ref:3,9]
打个比方:你搬家,本来 100 箱东西(本质)。用了更好的搬家带、更快的货车(框架),你的搬运效率确实提高了——但如果这 100 箱东西本身就有 60 箱是"不知道怎么归类、必须现场决策"的,卡车再快,你也搬不更快地"想清楚哪箱放哪"。
软件就是这么个行业。大部分"难",难在**“想清楚要做什么”(本质复杂度),不难在"用什么写"**(偶然复杂度)。框架帮你解决的是后者,而后者本来就不是瓶颈。
所以 Brooks 的结论一点都不悲观,它极其冷静:
不存在任何单一的技术或管理上的进展,能够独自承诺在十年内让生产力、可靠性或简洁性获得哪怕一个数量级的提升。[ref:11]
一个数量级 = 十倍。这句话到今天,依然成立。
四、这件事对"设计系统"意味着什么(本章最实用的一段)
既然框架干不掉本质复杂度,那**"选一个流行框架"这件事,本身就不是设计系统的核心动作。** 核心动作是:
① 先把"本质复杂度"识别出来。
这个业务,到底是哪一部分天生就难?是权限?是口径?是例外流程?是数据不一致?把它写下来。你会发现:真正难的,往往只有那么两三处,而且跟框架毫无关系。
② 再把"偶然复杂度"砍掉。
你加的每一层框架、每一个中间件、每一次"为了架构感"的拆分——都在给偶然复杂度加码。Brooks 说得很清楚:语言、工具、平台的不完善,都是偶然复杂度 [ref:6]。而你主动引入的"过度设计",是其中代价最高的一种。
③ 判断标准换掉:“不是能不能用上,而是需不需要用”。
别问"这个框架流不流行、客户会不会觉得高级",要问"它是不是刚好解决了那两三处本质复杂度"。凡是不解决本质复杂度的框架,都是在给未来的重构埋雷。
五、一个必须说破的现实:你在"为了显得高级"而选型时,已经输了一半
我把这些年看过的项目,归纳成一句话:
一个系统的短命,很少是因为"技术太简单",大多是因为"复杂度加得太早、太多"。
“为了让客户觉得高大上而用重架构”,本质上是把"偶然复杂度"当成"能力"卖。它短期唬得住人,长期一定会反噬——因为多出来的每一层,都要有人维护、有人理解、有人重构。而 Brooks 早就提醒过:本质复杂度不可化简,你只能管理它;而你多堆的那些框架,恰恰会让"管理本质复杂度"变得更难。
这就是为什么后面每一章我都会回到同一个问题:这个设计,是在帮我们逼近"本质复杂度",还是在帮我们逃避它?
六、本章小结
- 《没有银弹》的结论几十年不破:没有任何 SINGLE 技术能让软件生产力十年翻十倍。[ref:1,2]
- 软件复杂度分两类:本质的(问题本身,不可消除)、偶然的(实现手段,可以削减)。[ref:5,6]
- 所有技术突破解决的都是偶然复杂度;本质复杂度原封不动。[ref:3,9]
- 所以:框架能干掉"偶然复杂度",干不掉"本质复杂度"。
- 设计系统的关键动作,不是"选流行框架",而是"识别本质复杂度 + 砍掉偶然复杂度"。
下一篇
第 2 章|你的系统难,难在哪:本质复杂度 vs 偶然复杂度
这一章立了"银弹不存在"的论。下一章我们把这把刀磨得更细:用一个真实的业务场景(打样单为什么会逾期、口径为什么对不上),现场演示怎么把"你系统的难"拆成这两类,并给你一把尺子——判断一个设计是在"逼近问题",还是在"绕开问题"。
如果你也在被"上一套先进架构"逼着走,关注我,这个系列只讲一件事:怎么少给自己加复杂度。