"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 is watching your web traffic. QUnit, jUnit & Jenkins have teamed up and have your back like the little floating "bit" from Tron.
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. 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.
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...|
|todayx||Tuesday, Nov 28|
|yesterdayx||Monday, Nov 27|
I also use it for typo correction:
|I type...||I get...|
You get the idea.
java.text.DecimalFormat 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...|
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. Simple, but incredibly useful.
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 that reads a Velocity 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
I also have a little script called 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, but there are lots of good options out there. For years, I used a Moleskine datebook, and that worked great. I also used 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.
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 guy. Use whatever philosophy/method works for you. If you haven't seen Randy Pausch's lecture on Time Management, stop reading this article and go watch it. It'll be time very well spent.
Application Switching & Automation
Here, I like Alfred, 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
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.