Personally, I think that command line is the most flexible and at the same time most intuitive user interface paradigm we have invented so far. There is a large number of people who would not agree with this statement. There is this this notion that command line is a thing of the past, and modern software must have a GUI whether it makes sense or not. Somehow a large number of computer users got it in their heads that this is absolutely terrifying, ugly, and outdated:

But it is not. This is a modern shell in a modern operating system. I took that screen shot on my Kubuntu machine which is actually quite newbie friendly. If you need to launch an application, you just type in the name. If the application is not installed, the shell will give you a helpful suggestion which package you should download to get it. If you make a typo, bash will usually pipe in with one or two suggestions for application names that are similar to what you typed. Working on the command line is quite similar to having a conversation with your computer. You type something in, and the machine either executes your command, or goes “I have no clue what you just said, did you by any chance mean XYZ?”.

I do understand where the fear and rejection comes from. Command line interfaces can be scary and intimidating at first. When you first start them, you are presented with a prompt and blinking cursor and not much else. To get started you have to look up and memorize a number of commands. You can’t easily intuit these just from the way the shell prompt looks. You need to learn the basics of the interface before you start working with it.

Graphical User Interfaces are designed to be “discoverable” – they expose buttons and controls to the user right away, and one is expected to intuit function from the design. The idea behind GUI is that you can sit a complete newbie in front of it, and they ought to be able to figure out how it works just by reading the button labels, and experimenting with the interface. Unfortunately it is not an easy task to design such an UI. Apple is pretty good at building these but they don’t get it right all the time either. Open Source projects are usually famous for notoriously bad UI choices. Unless you are purchasing software from a company that spent a lot of money or usability research and testing, chances are you will end up with a GUI that looks like this:

This is a Git front end tool for Windows. I have been using Git for a decent amount of time, and I consider myself fairly proficient with it, but I could not even begin to tell you how this tool works. It looks fairly simple – it has a few buttons, and panels, but how does it work? I don’t know. I can’t figure it out just by looking at it. There is a forest of deeply nested dialogs, panels and configuration screens hidden under the pull-down menus and the entire thing is gigantic, confusing mess. I feel like I need to read a manual just to figure out how to operate this thing. And I know git. I know what I want to do – I want to add files, commit and push. But this UI gets in my way. It doesn’t abstract the functionality as much as it hides it.

Compare it to Git Bash UI that ships in the same package as the one above:

Firstly, the interface is very clean. There is no clutter or complexity. I don’t have to deal with a dozen different Git features right of the bat. I get a command prompt that simply asks me “what do you want to do now?”. I type in “git status” to see what is the status of my repository – what files have changed since the last commit, what files were added, etc.. The shell immediately responds with a relevant message “there is nothing commit”. Clean, simple, intuitive.

I don’t know about you but I find the simplicity of the command line very zen and soothing. The GUI above baffles, confuses and intimidates me. The CLI is friendly and laid back friend I can converse with by typing in commands. I know there are better graphical front ends for Git out there, but I used this one as an example, because it is so bad. It is possible to design a good GUI but it is hard. CLI experience on the other hand is consistent – it is little more demanding at first, but you reap the rewards later.

I’m not the only one feeling this way. Richard Wareham conducted an interesting experiment back in 2001 in which he taught bunch of “computer illiterate” users to use Unix terminals without a GUI. You can read the article for yourself, but the results were interesting: his students who felt completely lost on their Windows home machines picked up bash very fast. Not only that – command line helped them to grasp concepts such as the hierarchical nature of the file system (something they did not understand before) and allowed them to customize their own environment. By the end of the class all the users were hacking their .profile files, making custom prompts, scheduling things with cron and etc.

CLI is much closer to the way we operate in real life – it is a conversational user interface. You “speak” to the computer and it responds back to you. It is the most intuitive, most natural and easiest to grasp type of UI we have invented so far.

To wit, we have been trying to re-create the CLI experience in GUI form for quite a few years now. Here is a prime example:

How is Google front page different from a shell prompt? It works around the same principles – you type something in, the machine parses it and things happen. And it’s not just search – Google has a lot of other functionality built into their site – calculator, currency checker, maps, etc.. Google UI is considered super user-friendly, while shell is scary. Why is that?

Or how do you explain popularity of such applications as Quicksilver or Launchy – which are essentially just very limited command line interfaces wrapped in flashy graphical overlays. Their function is the same as that of CLI – launch application when user types in the name. Most have plug-ins that allow other actions too. They masquerade as “search tools” or launchers, but what they really do is implement a small subset of CLI functionality while pretending to be GUI apps.

What is Apple’s Siri if not a voice activated shell? It does a lot of abstraction, yes, but the functionality is the same. People want to “talk” to their computer either via text of voice. Pushing buttons is a fairly decent interaction system – it works for quite a few things quite well. But it cannot be shoe-horned into every situation. At the end of the day, users crave the simplicity and intuitiveness of CLI.

GUI paradigm is missing that “speak or type to launch” feature. It cannot be abstracted by a menu or a dialog because these will actually add complexity rather than remove it. What is easier to use: a deeply nested menu with 500+ applications listed alphabetically, or a box in which you can type a name or function of an application, and the system will launch an appropriate one?

An average user wants CLI functionality but without the actual command line. They were told it is hard to use and scary so they will avoid it. But dress up the command line in a “search” interface or make it accept voice commands instead of written and they will be all over it.