Well, I feel that this isn’t the right topic to discuss it, but here’s a small rant …
You can take any Java library that hasn’t been updated in 10 years and still use it and compile it without problems on the latest JVM. You can take most libraries developed for Clojure 1.0 and still use them on the latest Clojure 1.8.0. You can almost say the same thing about JavaScript as well. Of course, all these aforementioned platforms have issues with libraries breaking compatibility in newer versions. Scala does too, in addition to Scala itself breaking compatibility in every major version.
So in the words of Rich Hickey, there’s accretion and there’s breakage and breaking backwards compatibility is breakage. I would have loved for us to come up with a better convention, instead of using that dreadful “semantic versioning”, which is basically a recipe for breakage. We could choose for example to never, ever break backwards compatibility without changing the namespace.
But we don’t do that, instead we are hoping for some magical unicorn (e.g. something OSGi-like) to save us from our sins.
I really believe there are absolutely no advantages to how Scala is in this regard. We tolerate it because we are getting lovely features instead. But we are already seeing old codebases stuck on old Scala versions with old library versions, because there’s really no good return of investment on upgrading everything, since the costs are huge and upgrading it piecemeal is mission impossible.
So in my mind, even if getting new features is great, even if we got cross-compilation tools instead, Scala is a terrible, terrible option for long lived codebases.