Versioning hardware is hard
This past week there's been quite some outrage over on the interwebs about the proposed new version of USB and how it's being named. If you don't know much about this, here's a TL;DR
- USB started off with naming their first version as full speed
- They followed that up with naming the next version as high speed - which sounds slower than full speed but is magnitudes faster
- They then went on to USB 3 where they really started messing things up. They named something X and then later changed that name to Y - something that should absolutely not be possible with versioning (for obvious reasons, you shouldn't change the name of something that people have already bought)
- Now they plan to name something as USB 4 version 2 - or atleast that's the technical name they are going with it.
Anyways - this is a high level overview - and you can watch the first few minutes of this past weeks WAN show if you want to dive deeper into how badly USB group has handled versioning over the last 2 decades.
Why should we care?
- Because governments all over the world are trying to shove USB down our throat. Don't get me wrong - I use USB all the time. But I am not legally obligated to use it on my projects. The EU - as well as India - are at different stages of passing regulation that will make it mandatory for phones to come with a port of their choosing. This is not a good sign as regulations don't evolve as fast as technology. This is also not a good thing because regulators usually want more control not less. This means that today their regulation might address only phones - but tomorrow it might address laptops, routers, and more. Not a good thing.
Regulation also implies lobbying – which is a different phrase for the best solution might not necessarily win. - I care about how USB versions things because honestly its extremely hard for me to find cables that do what they are advertised. I have years of experience working in the hardware field - and I still struggle to find good cables. Not because I am dumb - but for the simple reason that manufacturers aren't lying but they are actually lying when they are selling some kinds of USB cables - a result of the USB working group changing the version number after manufacturers adopted it.
If I - with my understanding of this mess - can't search and find a good USB cable - imagine my dad or grandma trying to do the same. - And the last reason I care is because I think it's our responsibility to demand better things for us. We are buying gadgets that have USB - the gadget manufacturers are paying fees to the USB IF - and these guys are doing a bad job of versioning hardware.
If we don't demand good things, we might not get them.
Okay versioning is hard - but not that hard
Versioning things is not always simple. Especially so for hardware. There are some standards that people have adopted and we should study those.
SemVer
SemVer is the mostly universally accepted way of versioning software. It's not restricted to software mind you - in fact there's discussions on the SemVer repository on GitHub on how to use SemVer for hardware as well.
It's straight forward in principle - you have a major version number, followed by a minor version number, and finally a patch version number as a string. This is what you use to version your hardware as you add breaking changes, non-breaking changes and fixes respectively.
- If we added a new feature to the USB standard that it not backwards compatible with the advertised features of USB 4 - we would name it USB 5
- So for example if we added a high speed option to USB 4, and that requires some extra components on the hardware front - we would name it USB 4.1
- If we forgot to add a necessary feature to USB 4 before it was shipped - we decide to ship a new version called USB 4.0.1
Other options
SemVer is not the only option. People come up with their own standards of naming and versioning things all the time.
Take the Raspberry Pi for example.
- They change the major version i.e. they go from Raspberry Pi 2 to Raspberry Pi 3 when they change the main component on their board i.e. the CPU
- They have used the Model A/Model B system to version their variants of the same hardware.
- They add a
+
to their versioning when they increment something to an existing version - for example if they increased the RAM and added some new functionality to the Ethernet port while keeping the main processor on the board the same.
This is their own way of versioning things that doesn't have a name like we have for SemVer - but this is still something a new person can wrap their head around and then use it to release the next version of the Raspberry Pi. This can barely be said about the USB.
We should also know about arbitrary standards like the Linux kernel - where a single man usually decides when to move from a minor version to a major version - and when not to - seemingly arbitrarily. But that's a case of a benevolent dictator who runs the project as he sees fit. It's a risky way to do things - and probably not something that works for everyone - but so far it's not created major confusion. Probably because it resides mostly in the software world. Not something we can say about a connector like USB.
I don't have a conclusion here really. Mostly that us hardware developers should start using more tooling. So that like software developers using GitHub and automated versioning - we too can work without having to solve hard problems in unique ways every time. This is important if we want our projects to outlive us - and be useful to other people without them having to spend a day to go through 20 pages of documentation, 3 blog posts and 2 podcasts - something I did for understanding the USB versioning landscape.
USB IF - do better.