软件开发中有一个重要的定律叫“海勒姆定律”:当你的 API 有足够多的用户时,你的承诺和约定已不重要;API 的所有行为(包括那些未囊括在公共说明中的一部分)最终都会被其他人所使用和依赖。
软件随着时间变化产生问题时,这个定律一直都是主导因素。
它在概念上类似于热力学中的「熵」:根据热力学第一定律,能量是守恒的,可以互相转化。热力学第二定律进一步指出,虽然能量可以转化,但是无法100%利用。在转化过程中,总是有一部分能量会被浪费掉。熵就是系统里的无效能量,是系统的混乱度。热力学第二定律的一个重要推论就是:熵永远在增加。
如果不施加外力影响,事物永远向着更混乱的状态发展。比如,房间如果没人打扫,只会越来越乱。熵只能减轻,永远无法根除。
尽管我们有最佳意识、最佳的工程师和可靠的代码评审实践,但我们不能假定大家会完全遵守先前的约定或最佳实践。
比如,在实际工作中,我们一方面要尽量设计好接口,将接口和实现隔离,但同时也要留意隐式接口问题,隐示接口会限制系统的设计和发展。虽然隐式接口理论上不是你的锅,但使用者不会这么认为。
再比如,项目的大多数依赖项(无论是隐式的还是显式的),随着时间的推移都可能发生变化。软件工程就是随着时间不断集成的编程,多人开发多版本程序。不仅包括编程,还包括在一段时间内,用来构建和维护代码的所有工具和流程,最大限度地保持代码的长期价值。
现在你终于明白了:为什么bug永远改不完?因为熵永远在增加。