Я стараюсь комментировать каждую функцию, описывая на высоком уровне, но точным образом, что делает функция. Точность должна быть такой, чтобы не нужно было читать тело функции, чтобы понять, что делает функция, или заново реализовать ее и заставить ее прекрасно работать с любым кодом, который ее вызывает.
Кроме этого, я стараюсь держать функции достаточно маленькими, чтобы вышеизложенное представляло собой практически всю необходимую документацию.
Время от времени может быть что-то неясное или странное в том, что делается в коде - я это документирую. Все, что не является очевидным или интуитивно правильным, или о чем вы потратили некоторое время на размышления, должно быть задокументировано.
Представьте, что у вас проблема с памятью, и вы забудете написать эту программу через месяц. Тогда представьте, что вам нужно вернуться и исправить это. Что бы вы хотели прокомментировать и как сделать эти комментарии наиболее полезными для вас?