and "anybody can understand this by just looking at it, it doesn't need to be explained."
I beg to differ with this one. Code can be so clear and readable that no further documentation is required. It's just that writing such code is hard work, and never happens by accident.
After your code is complete, all tests pass, etc., take another pass and look for anything that isn't clear. Whenever you find a section that seems to benefit from an explanatory comment, try to rewrite it so that the comment is no longer needed. In many cases, this is as simple as moving the bit of code to a well-named function -- essentially you're replacing the comment with the function name. In other cases, renaming variables, or introducing new variables explicitly so that you can provide them with good names does the job. In other cases reordering/restructuring the code so that it has a more linear progression, and addresses subproblems in a logical and consistent way is needed. And sometimes, at the end of all that, there's some part that just requires a comment. In that case, add it, but only after exhausting all other options.
Then, let the code alone and do the same thing again tomorrow when your eyes are fresh. Then get a peer to review it (you're doing code reviews anyway, right?), and get their suggestions as to what isn't clear and obvious. Along the way, keep an eye out for bits of code that are clarified only by function and variable names, and look for ways to ensure that the function can't easily be changed in ways that invalidate the chosen names. Rinse, repeat until you reach the point that no more improvements can be found.
If this sounds like a lot more work than just writing an explanatory comment, you're damned right it is. But it's also much better, because, other than docsctrings, which are great, comments are evil. Over time, code evolves and comments tend not to get updated. I'd much rather maintain hard-to-read code with no comments than hard-to-read code with comments that are wrong. And in easy-to-read code, comments are pointless at best and a waste of time at worst, because experienced developers know that you can't just trust that the comment is correct, you also have to read the code.