Text UIs and the problem of discoverability

August 25, 2019

After setting up GNU Emacs to use LSP for Go and Python, I've been digging into what I can do through lsp-mode by doing things like finding out keybindings and reading up on features. One of the questions I wound up asking myself was if I was ever going to use various of these features, or whether they'd suffer the same fate as a bunch of Go programs and Emacs packages I had installed for similar purposes but then never used, such as gorename (which is directly supported by go-mode).

Part of my problem here, both in the past and today (with things like git-timemachine, which I have installed because of an interest of mine), is simply remembering that these things exist and how to invoke them. I don't do tasks like renaming Go identifiers or paging through the past versions of files in git frequently enough to remember these things off the top of my head. In fact, I didn't even remember that I had some of these Go Emacs addons installed until I switched to LSP based Go editing and had to revisit that area of my .emacs.

My outsider's impression is that I wouldn't have as much of this problem in a full bore GUI IDE, simply because with a GUI there's a lot more places to put reminders that things exist (and many of these reminders can be contextual, which cuts down how many are shown by excluding inapplicable ones). Mouse-driven GUIs also offer a larger set of options for how to interact with the program and expose things; you have text input, just like a text UI, but also mouse buttons popping up menus, hovering the mouse over things, and so on.

(Of course, a GUI can make bad or limited use of text input, and GNU Emacs can to some extent make use of the mouse and of GUI elements if you're running in the right environment. That GNU Emacs has a 'LSP' menu of things you can do with lsp-mode is actually quite helpful; I probably wouldn't remember the M-x invocations for half of them, much less know that they're possible.)

People have written some GNU Emacs packages to help with this, such as which-key (which I'm now using). But I think it's a genuinely hard problem in a text UI; there's only so many places to put things and prompt people, and you can't do it too often or your UI is far too busy. My GNU Emacs setup probably has hundreds of useful things I can run with M-x under various circumstances, but I'm extremely unlikely to discover them through ordinary use or know where to look for them in the way that I might learn to check, say, a mouse button popup menu in a GUI IDE.

(Similar issues apply to vim, of course. There are tons of useful vim commands that I don't know or can't remember; every so often I discover a new one, and sometimes it sticks.)

PS: I think that good text UIs are often great for experienced regular users, because their constraints push them towards efficiency and direct invocation of things. If you can remember all of the vim commands or GNU Emacs keybindings and M-x functions, you can do a lot very fast, and if you use vim or GNU Emacs all the time for something you'll wind up remembering all the things you use.

(This is related to but not quite the same thing as how custom interfaces benefit people who use them regularly, while standardized interfaces help infrequent users.)

Comments on this page:

By Greg A. Woods at 2019-08-28 21:42:44:

LSP seems way over-kill to me.

I have though just recently started using the new-ish Emacs Xref tools with GNU GLOBAL. This is wonderful! I can now find indentifiers across a large code base (in C) in very short order. The only thing I greatly miss is completion, but I think that's just because I haven't learned whatever might be the new key combinations to invoke it.

I haven't considered the issue for Go much yet, mostly because the extent of our Go code is still isolated to several very independent small programs with no interlinked dependencies.

Very much agreed! Text UIs are great for some reasons (easy to use remotely, tend to be fast, optimised for power users) but discoverability and consistency (between programs) isn't one of them. I tend to prefer simple GUIs but those are rare.

Written on 25 August 2019.
« Apache, Let's Encrypt, and site-wide reverse proxies and HTTP redirections
A lesson of (alert) scale we learned from a power failure »

Page tools: View Source, View Normal, Add Comment.
Login: Password:
Atom Syndication: Recent Comments.

Last modified: Sun Aug 25 22:15:00 2019
This dinky wiki is brought to you by the Insane Hackers Guild, Python sub-branch.