"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.
TextExpander, Breevy, and Alfred are perennial favorites in this area. Dash is also popular, and IntelliJ 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...|
|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.
Top comments (18)
I can't express in words how much I take from this article, so thank you for taking the time to explain your tools and how you use them (with pretty good examples) and delivering it here!
I am constantly curious how other people manage themselves and honestly I used a lot of tools and sticked with Evernote so far. But your usage of TextExpander got me thinking and I will definitely give it a try!
Wow! I'm glad you got something out of it! Thanks!
I used Evernote briefly a few years back, and it's a great tool. I've been meaning to give it another look and see how it's changed/grown.
TextExpander happens to be my favorite, but it's not the only snippet tool out there. If you find something else that you like (especially if it's free) let me know!
Sure I will let you know!
Just out of curiousity: did you manage to do something in pure JS?
I can embed momentJS and stuff, but did not find a standalone JS library that does not use the "window" object, since this is not available in TextExpander.
I'm on a Mac, so I tend to write stand-alone shell/ruby scripts, and then just call them from TextExpander.
Now you've piqued my interest. Gonna have to play with this a little bit when I have time. I'll let you know what I find. :)
That's my issue at the moment, I did not manage to use XMLHttpRequest yet. I will also try to solve this and will keep you posted :)
For remote developers I would also add voice/video recording tools.
It can be of so much help if you have a lot of voice communications and need to go back to them.
I have shared it here, how it helped me working remotely.
That's a great suggestion! What specific tools do you use?
I usually use HyperCam, but for sure you can find a lot of others that will suite you better.
Okay, fine, you can be my hero.
No! Be awesome! Share what you know! Write fun articles! Be your own hero!
This is extremely well-written, Chris. Thanks for sharing. I would add that two of the most effective development tools I know are pen and paper. If I try to sketch a system out in ink, I'll find out really fast what parts I don't understand.
Wow! Thanks! I'm glad you liked it!
Yeah, pen & paper are time-honored tools on my desk. Excellent point! I also find that sketching it out on paper really helps clarify my thinking.
Thanks for reading!
tcpdump + wireshark
Nice writeup, this is exactly what having a personal computer is all about, fine-tuned for it's owner to be as powerful as possible. I would add that taking the time to have an ergonomic setup is also a great way to ensure your staying productive. I use a trackball mouse and split keyboard to ensure that while I'm getting my work done I'm not hurting myself. Can't be productive later if my wrists are in pain.
Thanks for sharing
I'm definitely going to have to try out some of these text expansions. I've always bound things like my email address to a hotkey or expansion, but your examples are now giving me all kinds of ideas!
Awesome! That's what I was hoping for! It's an amazingly powerful and flexible tool. I've used it for everything from git & Jira-related stuff to recording my cycling workouts. Let me know what you end up doing with it!