As a technical instructor for DEV501 and now DEV450, I have found that there is a single overarching principle that Salesforce developers must adhere to in order to be effective Apex coders:
Developers have to understand how the Force.com platform works before attempting to write a single line of Apex code.
When developers from other platforms first encounter the Apex language, the natural reaction is to simply learn the Apex syntax and apply design patterns and principles from the languages that they already know. This is a fatal mistake.
Anyone can read documentation, memorize syntax, and find code snippets on Stack Exchange to hack their way through an Apex development project, but any developer who wants to write effective and efficient Apex code has to first understand the underlying platform.
To understand the Salesforce platform is to understand why it is designed the way it is, how it works, and what can and cannot be done with it.
Until there is a fundamental understanding of how this platform works, the power that lies within the platform can never be unlocked.