The cargo cult of versioning
OP brought up Rails, NPM, and Go but not Rust.<p>The Rust ecosystem might be a demonstration of the inverse problem. Pinning versions is trivial in Rust because its default. You will never be pushed over a major version boundary without intentionally doing it (and &quot;always get the latest&quot; is just the &quot;<i>&quot; version).<p>The problem then becomes that crates never reach 1.0. Flask is probably the oldest piece of software I use that similarly never reached 1.0 - albeit its been pretty close ever since the project was reorganized last year - but the entire Rust ecosystem is buried in Flasks. Software that is 99% of the way to what the creator wants 1.0 to be, but the last 1% is something nobody wants to do. When you are 99% of the way there, the software works in 99% of use cases, and that last 1% is... the last 1% anyone wanted to do. Which means they didn&#x27;t want to do it.<p>Probably the most blatant example of this in Rust is regex, which is blessed crate that is still only at 0.2, among many others (just from my hobby Rocket project are base64, chrono (and time), cookie, dotenv, envy, error-chain, lazy_static, num-traits, rand, redis, and uuid all still in version 0.x. That being said, the impl period going on right now and this entire year of direction from the core team was explicit in bringing as much of these fundamentals to 1.0, so we will see how successful the effort is.<p>Probably the greatest problem with semantic versioning in </i>that* context becomes feature creep. It is scary to go to 1.0 - you feel free in 0.x land where you can make major breaking changes in a .x release whereas you need to increment that scary major version number to do it later on. And besides the fear there is a lot of logistical headache properly maintaining semantically versioned software - you should <i>expect</i> if you never release a 2.0 to have someone trying to contribute 1.x bugfixes down the road, with the need to release 1.x.y bugfixes for all time. Because 2.0 is, like the article says, a new library - its a different API, you changed the meaning. So you are now maintaining <i>two</i> libraries.<p>There is also one final fear with the way Rust setup its crates ecosystem - if you are bold and break things but don&#x27;t end up delaying 1.0 for way too long, you might end up incrementing the major version a bit. And there is a cultural and subconscious aversion to <i>anything</i> on crates.io you see at version 3.0 or heavens forbid 4.0 or more. That software is <i>unreliable</i>, the developer is changing it <i>all the time!</i>. But then you go and use a 0.15 crate that is having the same problem anyway, just without saying &quot;this probably does its job&quot; like a 1.0 can.<p>In the end, versioning truly is almost meaningless, even in an enforced semantic versioning system the intent breaks down and meaning is lost just because different people release software differently. But that is a real deep almost - because its still more information than not having it, and in Rust right now at least it gives more helpful information than not. I&#x27;d call it a success at that point - way more than say Linux, where the major version is incremented whenever Linus wants to run a Google+ poll...