Command line interfaces are two edges swords.
The purpose of a GUI is to make explicit what actions are available to the user. Command line interfaces use implicit knowledge. Implicit knowledge is more powerful in almost every way. Since it allows a much richer set of tools and the ability to combine tools, in a way that is not possible in a GUI.
The issue with command line is that it requires significantly more investment of time and knowledge learning the implicit tools.
And yet, command-line commands are much more explicit than a click or drag in a GUI, which depends on all the implicit state in the rest of the application.
Really, in both cases, some things are implicit and other things are explicit, these aspects really don't set the two worlds apart. But trying to teach or instruct someone, it's much easier to communicate a specific command-line command, than explain where to click / drag (especially when GUIs are re-designed all the time).
Very good point. Both of you. CLI have zero discoverability (even with good completion, you're greeted with a vacuum, for a newcomer that's very weird). GUI are far too stateful and coupled.
Somehow ipython notebooks are a nice attempt at blending both. You have an easy linear visible state, yet you compose words.
A good double-tab auto-completion in a CLI gives explicit boundaries and flattens learning curve almost to the GUI level, while letting you retain full flexibility and expressive power of a CLI.
This work wonders in systems where complete set of commands is (semi-)fixed, like Cisco IOS CLI. *nix CLI is somewhat behind on this front, unfortunately.