tools
- my mind, in a well-rested and motivated state
- the ability to focus
- 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.
- 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 bash, mainly because it's available on all systems I work.
- a version control system, preferably distributed. Although I am a fan of of Haskell I currently don't use darcs, since git in combination with github is so easy to use.
- 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.