2006-04-16

Tools every programmer needs

I've been doing software development for a little over 10 years now, and have almost always been able to use open source tools to get the job done. Below are a list of tools that I have found essential for software development. Linux If you are going to be a software developer, you need a decent operating system. Over the years I have used Solaris, OpenBSD, FreeBSD, Windows and Linux and have found Linux to have good support for all the tools I require. WMI/WindowMaker You need a usable window manager. Sometimes I use WMI (I actually still use WMI-10 and not WMII), and sometimes I use WindowMaker. Both of them offer a minimal environment that's ideal for development. I recently moved to a dual head setup, and WMI doesn't work well with it. WMI has to be my WM of choice though, it's like VIM for GUI applications. VIM I like VIM, unless I'm doing Scheme/Lisp development in which case I use emacs (better support for s-expression navigation). If you spend the time, VIM can be a very powerful IDE. With CTAGS and some customization you get all the nice things you would expect from any IDE including syntax highlighting, function/method tab completion, documentation lookup, scope knowledge, build and test integration, etc. My .vimrc is about 200 lines, plus ~8k lines of supporting custom written plugins, dictionaries and compilers. CVS/Subversion I have been using CVS for a long time, but branching and tagging are two of the most useful and needed CVS features and they are the most difficult ones to use. Slowly I'm moving to subversion because in addition to atomic operations, it has good support for branching. Bash In a Unix/Linux environment, a good shell is essential for getting any work done. My current .bashrc is about 500 lines, with tons of custom functions, aliases, completions and environment variables. Bash is a complete scripting environment. Perl Perl is great for prototyping software solutions. You can generally whip up something very quickly with Perl, see how it runs, and then implement it in the required language. It's also quite useful for one liners like removing comments, search and replace (perl -pi -e is your friend), and just about any 'glue' components you might need. If you have some discipline, perl can be readable. Doxygen Every project seems to use slightly different documentation standards. Fortunately, doxygen can read most of them. Doxygen can read most standards, deal with most languages (more than 10) and output in many different formats (HTML, Latex, Man Pages, RTF, XML, PostScript, PDF). Bug Tracking I know people like Bugzilla, but I prefer to use "Request Tracker". With pretty minimal effort you can integrate either system into your version control system, IDE and build tools. A bug tracker is an essential tool for managing change requests. Build Tools Ant, PHING and Make are the most common build tools I encounter. Ant and PHING are functionally equivalent, and I prefer them to Make. However, I use Make for common shell based builds (building my resume from latex source, building simple applications written in C/C++). I had a brief fascination with the GNU build tools (autoconf, automake, autohell), but they changed too frequently to be reliable. Test Tools Nobody likes writing tests, however there are some tools that can make it a bit more manageable. Unit testing is really popular, so I've used JUnit, Simpletest and a bunch of other unit testing tools. All of these require development input and a framework to run and manage them. My company will be open sourcing a unit testing framework called 'SPANC' in the next month or so which handles managing unit tests, automating their runs, reporting on failures/successes, etc. Of course, everyone has written custom test tools as well. These usually suck, since no one outside of the group you are working in will understand them. Freenode When I need quick help figuring out why something isn't working, I usually hop on the freenode IRC network (assuming I can't find what I'm looking for on Google). Caffeine I drink large amounts of caffeine, usually in the form of mountain dew or "energy drinks". I'm quite fond of kha0s from "Monster", it has a citrus flavor. The above are the things I use to get through day to day life as a software engineer. I don't think the list of too uncommon from what other engineers are doing, but maybe a newbie will find it useful.