I think that many of us take backward compatibility for granted. It's so ingrained in our daily life that we don't even question it.
Backward compatibility is a spectrum – some systems are more compatible than others. But, at the end of the day, it's often one of the few reasons why we can use old software and hardware in new environments.
Why is backward compatibility important?
- Faster adoption. A new version of an API or software is only as fast as its adoption. If it is incompatible with prior versions, users will have to update their dependencies and code in a slow, painful manner. In some cases, this might mean that users never adopt the new version or continue to use old ones. Compatibility ensures that newer versions can be adopted faster, even if they are not 100% compatible.
- Decreases total cost of ownership. Newer hardware and software often requires new drivers and other components (even if they are backward compatible). This means that every upgrade has potential breaking changes – even if it's just a bug fix, it needs to be applied to all affected environments. Without backward compatibility, each upgrade would be a total overhaul of all environments. Of course, with better tooling and package managers, this is less true than ever.
- Creates more value for customers and users on proprietary platforms. On closed-source systems like Windows 10 or iOS 12, when APIs change in new versions that require changes on the application side (or sometimes the operating system side), there's often little recourse for users.
- Software doesn't live forever – but backward compatibility does. APIs that have been around for a long time (like git) will probably last even longer. When software dies, backward compatibility is one of the few ways we can preserve its legacy.
What examples of backward compatibility are out there?
- C/C++ still have function calls with the same ABI. Backward-compatible functions in C and C++ were crucial for the development of Unix applications on which the entire software ecosystem was built.
- Windows XP and Windows 7 can run DOS programs. DOS is one of the first operating systems to support backward compatibility. Even though it didn't support protected mode (386 protected mode), it could still run programs written for earlier versions.
- Linux kernel 2.6 (2002) vs. 3.0 (2011) – API changes but mostly backward compatible. The Linux kernel has long been an example of excellent API design and backward compatibility. The API is sometimes called a stable ABI (application binary interface). The ABI is guaranteed across different releases, even if the internal implementation might change between releases (e.g., faster or more optimized).
- Bitcoin – no protocol changes for almost 8 years. Bitcoin has been one of the few protocols that hasn't changed its API over the past 8 years (since 0.3). While there have been many upgrades and changes to other parts of the software stack (e.g., wallets), these haven't required any protocol changes that could break compatibility with older nodes on the network.