Deliberate style decisions. Having all of your code formatted the same way will make maintenance easier.
Once And Only Once. Try to have each piece of "how to do X" knowledge only represented once. Try to have each piece of information only stored in one place.
Abstraction. A good abstraction is not just an abbreviation for typing. It is a tool to think with, an idea that stands on its own.
Modules. Hide design decisions inside of modules to make changing your mind easier.
Push complexity into data when it will let you simplify the code. Complicated data is better than complicated code. Data is easy to reason about. It sits there. Code is difficult to reason about. It has a dynamic environment and behavior that change while it is executing.
The Unix Way. Small, simple building blocks which can be combined in arbitrary ways are more useful than large, super functional building blocks that can only be used in a couple of ways.
Data Directed Programming. Lots of problems get easier to solve when you handle them by looking up a piece of code (closure, object, function pointer, execution token, whatever) in a data structure and executing it.
Functional programming. Not all problems can or should be solved in a purely functional style (IMHO), but when practical, purely functional code can be easier to write correctly and easier to debug than imperative code. Only introduce mutable state when there is a payoff in increased modularity.
Imperative programming. Learn how to write imperative code. You may need to read old books in order to do this since everyone is all into objects and functions these days, but you will write imperative code, and being good at it matters. Dijkstra wrote quite a bit about how to design an imperative program and how to prove that it does what it should. I highly recommend the book Structured Programming.
Use meaningful identifiers.
Don't be afraid to pull out the big guns when faced with a big problem. It's amazing how often I see someone spend a ton of effort trying to make a small tool do the job of a big tool, because the big tool is "too hard," when using the big tool would actually be much easier.
Don't be afraid to use old fashioned techniques when they fit your problem. I still occasionally use Control/Break processing, a trick that I learned from a Cobol book.
Learn how to type.
Master your text editor.
Master your command shell.