I remember back in college my coding teachers would tell me that coding was a good part of a balanced breakfast. It would help those that happened to have to work on your code in the future. Most likely, that particular coder would have been you, so...comment well!
After coding for years now, I have to say I disagree. I've been over commenting the crap out of code in the past when I really thought I was being helpful (I used to swear by GhostDoc and nDoc stuff...). The problem resides in that code is changeable, and so when a specific code portion is changed we break the DRY principle because we have to update our comments as well. Instead of repeating ourselves, lets make our code cleaner by removing all comments that don't show a thought process, buuuuut also in the same stroke keeping the readability that makes those verbose like comments so helpful in there.
It's a fairly simple process, that just takes a few days in adjusting your thinking while coding. For instance here's what my code used to look like:
1: else // Show list of all things in widget
2: {
3: if (!Page.IsPostBack)
4: {
5: BindGrid(string.Empty, 0);
6: }
7:
8: ExistingMonitorFiles.Visible = true;
9: ProcessMonitorFile.Visible = false;
10: }
and after:
1: else
2: {
3: ShowListOfAllThingsInWidget();
4: }
What I've done here is simply take the comment I had, and refactor it into a method that contains the prior code. Simple enough? Instead of a comment, now I have a viable piece of code. If I do modify it, I will have to update the method name, which will in turn update all of those areas that are calling it, in essence updating the "comment".
One more example that comes up a ton, and you might not agree with at first:
if (ResultID != null) // Show results
To remove this comment I'll need to add a new boolean type, like so:
bool showResults = ResultID != null;
if (showResults)
Now, I hate adding extra lines to my code as much as the next guy, but this effectively gives us a valid in code "comment" that we can update a lot easier, and you'll find that you won't be testing for this again down the road because now showResults has way more meaning than ResultID != null.
Try it out, it's a mild switch in thinking while you're coding but in the end I think well worth it.