Personally, I write a comment at the top of every subroutine to explain what it does and what value, if any, it returns. Any lines that are not immediately obvious are also commented.
All my programs start with a comment block to describe its purpose, the processor or platform it runs on, the date and version number and lists any libraries it needs to be included.
Commenting every line is overkill and clutters the code but anyone seeing it for the first time should be able to understand its basic function and what strategy is used to achieve it.
Brian.