道光年间,山西票号在全国开了三十七家分号,总号在平遥。分号之间靠驿马传递汇票,每日对账。票号的规矩是:见票即付,认票不认人——一张汇票到了任何一家分号,只要印章、密押、日期都对,当场兑银。

这规矩有个裂缝。咸丰三年,太平军阻断江路,汉口分号与总号断了音讯。汉口掌柜的姓周,是个谨慎人,每日仍按老规矩收票兑银,只把兑出的数目记在一本私账上,等路通了一并上报。但客商不等人——汉口市面上流通的汇票,有些是从总号发出的,有些是从西安分号发出的,还有些是太平军围城之前从武昌转来的。周掌柜只管验票,哪张票背后的银两其实已经被总号调去了别处,他根本无从知道。

路断了四十日。第四十一日,驿马终于进了汉口,总号的信使脸色惨白:周掌柜这四十日兑出去的三万七千两里,有八千两对应的银锭,早被总号在半个月前拨去充了军饷。同一笔钱,花了两遍——一遍在汉口兑给了客商,一遍在平遥交给了粮台。

票号的东家姓雷,雷东家没有责罚周掌柜,只把他私账上的数字和总号的底账一笔一笔比对。比对完了,雷东家做了一件怪事:他命人把三十七家分号之间的驿路全部画成一张大图,然后在图上用朱笔一道一道地画叉——不是画太平军阻断的地方,而是画他自己假设阻断的地方。

"我要知道,"雷东家说,"不管哪条路断、断多久、断在哪一段,各分号会不会还照老规矩收票兑银。我要的是铁算盘——算的不是银子,是规矩本身的缝。"


雷东家养了八个不做事的人,专干一件事:拿着朱笔大图,随机挑日子、挑路段,假传号令说"某处驿路中断",看各分号的掌柜怎么应对。有人继续兑银,有人暂停收票,有人偷偷改了密押规则,还有人直接把账本锁进柜子装死。八种反应,八种裂缝。

这八个人不验票、不记账、不做任何正经生意,只负责制造混乱、观察混乱、记录混乱。雷东家管他们叫试路先生——不是试驿路通不通,是试规矩在断路的时候还管不管用。

铁算盘跑了三年,试路先生造了四十七种断法,票号的规矩改了十一版。到同治年间,雷家票号成了山西最稳的一家——不是因为它没出过事,是因为它出事的方式被提前算尽了。


后来洋人的银行进了上海,有人把雷东家的法子讲给汇丰的洋经理听。洋经理在纸上画了一个词:Jepsen——不是人名,是这套做法的名字。洋经理说,现代的"试路先生"不用驿马和朱笔,用的是程序:随机让网络里的节点彼此看不见,看数据库还承不承诺"见票即付"。

但洋经理漏说了一点。雷东家的铁算盘之所以有用,不是因为试了四十七种断法,而是因为每一种断法之后,都有人拿着总账和分账一笔一笔去对。试路先生只管造乱,对账的是另一拨人;造乱的人不能知道自己造完乱之后系统会怎么反应,否则他下回就会照着"能过关"的方式去造。这两拨人必须隔开,像铸币局的雕版工和熔金工不能是同一个人。

现代的 Jepsen 测试也一样。写测试的人不能同时是修 bug 的人——不是出于什么道德洁癖,是因为知道怎么修的人,下意识会避开能让自己修不过去的测试用例。雷东家当年要是让周掌柜自己去试断路,他试出来的断法,一定是他已经有办法应付的那些。


雷东家晚年,铁算盘的规矩传给了儿子。儿子问:"爹,这算盘要打到什么时候才算完?"

雷东家说:"完不了。每改一版规矩,就生出新的缝。新缝要试,试了要改,改了又生缝。铁算盘不是一锤子买卖,是跟着系统一起长的东西——系统活多久,它就得打多久。"

儿子又问:"那四十七种断法够不够用?"

雷东家摇头:"四十七种是三年里试出来的,不是三年里全部的。明年有明年的太平军,后年有后年的洪水。断法要随机生,不能靠人想——人想得出的缝,都是人已经防住的缝。真正的缝在人意想之外,所以试路先生的朱笔不能照着老图描,得每次重新撒点。"

现代的 Jepsen 测试框架,核心正是这个"撒点":不是预设几种分区场景,而是让网络分区的方式、时长、范围都随机组合,像一把沙子撒在地图上,看哪粒沙子能漏进规矩的缝。


雷家票号在光绪末年倒了,不是规矩试得不够,是时局不再需要票号。铁算盘的法子却散进了各处——银行、电报局、铁路公司,后来是洋人的机器房。名字换了一茬又一茬,底子没变:故意让东西坏,看坏的时候承诺还作不作数

Kyle Kingsbury 把这个底子做成了公开的刀,一刀一刀往各家数据库上招呼。被砍过的数据库,有的改了架构,有的认了怂,有的干脆在文档里写明"此种情形下不保证一致性"。这三种都是铁算盘要的结果——最怕的不是查出缝,是不知道有缝还继续兑银