Tools I use
Non-technical tools
- my mind, in a well-rested and motivated state
- the ability to focus for a long period
- a pen and plenty of paper (or any other materials to jot down notes) — I need to jot down thoughts and connections;depending on the case a keyboard works, too, but I’m not so efficient using only written text to develop ideas. It’s surprising how often the value of pen and paper development is underestimated, especially by unexperienced programmers, e.g. first-year students.
Those three are the most important. What I’ve listed below is just nice-to-have support material which I happen to use regularly over the years.
Technical tools
- vim as my editor. I use it since (probably) more than 13 years and its commands and functions are now hardwired into my hands. The configuration possiblities and possible hacks are endless!
- screen to stay connected to remote servers. Being able to terminate a session, go home, and restart where I left is invaluable, especially when I have one of my long-running benchmarks tasks on our multicore-research computer.
- Some flavour of linux. When I was a student I tried out nearly any of the existing distributions (RedHat, Fedora, SuSE, Debian, Gentoo, …) and tweaked them until they finally broke — and learned a lot this way. Nowadays I’m just happy if I have a free, customizable operating system (I love shortcuts and define them for nearly all my daily tasks) which just works out of the box. Therefor my choice is Ubuntu, which worked on all my laptops without heavy fiddling.
- a good shell. Since I work most of the time with plain text files (source code, configuration files, LaTeX sources) being able to use all my own little utilities and unix tools like cut, tr, sed and awk eases my daily work and allows me to automate repetitious tasks. I currently use zsh but besides directory filename completion I did use bash, too.
- a version control system, preferably distributed. Begin a fan of Haskell I use darcs of course, but git and mercurial seem to be good, too. Using mainly plain text files they come in quite handy.
- Some kind of synchronization tool which allows to synchronize seamlessly with all the different computer I work with. In the past I used unison but nowadays dropbox is a much better alternative; it just works.
- a compiler or interpreter; which one is actually not of so much importance, even though some provide more convience for the specific problem. I can use shell scripting languages like bash, full featured ones like Ruby or Python, quite normal ones like Java or C and functional languages, e.g. Haskell (my preferred choice for everything besides scripting) or Scheme. Most important thing is: choose the right tool for the job and don’t be too religious.