Tools Of The Trade

When I first started writing code, I was curious to see what a professional software developer’s setup looked like. After making that jump and spending a great deal of time thinking about the tools I use to support my workflow, i’m happy to be in a position to share this information with you.

As I took a step back to think about this topic, it reminded me of a Steve Jobs interview I watched many years ago, here’s an excerpt:

“I read a study that measured the efficiency of locomotion for various species on the planet. The condor used the least energy to move a kilometer. Humans came in with a rather unimpressive showing about a third of the way down the list … That didn’t look so good, but then someone at Scientific American had the insight to test the efficiency of locomotion for a man on a bicycle. And a man on a bicycle blew the condor away. That’s what a computer is to me: the computer is the most remarkable tool that we’ve ever come up with. It’s the equivalent of a bicycle for our minds.”

It’s a fascinating description of the personal computer and it really cemented this idea in my mind - humans are tool builders and we use these tools to magnify our abilities.

You could write books on this topic and it’s application to software development. In the interest of brevity, I will leave out discussion of programming languages and libraries here, instead I will focus on the tools that help you write code [1].

Developers are generally quite passionate about this subject and I have never seen two developers with the same setup. Ultimately I think it’s about finding out what works for you. I think my setup is fairly minimal without too much customisation, you could probably replicate this within an hour.

It’s great to learn about new tools that can make you more productive so please feel free to share your favourite tools in the comments!

Machine

For completeness I thought I should mention that you are not going to be able to write software without a computer (who knew, right?). Most modern computers have sufficient performance for building web applications so you probably only need the top specs if you are regularly doing computation on extremely large data sets. My general advice would be to follow the crowd and use whatever machine the majority of the community uses for your chosen language(s). i.e. if you are building iOS applications, there are ways around it, but your life will be far easier if you are working on a Mac!

I use a 15” Macbook Pro. Once you are past an inital learning curve OSX is very intuitive. They are expensive but when you consider the fact this is a device you use for hours daily, I think it’s not such a bad investment.

OS Settings

Keyboard

  • This is Mac specific but I expect there are similar settings on other Operating Systems. If you spend a lot of time navigating with the keyboard then you will want adjust your keyboard settings for Key Repeat (set to fastest) and Delay Until Repeat (set to shortest). These minor navigational tweaks definitely add up.

Screen

  • I would highly recommend installing Flux, it adjusts the colour settings of your screen at night so that your screen essentially looks warmer. I find it helps prevent eye soreness when working on something late at night. Also there are many studies that report the default ‘blueish’ light of the screen can distrub your sleep by supressing melatonin (the chemical your body produces to let the body know it’s time for bed).

  • Another setting I have found useful within the operating system is to Invert Colors. This makes it easy to read online documentation and PDF’s late at night by switching to a black background with white text. You can find this option System Preferences > Accessbility > Display > Invert Color.

Text Editor

This topic is the usually the catalyst for a flamewar: Vim vs Emacs vs Textmate vs Sublime vs Atom vs Notepad++, IDE vs Non IDE and on and on…

In my case I don’t use an IDE, my first programming language was Ruby and Textmate was the most popular editor. I then moved on to Sublime and now currently use Atom. I’ve never felt the need to move to an IDE but I will probably try one of the JetBrains products at some point just to compare the difference. Similarly, I am interested in using Vim keybindings within Atom to see whether that adds a speed boost.

With version 1.0 I think Atom has just surpassed the level of Sublime and with the vibrant package ecosystem it will only continue to get better. Here are the Atom features and packages I use most often:

Key Bindings

  • CMD-D - Press it multiple times on a word and it selects them all giving you multiple cursors. Easy when you want to rename a variable.
  • CMD-L - Highlight a line of text
  • CMD-X - Cut a line of text
  • CTRL-CMD-Up or CTRL-CMD-Down - Move a line of text up or down
  • CMD-[ or CMD-] - Indent a line of text left or right
  • Option-Down - Press multiple times to select a column of text
  • Shift-Option-Right - Press multiple times to highlight text, one word at a time

Packages

  • UI Theme - Atom Dark. When staring at the screen for hours I find that a dark background is much softer on the eyes.
  • Syntax Theme - Tomorrow Night Eighties. I’ve been using this theme for years now and still haven’t become bored of it. Again it’s colourful but soft on the eyesight so you don’t strain between the contrasts.
  • Autosave - Pressing CMD-S every time you wish to save a file is a waste of time if like me, you usually want to keep the changes you have made. In the exceptions you don’t want to keep the changes, just hit CMD-Z n times within the file :-)
  • Autocomplete Plus - Autocompletion options as you type, I just turn this on for variables and words that have already been used rather than language snippets otherwise the choice can be overwhelming. This helps prevent pesky spelling bugs from creeping in.
  • Linter - Linter is really useful, especially when you are learning a new language and there are plugins for most languages.

Version Control

Version control systems are essential for keeping track of your work and enable you to freely build new features without affecting other developers on your team.

I have always used Git and while there are other options I haven’t really felt the need to explore them because it works so seamlessly. Git allows you to work on separate branches so your work is independent of others, commit changes to your code on your local machine and then publish them to a public or private repository. When your changes are ready to be integrated with the main codebase (usually the master branch) you can then merge your branch to master.

Atlassian has some great documentation to help you understand the core concepts and Github or BitBucket are common choices for storing your work.

Terminal

  • iTerm2 - I like having split panes within a single tab so I can see everything going on at once and you can do this just by pressing CMD-D. To close a pane hit CMD-W. You can switch left and right between the panes with CMD-[ or CMD-] and toggle a full screen pane with CMD-Shift-Enter.
  • Alias’ - I think these are really important for tasks that you do regularly. I would rather type gp than git push all day. Of course you need to be wary about making adverse operations easy to execute but in practice I have not found short alias’ to be an issue. Here’s a simple bash profile with a bunch of alias’ which you can add to ~/.bash_profile

Other Desktop Applications and Browser Plugins

  • Spectacle - Let’s you use CMD-Option to position and tile your windows anywhere on the screen. Great for Mac which does not have a native window manager.
  • Quicksilver - Setup key triggers so you can quickly switch between your desired windows. CMD-Tabbing to the screen you need wastes time, and adds cognitive overhead. I use the seemingly useless § character in the top of the mac. § switches to Terminal, CMD-§ switches to Google Chrome and Option-§ switches to Atom. Fast and simple.
  • Timeout - I usually forget to take regular breaks from the screen so this app provides handy little reminders at scheduled intervals (which you can configure).
  • GasMask - Switch between different hostfiles. Useful when working on different projects or when you want to focus you can create a GetFocused hostfile which contains a list of domains that point to localhost e.g. 127.0.0.1 news.ycombinator.com preventing you from accessing them.
  • Postman - Great for constructing HTTP requests to test out APIs.
  • EditThisCookie - Let’s you edit cookie values easily within the browser to test out the impact of different values.

Monitor

Having a 15” laptop means that I don’t always need a monitor so I don’t personally own one but I do use one at work and I think it’s essential when you are working on a complex project. The nicest one I have used is the Apple Cinema Display and they are due for a Retina update so given a choice, that would be my top pick.

Headphones

I find headphones are a necessity in open plan offices where noise/interuptions are common and you need your own space to think. These ATH-M50X’s are the best I have found at a reasonable price level. The sound quality is great and they are over-ear so they have decent protection against outside noise. I highly recommend them.

Conclusion

Hopefully you found this useful, I will continue to update it over time and as my choices evolve and definitely let me know your favourite tools in the comments over on Hacker News! :-)

Sidenotes

[1] However, this is something I will revisit in the future because I wouldn’t be surprised if programming language and library choices have the biggest impact of all on productivity.




Jack Hoy

Jack Hoy

Software Engineer thinking about intelligent systems, lean startups & well-being. Sharing my findings with you here!