rainier ababao reads and writes

Optimizing your iteration speed

One Quora answer that’s really stuck with me for the past few months is Edmond Lau’s answer to “What are the things required to become a hardcore programmer?” The entire answer is solid, but this is the part I will focus on:

4. Optimize your iteration speed.

Say it takes you 12 seconds to search and navigate from a function call to where it’s defined. And suppose you have to do similar navigations 60 times per day. That’s 12 minutes per day spent navigating files. If you learn enough keyboard shortcuts in your text editor to navigate to a file in 2 seconds instead of 12, then over the course of a day, you’d save 10 minutes. Every year, you’d save an entire 40-hour work week.

Find 3 more similar optimizations, and you’d save a month. Imagine what you could do with an extra month per year.

Or suppose that you’re fixing a bug that requires you to start the app and then navigate through five screens to set up the right conditions to trigger the bug. Could you spend 10 minutes to wire it up so that it goes to the buggy screen on startup? You’d be able to iterate significantly faster on that bug with a small initial investment.

Systematically ask yourself, “How can I iterate faster?” The payoffs will be enormous.

One of the payoffs, not explicitly mentioned, is that decreasing your iteration time will lower your chances of emptying your mental “cache” or “stack” of things to do, i.e., getting distracted, while you’re spending time on minor, unnecessary context switches.

I’m a student currently at my second software internship. As someone who’s been developing stuff for just a little under two years, I’m not the fastest, but I’ve still managed to accumulate a list of small, medium, and large techniques that speed up my development. I feel like adopting every technique possible (like learning how to use the Dvorak keyboard, for me) would be impractical, so these are the ones that keep me fast but sane. It also goes without saying that different tricks will work for different people, so I hope my tips are general enough for most budding developers.

(By the way, most of these work best if you work in a Unix environment. Most of my work these days is done on OS X and when I’m ssh’d into Linux boxes.)

Small things

Select all/copy/paste (well-known)

[Cmd-a]/[Cmd-c]/[Cmd-v]

Quickly navigate and select text

Using keyboard shortcuts such as [Cmd-Left/Right]+[Shift-Cmd-Right/Left] to highlight a line. Experiment with these!

Get to the beginning of a line in the shell

[Ctrl-a]

New tab/Close tab in most programs that have tabs

[Cmd-t]/[Cmd-w]

Issue the last command in sudo mode

sudo !!

At first, I thought it was a funny alias my mentor made, as in, “sudo, darn it!”. But !! (read: “bang-bang“) is a great thing to know!!

Launch Sublime Text from the command line

If I’m not using Vim or MacDown, I open up Sublime like so:

subl README.md

You can either add an alias to the Sublime app in your shell profile or add a symlink to it in one of the /bin folders of your PATH.

More: Stack Overflow link

Take advantage of Spotlight (or Alfred)

It takes me less than a second to launch the most-used applications on my desktop. To do that, all I have to do is type [Cmd-Space] anywhere and the first few letters, if not just the first letter, of the application.

Medium things

Use oh-my-zsh

Oh My Zsh is an easy-to-install framework for installing and managing zsh, an alternative shell to bash. The most useful feature for me is its fast autocompletion and ability to simply tab through autocompletion results. It also makes your shell look fancy :)

More: Difference between bash and zsh

Use a good .vimrc if you use Vim

I’m pretty lazy and use the one by “amix” out of the box. If I cared more to study Vimscript, I could roll my own and be an 3l33t h4x0r, but this will do.

More: The ultimate vimrc

Add stuff to your .bash_profile/.bashrc/.zshrc

alias workonproj="ssh -t rainier.ababao@xyz.example.com 'cd ~/project_directory; bash'"

It’s quite nice to open up the shell and type in a short alias to ssh into a server.

export GITPAT="xyz"

If I have GitHub two-factor auth enabled, I’m required to use a “personal access token” to authenticate pushes if I cloned by HTTPS instead of SSH. In that case, I can just echo $GITPAT since it’s an environment variable in my private shell profile, and copy-paste it whenever I have to authenticate. However, I stopped doing this when I learned about triggers for my terminal…

More: Learning the Shell

Take advantage of iTerm2

For command line work, I use iTerm2 instead of Terminal. There are a lot of great things about it, and one of them is triggers. A trigger is a regex that iTerm2 listens for, followed by an action, like automatically entering text as if the user had typed it in themselves. I have a trigger set up so that when \[sudo\] password for rainier.ababao appears, the password manager opens and I just press [Enter] for iTerm2 to put in my password.

More: iTerm2 triggers

Large things

Improve your words per minute (WPM)

Learn to keep your fingers on the home row and touch-type! It will be slow at first, but you’ll see gains from 40 WPM to 100-120 WPM within a few months if you practice every day. That’s at least doubling one’s typing speed!

(Edit: This isn’t to suggest that efficient coding has much to do with how fast you can type, but rather that this reduces the repetitive task of looking for unnaturally-placed characters on the keyboard.)

Some fun: play.typeracer.com

Master a text editor

I started forcing myself to use Vim last year and have since gotten faster editing with it than with any other text editor. Vim comes installed with vimtutor, a classic interactive tutorial for the editor.

The common thread in a lot of these micro-optimizations is keeping your fingers on the keyboard and away from the mouse.

What are your favorite optimizations? Feel free to DM or tweet @rainieratx with corrections and suggestions.