Some of the Best Coding Tools Aren't Coding Tools
Tags: productivity, tools, gtd, coding
Published: 2017-11-28 21:41:38

---
title: Some of the Best Coding Tools Aren't Coding Tools
published: true
description: 
tags: #productivity #tools #gtd #coding
---

```
"That which hinders your task... is your task." -Sanford Meisner
```

Okay, so you've got Sublime cooking, IntelliJ is a seamless extension of your will, and [Charles](https://www.charlesproxy.com/) is watching your web traffic. QUnit, jUnit & Jenkins have teamed up and have your back like the little floating "bit" from Tron. 

Good start.

But some of the best coding tools out there aren't *specifically* coding tools. Let's talk about *those*.

**Password Manager: Test logins, addresses & credit cards.**

You're already using a password manager to hold your credentials for your dev box, test server, Jenkins, Jira, Splunk, GitHub, StackOverflow, and the dozen or so other logins you need to do your job, right? Good.

It can do more.

When I need to test with a certain type of account, I have one ready to roll in [1Password](https://1password.com/). Ditto for fake MasterCard, VISA, AmEx, and PayPal accounts.  If I need to test the international shipping form, I have addresses for Antwerp, London, Beijing, Dubai, Lima, Seoul, Harare, and Vancouver. No more copy & paste, no more typos.

No, this is *not* a substitute for actual automated testing. But it *seriously* helps when you get a note from customer service saying, "Drop shippers can't use the international shipping form! Help!"


**Snippet Tool: Code boilerplate, branch names, ticket links, etc.**

[TextExpander](https://textexpander.com), [Breevy](http://www.16software.com/breevy/), and [Alfred](https://www.alfredapp.com/) are perennial favorites in this area. [Dash](https://kapeli.com/dash) is also popular, and [IntelliJ](https://www.jetbrains.com/help/pycharm/creating-and-applying-live-templates-code-snippets.html) and other IDEs have good built-in support for snippets.

They're all good, but I like TextExpander, mostly because it has a lot of great functionality built in, and lets me use my snippets in *any* app on my machine.

TextExpander runs in the background and listens to your keyboard input. When you type a particular string, it instantly replaces it with a stored value. For example:

| I type...  | I get...             |
| ---------- | ---------------------|
| tstampx    | 2017.11.28-12.21.48  |
| todayx     | Tuesday, Nov 28      |
| yesterdayx | Monday, Nov 27       |

I also use it for typo correction:

| I type...  | I get...             |
| ---------- | ---------------------|
| retrun     | return               |
| Chirs      | Chris                |

You get the idea.


[java.text.DecimalFormat](https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html) uses the symbol **¤** to indicate where you want the locale-specific currency symbol. Do *you* know how to type a **¤**? Me neither. So I bound that character as a snippet, and now when I type **currx**, I get **¤**.

| I type...  | I get...             |
| ---------- | ---------------------|
| currx      | ¤                    |

How often do I use that? Rarely. But I *never have to look up that symbol again.*

When I need placeholder text in web pages, I just type **loremx**, and I get 200 words of [pseudo-Latin nonsense](http://www.lipsum.com/). Simple, but incredibly useful. 

The *real* magic starts when you use TextExpander to run scripts in the background and emit the output. (It'll run shell scripts & JavaScript directly.) I type **jtitlex**, and TextExpander runs a script that fetches the title of the ticket I'm working on from Jira's REST API. If I type **tlx**, I get the URL of that ticket. **tkx** gets me its Jira ID.

Why would I do such a thing? Just think back to every email you've ever received that asked, "What's the status on the frob issue?" When I get those, the first line always clarifies *exactly* what issue is being discussed, with a ticket number, title, and link to the ticket in the ticket system. That's done using a few TextExpander snippets, so it takes three seconds and I never have to switch windows. 

Part of communicating well is quickly clearing away confusion. A snippet tool is a *powerful* means of making that easier.

I have another script called [vm-boilerplate](https://github.com/craser/practical-dev-tools/blob/master/vm-boilerplate) that reads a [Velocity](http://velocity.apache.org) template file and generates some Java boilerplate for binding the necessary input values. So I just type *vmtx*, hand TextExpander the name of the file, and TextExpander then runs my vm-boilerplate script and drops the output into whatever editor I'm using. Works everywhere, less typing, no typos, no missing parameters. (Because after decades of bitter conflict, we still haven't settled the `fileName` vs. `filename` debate.)

I also have a little script called [tebind](https://github.com/craser/practical-dev-tools/blob/master/tebind) that I use to bind TextExpander snippets from the command line, or from other scripts. So snippets don't have to be hard-coded values; I can re-bind them on the fly based on other processes.

TextExpander is *far* more than just a text replacement tool. Its scripting capabilities let you automate any quick information lookup you do, or to trigger scripts that automate text generation.


**To-Do List Manager: Keep your act together.**

The choice of what to-do list manager to use, how to use it, or even *whether* to use one is a hugely individual one. If your system works, I'd never presume to tell you how to improve it. 

I use [OmniFocus](https://www.omnigroup.com/omnifocus), but there are *lots* of good options out there. For years, I used a [Moleskine datebook](https://us.moleskine.com/12-month-daily-planner-black/p0269?variantName=z1DaaFormat&variantValue=Pocket%20(cm%209x14)), and that worked great. I also used [Things](https://culturedcode.com/things/) for a while, and liked it. And there's a great note here at dev.to about [building a great system right into Gmail](https://dev.to/peter/programmers-should-be-good-at-email-too-here-is-my-guide-to-leveling-up-your-gmail-game).

For me, it's invaluable to be able to hit `Alt-space`, type in a to-do item & due date, and then get back to what I was doing. This is *awesome* in meetings. I can quickly capture all the stuff I need to follow up on without losing track of the conversation. 

And I don't just put *my* to-do items in there. I also enter items like "Expect data flow chart from Thor" with tomorrow as the due date. That's my reminder to check in with Thor if I don't get that chart I need.

And once it's on my to-do list, I *completely clear my mind and get back to what I was doing*. OmniFocus remembers all my tasks and due dates so I don't have to.

In general, I'm a [Getting Things Done](https://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity/dp/0142000280) guy. Use whatever philosophy/method works for you. If you haven't seen [Randy Pausch's lecture on Time Management](https://www.youtube.com/watch?v=oTugjssqOT0), stop reading this article and go watch it. It'll be time *very* well spent.

**Application Switching & Automation**

Here, I like [Alfred](https://www.alfredapp.com), but there are free options out there that are just as good. (I use Alfred for other stuff too, so I've elected to pay for the license. I have it, so I might as well use it.)

I have a set of keyboard shortcuts that launch or switch focus to particular apps. `Cmd-Shift-Ctrl-J` pulls up my browser. `Cmd-Shift-Ctrl-K` pulls up my IDE. `Cmd-Shift-Ctrl-L` opens Terminal. I like this *much* better than `Cmd-TAB`. It lets me switch apps purely by muscle memory. (Also: yes, I have **chordx** bound in TextExpander to `Cmd-Shift-Ctrl-`.)


**The Big Picture**

Ultimately, all of these tools are about clearing away organizational and mental clutter so you can focus your attention instead of being constantly pulled into the weeds. 

When faced with any hindrance, there are two solutions. One is to sidestep the problem and make it irrelevant. The other is to get so good at dealing with it that it stops being a hindrance and becomes an advantage.

When I first started taking CS classes, I'd hear classmates say things like, "Why do we have to use cvs? Why can't we just keep a copy of the project on the network drive? That should be fine, right?" Having to check files in and out, deal with merge conflicts, etc, felt like a hindrance, and they were tempted to sidestep it. 

But we all know that having a version control system is *so much better* that it simply never comes up for discussion on real software teams. The right solution is to get good at using git/hg/svn that we can reap the benefits with minimal pain. 

Effective coding rests atop a foundation of general-purpose organizational and communication skill. If you find yourself constantly pulled away from productive work to spend time on housekeeping stuff, shaking your fist at the sky won't help. What *will* help is getting really good at that housekeeping stuff so that it doesn't pull you into the weeds any more.