A slight twist on "Write proper comments"
Good commenting is ALWAYS a plus. By all means anytime you do something unique, hackish, or otherwise not obvious it needs a comment. (Because anything odd probably needs an explanation or you'll wind up revisiting it for no reason other than "what the heck is this nonsense?")
Another thing that goes along way is SOLID design principal and writing "self commenting code"
SOLID design
The entire point of SOLID design is to break your code into it's smallest components to make each and every piece do one thing for testability and reusability.
This also has the benefit of making every piece of code REALLY simple where most of the time the method and variable names alone cover your needs for commenting. (there will always be places that could use additional comments, but the idea is to get it so the code itself is clean enough that you only need the occasional additional comments rather than needing them for every single method)
Self commenting code
Self commenting code is the idea of naming your methods, classes, and variable as such there is no question what's happening at a glance.
If you method is called "FinanceProcessor" you're going to need a comment... Okay... Finance is a VERY broad subject... perhaps a poorly named object? And what the heck am I processing?
Now if that same method is named "UpdateRemainingBalanceByUserId" okay, so that makes sense! I'm going to update the remaining balance based on whatever user Id I provide. I don't know the knitty gritty on how this works, but I now know what it does!
Now lets look at variables... bool payments, bool refunds, bool round, int UserId... Hmmm not very useful... I mean UserId is self explanatory thanks to the method name but am I including these bools, excluding, or something else?
Now if we made these variables... bool includePayments, bool includeRefunds, bool roundToNearestDollar, int OwnerId. Ahhhhh!!! that makes sense! Once again I don't really know how this thing gets it's data for crunching numbers, but I know what it's supposed to do and what these variable will do.
Summary
Adding comments is good, but making clean self commenting code (with comments where appropriate) is better! Cleaner code requires less explaining.
The goal is anytime you look at something in your code you should know WHAT it does without any further investigation, comments should only be necessary for telling HOW it works and little oddities that don't make sense at a glance.