One of the best tips which I learned is that there is NO SUBSTITUTE for long and descriptive variable-names.
When I first started programming in BASIC we were restricted to single-letter or letter-plus-one-digit variables. So we had to make do with variable names like A, A1, A$, A1$, A(), A1(), each of which is a separate variable. The first two are numeric, the second two are text strings and the last two are functions.
Try going back to maintain a program using that sort of nomenclature six months later. It was, and is, probably faster to do a complete re-write than to even attempt maintaining code written like that.
Several years later, I started programming in COBOL which is a verbose language at the other end of the scale. It had code like "ADD INVOICE-TOTAL TO MONTHLY-PURCHASES GIVING STATEMENT-TOTAL.". What a joy to behold six months later. I knew exactly what the variables represented, and it was all self-commenting.
I have since moved to other languages, including Java and C. But I have always tried to carry along the use of long and descriptive variable names which I learned in COBOL, even if (as in C) the language itself doesn't care whether you use 'a1' or 'invoice_total'.
Of course, you may say that a long-winded variable-name gets in the way of your being in the Zone. That's what text editors are for. Use the 'a1' if you like temporarily, just rename it to 'invoice-total' later with 'find and replace'.
Personally speaking, I still reckon that using long descriptive variable names from the very start helps in visualising the logic better.