← 返回《系统》

第11章 复杂度:系统为何崩溃

系统

大多数人理解崩溃,会这样想:是不是有人犯了错?是不是某个决策出了问题?是不是突然发生了一件坏事?是不是运气不好,刚好撞上了黑天鹅?这些解释有时没错,但它们往往只解释了最后一下,没有解释系统为什么会走到“这么容易被击穿”的状态。 真正值得追问的问题不是:是什么让它倒下?而是:为什么它已经脆弱到,会被那一下击倒?这就是复杂度问题。 很多系统不是死于一个错误,而是死于复杂度积累到一定程度以后,系统已经失去了理解自己、控制自己、修复自己的能力。最后,一个本来不该致命的小问题,变成了致命问题。 所以,崩溃往往不是“被打死”的,而是“先变得过于复杂,然后在复杂中失去稳态”的。 复杂度,不只是“东西变多了”。复杂度真正的意思是:系统里的变量更多了,连接更密了,反馈更绕了,依赖更深了,局部动作带来的后果更难预测了。 当系统走到这个状态,它表面上可能越来越强,但实际上,已经越来越难拉回。这就是很多崩溃的真正前夜。 复杂,不等于大;复杂,也不等于高级。一个系统之所以复杂,不是因为它有很多东西,而是因为这些东西之间有太多相互作用,而且这种相互作用不是线性的、透明的、可直接计算的。 系统越复杂,通常意味着四件事同时发生:变量更多,连接更密,反馈链条更长,局部变化带来的整体后果更难预测。复杂度不是数量问题,而是相互作用的密度问题。 一块石头不复杂。一台发动机比石头复杂。一家公司比发动机复杂。一个金融市场比公司复杂。一个被全球供应链、政策、舆论、资本和技术同时牵引的现代系统,则更复杂得多。因为在这些系统中,你已经无法再用“一个原因对应一个结果”的方式理解世界。 你改动一个地方,影响的往往不是一个点,而是一串链条。而且这串链条,通常还会绕回来影响你自己。这时候,系统就开始进入一种状态:谁都还在控制局部,但没有人真正控制整体。 复杂系统有一个非常迷惑人的特征:它在顺风的时候,往往显得更强。因为复杂系统通常意味着功能更多、效率更高、分工更细、规模更大、反应更快、表面表现更亮眼。 一家不断加流程、加部门、加指标、加系统工具的公司,看起来更专业了。一个不断加杠杆、加产品、加衍生结构、加资金效率的金融体系,看起来更先进了。一个依赖越来越多算法、平台、外包、协同、即时连接的社会系统,看起来也更高效了。 所以人类很容易把复杂误解成强大。但这只是表面。因为复杂度带来的,不只是能力,还会带来三种隐藏成本:理解成本上升、协调成本上升、脆弱性上升。 复杂系统的问题从来不是“跑得慢”,恰恰相反,它常常跑得太快、太顺、太漂亮,以至于人们忘了问:它到底还能不能稳住? 系统之所以因为复杂而崩溃,不是因为复杂本身有罪,而是因为复杂度会改变系统的失效方式。在简单系统里,问题通常是局部的;但在复杂系统里,问题很少停留在原地。 因为复杂系统里的各部分,不是松散拼接的,而是高度相连的。一处故障,很容易触发别处压力;别处压力,又会反过来放大最初的故障。于是,小问题不再是小问题。 它会沿着连接传播,沿着激励放大,沿着延迟积累,最后在系统中某个你原本没注意到的地方爆出来。所以复杂度的真正危险在于:它让系统从“可局部修复”,变成“容易连锁失效”。 这就是为什么很多崩溃发生时,人们会说:“怎么会因为这么一点事就出这么大问题?”其实不是因为那件事本身有多大,而是因为整个系统已经复杂到,任何一点偏移都可能沿着隐藏链条滚大。 复杂度越高,系统越像一张拉得很紧的网。看起来稳定,但任何一点撕裂,都可能迅速扩散。 复杂度不是凭空来的。它往往来自四种常见冲动:为了效率不断增加连接;为了解决问题不断叠加规则;为了增长不断堆功能;为了局部最优牺牲整体可控。 每一个局部动作单看都合理,但叠起来却可能把系统推向不可控。所以复杂度的增长,很多时候不是因为愚蠢,而是因为:太多局部理性叠加,最后生成了整体失控。 很多人对崩溃最大的误解,是以为崩溃一定有明显预兆。其实未必。复杂系统常常在很长一段时间里都“看起来没问题”。它甚至可能表现得越来越好:增长在加速,利润在提升,流程在完善,功能在增加,市场在扩张。但这不代表它更稳。 它只是说明:系统还没有遇到足够大的扰动,或者说,结构性问题还没有被真正触发。 复杂系统最危险的地方就在这里:平时的小波动,并不能充分暴露它的真实脆弱性。直到某一天,一个原本不算大的事件触发了某条链,整个系统突然开始失控。于是人们会觉得崩溃很突然。其实不突然。只是复杂度造成的脆弱性,平时不容易被直观看见。 复杂度不只增加崩溃概率,还会降低系统参与者的判断能力。因为当系统越来越复杂时,会出现三件事:没人看得全;因果链条越来越长;责任开始模糊。 于是,在复杂系统里,误判会自然增加。不是因为人更蠢了,而是因为系统已经复杂到,正确判断所需的信息、时间和理解能力,超出了普通人能稳定处理的范围。 这会带来一个非常危险的结果:系统越复杂,人越依赖局部指标和表面信号做决策。但局部指标,往往正是导致整体误判的来源。 于是,系统进入一个新的恶性循环:复杂度上升 → 可理解性下降 → 误判增加 → 用更多补丁修补 → 复杂度继续上升。直到某一天,系统已经不是“难以优化”,而是“难以维持”。 复杂度真正危险的地方,不是让系统不能波动,而是让系统在偏离之后,越来越难拉回。这就是失稳。稳态不是没有波动,稳态是波动以后还能回来。复杂度不断上升,会一点点削弱这种“回来”的能力。 为什么?因为系统越复杂,反馈越慢,信号越乱,责任越散,动作越难协调,修复成本越高。这意味着,当问题刚出现时,系统往往反应慢;当问题扩大后,系统又修得慢;等终于开始真正纠偏时,代价已经大得多。 所以很多系统不是没有看到问题,而是:看到的时候已经晚了,动手的时候已经难了,想拉回的时候已经太重了。 真正强的系统,不是功能最多、结构最复杂、效率最高的系统。真正强的系统,是在出问题时,仍然能被理解、被修复、被拉回的系统。 很多人把“复杂”误读成“成熟”,其实复杂和成熟是两回事。成熟的系统,往往有边界:知道什么不能加,知道哪里必须留冗余,知道哪些接口不能过度耦合,知道哪些效率不能用稳态去换。 而不成熟的系统,常常是一路往上叠加:加人、加规则、加功能、加连接、加杠杆、加目标。最后把自己叠成一个谁都不敢碰、谁也修不动、谁都解释不清的东西。这不是成熟。这是复杂度失控。 从表面看,复杂度往往能换来更多效率。但从长期看,复杂度常常是在透支未来稳态。这就是为什么,真正高级的系统设计,不是一味加东西,而是不断问:这个连接有必要吗?这个流程是不是可以砍掉?这个依赖是不是过深了?这个规则是不是只是补丁?这个效率提升,是不是在拿系统脆弱性做交换? 系统设计最怕的一种冲动是:只看当前收益,不看未来脆弱性。因为复杂度一旦积累,它不会立刻以成本形式出现,而会以“未来某次危机突然变大”的形式出现。 所以很多时候,真正有智慧的系统不是最复杂的,而是最克制的。宁可慢一点,也要可控一点;宁可少一点,也要稳一点;宁可留余地,也不要把所有空间都拿去换效率。 一个能长期运行的系统,不是赢在每一段时间都最快,而是赢在不因为复杂度失控而突然出局。 很多系统之所以崩溃,不是因为某一个点错得特别离谱,而是因为复杂度不断上升之后,系统已经失去了稳态运行所需要的三样东西:可理解性、可修复性、可拉回性。 复杂度越高,连接越密,反馈越绕,依赖越深,局部优化越容易伤害整体,小问题越容易沿着隐藏链条被放大。于是,系统看起来越来越强,其实只是越来越脆。 真正导致崩溃的,往往不是最后那件事本身,而是系统早就复杂到,已经承受不起那件事。所以,崩溃不是单点问题,它常常是复杂度问题。 一个系统真正的成熟,不在于它能堆多高、跑多快、连多密,而在于它是否还能在波动中保持可理解、可控制、可修复。这就是复杂度这一章最重要的一句话:很多系统不是败给敌人,而是败给自己越来越复杂的结构。