$ nvm ls-remote | wc -l
303
Most of those are patch releases. There are 47 minor releases and 6 major releases: $ nvm ls-remote | grep -oE 'v\d+\.\d+' | uniq | wc -l
47
$ nvm ls-remote | grep -oE 'v\d+' | uniq | wc -l
6
Most language implementations probably have similar number of releases.https://clojure.org/community/downloads_older http://www.scala-lang.org/download/all.html https://www.python.org/downloads/
etc...
Python and OCaml have had 3 each. Libc has had 6. 32 for something that's been around less than a decade is a bit excessive.
Are all these 32 actually backwards-incompatible?
Testing across all 32 (or 303) versions is still going to be useful for catching bugs and quirks between minor versions (as opposed to deliberate, documented breaking API changes)
Node uses semantic versioning [0] and the current release is 5.10.z
The breaking changes can be found here [1] By searching for `SEMVER-MAJOR`. Some seem rather unavoidable for progress (updating dependencies...) and some are for things that have been deprecated. I'm not an expert but it looks like there are several security related changes as well?
In my eyes a backwards incompatible change that breaks a feature that has been deprecated for years or is insecure is a change worth making. Stability is bad if it means remaining insecure.
[1] https://github.com/nodejs/node/blob/v5.10.1/CHANGELOG.md
These versions include a lot of minor and patch releases. Chances are most code will run just fine on most of these versions, but if you can automate testing them all then why not do it?
Testing across 32 versions is probably very overkill for most people though.
...actually that does sound pretty 60s
I know that other languages also have issues in this regard -- but for more mature languages it seems to be more an exception than than the rule (restricted to certain platforms of subsystems, say).