Personally I believe a more in self documenting code that in code documentation. The heavy use of intent-revealing-names, side-effect-free functions, etc.
But sometimes it is not possible to let the code be self documentary, and in that case, I will always document the functions, or the inner workings.