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. Semantic versions aren't a promise – they're an excuse. Versions are a consequence of the choice to break software.