blankyao's blog

Review | Hyrum's Law

March 15, 2020

Hyrum’s Law 是 Google 的软件工程师 Hyrum Wright 总结的规律,原文如下:

With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody.

翻译为中文:

在 API 的使用者足够多的的情况下,你在契约中的承诺将不再重要: 某些使用者将会依赖你的系统中所有可观察到的行为。

这是作者在 Google 这个全球最复杂的软件系统做底层基础设施迁移的过程中对接口和实现的观察得出的结论。我们通常认为接口是和一个系统交互的抽象,就像车里面的方向盘和踏板一样,实现则是系统内部工作的方式,比如轮子和发动机。这样做是非常有用的,因为大部分系统都会变得非常复杂,以至于一个单独的个体或者团队无法完全的理解整个系统,「抽象」对管理这种复杂是非常有必要的。

理论上来说,接口应该为系统的使用者和实现者提供一个清晰的隔离,但是实际上,随着对系统使用的发展,使用者开始依赖通过接口暴露出来的细节,这个理论就不成立了。

从逻辑极限上来说,这会导致如果有足够的使用,则根本就没有私有实现这种说法。也就是说,如果一个接口有足够多的使用者,他们会有意或无意的使用所有的实现细节。这会约束实现既要符合文档里明确说明的接口,又要符合通过使用而沉淀下来的隐含的接口。我们通常称这种现象为”bug-for-bug compatibility”。

隐含接口的实现通常都是逐渐发生的,接口的使用者通常不会意识到这种现象正在发生。比如,一个接口可能并没有承诺其性能,但是使用者通常会期望其实现能让其性能在某个级别上。这种期望就成为了系统的隐含接口,在对系统进行变更时就得考虑到这种隐含特性。

当使用者足够多的时候,这些隐含的接口将会正好和实现匹配,这个时候,接口就蒸发了,实现变为了接口,所有的变更都会违反使用者的预期。

隐含接口是随着系统的自然发展而产生的,因为我们不期望这种问题产生,系统设计师和工程师在设计和维护复杂系统时最好将这些问题考虑,所以要意识到隐含接口是怎样约束你的系统设计和演进的,并且意识到在任何系统中,接口都会比你想象的变得更加深入。


Written by blankyao who lives and works in Amoy building useful things.