There is a lot of wisdom in many of the above comments.
My two cents is, don't go overboard. Code documentation ought not be a design doc, though people may feel falsely reassured by the presence of a lot of verbiage.
Code documentation exists to assist future code maintainers in understanding the code in the fewest words possible. Consistent use of a good naming convention can be considered a form of documentation, and also modest block headers. Inline code comments are needed only to specify anything likely to be obscure or never seen before by a coder, or possibly to explain changes made to existing code. And also a brief external document intro with a (hopefully not too complex) diagram.
Overdocumenting can actually be counterproductive.The code does what it does, and that will ideally be self evident--if the coder has tried to make it so. Not all programmers are so nice; instead, they sometimes use the most obscure abbreviated syntax that invokes multiple operations that only someone steeped in that language would know without looking it up,
Maintaining old code, in fact, caused me to modify a number of things about how I wrote and documented new code. I learned many pitfalls to avoid, and I often found old documentation that was out of sync with what the code currently did. As others here have said, it would sometimes have been better to have no documentation in those cases, because the docs themselves need maintaining. It's like in databases: do not duplicate data, for it WILL get out of sync.
When working on an existing code base, I always document changes inline, and maybe sign and date the change as well, to make it easier for the next programmer coming along.
Also, it doesn't hurt to have fun with it. I once found, buried in a long stringy routine, a comment from my predecessor that said, "Oh, and have I said that Visual Basic sucks?" Since it made me laugh, I considered it a very helpful comment.