Hacker News new | comments | show | ask | jobs | submit login
Ask HN: What tool makes you most productitive?
59 points by JoelMcCracken on Nov 12, 2009 | hide | past | web | favorite | 101 comments
I believe that learning certain tools can make a programmer much more productive. What knowledge about tools do you have that makes you more productive?

Aim your advice toward a competent *nix user who knows a little about everything, but doesn't know anything in any real depth.

* Bash shortcuts. Learn ^l, ^r, ^a, ^e, ^w, the substitution syntax (^one^two), bang commands (!cmd, !!, !!:0, !!:1, etc)

* Learn a good text editor well. I use vim, but learn whatever you feel comfortable in. Just make sure it doesn't stand in your way.

* Learn the core unix commands and use them often (tail, sort, uniq, tee, pushd/popd, etc)

* Use a configuration management tool (I use puppet, some people like cfengine, there's also chef)

* The second you see yourself doing something for the third time, script it (It goes without saying: learn a decent scripting language well)! Keep typing same long command? Alias or macro it. I can't stress this enough.

* Automate builds, tests and all doc generation. Don't repeat yourself. Use your downtime to reduce repetition. See what can be scripted.


* Keep everything in source control. Have a 'misc' repo and if you're starting to work on a script just to do some basic maintenance, add it to repo and keep it up to date. You never know when it will grow beyond a toy and you never know if you might break its functionality by messing with it.


What really keeps me productive is liking the work I'm doing. Nothing else comes close.

Not to shamelessly plug a YC-funded startup, but with regard to source control, I've found Dropbox (https://www.dropbox.com/) a good solution. Granted, it's more GUI-inclined than SVN, Git, et al. I've read there are CLI interfaces with it, but haven't looked into any myself.

Does Dropbox have any sort of versioning?

Yes actually.

Also, after getting my laptop bricked by the Ubuntu 9.10 upgrade I recovered my entire project from it.

You have to go pretty far out of your way to have an OS update render your user data inaccessible.

Emacs. Kudos to an univ professor who made jokes of anyone who was not using it. He used to say we'll be using emacs for decades if we really invest some time learning it. He was right.

A REPL for any language used atm. Cool if coupled with the above.

REPL/shell history with incremental search, like readline. This is the most powerful single feature I use. Hitting Ctrl-R and typing usually 2-3 keys gives me back the previously entered line I intended to find. If your REPL doesn't have it embedded, use rlwrap. Look at -H option to control where your history is saved exactly. Use big history size if you want to be reminded what you typed months ago - having 10/100k of history entries doesn't hurt really as it's still quick.

Tab completion is cool as well. For rlwrap you can pregenerate keywords for completions (eg. your favorite libraries) and it will add completions for terms entered during current session.

A good SCM for tracking changes even if working alone. I find centralized ones annoying; hopefully we've got Darcs & Git, both awesome.

Using multiple desktops/workspaces to try new ideas in a space which doesn't clutter your current visual, so you don't waste your time rearranging it.

Pen & paper. A habit of using it to get some distance. You can always scan a sheet of paper if needed. I know not every boss is going to accept such scan as a documentation ;), but preparing deliverable docs is something different than making useful notes to yourself.

Lack of running IMs, MUAs, popup calendars and other disturbances during coding. All that stuff can wait. The focus is everything. One exception is when you do remote pair programming, then some VoIP app is handy. OTOH not many people work this way.

A sign of a good tool is when you still enjoy using it after, say, ten years. Most of the above apply here.

[edit: I meant MUAs not MTAs of course]

A bit of a cliché but: Emacs. (Or alternatively vi since that can be plugged into most things as well.)

As a software developer on *nix I spend a lot of my time manipulating text: code, e-mail, news, forums, documentation, etc.

I can do all this from Emacs which is its greatest strength for me. It might not have the latest and greatest editor features but generally it'll quickly pick them up (within weeks, months or a year someone will have written an Emacs version and I've also written them myself).

So I don't have to suffer all kinds of different programs for doing the same activity: manipulating text. Usually all those programs (web browsers, text editors, word processors, news readers, e-mail clients, etc.) only contain a subset of Emacs' powerful editing features.

It is also available for a lot of different platforms.

emacs doesn't have the latest/greatest editor features?

It isn't always the first to have them. Sublime Text's high level navigation took a couple of days to surface in Emacs.

Hm, but it doesn't really do that.

My brain.

It's amazing how much time you can save if you analyze the problem a bit more deeply. It's much easier to use the correct algorithm/implementation if you truly understand the problem.

I would have to agree here. The productivity gains are remarkable when one takes the time to think a little bit before typing, or learn more keyboard shortcuts for Emacs/Vim, or be able to apprehend a holistic view of the application and problem domain.

A second note: Emacs is the one piece of software that makes me the most productive.

I would have to agree with thinking as well. When I first started programming I would just brute force my through whatever problem. After some years I realized that the 3rd or 4th iteration of something was commonly the best solution and the rest were crap. Then I realized I could skip the coding for iterations 2 and 3 and just think about the problem a little harder, and go do some reading about it. Thinking works and it saves me a lot of time and frustration. Learn an editor Emacs or Vim. I like Vim. Learn a scripting language Perl or Python. I like them both, for me Python gets the edge.

Pen and paper help, too.

The Feynman Problem-Solving Algorithm: (1) write down the problem; (2) think very hard; (3) write down the answer.

agreed. a whiteboard helps, too!

Or a blackboard. I love chalk!

Deeper analysis can help, but I have found I often get better returns from forcing myself to simply contemplate a problem shallowly and more broadly for a while before I start digging. Taking the time to make sure you are analysing the right problem.

  echo " news.ycombinator.com" >> /etc/hosts

Two things: Emacs and pen-paper (yes, the old-fashioned paper notebook and a pen).

Eulogy follows:

Emacs has helped me eliminate software clutter. Seriously. Computer and software maintenance is a major productivity killer for me. Install this upgrade, update this app... I really hate that process, and even Mac OS does not hide it behind the scenes.

Emacs and org-mode helped me get rid of my mess of "productivity" apps, which also means less thinking about which app to use for what. It helps that Emacs just helps me bend text files into my thought flow, and I don't have to adapt to Productivity-App-Of-The-Day's model of anything. To-do lists go into an org-mode file. Latest thoughts about work can go into a an org-mode file. I can slice and dice them and write them as free-form or as organized as I want. It's immensely liberating. It helps that I don't have to worry about a proprietary file format biting the dust.

I just tried Org-mode and it looks really promising. I've been Omnifocus user for a while, but flexible, almost natural feel of Org-mode is amazing.

And it's telling that there's even iPhone app for it http://mobileorg.ncogni.to/ . Wow. RIP OmniFocus.

+1 on the org-mode upvote

Linux/GNU/Unix (don't murder me, I do not know which one applies here):

grep, sed, awk, sort, uniq, shell scripts and pipes now do things in seconds that took me hours if not days to do with Windows GUI tools. Of course my experience plays a big part to that but I don't think that I would be were I am without those.

I use Joe's Own Editor. You must configure it to prevent it from making backup files (which are security risks) and to highlight based on your language, but overall, it is excellent in terms of its speed and intuitive interface.

I use putty for my SSH connections. It is a nice way to remotely access your server from a Windows client.

The programming language you use should fit the job so that is something that is specific to the project.

Using subversion for version control is really one of the best tools available. I would fear making changes in my code even if I had backups because changing it might break functionality, and I would spend a long time hunting for solutions of what I did. With any kind of version control system (and subversion is very easy to use), you can make changes without worry, and you can get old code you wanted to keep even though you were not using easily (because commented code is evil). It encourages you to clean your code, remove dead code, and to refactor your code because you know you can always go back.

You should learn vi in case you must use an archaic machine where you only have remote access and do not want to try installing new apps. (Some very old yet very stable telephone switches running with Solaris interfaces come to mind.)

Grooveshark for listening to music. The site is fantastic, and I do not need to waste time hunting for music that gets me in the mood to work.

Lastly, a notepad. I keep a notepad beside my bed. I find that it helps me sleep. I will be thinking of code, and one idea leads to another as I relax. So, instead of staying up for hours focusing on it (This has happened to me hundreds of times.), you can write it down. My brain then relaxes because it knows I do not need to remember it. Then, I can go to sleep. In the past, I would not be able to actually fall asleep unless I got up, coded what I was thinking about it, and then went back to sleep. Now I know I can put it off until tomorrow and actually get a good sleep for the night.

You are right with the notepad near the bed.

Slight modification:

I practice a certain kind of meditation. It has side effect that many things, including hacking solutions, come to mind during a session. I use a notepad to quickly scratch one catch-phrase which will bring back whole idea later, and let that idea go which is the purpose of this particular meditation. Often I'm quite full of fresh ideas after such session. It's amazing and I'm very thankful to the teacher who gave me this method.

What is the name? -thanks

I've tried a notebook beside the bed, and when that didn't work a cassette recorder, but I discovered that the process of writing something down or recording it woke me back up too thoroughly. I'd end up lying awake for another half hour or more.

Most frequently used zsh/bash Shortcut : Ctrl + r

Most frequently used Gnome Shortcut : Ctrl + Alt + Arrow Keys to switch workspaces

Quicksilver like launcher for Linux with numerous plugins : Gnome-Do

Version Control : git

Text Editor : vim

Managing multiple remote ssh sessions : screen

A computer not connected to the Internet.

Absolutely, +1

A locally running version instance of issue tracking software. Use whatever you're comfortable with, but I go with JIRA; It costs $10 for a license for up to 10 people.

It helps me keep track of side projects. For a long time I had trouble remembering where to pick up a project and would get distracted by unimportant parts. JIRA helps keep that to a minimum and makes me feel more serious about them.

I even keep one project setup in it for personal stuff (renew passport, etc) just to keep all the TODOs in one spot, but whenever you tell people that they always make some wise-ass crack about using it to file a bug report about you personally...

"but whenever you tell people that they always make some wise-ass crack about using it to file a bug report about you personally..."

That could be an interesting way to learn more about yourself and how others perceive you. Let people file bugs against you. How am I doing as a manager? As a husband and father? Are any of the tickets being closed?

It would take a pretty strong personality, though, to welcome that level of criticism.

I actually really like that idea!

Although I would think it would be more useful in terms of filing bugs about yourself. After all if we try to change ourselves to meet everyone else's expectations then were not much more than a shell after a while...

Git, or any distributed source control software. Even when you are working solo, it helps to have something like git

I don't mean to spam, and I'm admittedly very biased, but my product Zen (http://agilezen.com/), helps me stay organized and makes me much more productive and happy. I always have a million things to do, and Zen stops me from being overwhelmed. (That's why I wrote it!)

On a less self-serving note, I'd also suggest (at least) two monitors, a good keyboard, and a good desk chair. Fatigue, RSI, and task-switching are all very real productivity drains.

Ambient Music, mostly http://www.hos.com

I find that the best ambient music is often stuff you really like, but have played so much you know every note by heart. The familiarity of it, particularly if you play it loud enough that it's thoroughly immersive, is really helpful for getting into the "zone".

I find Kraftwerk is gold for this. Try "Computer Love" or "Radioactivity". There's more esoteric ambient stuff like Maeror Tri if you're curious enough to hunt around a bit. Also try Ildjarn's ambient music. (Ignore his heavy metal -- I like it, but it's certainly not for everyone.)

Really good headphones. Not necessarily noise-canceling but the more environmental noise they block the better.

- Notepad++/Textpad/Emacs

- Python [You can write quick programs on the command line or use it as a calculator]

- ToDo List/Notes App running on the background.

- Multiple Desktop Windows(workspaces)

- Dual Monitors.



Of course if you're using Unix, you can get the linux version (which I don't believe is officially supported).

Just knowing where I am spending my time makes me more productive and less likely to randomly web surf etc

Knowing well how to do for loops on the command line of whatever shell I'm using at the time.

Saving snippets of how I get things done.

Always saving command lines in shell scripts, sometimes with parameters, instead of just trying to remember them. Bash history is great, but it isn't available when changing systems, hosts, and jobs.

Always making a sandbox directory for every idea/project, under a directory named for the current year. This includes my own ideas as well as stuff other people did that I download to play with. When a new year rolls around, most of the directories don't get carried over; they just stay in the old year archived.

Tagging every new project with keywords.

Automating everything possible.

Most fantastic win ever: VMware images that are preconfigured to whatever state they need to be in to debug whatever I'm working on. Could be Amazon AMIs; I use VMware atm.

emacs, vi, sort, uniq, comm, find, ack, diff, patch, perl, perltidy, man, git

GNU Screen

My top level screen session is a list of hosts I log into. On each of those hosts, I also run screen (screen within screen) to give me virtual windows on that host. As a UNIX admin this makes my life a lot more productive, as I'm often logged into 5-10 machines at once. Instead of hunting around for the right window, I can jump to screens and/or subscreens by name, without taking my hands off of home row. For me, one large multiplexed terminal window is best. It also helps if your terminal program can go full screen (like iTerm) for maximum old-school terminal concentration.


Learning how to edit text without taking your hands off home row (control key sequences) is invaluable. This skill will help you in your editor, at the bash prompt, inside of any program you can run with rlwrap, and in OSX (or windows) edit widgets. With a bit of work you can configure emacs keys in every GUI and non-GUI application you use. For Windows users XKeymacs works well for this. Linux users can configure GTK to support emacs style editing. Having fast and universal controls for text editing makes me productive.


Why wonder why the a program is misbehaving? See every system call it makes as it makes them, complete with arguments and return codes. Even attach it to a running process to find out what it is doing in real time. This tool has allowed me to diagnose and solve more thorny problems than any other in my arsenal. For example, you're trying to figure out what arguments that gcc is using to invoke the linker in a Makefile, or which order that the linker looks for libraries, strace can tell you all of this, when you'd be otherwise scratching your head and guessing.

Regular Expressions

Knowing Regular expressions can make your life a lot easier. In your editor they allow you do all kinds of advanced text manipulations, even some dumb refactoring. Knowing them also allows you to do some great parsing in sed, perl, grep (ack is a better grep btw), whatever. Once the regexp lightbulb has turned on your productivity can go way up.

Server Side IMAP Email Filtering

Regular expressions reminded me of this, but if you have all your email handling rules (filtering, organizing into folders etc) done on the IMAP server side, it frees up your email clients to be stupid. They don't have to do any of that. Your email inbox will look the same in Pine, Mutt, Mail.app, Outlook, your phone, whatever. This is the promise of IMAP. I use maildrop on my own IMAP server for this.

Familiarity with functional/declarative programming methods. I'm not a guru on this at all but learning a different way of thinking about programming like this has been terrifically helpful -- in some languages more than others. You can write functionally to at least some extent in almost any language -- even Perl has a level of support for it that surprises a lot of hackers.

So if you haven't already, learn a Lisp, or Haskell, or even JavaScript. Something that lets you pass around functions as parameters, and does closures.

It's superb for JavaScript, for example, once you realise it's basically a slightly weird Scheme with C-ish syntax. Suddenly all that ranting about closures and lazy evaluation will seem so much more relevant!

Vim, paper and good quality colors pens. Valgrind, grep, gdb, inkscape for drawings...

I want to like Inkscape but I just find it too hard to use. Can you recommend any resources for learning how to use it?

I was surprised to see no one mentioning calendar/reminder tools. Maybe it's because this is Hacker News and more folks are focused on, well, hacking and therefore when they hear the term "productive" they think about being a more productive hacker - I don't know. I do know that I would be far less productive without a tool to set reminders - the idea of "Set it and forget it" leaves room in my brain for more. Oh sure I have lots of other tools for productivity including programming-related tools but the most productive tool I use is my calendar with reminders and tasks.

Habitually using Compiz workspace switching to get more working area on my laptop, instead of trying to arrange windows carefully on a single desktop and bring them forward with the taskbar.

You've probably had 20 other people tell you about this; but switching to a tiled window manager will remove that whole 'careful placement of windows' thing from your life in a very positive way.

I've tried tiling window managers multiple times, and each time find issues with them that frustrate me until I switch back to Gnome:

- No simple way to keep a small IM status window open in the corner of a workspace

- Limited support for resolution-dependent windows, such as videos, games or remote desktops

- No notification bar for status apps to utilize, such as pidgin or network-manager

- No integration with modern desktop environment features or tools, such as media keys for rhythmbox, launchers like gnome-do, network-manager, automatic disk mounting, screen lock, etc

Gnome and compiz have solved a lot of problems that actually make a Linux desktop usable in modern contexts.

Those are all very fair criticisms, but by simply running gnome-panel with Xmonad, you get 80% of what you want.

Apologies for the evangelism. :)

A notebook and a set of habits (my processes). A simple paper notebook which I can write ideas down in meetings, which I can keep by my bedside and scribble down my thoughts if I get a brainstorm when I'm sleeping. There have been a number of discussions. All electronic tools I've used over the years (languages, software, gadgets) change and evolve and I have to port from one format to another. The consistent parts are the habits I've developed over time. Habits on note taking, organizing, question asking.

Visual Studio, Launchy, Web Developer Toolbar, Firebug

Upvoted for Firebug. If you've been a web developer for any length of time and you're not using this yet, start now. Prepare for the forehead slap when you learn to use the console!

Upvoted for Firebug. This tool makes working on Ajax, Javascript, and CSS a breeze (at least for me).

Fresh.app is the core of my activities online. I can't recommend it enough.


Most of my activities concern the most recent things I've moved with or played with. Fresh lets me handle all of that without worrying about any other workflow. Downloads/screenshots/etc all go through it.

That's really cool. Wish it existed on windows or linux.


I have a semi-repl with autotest + ruby-debug and it's done wonders for my productivity; I can't imagine going back to alert/printf style debugging/development...

I'd be interested in reading more about your workflow, I'm a RoR dev.

I code Java at work, but Clojure+SLIME+Emacs gives me a way to quickly prototype things that call my existing Java code in a REPL. Once I've demonstrated the concept to myself and have the basic algorithm working, I port back to Java. Clojure and Java sometimes demand a different style, but I sometimes find that porting back from Clojure to Java results in more elegant Java than if I would have started with Java in the first place.

Graph paper and a pencil. Just pull it out and start drawing, jotting down ideas, and organizing a strategy of executing on the project at hand.

Also, Excel (or other spreadsheet program). Not usually thought of as a tool, but putting small functions in cells and passing inputs/results cell to cell is a good way to start the actual implementation of a solution.

Learning the ins and outs of regex is well worth it. I find myself doing regex search/replace almost daily within textmate.

Some people seem to find Jeff Atwood ranting about how fantastic regexes are annoying. Every time I read another article like that, though, I just find myself smiling and nodding.

Only thing that's kind of annoying is that the whole world hasn't moved to Perl regexes yet (with which I'm most familiar and think most fluently). I nearly punched the air when I learned Apache used PCRE for stuff like mod_rewrite.

* vim + numerous custom scripts and mappings

* JotBot (note: it's my own commercial app, but I use it every day)

* Todoist.com + a few custom apps that work with it

* Scores of little scripts to automate assorted tasks

* My G1, for notes and reminders

* git; almost everything gets a repo, so I more easily try things out while not risking losing previous work

Not at all related to 'nix, but most important:

* World's greatest wife

* Smart & good friends

For me, just recognizing that something was painful and I was doing something repetitive. It's easy to get lulled into a sense of 'this is how things are'. When you're conscious of it, you can then start looking for features in the tools you're already using, other tools, or build your own.

I'm somewhat biased being one of the TimeGT ( http://timegt.com ) developers but after we finished it to a point that we were not that embarrassed to publish it -- it has saved us time and made life much more productive.

A good cup of orange pekoe. More often than not, a quiet time to meditate with a warm cup in my hands gives me the greatest productivity breakthroughs.

I fear I have fallen to the monks of old: "First, boil water."

Vim and SlickRun (sorry Windows specific but certainly worth mentioning)

Not worth mentioning since it's not remotely answering the question.

Uh, what?

A web browser, actually. Plus that whole Internet thing.

TextMate for mac

Django for framework

+1 TextMate. Search Project and Go To File take it over the top for me when working on more than one file at a time.

have you tried Ack in Project? shift+cmd+a (once you have it installed)... i do that many, many times a day

Vim and Emacs (yes, I'm schizophrenic).

You should look into Viper. And if Emacs doesn't start quickly enough for you, you should run it as "emacs --daemon" and then "start your editor" with emacsclient -t (or emacsclient -c, if you want an X window).

Once you've gone the Way Of The Emacs, there is no reason to use vim... unless you have some internal application written in vimscript, of course.

Straight vim is rarely very useable. I wouldn't be comfortable with out tags, minibuf explorer, nerdtree, cscope, and taglist.

Right, which is what Emacs is there for. I don't think there is any Vim functionality (plugin or otherwise) that is not implemented in some Emacs extension.

Viper just gets you insert-mode and command-mode. It's still Emacs.

What about the one where you don't use megabytes of disk space? ;)

The OP says he uses both Emacs and Vim regularly. Emacs alone uses less disk space than Emacs and Vim combined.

I definitely take advantage of the Emacs daemon, and use emacsclient extensively. However Viper just doesn't cut it for me, since I rely on a lot of vim plugins (as Locke1689 pointed out) for extra functionality. It's not just the keybindings or the modal interface.

But hey, these two programs are great. I've tried other IDEs, but always end up coming back to one of those two for real work. Some things are easy in one and annoying in the other so they complement well.

The point of Emacs and Vim is that they are programmable. If something is annoying, you have not programmed one correctly yet.

Oh believe me, I've customized both extensively. My annoyances are extremely minor, but annoying nonetheless.

I do a lot of data mining using Hadoop. Hive has become one of my tools of choice for SQL-ing large datasets.

Increasingly, mathematics. Not sure if that would be considered a "tool" for the purposes of this discussion.

Netbeans, JRuby/Java, and some music

Valgrind. If you are writing c/c++ but not using valgrind all the time, you are wasting time.

s/ but not using valgrind all the time//.

Want to tell me what you develop your type I virtual machines in?

Someone else already wrote that, so it's not my problem.

If you want to use C for your "type I virtual machines", great. But stop writing music players and web browsers in it.

Definitely Eclipse. The debugger is basically the most valuable feature ever developed. Ever.

GNU screen, vim, git, and Haskell

Eclipse, oh god yes.

I'm an Emacs guy, but I cannot deny that Eclipse is the superior tool for Java development. I have come to rely on the refactoring tools and would miss them greatly if they were taken away from me.

SLIME in Emacs is comparable (better in some ways, worse than others) if you're hacking in a Lisp. It is really nice to work with code at a higher semantic level than just ASCII text, sometimes.

(I also hear that VC++ has similar or even better refactoring features, but I haven't used it.)

Cygwin makes life bearable on Windows.

the key productivity enhancer:

Having a good reason why you are doing something




1) bash/perl(regexps)/other command line tools;

2) trackers, task focusing software: GTD-free, Trac, Mylyn, pyroom, etc.;

3) blind typing (to type fast), workrave (to stop typing);

4) somebody else, which will review my work.

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact