Code layout and presentation schemes will affect how you lay out your comments.
Another aspect of self-commenting code: choosing good names.
Discusses self-documenting code, a tactic that makes heavy commenting redundant. Also describes literate programming techniques.
Revision control systems hold file history so you don't need to explain it in comments.