What matters more to the outcome of a software project? Good tools or good people? Okay, that one is a no brainer, right? We all know people matter more than tools, right?
But try this thought experiment. Take an average group of programmers today and set them up in a contest with the brainiest programmers of 1000 years ago. Who wins?
No, no, no, that's not right because computers didn't exist 1000 years ago. But isn't a computer just a tool? So apparently tools matter in some cases.
So let’s make this more fair by flashing forward to, say, the 1950s and retry the thought experiment. Again, the average programmers in 2009 will win hands down on a productivity basis. They can make more complex programs using Java or .Net then the 1950s programmers could ever dream of. So again, tools do appear to matter more than we given them credit for.
The problem is that the “tools vs. people” dichotomy we talk about doesn’t really exist. Apparently, what we mean when we say that “people are more important than tools” is that given roughly modern tools, one new snazzy tool isn't going to make much of a difference and it's certainly not going to cause your productivity to go through the roof. However, over longer periods of time, changes to paradigms, as supported by tools, can and will significantly increase a programmer’s productivity.
Tools allow a person to be more productive by changing the level of abstraction the programmer is forced to think at. 1950's programmers had to us machine language or punch cards or, gulp, both. No matter how smart they were, they were limited in their productivity by the tools. Today's programmers use modern compilers that allow code in something similar to English, virtual machines, automatic garbage collection, built in error handling, build tools, automated unit tests, etc. Throw in there a nice GUI-based drag and drop interface and now you're talking real productivity gains. So tools matter and they matter a lot.
With each new tool paradigm, we get closer and closer to the way a real human thinks. When we are dealing with punch cards and machine language the amount of translation between what the programmer is able to think and the way to implement it is huge. With modern tools, the gap has narrowed and thus productivity has climbed to match.
Now if you followed my argument above, we have uncovered that real source of productivity in software – a programmer’s ability to think! The basic unit of productivity in software has always been a “thought unit” (whatever that is.) No matter how good your tools get, the best programmers will always be the clear thinkers that require less thinking to accomplish their goals.
Tools are used to make thinking easier and more human-like and nothing more. So it turns out tools are really just a way to remove obstacles that naturally exists between the programmer's ability to think and the computer's need for formalized instructions.