Software engineers are great at devising solutions for problems they introduced. Versioning promises to alleviate the pain of incompatibility. But incompatibility isn't some force of nature. It's a design choice. Changes don't have to break things. Functions can be added, options extended, modules namespaced. Versions are often an excuse to break software, rather than a promise of something better.