Wednesday, August 8, 2007

Linux compared to communism: Why it will never work on the desktop.

In theory, communism is a good sounding idea. The government dispenses wealth to everyone and provides the services everyone needs. Everyone gets what they want/need, and no one is out on the streets. However, in practice, it works horribly. People have no incentive to work hard, bad products are produced, the government becomes corrupt, and everything falls apart.

Now, let's look at Linux(and its associated open source applications). The applications are developed for free my developers. Now, one would presume that the developers write the applications for their own needs. Next, let's consider the average programmer. The average programmer probably wants applications that enable him/her to code quickly, and hack around the system to easily look at and change various settings. The average coder probably doesn't care too much about whether he/she has to learn the command line in order to make use of the OS. In summary, the average coder wants radically different things from a desktop user; the coder wants an infinitely customizable system, at the expense of complication, while the user wants something that's easy to use with a nice GUI.


Next, let's take a look at how the capitalism market solves this problems. Let's take Microsoft for example. The people who work for Microsoft may be average programmers wanting a hackable system, but they are forced to code an easy to use system. Why? Because no one in the mass market would buy it if it meant that they would have to learn the command line to accomplish the most basic task on the system. The mass market forces companies like Microsoft to produce easy to use software for the mass market.

What incentive does a Linux coder have to make his/her app easier to use? Nothing. A Linux coder would likely reason, "Well, I could spend my time coding a feature I really want/need, so why should I bother with usability and a nice GUI?" Because Linux coders are working out of their own free will- and not for anything but themselves, there is no reason for high quality desktop software to work.

This difference between the Linux users and the desktop users fosters a sense of difference and elitism. I've cricitzed some of Linux's features in the past, and have primarily been met with comments such as "you are a dumbass", "get a life", and"ignorant rants," instead of comments that would likely come from a company like Microsoft or Apple like "thanks for your input," "we'll look into it," or "we'll definitely consider your comments." From the comments, I can deduce that the Linux developer considers windows users' needs to be below their own, and not worth developing for. In theory, the Linux programmers would be coding for the mass market, but in practice, they're coding for themselves with little regard for with the desktop(read: Windows/Mac) user wants or needs.

Thursday, July 26, 2007

Why Linux has failed to become a viable desktop OS

Linux has been an OS since 1991. It has been adopted by many web hosting providers and is a heavily used server platform. So, why can't Linux be a desktop OS? Simply put, because it doesn't have the features of a modern day desktop OS.

First, let's define what a desktop OS truely is. To me, it has the following:
  1. A GUI application for everything
  2. No reliance on the command prompt(i.e. the user shouldn't have to touch it for anything, not installing an application, nor installing a driver)
  3. A complete and total reliance on binaries for distribution of software/drivers. Open source software is nice- but don't require users to compile software. Open source software should be distributed exclusively in binary form(except in the svn, for development purposes).
  4. Standards for development. Drivers should have to conform to a standard, not just be floating pieces of code in a kernel.

I'll start with something that's bugged me every time I've done a Linux install: Driver support. It's an ugly thing in Linux. A very ugly thing. Often, this involves recompiling the kernel. I remember on my desktop, when I installed ubuntu, I couldn't get the drivers for my Audigy 2 Platinum working completely(I believe I was trying to get the alternate RCA recording ports working). I spent days trying to figure this one problem out. I ended up reinstalling windows, and within 5 minutes of clicking "update driver" in the device manager, I got everything working.

Another example is VMWare. When I tried it, VMWare for Linux required me to recompile the kernel to get the necessary drivers installed. Why? On Windows and Mac, I can install and use VMware without so much as restarting my computer. This should show, more than anything, how far Linux is behind Windows and Mac in terms of usability.

Now, in order to look at solutions for Linux, we must consider an operating system with a very similar (and recent) problem: Mac OSX. Mac OSX is a POSIX compliant operating system, just like Linux is. I know the kernels aren't identical in many ways, but they do share some commonalities. When Apple developed Mac OSX, they wanted to have a driver development system which was both stable, documented, and was easy to develop for. They chose a kernel-safe variant of c++(eliminating exceptions, and a few other things, which are unsafe in a multi-threaded kernel). What's unique about IOKit is that it has layered drivers. For example, a network card might take the following set of layers: a pci bridge driver, a pci device driver, a controller driver, an ethernet driver, and a network stack. So, what's so great about this driver architecture? Well, for starters, the layering means that driver code gets reused(i.e. to write a driver for another pci card, say a sound card, we needn't re implement a PCI bridge driver). Another great thing about the architecture is that it relies on kexts, kernel extension. These are binary files which are loaded at runtime by the OS and provide additional driver support. Note that you do not need to alter the kernel in any way to modify a kext, the kext files are completely separate.

I'm not very familiar with the windows driver architecture, but I can speak from a user's standpoint, that I have never had a driver not work when I clicked update driver and found the .inf file in the device manager. It's this kind of inter-interoperability that Linux lacks. Linux needs a device manager where I can click update driver for any device, find the driver file, hit OK, and be done with it.

Recently, it has been proposed that Linux have user mode drivers(that would not involve recompiling the kernel). This is a step in the right direction, but it is lacking in two ways. The first being that there are still no standards laid out for drivers, and the second being that there is no support for devices needing a lot of speed(like video cards) due to its lack of DMA support. I'd like to see this effort succeed, but first I think the kernel developers need to develop something similar to Apple's IOKit standard with kernel extensions supporting basic things like DMA and layered drivers.

My next major gripe with Linux lies with command files. One of the biggest frustrations to be was the x.org configuration file. It is of monstrous size, and you have to edit it to change a simple thing like resolution or bit depth. Now, I know the next release of x.org is supposed to eliminate the configuration file and enable dynamic setting changes via a GUI, but my question is this: Why has this taken so long? Windows 95 had this feature, and so did Mac OS(for a long time, I don't know the initial release where they added it). Having dynamic resolution changes is a feature which any desktop client needs to have, and I'm perplexed as to why it took so long(It was first made available at MIT in 1984(the same year the Mac was released)). Configuration files need to be eliminated entirely. It's inexcusable to have a configuration file(expected to be edited by the user) in any part of a desktop app. It should all be done by GUI.

Moreover, x.org is only one small project with a configuration file. There are many others with similar problems. Linux developers need to realize that desktop users don't want to touch configuration files. All preferences should be set by GUI, just like Windows and Mac OSX.

Now, although I have these gripes, I do give Linux some credit. Apt-get is pretty amazing- you can get any app with a single command. Additionally, Linux is rock solid, which is why it's used in so many webhosting environments. Linux just needs to become a little desktop friendlier by looking at what makes Windows and Mac OS easier to do.

I want to address one issue additionally, the elitist attitude of "Linux wasn't meant to be Windows." This is true to some degree- Linux wasn't initially designed to be a desktop OS- but Linux needs to change to become similar to Windows- and Mac OSX- if it wants to gain marketshare, by adapting things like well documented kernel extensions, removing configuration files alltogether, and making GUI tools for everything.

One of the problems I see in Linux, a possible reason for why it has not been successful in the desktop market, is because developers have no reason to make their applications user friendly. Whereas Apple and Microsoft would loose significant sales if their applications weren't usable, Linux developers loose nothing. Developers develop applications for themselves, and as such may not see it important to eliminate configuration files or add in a full featured driver implementation similar to IOKit. To this, I say to the developers: Make your applications easier to use; it will result in more donations, and you can offer commercial support if your application becomes popular enough.

I hope Linux developers will take a good look at what is holding Linux back from being a desktop OS. It is possible to fix these problems- and make Linux a great desktop OS, even better than Windows or Mac- but only if developers make it their goal to do so.