I’m far from what you might call a die-hard anything when it comes to operating systems. Growing up, I used a mix of DOS and OS/2. OS/2, if you don’t recall it, was the betamax of OSes (or was that BeOS?). Originally conceived as a collaboration between IBM and Microsoft, it wound up as a bastard stepchild beloved by neither. But it was better, dammit, so my dad bought it and used it.
In the late 90s and early aughts I used Windows 95 and 98, and NT 4. It was crap, but it was ubiquitous crap, and it was what everything supported. I was fairly productive under those OSes; I still have some of the more obscure shortcuts ingrained in my muscle memory, like Win-Break to bring up System Settings. The subject I would later come to know as “package management” was a constant headache, however. Every piece of third-party software had to be updated in its own way, and then there was DLL Hell to worry about. God help you if you had just read an article about the Data Display Debugger and wanted a fully functional *NIX userspace to try it out on.
In the early to mid aughts I experimented more and more with various flavors of Linux. At first, I experienced similar problems managing the software installed on my system. Anything off the beaten path would trigger a search through the hit-or-miss listings of RPMFind, looking for that one missing package. It was a mess.
Finally I came around and started using Debian-based systems, and that’s where things got interesting. Sure, the Linux GUI situation was still shaky at best. But for the first time, for pretty much any new utility I read about on Slashdot, I could type “apt-get install cowsay” (or whatever) and a minute later it would be installed and configured. Not only that, but the next time I did a “apt-get update; apt-get upgrade” all those packages would be upgraded to the latest stable versions at the same time. This was pretty neat. But it got better: to set get up and running with MySQL, you did this:
apt-get install mysql-server
Then you got a cup of coffee, and when you came back, the server was already up and running with some sensible default settings. This was downright magical.
All this time I’d also been keeping an eye on the developments coming out of Apple after Steve Jobs’ return. I got more and more excited about what I saw of OS X. A beautiful, functional UI over a solid BSD core? Count me in! I came to the mental resolution that once finances permitted, I’d gradually switch over to a Mac-centric household.
In 2007, I managed to convince the company I was working for to give me a MacBook to work on. I loved that thing. Gorgeous, powerful, portable, and a pleasure to use. It was everything I’d looked forward to.
Well, mostly. There was still that niggling issue of package management. When I came in Mac developers were already on the second wave of package UNIX-side package management solutions. Fink, a re-purposed apt-get system, was on the way out, and MacPorts, a more BSDish solution, was the new hotness.
MacPorts worked well enough if you stayed on the golden path of a couple dozen well-maintained packages, and you didn’t need any unusual compile options. Unfortunately, I’m the kind of polyglot hacker who will randomly decide that today is the day to play with XOTCL. MacPorts had a somewhat limited selection compared to APT; but even within those boundaries all was not well. I had a lot of MacPorts installed. And like a good admin, I made an effort to keep the packages updated. Unfortunately, more often than not, this meant that after leaving the system to compile updated packages for 24 hours, I’d come back to find my scrollback buffer had overflowed with compilation errors stemming from badly- or un-maintained packages. Eventually I just gave up on updating.
Meanwhile Ubuntu was maturing. By the end of my ~2 year stint with a Mac, I was doing most of my work inside of Ubuntu VMs running under Parallels.
It wasn’t just that the Ubuntu package archive contained everything I ever wanted, and the packages invariably Just Worked when I installed them, and system updates were never a problem. It went beyond that. All Debian-based systems have this thing called Policy. It’s kind of like Leviticus for package maintainers. It specifies finicky little things like naming conventions for packages. And where the code examples must be installed if your package comes with examples. And how your startup script must behave if your package contains a daemon. And where config files go, and where the example config files went. And how all lockfiles, pipes, and pidfiles mustbe placed in the appropriate namespaced paths under /var. Etc., etc., etc..
When you spend more than a little time dicking around with assorted software packages from assorted sources, this stuff goes from being amusingly anal-retentive to being mana from heaven. You know where to find the things you are looking for, every time, without fail. And you know that installing obscure package foobar is never going to fuck over some existing package the way they sometimes would in MacPorts.
So my decision to give up on the OS X dream and resign myself to a life of cursing at crappy graphics card drivers was, in the end, driven by zero idealism and the purist pragmatism. It was about getting shit done, and not having shit break on me every few weeks. Because when I look back over my OS career, I realize I’ve spent far more down-time un-fucking b0rked packages than I ever did trying to get Linux to talk to my wifi card. And the thing is, once I figure out the magic incantation to make the wireless NIC work, with rare exceptions it keeps working from there on out. The same cannot be said of software packages on any system I’ve used other than Debian.
I’m not going to tell anyone what they should use. By all means, use what works for you. I’m sometimes surprised, though, at the vehemence with which people will assert that my choices can’t be working out for me as well as theirs. Or at the misconception that I must use it out of some kind of holy Free Software crusade or need to be l33t-er than thou.
Does Ubuntu have more than its share of usability warts? Yep. Does its hardware support drive me to distraction from time to time? Absolutely. But overall, has it been a more reliable swiss-army chainsaw for the day-to-day hacking problems that I confront? Without a doubt.
For what it’s worth, I still peer over the white-picket fence from time to time to see how the Apple neighbors are doing. I see they’ve moved on to a third package management solution. What I see sometimes brings back memories.
EDIT: Because I’m tired of answering the same objection over and over again, a clarification. If you didn’t click, or didn’t understand that last link, I have discussed HomeBrew with a number of Mac users and they confirm that the very same issues I had with MacPorts–missing or broken packages when you step off the “golden path”–are present in HomeBrew. If HomeBrew works for you, great! But understand that there are people like me who tend to go beyond the relatively tiny set of well-supported paclages available in HomeBrew. For me, it’s a headache I haven’t had to deal with for a long time, and one I don’t feel any pressing need to deal with again.
Oh and if I never wait for another 8-hour system update again it’ll be too soon. Precompiled packages are where it’s at.