Not all code can be self-documenting, especially optimized algorithms and complex operations. Comments serve to add requisite context and clarification that code alone cannot provide. Simply regurgitating the obvious in comments is a waste.
2. not all decisions can be revealed in code itself. (for example, adding a delay to workaround a hardware bug.)
3. the biggest part missing from code documentation is the big picture document, not really the code level document. even you know what a class/function is, you don't know how it is used in the entire project, its life cycle, etc.