先说清楚这本书要用的那副眼镜。我们不把国家当成一部宪法、一群人、或者一段历史,我们把它当成一台正在运行的机器——具体说,是一套上亿人每天都在使用、从早到晚不能关机的软件系统。你、你父母、你楼下卖菜的、你没见过的东北某家钢厂,都是这台机器上的进程。它算的是:谁生产什么、卖给谁、多少钱、钱从哪来到哪去。
这个视角不是为了显得聪明。它是有用的,因为一台跑了几十年的大系统坏起来,有它自己的规律,而这些规律,写软件的人闭着眼睛都熟。
为什么用「系统」这副眼镜
你要是把 1990 年代初的中国经济当成一堆孤立的问题——财政困难、企业亏损、银行呆坏账、物价、住房——你会得出一个很自然但很错的结论:一个一个修呗。财政缺钱就多收点,企业亏损就多补点,物价乱就管一管。
这正是把系统看成清单的人会犯的错。真实的大系统里,故障不是一条一条排队等你修的 bug,它们是互相咬合的。你按下这一个,那三个会一起动。要看懂朱镕基后来做的事为什么长那个样子,你得先看懂:这台机器不是坏了五处,是这五处坏成了一个死结。
说人话:那不是五个漏水的地方,是五根管子接在一起,你堵住一根,水从另外四根喷得更猛。
它同时坏在哪几处
先各自看一眼。别急着记数字,记住每一处「坏」的性质就行。
一、财政:中央收不上来钱
当时用的是财政包干——地方跟中央谈好,每年上交一个固定数或固定比例,超收的部分大头归自己。听着像给地方发奖金、鼓励它多挣。问题是,地方一旦发现「多收上来的要分给中央」,就会想办法让账面上少收:该进国库的税,变成企业的各种减免、乱收费、账外的钱。结果是全国这台机器整体在转,可是流到中央这个账户里的钱,占比一年比一年低,低到中央想办一件全国性的大事,得挨个省去「借钱」。
用工程师的话:这是激励错位——你给系统设的奖励规则,把它优化到了一个你不想要的方向去。你想让它多收税,它学会了少报税。(这条线,第四、第五章会拆到底。)
二、国企:一个堵不上的泄漏
成千上万家国有企业连年亏损,但没有一家真正倒闭。因为它们背后连着银行,亏了就贷、贷了再亏。经济学有个词叫软预算约束——意思是一家企业花钱其实没有硬性的天花板,花超了不会死,总有人兜底。
说人话:正常的公司,钱花光了就完蛋,这叫「硬约束」。国企是「软」的——花光了会有人再给一笔,于是它永远学不会省着花。
写过服务的人一眼就认得这个东西:这是内存泄漏。程序在跑,看着正常,但有一块资源只进不出,一直在漏。短时间没事,时间一长,整台机器被它拖垮。(第六、第七章。)
三、银行:漏出去的账,全压在这里
那国企亏的钱,最后堆在哪?堆在四大国有银行的账上,变成坏账——借出去、大概率收不回来的贷款。银行名义上是银行,实质上成了给亏损企业输血的管子。堆到什么程度?堆到技术上已经接近资不抵债:真按市场规矩算,它欠储户的,比它能收回来的还多。
注意这一处和上一处的关系:银行的病,不是银行自己得的,是国企的泄漏顺着管子流过来的。你不把国企那个漏堵上,光去救银行,等于一边舀水一边任龙头开着。(第八、第九章。)
四、价格:一套东西两个价
那几年还留着价格双轨制的尾巴——同一样东西(比如钢材、煤),计划内一个便宜价,计划外一个市场价,两个价能差出好几倍。这中间的差价,本身就是一个巨大的套利口子:谁能拿到计划内的批条,谁就能低买高卖,白赚一道。它扭曲了所有人的算账方式,也是腐败的温床。
这像什么?像系统里同一个数据有两份不一致的副本,谁读到哪份全看关系。只要这个不一致还在,上层任何逻辑都算不准。
五、住房:一大块资产被冻在系统外
那时候房子基本不是买来的,是单位「分」的。你在哪上班,单位排队分给你一间,租金象征性地收几块钱。这意味着全国人民住的房子,作为一笔天量的财富,几乎不在市场里流动——它不能买卖、不能抵押、不产生现金流。
说人话:这好比一个应用把一大块内存永久占住了,既不用它干活,也不还给系统去调度。资产在那儿,但对整台机器是「死」的。
同时,企业得替职工背着盖房子、修房子的负担,这又反过来加重了国企那个泄漏。(第十章。)
为什么不能单点修
现在把这五处连起来看,那个死结就出来了:
- 想救银行坏账,钱从哪来?中央没钱(财政坏了)。
- 想让中央有钱,得改财政包干,可地方不干——地方的日子正靠国企那点税和地皮撑着。
- 想让国企不再泄漏,就得让它们能倒闭、能裁人;可它们一倒,坏账立刻在银行账上「实现」,银行当场爆掉。
- 而且国企还背着职工的住房和福利,你动它,等于同时动了几千万人的饭碗和房子。
这是软件工程师最怕的两样东西:死锁和级联故障。死锁——A 在等 B 松手,B 在等 A 松手,谁都不肯先动,全卡住。级联故障——你去修一个组件,它一动,把跟它连着的下一个拽垮,再拽垮下一个,像多米诺。1990 年代初的中国经济,同时具备这两种病:改革的每一步都被别的环节反向拽着,而你真敢硬拆某一环,连锁反应能把整片拖下水。
所以「一个一个修」在这里是行不通的——不是慢,是物理上做不到。你按住任何一处,另几处立刻反弹。
为什么也不能停机重来
写代码的人遇到这种烂摊子,有个偷懒的念头:推倒重写。停机、清空、按干净的设计重新部署一套。
这台机器不许。因为它不能停机。
停机意味着什么?意味着这个月工厂不发工资、粮店不进货、火车不排班。上亿人不是数据,是活人,他们的吃穿住行今天就要,不能等你「维护完再上线」。历史上真有政权试过把机器关掉从头再来,代价是几百上千万人的生死。所以这条路从一开始就被划掉了。
剩下的,只有一条最难走的路:在机器满负荷运行、上亿人在线的状态下,把它的底层协议一部分一部分换掉,还不能让它宕机。
说人话:这就是热更新——不重启服务,在它继续对外提供服务的同时,替换掉里面的核心代码。任何做过线上系统的人都知道,这是所有操作里最凶险的一种。
贯穿全书的那个问题
把上面这些收拢成一句话,就是这本书要一路追问的东西:
一个人,能否、以及在多大程度上,重构一台正在运行、上亿人在线、绝对不能停机重启的巨型系统?
接下来的十几章,讲的就是一个人怎么真的去干了这件几乎不可能的事。他不是天降的圣人,他是个学电机出身、被打成右派晾了二十年、说话较真到得罪一片人的工程师。他改这台机器的手法,带着强烈的工科味道:先量化,找到那个能同时松开死锁的关键结点,先在小范围(上海)试跑,再逐个模块热替换——分税制、国企、银行、房改、汇率、开放接口。
每一步我们都会问三件事:它原来怎么运作,他为什么这么改,如果不改会怎样。这三个问题,就是我们这副系统眼镜的全部用法。现在,戴上它,往下看。