Think about how we were developing software fifteen years ago. For the mathematically handicapped thats 1992. At that time Visual C++ 1.0 was hot off the press and you most likely didn't use it. You were probably using ed, vi, emacs, or some other cult-following editor. All of the editors had syntax highlighting. The modern debuggers had features such as watchpoints, single stepping, and variable inspection. However you probably never used any of these features. You would be considered state-of-the-art if you used breakpoints. Back then the king of the debugging world was printf.
Now lets look at today. Compilers today are much better. They have fewer bugs and are much more standardized. The biggest breakthroughs in editors have been automatic code-completion, integrated documentation, and error highlighting. The biggest breakthroughs in debuggers have been conditional/scriptable breakpoints (which no one uses) and a little bit better GUI design, and more recently multi-core debugging. It is shocking, but from empirical evidence the most common debugging technique in the world is still printf!!
Why is it that the tools have only inched along? Thats coming up next, but I'll tell you now that our modern tools are still not good enough. The fact that printf is still so widely used is a key indicator that we haven't changed much at all in the past 15 years.... more on that later.