The Value of Customizable Tools
As a young programmer just starting my career, I drew heavily from Gary Bernhardt’s video series Destroy All Software. I owe a tremendous amount to these videos, but the most immediate impression you get from watching those videos is his masterful use of Vim and the Unix shell. To my untrained eyes, Gary might as well have been a wizard: flying through files, slamming down code almost as fast as he could speak… It was magical.
I’ve been a happy Vim and Unix user myself for probably six years now, thanks to Gary. Over the past year or so, I’ve extended the lessons I took from Gary’s workflow beyond just managing my code base. I’ve switched to a fully programmable desktop environment (built around Sway) and web browser (Qutebrowser) as well. I really love working this way, but it’s definitely not the right choice for everyone. After reading this, you will understand why it’s such a great fit for my type of work and whether it would be a good idea for you too.
Invest now, reap later
Programmers all know Vim has an infamously steep learning curve. Still, its fans will defend it (sometimes to a fault). The time it takes to learn pays off in the long run. Of course, not all time-saving tools are worth the investment, but for a tool you use hours and hours per day, the time savings are significant.
To me, however, the biggest benefit I feel from using Vim is that there is very little impedance between my thoughts and the text in my editor. For example, if I want to globally substitute “this” for “that” in a file, I simply type :%s/that/this/g. If I want to change the content of a quoted string, I type ci”New quote. Notice how closely the commands map to my intent:
|Change a quoted string||ci”|
With practice, this translation from intention to key press becomes second nature. Like learning to speak a foreign language, it takes time, but eventually you can perform the translations without thinking about it.
You can’t do that with a menu-based UI. Navigating menus is slow. It requires moving your hand to your mouse. It forces you to read. It disrupts your thoughts in a way Vim does not. This is the real value of using efficient tools: they get out of your way.
What processes are worth the investment?
As a web developer, I usually spend at least eight hours a day at my computer with my text editor and browser open. I work remotely, so email, text chat, and video conferencing are crucial to me as well. Finally, I have music playing pretty much any time I’m not in a meeting. So for me, these aspects of my workflow are the most valuable to optimize (roughly in order):
- Text editing
- Source code management
- Web browsing & debugging
- Text & video chat
- Music management
If you work differently than I do your list may be different than mine, but the principles will apply just the same: optimize first what you do the most.
There are, of course, lots of ways you might optimize your workflow, but choosing the right tool will probably get you the best bang for your buck. The key thing you want to consider in making your choice is programability. Programs that can, themselves, be programmed (or at least deeply configured) allow you to tailor their workflow to your precise desires.
For example, in Vim I have shortcuts for opening the corresponding unit test file for a production code file and vice versa. This shortcut has to know how my files are laid out on disk in order to work. They won’t work in a project that uses directory structures I haven’t accounted for. But they work for my code bases, and that’s all I need.
Like a well-fitted suit, it works amazingly for me, even though it may not work for you.
This is only possible because Vim is so customizable and programmable. There are other text editors that are similarly customizable (Emacs comes to mind). The point isn’t that you should use Vim; the point is that you should use a tool that gives you power and control.
This goes equally for other tools in your stack. Many window managers will give you similar power and control over your desktop environment. I use Sway because I have two monitors with different DPI settings and Sway handles that quite well, but there are lots of other great options. Any highly programmable environment will do.
Here are some of my recommendations if you want to dive in, but don’t know where to begin:
- Vim or NeoVim
- Emacs or Spacemacs
- Sway or i3 — a good introduction to tiling window managers
- AwesomeWM — another good starter tiling WM
- OpenBox — if you prefer stacking windows to tiling
- bspwm — if you appreciate simplicity
- xmonad — if you know or want an excuse to learn Haskell
- dwm — if you’re a masochist
- Qutebrowser — a popular option, written with QT
- Luakit — if you prefer GTK to QT
- Neomutt — the popular, well established choice
- aerc — more modern, but very new and sometimes unstable
- IRC — most easily programmable
- Matrix — more modern features, programmable with bots and webhooks
Note: I do not recommend proprietary chat solutions like Slack because API access is often limited on free tiers.
- Mopidy and NCMPCPP
What are my custom-tailored workflows?
I’m going to leave this question for future posts. Each tool I use is worth digging into on its own. Until then, I hope this post has sparked your own imagination! Let me know @firstname.lastname@example.org how you custom-tailor your workflow.