How I Comment
If it's something simple, I don't usually bother with a date. I can get that from source control later. I just say what it does: "Get the user's meta data"
If I'm tampering with someone else's function at work, I usually leave a message like:
// 4-30-2009: (Steven) Modified to make it less prone to DROP all tables
If I think a piece of code is going to be confusing, I write some conversational comments in addition to the "here's what line X does" inline stuff:
/* Bear with me, this is going to get stupid-hard to follow
First we get the ID of the thing
Then we get the children of the thing based on the ID
Now, for each child, if that child has a date parameter that
falls on a full moon, we return void so that otherFunction
knows to take cover.
Otherwise, delete the child and never look back
*/
Additionally, I use comments as pseudocode as I start building a new method or class. It's the code equivalent of talking to myself (it pretty much looks like that last comment block). It helps immensely with wrapping my brain around the process I'm trying to implement. The comments themselves may end up modified or replaced later, but it speeds up my development process and I've noticed significantly fewer bugs in the code I write this way.
How I Wish Others Commented
When reading comments in a program I've never seen before, dated modification comments are pretty useless. I wasn't there to see the original, so it's not really helpful to know why the new code is the way it is. That's really what commit messages are for.
Much more useful (to me) are humanized messages: "Get the frame buffer and clear it so we have a blank slate before drawing." Something that gives purpose, technical detail and context all at once. The best comments have the potential for education as well as documentation: here's what we're doing, and here's why.