Sometimes you have an inherited code base and need to understand what is happening where, though. Debuggers are immensely helpful, in that case.
I see your point about logging and error messages. Well placed print statements can make all the difference.