In NAG's development division we hire a variety of people from a variety of backgrounds - in fact we have a very diverse community of technical staff. At the time we hire them, of course usually we have a role in mind for them, whether it's someone with a specialism that enables them to work on a particular piece of software, or someone we want as an "all-rounder" who needs to make software work on lots of different hardware.
However, it's not always clear what direction their talents will ultimately take them, and when we're interviewing we can't always tell what virtues a person has. It would be nice if we could know in advance, but usually we just can't.
I got to thinking - what are the attributes of a good software developer? I came up with the following list.
- A logical mind
- Ability to transfer knowledge
- Knowing when to let go
- Knowing the right people
Number 1 seems obvious. You can't write software without using logic; or at least, not the kind of software that we build.
Number 2. A degree of impatience is vital. It's often what drives us to make improvements to software. Is the software build system too slow for your liking? Find a way to speed it up so you don't need to wait around so much for it to complete.
Number 3 - patience. Does this contradict number 2? Not at all; sometimes you need to take your time. When you're wading through a mountain of code trying to track down an obscure bug in, for example, an optimization routine, you might need to re-start the debugger, or re-compile your code, a hundred times before you pin down what's going wrong. (Of course you might never pin it down at all - then you might need to call on attribute 7).
Number 4. Curiosity - never mind that it kills cats - it can be very useful. How can a routine that multiplies a vector by a scalar sometimes give slightly different results when called with the same data? Well, it can if it turns out that the location of the data in memory might affect the result - for example if a fast algorithm using 64 bit registers is used when the data is nicely aligned, but a slower algorithm using 80-bit registers is used when it's not. If the vector and scalar contain complex rather than real numbers, the arithmetic operations involved are sufficiently complicated that the results can differ by about one unit in the last place. Knowing this enables us to make a judgement on whether the difference is important or not.
Number 5 - ability to transfer knowledge. At NAG it's no use being an expert in one thing. Good at Fortran? Well, our customers want to use C, C++, C#, Java, Basic, Python, and anything else you can think of, so you'd better be flexible. And you need to be able to show other people how to do it too. (As an aside, I wonder if anyone knows a way of calling a NAG library routine from emacs lisp? Not that I'd want to do it - just curious.)
Number 6 - knowing when to let go. Sometimes a developer doesn't want to stop work on a piece of software until it's absolutely right. Being a perfectionist is no bad thing, but sometimes - you just need to stop. Otherwise no-one else will ever get chance to use it.
Number 7 - knowing the right people. When you get stuck on something, or just need a bit of advice, there's nothing like being able to ask your colleagues for help at tea time. And a good way to make them happy to help you is by trying to be helpful to them in return when they need it.
How do I myself fit into this list of attributes? Well, I have to admit that I'm very good on the impatience front. I can't stand the few seconds pause while Visual Studio fires up. But my best attribute is probably number 7. I'm lucky to be able to work with a whole bunch of talented people who don't mind helping me out when I'm stuck.