As developers, we spend a ton of time typing, so any small improvements in speed or comfort are well worth it.
If you’re anything like me, then you spend a full day typing at work only to come home and continue typing into the wee hours of the morning. With so much of my life spent typing, things like RSI are a serious concern. I’ve tried a variety of different ergonomic keyboards and I’ve even switched to Dvorak, but none of it made any significant difference in speed or comfort.
In my search for alternative text input methods, I discovered stenography. In this blog, I will give an introduction to stenography and how programmers (like me) have implemented it in an effort to make typing more comfortable and efficient.
Stenography has been around for over a century, mostly being used by court reporters and closed captioners who need to be able to transcribe human conversations, which can reach upwards of two hundred words per minute. Unfortunately, in the past, this industry has been plagued by expensive, proprietary hardware and software; it was certainly not feasible to use as a general input method for programming or writing emails.
The idea behind stenography is simple: instead of typing individual letters of each word, you type entire words or phrases at a time using chords.
Think of chords like keyboard shortcuts, except they have phonetic mnemonics, so most words are intuitively typed without having memorized anything.
A real stenotype machine has 22 keys. Each key is assigned a common phoneme (a specific sound created by the human voice), and additional phonemes are assigned to pairs of keys which can easily be pressed together with one finger. To chord a word or phrase, a combination of these keys is pressed and released at the same time.
This offers a lot of speed and flexibility. Everything from phrases, programming syntax, traditional keyboard shortcuts, or emoji could be assigned chords with mnemonics which are easily memorized.
I’ve found programming with steno to be excellent. It definitely takes some getting used to (even from normal prose writing with steno), but it offers a lot of benefits.
As I said earlier, language syntax can be assigned chords. This acts almost like code snippets, except without the need to remember the exact name of the snippet. Temporary chords can also be assigned to local function or variable names. Keyboard shortcuts can be given mnemonics based on what they do, which has led to me using the full power of my IDE without memorizing nonsensical shortcuts.
Unfortunately there are a few caveats about what keyboards can be used for this purpose, as the keyboard needs to be able to report arbitrary sets of keys being pressed at the same time.
Have you every tried playing a complex game on an old USB keyboard and realized you couldn’t press more than a few keys at the same time, or worse, random other keys would mysteriously be triggered when that happened? This is known as ghosting, and it can be tested for here.
There are keyboards that don’t suffer from this problem because they have a special feature called N-key rollover. They’re usually marketed as gaming keyboard, because that’s their main use case (that, and Emacs users). Most PS/2 keyboards will also work, if you happen to have one of those laying around. If you choose to use a keyboard longterm, getting keytoppers or custom keycaps are well worth it.
Another option is to get an actual steno machine which will interface with your computer over a variety of protocols. You can read all about supported hardware and see keytoppers and keycaps here.
I personally decided to get an Ergodox EZ. It’s a little expensive, but it’s an excellent all around keyboard. It’s a split keyboard, which makes it very comfortable to type, and it’s based on the QMK firmware, meaning it’s completely programmable. Used as a typical keyboard, it has a pretty cool mapping layer system and an interesting layout.
Being programmable, the layout, mapping layers, and macros can be used with any computer it’s plugged in to, regardless of software. The best part of it being programmable though is its ability to emulate the TX Bolt protocol. So, by tapping a button on my keyboard, I can switch between dvorak and steno. You can see this keymap and others here.
This has proved to be a great setup. I can type with steno normally and switch to my ergodox layout to do stuff like move the mouse around or press media keys to control music. Over time I see myself using steno for almost everything, as I assigned chords to media keys and keyboard shortcuts, but it’s been great to have this quick fallback.
One thing to keep in mind when choosing a keyboard is the switches. Normal stenotype machines require very little pressure to actuate the keys (~15g), but normal mechanical key switches take anywhere from 45g to 70g. I personally chose my Ergodox with Gateron White switches which have a 35g actuation force, though looking at their website now, it appears they’ve switched to Cherry MX switches with the Brown 45g switch being the lightest.
Anything can work, but the lighter the better for steno. Though if you intend to use it as a typical keyboard, heavier, or maybe even clicky, keys might be desired.
Plover itself is a small python application which runs in the background, translating either keyboard or steno protocol input into key presses.
This means it can be used in any application, from Microsoft Word to Emacs. This is also where chord dictionaries will be managed and new mappings will be assigned. Plover also has an online demo, if you want to see an example of steno in your browser.
This certainly isn’t for everyone. It’s a huge time investment which requires regular practice, not unlike a musical instrument. I’ve started to see the benefits and future potential myself, though I’m a long way from what I’d consider efficient.