Some simple reasons for comments
The most important point about a (well-placed) comment is that it illustrates what was in the programmer's mind.
If you're reading a code comment, it's because you are revisiting code and need to understand what the code does - and that's usually for one of two reasons. Either (1) you need to debug it, or (2) you need to modify it.
In debugging, an expert uses the comments to understand the coder's thought processes, and trace back to where they went wrong. Without comments, the reader is forced to follow the mechanism of the code, not its intent, and that can lead to falling for the same fallacies as the original developer did.
Likewise, when modifying existing code, sometimes comments are the only thing that saves you from repeating the errors of the past. I'm delighted when I see something like:
// The datasheet says set bit 10 here, but there's a hardware
// bug. If you do that, you'll gate VCC and GND onto the same
// output! Instead, set bit 3, which does the same job, safely.
Bare, uncommented code could not convey this vital information. It's unreasonable to expect a developer (or maintenance programmer) to memorise every piece of out-of-line documentation and keep it all in mind at every line of code, so documenting assumptions and discoveries really does save time and effort (not to mention stress) when revisiting code.
Code should self-document, as a general rule - but *good* comments can make all the difference when it's time to look again.