That's not possible to make it perfectly readable to the point of no comments needed (except for simple code).
Depends on the language. It is pretty hard to make ASM readable.
However, what I am trying to say is: If you need a lot of comments to understand your code, think about a way to make it more readable instead. Comments are considered a code smell for a reason.
I.e. people tend to do something like that within a single method/function/procedure:
//read file
code
code
code
//compute something
code
code
code
//write file
code
code
When they should do this (seperation into procedures):
readFile()
compute()
writeFile()
The procedures get the name of the comments here, so these comments are not needed anymore.
Another example are magic numbers:
modus = 1 //sets modus to "encrypt"
[...]
if (modus == 3) //if modus is "decrypt"
What you should do instead is using enums or (if the language has no enums) constants.
modus = ENCRYPT
[...]
if (modus == DECRYPT)
I don't say you shouldn't write any documentation. That is very important too. But I say, look if you can change the code in a way, so that most of the comments are not necessary anymore.