There is something liberating about using an operation system that not only is free, but completely open source. You have the option to take this operation system and modify it in any way you want, for free, as long as you too publish the source code to any changes you made to the Linux kernel. This is one of the most powerful assets for Linux, and is the driving force behind adoption. Unfortunately this has not translated into widespread mainstream adoption even though most of the worlds servers run Linux. In my mind there are a few key fundamental issues holding Linux back: being forced to use the terminal, user friendly documentation, the complexities of installing packages, and abysmal driver support.
One of the fundamental components of Linux is the amazing power of the terminal. In the right hands there is almost nothing that cannot be accomplished quickly, and efficiently, with the terminal. This is unfortunately where the problem lies, your ability accomplish anything more than the most basic tasks, and take advantage of the power Linux has to offer, is offloaded to the terminal and thus lost if you don’t know your way around the terminal. This is a stark contrast from Windows, which though arguably not nearly as powerful in the command line, allows intermediate users to unlock nearly all of the operating systems potential through a very detailed and complex GUI. This functionality, in my mind, is key to the wider adoption of Linux as you are leaving a key user demographic out in the cold. This is because the way I look at it there are 3 key groups of computer users: basic user, advanced user, and guru’s. All of the major operating systems available cater to at least two of those, beginners and guru’s. This is because the operating system is designed by the guru and thus provides the advanced functionality at a level that is both easy for them to understand and use. Then the support for the basic user is there because they are, by a large margin, the biggest part of an operating systems user base. The third user demographic is probably the most challenging to cater to as they bridge the gap between the two other groups. They understand the more advanced concepts, are capable of troubleshooting issues, and are looking to expand both their knowledge and the functionality of their computer, but at the same time they are still not experts in the field and either don’t have the time, need, or willingness to learn how to take full advantage of the functionality of the terminal/command line. The issue with designing advanced GUI-based functionality is that there is a lot more complexity involved and effort required to provide that full functionality. By leaving that functionality out you are alienating a very influential user base. Not only are advanced users the most vocal online users, posting reviews, and participating in forums, but frequently they are the first people a basic user will turn to for help. Thus by catering to advanced users you indirectly influence a much larger user-base of basic users with can translate directly into an operating systems increased adoption.
Building directly on the reliance of operating systems on the terminal/command line for advanced functionality comes the discussion of documentation. Every operation system in the world has some online community or web forum for crowd-sourced troubleshooting of issues, and some are good, some are bad, but none are perfect. Microsoft runs a series of guides and forums through their website for Windows issues, and though helpful, tends not to be the main source for tech help. This lies with the literally thousands of tech forums dedicated to troubleshooting Windows issues across the web. For Linux there is a much more structured forum ecosystem as most Linux distributions host their own extensive forum network (though these are by no means the only Linux forums). Though this might seem like a great advantage (and it can be in some cases) there are some highly fundamental flaws in the approach of most Linux forums. When searching through the forums looking for a solution of some problem you have encountered, or functionality that you are trying to use, chances are there is a thread which relates to the issue, error, or question you have. The problem then becomes two-fold; first that the problem or error code is rarely specific enough to be of much use due to the obscure way Linux tried to warn you about errors, or secondly, that the error occurred on a different applications in a different situations than yours. This fragmentation, paired with common attempts at the “one-size-fits-all” solution is unfortunately rarely the solution you are looking for. The chances of you finding a solution to the problem you are having, in the same circumstances you encountered them, on the same hardware you were using, that actually fixes the issue are slim to none. Assuming you managed to find an explanation and solution to your question the issue now becomes implementing that solution. Going back to the breakdown of user demographics we know that by and large most users fall under the “basic users” category, this should logically translate into explanations designed for the lowest common denominator. Unfortunately that is not the case. Most Linux documentation, though seemingly thorough, detailed, and simple, gaps are left and assumptions made of the user about steps that they should be able to do already, or should already have taken. This leads to the user running in circles having to learn each of the recursively increasing number of tasks in great detail so as to tailor it to their problem, resulting in a vicious cycle of tech help forum solutions. The fix for this would be recognition on the part of forum mods and writers as to who these documents should be targeted at, what skill level they have, and then rewrite things so that anything that goes beyond what a basic user can understand is explained in simpler and more detailed terms.
Installing the most common applications in Linux can be a breeze. Most consumer distributions of Linux have some form of application repository and a program which enables the user to search through and install the ones they want, such as the Ubuntu Software Center. This is great until you need to install something that isn’t in the software centre. Where on Windows there is usually just one file you can run and install in a few simple steps, Linux is a bit more complicated. Most of the time you are left to your own devices to navigate the minefield of choosing which type of download you would like, what distribution the download is for, what dependencies they rely on, and the amazing complexity of trying to run the program after you have managed to find what you think is the right file. What is the problem with making it as simple as Windows?
Driver support on Linux is probably the most visible, and frustrating problem. Linux, having been designed to run on just about everything, has both a wide array of supported hardware and at the same time limited and sub-par support for some of the most common things. This can mainly be attributed to the the fact that because next to nothing ships with Linux out of the box there is no motivation for hardware OEM’s support it. Similarly, support for hardware in general is based on adoption and demand, if no one has the hardware that requires the driver then there is no need to write it. This combination of lack of official support and the lack of widespread demand for drivers is a serious headache for anyone thinking of using Linux. This “Driver Paradox” is the cause of many of the shortcomings of installing Linux on a computer, such as: the wireless not working, power management killing battery life, lack of working media keys, and much much more. Thus when someone goes to install Linux on their computer, whether it be a laptop or a desktop, chances are there will be at least one feature that isn’t working like it should on Windows. For example, on my ThinkPad X220 I am able to get 6, maybe 7, hours of battery life using the balanced power profile while running Windows 7 or 8. On Ubuntu, or Linux Mint, the battery will last for 4 hours if I am lucky. This is a very real example of how the lack of optimization can cause noticeable shortfalls because, although Linux might be less system intensive, if the power management and chip-set drivers aren’t as refined as they are on Windows the experience will suffer noticeably.
So as it stands, running Linux on a computer, whether it be a laptop or a desktop, is a crap shoot. There are some amazing aspects of Linux both in its user interface and its software distribution. Unfortunately this experience is ruined by the constant reliance on the command line for performing anything more than the most basic tasks, the lack of user-friendly beginner-intermediate documentation, the complexity of installing programs from outside the repository, and terrible driver support which cripples the full potential of the hardware. If I was Canonical (or other Linux software distributors) I would spend less time trying to break into the mobile market, or adding flash UI features, and more time trying to get desktop Linux in a usable state.