I like to think about Linux, because it represents something that you can only understand once you start to use it. It represents progress and inginuity in the face of complete opposition. It survives despite never coming out on top. It's the competitor that never seems to run out of steam and give up. It's not driven down by market analysis or trends. But... why is that?
You cant keep a good idea down. In the midst of BSD litigation Linux was born, and the concept of a free operating system slowly grew, and it's growth continues to this day. The concept of free software brings it continuity and makes it unlike it's competitors. When Microsoft builds a new version of Windows it is like running a marathon. Their old version has to live and generate enough revenue for them to hold out to releasing a new version. Linux is more like relay. If someone drops the torch there is always someone else to pick it up and run with it.
Another advantage that Linux has is that it's never the final answer. Windows 7 will be what it is up until the point where they release version 8. In that time ubuntu will have had at least 3 releases and if you count the releases of other distributions it starts counting up... quite a lot. If you count the releases of individual pieces of software, that number becomes astronomical. If there is a bug in the final version of a distribution, there is a much better chance that it will be fixed than there is with any commercial competitor.
If you've read the above and didn't just skip to this paragraph you are thinking that I am full of shit, because if you look at reality, and you compare it with what I said above, it makes sense, but Linux is not ahead in the race. not by long shot. You are right on that point, but there is a reason for all of this.
I am not going to bore you with the common "not enough support from 3rd parties" problem that Linux suffers from. This has been discussed ad nauseum in many articles before this one.
There are two lesser discussed problems in the world of Linux. The first is that Linux, when percieved as an end to end replacement for general purpose desktop computing, is a massively modular system. A typical Linux distribution has a seemingly endless list of components that have to interact with each other and play nicely together.
If you follow Linux in the news you will see that this is a violent war of peace, where everyone wants to get along but struggle to find the terms to do so. GTK and QT has been a good example of this. If you launch a GTK application next to a QT or KDE application, you can see there is a war of paradigms being fought right on your desktop. This has a severely detrimental effect on usability. Things are getting better and opinions are slowly shifting, but this competition between modules is part of the nature of how Linux lives on... and on... and on...
The better toolkit will have a growing developer base, very possibly at the expense of the not so good one. Slowly the old one will become obsolete and the new one will emerge as the winner. If the new one can stay fresh, structured and relevant as time moves on it will survive, if it falls behind another new competitor will come in and slowly chip away at the incumbent system's support base. This creates an evolutionary eco system, where obsolence is minimized, but it creates periods of violent transition, with fighting, incompatibilities, programs that depend on different modules and sometimes both, which swells up the super-system as a whole and can have a bad effect on users. So Linux must renew itself to stay alive, but at the same time remain stable enough to win the hearts and minds of the masses.
A second problem that Linux suffers from immensely is the fact that a chain is only as strong as it's weakest link. Some links in the stack are more interesting and easier to work on than others, which explains why Linux has a beautiful base(paid for by commercial interests) and a wealthy high level eco system, because mp3 players are easier and more fun to code than say a graphics driver.
Some parts of the system get neglected and the folks higher up in the stack cannot fix them. The lack of attention in the middle makes some parts difficult to work with.
I believe that both of the above mentioned problems are being solved. The massive modularity is being eased out by slowly integrating disparite systems. Like seeing Qt theming on GTK applications so that they blend in. It is very possible that in the future applications will decide which file dialogs and notification systems to use based on user preference, rather than the original toolkit used to create the application, based on a standardized interface to communicate with such a dialog. This is happening already. An example of this kind of thinking can be found in Phonon. A developer using Phonon does not care how music or videos get played, he just says "play" and the framework figures out which sound system to use. As more of these translators step in beautiful elegant modularity is created, and the bottom of the stack doesnt screw with the top so much anymore.
The solution to the second problem is a little more complicated. What needs to happen is that only the most difficult parts of these mid level systems should stay difficult. And all the rest should be easy to work with and maintain. If I decided to take part in programming something in my free time, I don't want to wade through all the levels and reading endless amounts of documentation to get started. I want to begin on the level of abstraction that I am interested in, and all other levels of abstraction should remain above and below me without disturbing me(too much).
I think that Linux fails to attract other developers because there still seems to be a steep learning curve to get up and running. If Potential new developers could just fire up their IDEs and load up a project instantly, with automatic set up, I think more curious eyes and itchy fingers will contribute to the world that is Linux.