I was reading Standards and specs: Not by UNIX alone, which is a nice article on Unix software development. It made me pull out an older rant of mine and polish it up for this blog.
Software companies build a fundamentally different thing from hardware companies.
To most people, this is so obvious that it shouldn't even need to be stated. In the obvious ways, Most People are right. But there are non-obvious ways in which this is importantly true.
Toyota or Ford don't actually have to make next year's models "interoperate" with this year's models. I'm not even sure what "interoperate" would mean in the context of cars, beyond "they have to use some version of unleaded gas, and be able to fit on the roads, park in garages (I'm talking to you, Ford Excursion) and have the same user interface -- steering wheel, accelerator & brake pedals, etc.".
Auto companies can make everything else about their cars change from year to year.
They don't, of course -- there are strong rewards to not changing too much too fast, and for sharing ("conserving", in the genetic sense) parts within a product line -- both temporally (last year's model and this year's model have a lot of the same parts) and organizationally (our luxury model uses most of the same parts as the base model). But if someone wanted to radically change their engine without touching their car body or interior at all, they could. In fact, that's basically what Honda did with their Hybrid Civic. Looks just like every other Civic on the road, except for the little "Hybrid" sigil on the back.
In the same way, computer companies could radically re-engineer their hardware (motherboards, peripherals, CPUs) as long as they look the same to the rest of the world (e.g. programs). This is what Intel and AMD do every time they bring out a new product line. (Well, these days. The 286 to 386 jump was a doozy.)
But software? Software is a totally different thing. It has to interoperate. The lateral interoperation (between co-existing hardware) isn't that important to some software producers -- Microsoft deliberately engineers incompatibilities all over the place to keep the Mac a second-class computer -- but temporal interoperation, that's a big one. The Office 95/97 incompatibilities burned Microsoft pretty badly, although they'll never admit it.
This is arguably the defining distinction between the Unix and Microsoft worlds.
Most Unixes are built, maintained, and pushed forward by one of two groups:
- Software engineers who work for hardware companies, and whose job is to build a great OS which can help ship more hardware units. I'm mostly thinking about Sun here, but most other Unix vendors were in this camp: HP, SGI, DEC, etc. And Apple is now in this group with OS X being Unix underneath.
- Hobbyists: Linux and the BSD bestiary. These folks are not tied to any particular hardware, usually. These follow the original Unix in the way they're developed: by the people who use it, for the people who use it, and not directly for money.
Microsoft is a (relatively) hardware-agnostic software-only company (notwithstanding the Xbox or the Microsoft Mouse or Keyboard). Windows runs on most Intel x86 hardware.
Guess which set of software producers has sold the most incompatible versions of software?
Okay, that's a no brainer.
Apple navigated the 680x0 to PowerPC migration in the early 1990s quite well; I'm sure they'll handle the PowerPC to Intel migration just as well. Stuff will Just Work -- on expensive Apple-only Macs, but it'll Just Work. Mostly.
Unix is a weird case for a lot of people, I think. I remember doing a Sun 3.7 to 4.0.1 OS migration, which also involved a 68020 to SPARC 1 hardware migration at the same time. We had specialized video capture hardware to deal with, including all sorts of special code to drive it. We simply recompiled everything, and except for a few little things, it all Just Worked. Try that going from Windows 3.1 to Windows 95, or 95 to NT.
There are programs written in the early 1980s which would compile directly on any modern Unix these days. They might need a little tweaking for header files or libraries, but they'd Just Work. A lot of this is the whole command-line vs. GUI issue (all our fancy Unix boxes still act like they're talking to VT100 terminals from 1978, which in turn are not all that different from actual teletype machines from the 1950s -- cf. In the Beginning was the Command Line). The Unix programming model is so clean and spare, it has barely changed (regardless of what's under the hood in the OS) -- the clean separation of functionality and coherent interfaces simply make it Just Work.
Unix has a long history of having things layer on top of each other -- things continue to Just Work. Contrast this with Windows, which changes radically (and disruptively) every few years. That might be calming down; Windows 2003 seems to be more like "Windows 2000, but done right this time" than a totally new OS. But the Home edition of it (XP) still has some idiotically disruptive things in it compared to 2000. E.g. the My Computer and My Documents links disappear off the desktop. The claim is that having everything under the Start Menu makes it easier to learn Windows. That may be true, but it's sure annoying to someone used to Windows 2000. Sure, you can tell it to look like Win2k, but you still have to manually tell it to put My Computer and My Documents back on the Desktop. Stupid!
This is one of those clear cases where Microsoft is trying to make software the way that auto companies make cars -- "next year's model can be different because it'll be a new batch of people". Except it's not. The software market is a lot more mature than it was 10 years ago when Windows 95 came out. It's a lot closer to saturation. Even most home users are buying upgrades, not a first computer. And businesses? Wasn't Windows supposed to be the business OS? (Macs, of course, are the long-haired arty-farty computers.)
Businesses that plan for the future (i.e. businesses that will be around for the future) do not buy new OSes and throw the old ones away. They migrate: they have different versions coexisting. As much as it'd be nice to simply rip out everything and rebuild, it's simply impossible to do. If you have a big IT installation (and especially if you're providing a service, like web pages or email, or VOIP or something), you simply cannot do that. Won't work. You have to evolve, not revolve.
Any OS that makes it hard to migrate from one version to the next is a real pain. Unix is simple. It all Just Works. It has its pains, but it usually Just Works at this level.
Windows? Ha. This is an OS that doesn't have to worry about long-term OS uptime because urgent security patches come out monthly and therefore no box is going to be up longer than a month, because so many patches require a reboot. There are Solaris boxes at my company that have been up for 3+ years without breaking a sweat.
To summarize: software is NOT like hardware. It's not like automobiles, or appliances, or anything else that people replace. Software lives a lot longer than any single piece of hardware, has to play nice with other software, and most importantly, has to play nice with its descendants. The entire idea of "next year's model" is absurd and idiotic when it comes to software. There's only the next version. And that version MUST play nice, or you're going to piss people off.
It's entirely unclear to me if any Windows admin (who hasn't used Unix for any length of time) understands this. I'm guessing no.
It's entirely unclear to me if anyone at Microsoft truly knows this, either. Or is it just that if they understood it, they wouldn't be able to market their stuff without wanting to kill themselves in shame?