Some esoteric versioning schemes (monotonic moronity)
Since time immemorial, software has had version numbers. A developer releases V1 of their product. Some time later, they add new features or fix bugs, and release the next version.
What should that next version be called? Modern software broadly bifurcates into two competing standards; SemVer
and CalVer
.
SemVer
Semantic Versioning is usually in the form 1.2.3
, the last digit is usually for minor bug fixes, the second digit for new functionality, and the primary digit for big and/or breaking changes.
The semantics are pretty loose. There's no real consensus on when a new "primary" number should be issued. There are two main weaknesses:
- The numbers might not be decimals. Is
V1.29
newer or older thanV1.3
? - There's no semantic information about when the software was released.
Which leads us to…
CalVer
Calendar Versioning is, ironically, more semantic than SemVer. The version number is the date when the software was released. For example, Ubuntu releases are in the form of YY.MM
- the latest stable release at the time of writing is 24.04
- so we can tell that it was released in April 2024.
There are three main problems with this approach.
- ISO8601 or GTFO! Surely these should use
YYYY-MM
to make it obvious this is a date? - Minor bug fixes are often given a release number like
24.04.1
- is that still obvious it is date-based? Was it really released on the 1st of April? - No information about big and/or breaking changes. Software released several years apart may be functionally identical whereas software released days apart may be incompatible.
Alternatives
So, what other ways can we number software versions?
EffVer
Effort Versioning is, I think, a sensible way to standardise SemVer. It attempts to show how much effort it takes to move between versions.
PrideVer
How much Pride do you have in your software release?
This is SemVer for people with an ego and the coding chops to match.
RuffVer
Ruff is a sort of bastard child between SemVer and CalVer, but adds this delightful complication:
Stable releases use even numbers in minor version component:
2024.30.0
,2024.32.0
,2024.34.0
, … Preview releases use odd numbers in minor version component:2024.31.0
,2024.33.0
,2024.35.0
, …
It's the versioning equivalent of setting up a fully scalable cloud database and hand-chiselling HTML out of stone for the cookery blog you update twice per year.
0Ver
Zero-based Versioning tells us that it is forbidden to ask and a sin to know when a piece of software will be completed.
Essentially, it is SemVer for cowards who are afraid to commit. The opposite of PriveVer.
PiVer
The venerable TeX uses Pi Versioning. The current version is 3.141592653
, the next version will be 3.1415926535
.
As the software gets refined, it gradually reaches a state of perfection. This is a charming versioning scheme which shouldn't be used by anyone other than Knuth lest hubris overtake you!
NameVer
Sometimes marketing takes the reins and insists that consumers need a Named Version to help prevent confusion.
Ubuntu uses things like Bionic Beaver
, Distinct Dropbear
, and Mantic Minotaur
. By convention, names increase alphabetically, so you should know that Jaundiced Jackdaw
is before Killer Kangaroo
- until you've released 26 version and have to wrap around the alphabet again.
NameVer is helpful for distinct products which aren't related, but probably more confusing than necessary.
WinVer
Microsoft Windows uses this very logical scheme - 1, 2, 3, 3.11, 98, 2000, Me, XP, Vista, 7, 8, 10, 11.
It starts with more-or-less SemVer, then jumps to CalVer, then 4 digit CalVer, then to NameVer, then back to SemVer - skipping 9 because of alleged technical reasons.
Do not attempt to use this versioning unless you want to anger both gods and mortals.
KelVer
Absolute Zero is defined as 0K. And so, Kelvin Versioning counts down to stability.
Almost the opposite of PiVer - the closer this gets to zero, the closer the code is to being complete.
This versioning scheme is affront to most sane people. But here's to the crazy ones.
Non-Monotonic
You will notice that all of the above are monotonic. That is, they all proceed in one direction and never reverse. Any subsequent version was definitely released later than a previous version. So, in a sense, they all contain some level of semantics.
But they don't have to.
HashVer
Taking the Cryptographic Hash of the code, or a commit, allows one to create Hash Versioning. For example 43317b7
is a HashVer for something which would otherwise have the dull and unworthy name of v0.118.1
But, of course, a hash does have a modicum of semantic information - even if it is only loosely related to the content of the code. What if there were something with no semantics and no monotonic behaviour!?!?
RandVer
Embrace the weird with Random Versioning! It its heart, RandVer says pick any number that hasn't been used before.
Perhaps V7
is followed by V2.5
, which is overtaken by V0xDEADBEEF
Absolutely guaranteed to have zero semantic content.
What have we learned today?
The square-root of bugger-all.
@Edent Nice! I'm pretty sure there was a version 3.1 of Windows between 3 and 3.11. (In my memory it goes "3, 3.1, 3.11 for Workgroups, 95" but apparently there was a non-workgroups edition of 3.11 too.)
@Edent
In WinVer you missed 95!
@Edent I quite like KelVer.
Alex Gibson says:
My favourite company for naming and versioning products has to be Creality. Their philosophy is: If it sells, keep selling it, and proliferate more, slightly varied models of it. Make no attempt to prune the product tree, and if our competitors have a popular product, take one of ours and rename it similarly, and then continue the version updating from there. Their most popular machine, the Ender-3, has these versions alone: Ender 3 V3 Plus Ender 3 V3 Ender 3 V3 SE Ender 3 V3 KE Ender 3 S1 Ender 3 S1 Pro Ender 3 S1 Plus Ender 3 V2 Neo Ender 3 Max Neo Ender 3 Neo Ender 3 Ender 3 Pro Ender 3 V2 Ender 3 Max
This is not exhaustive. Wild. Their PCBs, liberally scattered among the models, use SemVer like numbering, like 4.2.1, but with no obvious pattern, could include 8-bit or 32-bit processors, basic or advanced motor drivers... Basically anything goes.
HO says:
Agree. I happen to have an Ender3, and figuring what parts fit what printers is not intuitive.
Another is when tech and marketing version are off like MSSQL: "You have to be on 2014 for that feature." "Oh, I am on 12. No wait, that is 2014!" https://en.wikipedia.org/wiki/History_of_Microsoft_SQL_Server
For my own things I have mostly dropped version numbering, and just use autogenerated "Release build: 2025-02-02T13:45:07Z".
Dave Crialdn says:
SemVer was based on the UNIX shared library mechanics, I think. It works well for shared libraries; less well for applications, and pretty awfully for protocols.
In practice, projects I've run have used a mixture of SemVer, PrideVer, and IncentiVer - the latter being "I'll bump the major version when I really want to shame you into upgrading because I don't really want to support the older versions".
Anthony Gelibert says:
You named the WinVer but the “AppleVer” is pretty nice too with the various versions of MacOS Classic, MacOS X, macOS 😉. There is also the versioning scheme used by Oracle for Java where they retroactively renamed some versions (1.6 -> JavaSE 6)… Some companies are indeed very innovative on the subject!
I wonder what category schemes like less(1) fall into. It's a monotonic integer, with (AFAICS) no meaning other than "it's a new version"
http://www.greenwoodsoftware.com/less/index.h...
@Edent not *quite* true to say that semver is monotonic. One of the complaints I frequently have is that it's treated as monotonic when it shouldn't be. It *ought* to be fine to release (e.g.) 1.2.1 after 2.2.0, if you need to backport a bugfix. Projects which do that are comparatively rare though.
@blog first time reading about effver (not a programmer) and I agree it makes more sense than semver. Thanks for this!
More comments on Mastodon.