When I code I write a classes header file first, then comment the class, its member functions and variables in doxygen style.
Then I actually write the class. This is followed by a unit test suite that tests to make sure every method of the class does what the documentation says it does. This is all quite helpful in forcing you to design your classes well. This all goes along with proper variable and function naming.
I would like to say the people who claim there code is "self-documenting" have not come back to code they wrote a long time ago. Self-documenting is true for body of simple functions, but you can't expect a function name to convey as much information as
this.
Ogre is quite a good project to see how a pretty well written, documented and layed out project should look like.