We like to see a simple module-level header comment, comments for significant data and type declarations, and a brief per-class and per-method header, describing how the function is used and anything that it does that is not obvious.
The Pragmatic Programmer, From Journeyman to Master (Andrew Hunt, David Thomas)