Software Design/Compatibility

Compatibility is an external software quality. Compatibility may mean, depending on the type of the software,
 * Backward compatibility, including bug compatibility and performance compatibility.
 * Forward compatibility.
 * Interoperability, including the ability of two versions of software to coexist in a single distributed system where individual components could be upgraded and rolled back independently.

Relations to other software qualities
Among internal qualities, compatibility requirements mainly affect the easiness of change or the very ability to change the software in certain ways. For example, highly compatible software should keep support for older storage and wire formats and protocols for several versions to make possible unconstrained upgrade and rollback between versions. APIs (and even promises made in their specifications) of highly visible libraries such as SDKs of programming languages can never be revoked.

Among external (that is, software and interface) qualities, good compatibility may enhance the system's reliability: for example, an accidental rollout of a new software version or unintended input of data in the old format may not break the software if the backward and forward compatibility are in place. Interoperability makes easier and safer to upgrade a distributed system without downtime if every (micro)service can be upgraded separately.

Relevant practices

 * Don't use get- prefix in the name of an expensive function
 * Document function's algorithmic complexity
 * Specify interface contracts