离散数学里到处都是看起来显而易见的小东西。陷阱就在这里。
你坐在课堂里。教授在黑板上画了点什么。不变量是在一个操作的每个检查点都成立的性质 P。 你把它记下来,耸耸肩,去喝杯咖啡。然后十年以后,你凌晨两点在调试一个分布式系统……直到那时,这个词才开始对你有了意义。
这是写给那个仍然坐在课堂里的你。
田野里的一根石柱
想象一根老石柱,孤零零地立在田野里。周围什么也没有。它身上什么也没有发生。
这就是教科书定义给你的画面。只有石柱。
教授忘了画常春藤
顺便说一句,我的教授很好。教科书也没有撒谎。只是这幅画不完整。
现在,让常春藤长到石柱上。藤蔓拉扯着石头。鸟在上面筑巢。一个游客拿着记号笔。一次小地震。一场风暴。两百年的天气。
石柱还在那里。从它自己的角度看,什么都没发生。
这就是不变量。
现在再读一遍教科书里的那句话:在一个操作的每个检查点都成立的性质 P。石柱就是性质。常春藤就是操作。检查点,就是你路过并看一眼的那个时刻。成立只是用很长的方式在说:石柱并不在意常春藤。
你会在哪些地方不断遇见它
一旦你有了这根石柱,你就会开始到处看见它。
循环不变量。你的循环体是常春藤。你的不变量是石柱。循环体可以在某一刻把它弄乱,就像藤蔓拉扯石头一样。到了下一个检查点,石柱又回到了原来的位置。
数据库事务。在 BEGIN 和 COMMIT 之间,数据可以翻跟头。ROLLBACK 是那个走过来把常春藤扯掉的园丁。石柱,也就是你的一致状态,仍然站着。
ACID。外键。类型系统。分布式重试。全都是石柱。全都站在各自的常春藤里。
一根可以抱的石柱
还有一个小赠品,既然你还在读。
有一个兄弟概念叫 幂等性。一个幂等操作,就是你可以做很多次,而结果和只做一次一样。调用 ROLLBACK 十次,和调用一次一样。把灯的开关设成“开”十次,和设一次一样。
如果不变性是常春藤疯长时依然不变的石柱,那么幂等性就是你想抱多少次都可以、它也不介意的石柱。
把两者放在一起,你就得到了容错系统的黄金标准。网络断了?重试。服务器崩了?重试。你最终会落在一个有效状态里,而且可以继续重试,不会把任何东西弄坏。
一根既经得住常春藤,又经得住被抱上一千次的石柱。大多数现代基础设施都安静地建在这上面。
一个小结尾
这就是我希望十年前有人为我画出来的那幅图。
它不算多。一幅图而已。但有时候,一幅图就是一个概念住进你骨头里,和一个概念只住在脚注里的区别。
如果你是学生,或初级工程师,或只是一个已经对“不变量”这个词默默点头点了很久的人……这是写给你的。
石柱并不在意常春藤。就这么回事。
从一个不被看好的人,写给另一个。

评论