能活下来的复杂,都是搭起来的(Survivable complexity is assembled, not authored)
2026-07-21 · 什么算「复杂」
你以为「把一个系统拆开来分析」是分析者的自由——想拆得细就细、想拆得粗就粗。其实不是。一个系统能不能被干净地拆开,是它自己的性质,不是你的选择;而且正是这个性质,决定了它当初能不能被演化出来、以后能不能被改动而不整个崩掉。
钟表这东西有上千个零件。假设有两个钟表匠,做的表一样精密、一样值钱,但一个越做越富,一个最后破了产。区别不在手艺,在于他们把零件拼起来的顺序不一样。这个小故事——赫伯特·西蒙(Herbert Simon)1962 年讲的——是本期全部内容的种子。
它要回答的问题很朴素:为什么你见到的复杂系统,从细胞到公司到操作系统,几乎无一例外是分层套盒的?是巧合,是审美,还是有个更硬的理由,逼得它们必须长成这样、不这样就活不下来?
这一期和上一期(涌现)是一对:涌现说的是「整体有了部分没有的性质」,本期说的是「这些整体是怎么被一层层搭起来、并且拆得开的」。搭得起来、拆得开——这两件事其实是同一件事的两面,下文会说清。
西蒙的寓言是这样的。两个钟表匠,叫 Hora 和 Tempus,做的表都由一千个零件组成,两人的手艺一样好、生意一样兴隆——所以电话总是响个不停,老有客户打来订表。
问题在于:手头这只表还没装完,电话一响,你就得放下它去接。而放下一只没装完的表,它会散架——只要它当前的这部分还不是一个能自己立住的整体,一松手就垮回一堆零件。
Tempus 的做法是老老实实一个零件一个零件往上叠,装到第 999 个都还是一堆随时会散的东西。所以每次电话一响,他几乎都得从头再来。Hora 不一样:他把表设计成先拼小总成——每 10 个零件先扣成一个能自己立住的小模块,再拿 10 个小模块扣成一个中模块,10 个中模块才合成整只表。电话响了,他顶多损失当前正在拼的那一个小模块,已经扣好的那些一个都不散。
西蒙算了一笔账:如果每装一个零件、被打断的概率哪怕只有百分之一,两人的效率也会差到好几个数量级——Hora 从容做完,Tempus 几乎永远做不完一只表。差别的全部来源,就是 Hora 的半成品在每个阶段都是一个能自己立住的整体。
把这笔账倒过来读,就是本期的第一条硬结论:凡是靠「一步步搭出来」的复杂系统——演化搭的、工程搭的都算——只有那些拥有稳定中间态的,才可能真的被搭出来。没有稳定中间态的复杂系统不是被禁止存在,而是几乎不可能被走到:通往它的每条路径都太容易在半途散架。于是你环顾四周看到的全是分层套盒的东西,不是因为分层好看,是因为不分层的那些根本没能熬到你看见。
EN Simon's parable: two watchmakers, Hora and Tempus, each assembling 1000-part watches while the phone keeps interrupting them. Tempus builds flat, so any interruption scatters the whole thing; Hora builds stable ten-part sub-assemblies, so an interruption costs only the current module. With even a 1% chance of interruption per part, Hora finishes and Tempus effectively never does. Stable intermediate forms are autosaves — which is why every complex system you meet, having been built up step by step, is layered.
现在把镜头从「怎么搭起来」转到「搭好之后长什么样」。西蒙给分层系统起了个更精确的名字:近可分解(near-decomposable,意思是「几乎、但不完全能拆开」)。
它的定义只有两句话,但每句都要拿捏准:模块内部的相互作用又强又快,模块之间的相互作用又弱又慢。注意是「弱」不是「无」——完全没有连接那就是几个互不相干的系统,不叫一个系统了。近可分解的妙处全在那个「近」字上:连着,但连得松。
这个强弱之差会带来一个非常实用的后果,西蒙把它讲得很干脆。用他自己举的例子:一栋楼,几个房间,房间之间隔着不太隔热的墙。你在其中一间点个炉子。会发生两件时标截然不同的事——短时间里,每个房间内部的空气很快各自匀成一个温度,房间和房间之间还来不及交换多少热,所以你可以把每个房间当成一个独立的小系统单独算;长时间里,热才慢慢透过墙渗匀,各房间最终趋于同一个温度。
这就是为什么你能分开研究一个复杂系统的各个部分而不至于全错:不是因为它们真的互不相干,而是因为在你关心的那段时间里,模块间的耦合慢到可以近似当成不变的背景。这也是上一期(涌现)里「有效自由度」的另一种说法——近可分解,正是那个「有效层」能被单独描述的物理前提。
要不要把一个系统拆开分头处理,别凭直觉,去量它的耦合时标:模块内部匀好的速度,和模块之间渗匀的速度,差几个量级?差得越多,「分开算」越安全,也越可以放心地并行、外包、分工。两个速度接近甚至反过来(外部比内部还快),任何拆分都会骗你——这时该做的是先弄清耦合结构,而不是硬拆。
EN Near-decomposability, Simon's precise name for hierarchy: interactions within a module are strong and fast, interactions between modules are weak and slow — weak, not absent. His heated-rooms example: each room equilibrates internally fast (analyse each alone), then rooms slowly equalise through the walls (only aggregate heat couples them). That two-timescale gap is exactly why you can study parts of a complex system separately without being wholly wrong — and why "separable" is a claim bound to a timescale, not a permanent label.
既然模块之间连得松,你就能只改一个模块而不惊动其它——换掉厨房的炉子,不用重装整栋楼的电路。这件事听着平常,却是「可演化性」(evolvability)和「可维护性」的全部来源:一个近可分解的系统,改动的后果被关在模块内部,不会顺着强耦合乱窜出去。
但这里藏着一个最常见、代价也最大的错误:人往往按「功能」或「组织图」去画模块边界,而系统真正的接缝在耦合图上,两者常常不重合。你以为的模块,未必是它实际的模块。
1972 年,计算机科学家 David Parnas 把这件事讲穿了。当时主流是按「处理步骤」拆软件——先读输入、再排序、再输出,一步一个模块。Parnas 指出这是错的:该按「哪些设计决定将来会一起改变」来拆,把每个易变的决定藏进一个模块内部(他叫这个「信息隐藏」,information hiding),让接口稳定、内部可换。翻成本期的话就是:接缝应该切在耦合弱的地方,而不是切在流程好画的地方。切错了,你以为拆开了,其实每次改动照样牵一发动全身。
所以「拆解一个系统」这个动作,正确的顺序不是先决定要几块、再硬切成几块,而是先把耦合结构看清楚,找到那几条本来就细的桥,顺着它下刀。天然的接缝是被发现的,不是被规定的。规定出来的边界,系统不认。
拆一个系统(代码、组织、流程、计划)之前,先别问「分成几块」,先画出「谁改动会连累谁」这张图,把边界切在连累最少的地方。一个当场能用的检验:假想改动每一个候选模块,数一数会波及模块外多少东西——波及越少,说明你找到的是真接缝;每个都牵连一大片,说明这堆东西目前根本不近可分解,硬拆只会把强耦合藏进你看不见的地方。
EN Loose coupling between modules is what lets you change one without disturbing the rest — the entire source of evolvability and maintainability. But people draw module boundaries by function or by the org chart, while the real seams live in the coupling graph, and the two rarely coincide. Parnas (1972) said it first: modularise around the design decisions likely to change (information hiding), not around processing steps. Cut along the weak bridges, not where the flowchart is easy to draw — otherwise you have split the system in name only.
现在说反面。近可分解性是个极好用的透镜,但它有三处容易被用过头,用之前得把边界划清楚。
第一,「复杂系统必然分层」这个「必然」是被幸存者偏差撑大的。西蒙的论证严格说来只证明了:靠逐步搭建、且会被打断的过程,造得出来的复杂系统里分层的占压倒多数。它没有证明非分层的复杂系统在逻辑上不可能。有一整类系统就是没有干净接缝的——物理学里的自旋玻璃(spin glass)和各种「阻挫」(frustrated)系统,每个元素都同时强耦合到一大片别的元素,你怎么切都会切断一堆强连接。它们确实复杂,也确实存在,只是没法像钟表那样被一层层搭起来。所以准确的说法是:分层不是复杂的定义,是「可被逐步建造」的复杂所交的入场费。
第二,接缝会漂移,尤其在压力下。近可分解是个「好天气」性质。平时弱的那些跨模块连接,在系统受压时可能一起变强——上一节那张块对角矩阵,非对角的浅点会集体加深,三个模块糊成一个不可分的整块。金融里叫「相关性在危机中趋近于 1」,工程里叫「隐藏的公共依赖在高负载下暴露」。你依着平时的接缝做的所有分工、并行、隔离,恰恰在你最需要它们成立的那一刻失效。
第三,模块化本身有代价,不是越多越好。切开就要装接口,接口有开销、有信息损耗;切得过细,本可以联合优化的东西被人为隔开,反而做不出全局最优解。「近可分解」里那个「近」字是有分寸的——它说的是存在一个尺度让耦合足够弱,不是说你切得越碎越好。真正的手艺是找到那个恰好的粒度,而不是无脑拆分。
用「近可分解」下判断前,先明确回答三件事:①你这个系统是「逐步搭出来的」那类吗(是,分层的先验才成立;不是,就别默认它有接缝);②你依赖的那些弱耦合,在压力/危机下会不会一起变强(会,就不能拿平时的模块边界做应急预案);③你切的粒度是不是切过了头,把该联合优化的东西也隔开了。三问过不了,就别用模块化给自己壮胆。
EN Three limits. First, "complex systems are necessarily hierarchical" is inflated by survivorship: Simon only shows hierarchy dominates among complex systems that can be built up stepwise — spin glasses and other frustrated systems are genuinely complex with no clean seams. Second, near-decomposability is a fair-weather property: weak cross-module links can strengthen together under stress (correlations →1 in a crisis, hidden shared dependencies surfacing under load), so the seams you planned around fail exactly when you need them. Third, modularity costs interface overhead and can block joint optimisation — the "near" has a right grain size; finer is not better.
能,但要看你是在发现接缝还是在制造接缝。制造接缝=主动切断一些原本的强耦合、代之以受控的窄接口(微服务、部门墙、法律实体的隔离都是)。代价是那些被切断的耦合曾经在做有用的事,切了之后要么用接口补回来(有开销),要么就真的损失掉了。所以模块化不是免费的整理,是一笔用「联合优化能力」换「可改动性」的交易,得看这笔汇率划不划算。
是同一件事的两面。涌现说高层有个能自成一套的描述(温度、价格);近可分解性说的是为什么那个高层描述能自成一套——因为底层被打包进了弱耦合的模块,模块内部的细节在高层的时标上匀成了背景常数,于是高层只需跟踪少数几个总量。没有近可分解,就没有干净的「有效层」,涌现也就无从谈起。
因为改的是模块边界,而边界处正是耦合最纠缠、历史包袱最重的地方。系统平时能近可分解运转,靠的是现有边界已经和实际耦合大致对齐了;一旦重画边界,你会短暂地制造出一大批横跨新边界的强耦合(原来在一个部门内部的协作,突然要跨部门了),系统在过渡期反而更不可分解、更容易散架——这和第 10 期要讲的「跃迁前必须先变差」是同构的。
这是个诚实的疑问,也是本期方法最容易自欺的地方。检验的办法是让「接缝」做出可证伪的预测:如果你声称某处是弱耦合的天然接缝,那么沿它切开之后,两边应当能各自独立地改动、且互不引发对方的返工。如果每次改一边都要回头修另一边,那你找到的就不是接缝,只是一道你希望它是接缝的切口。接缝的真伪,由改动的连带后果来裁决,不由图画得好不好看来裁决。