石柱与常春藤

给计算机科学里那个不被看好的人的一幅小画。教科书没有撒谎。它只是少了常春藤。

离散数学里到处都是看起来显而易见的小东西。陷阱就在这里。

你坐在课堂里。教授在黑板上画了点什么。不变量是在一个操作的每个检查点都成立的性质 P。 你把它记下来,耸耸肩,去喝杯咖啡。然后十年以后,你凌晨两点在调试一个分布式系统……直到那时,这个词才开始对你有了意义。

这是写给那个仍然坐在课堂里的你。

田野里的一根石柱

想象一根老石柱,孤零零地立在田野里。周围什么也没有。它身上什么也没有发生。

这就是教科书定义给你的画面。只有石柱。

教授忘了画常春藤

顺便说一句,我的教授很好。教科书也没有撒谎。只是这幅画不完整。

现在,让常春藤长到石柱上。藤蔓拉扯着石头。鸟在上面筑巢。一个游客拿着记号笔。一次小地震。一场风暴。两百年的天气。

石柱还在那里。从它自己的角度看,什么都没发生。

就是不变量。

现在再读一遍教科书里的那句话:在一个操作的每个检查点都成立的性质 P。石柱就是性质。常春藤就是操作。检查点,就是你路过并看一眼的那个时刻。成立只是用很长的方式在说:石柱并不在意常春藤

你会在哪些地方不断遇见它

一旦你有了这根石柱,你就会开始到处看见它。

循环不变量。你的循环体是常春藤。你的不变量是石柱。循环体可以在某一刻把它弄乱,就像藤蔓拉扯石头一样。到了下一个检查点,石柱又回到了原来的位置。

数据库事务。在 BEGIN 和 COMMIT 之间,数据可以翻跟头。ROLLBACK 是那个走过来把常春藤扯掉的园丁。石柱,也就是你的一致状态,仍然站着。

ACID。外键。类型系统。分布式重试。全都是石柱。全都站在各自的常春藤里。

一根可以抱的石柱

还有一个小赠品,既然你还在读。

有一个兄弟概念叫 幂等性。一个幂等操作,就是你可以做很多次,而结果和只做一次一样。调用 ROLLBACK 十次,和调用一次一样。把灯的开关设成“开”十次,和设一次一样。

如果不变性是常春藤疯长时依然不变的石柱,那么幂等性就是你想抱多少次都可以、它也不介意的石柱

把两者放在一起,你就得到了容错系统的黄金标准。网络断了?重试。服务器崩了?重试。你最终会落在一个有效状态里,而且可以继续重试,不会把任何东西弄坏。

一根既经得住常春藤,又经得住被抱上一千次的石柱。大多数现代基础设施都安静地建在这上面。

一个小结尾

这就是我希望十年前有人为我画出来的那幅图。

它不算多。一幅图而已。但有时候,一幅图就是一个概念住进你骨头里,和一个概念只住在脚注里的区别。

如果你是学生,或初级工程师,或只是一个已经对“不变量”这个词默默点头点了很久的人……这是写给你的。

石柱并不在意常春藤。就这么回事。

从一个不被看好的人,写给另一个。


评论

Boris D. Teoharov

作者

你好,我是 Boris

我不是作家,也不是哲学家。我只是一个来自保加利亚的后端工程师,靠在 Laravel 队列和上亿行索引之间讨生活。其余时间,我读一些本不该我读的医学资料,读一些半懂不懂的法国小说,也读我的小橡皮脑袋想咀嚼的别的东西。两只被救助的流浪狗让我保持诚实。