5. Code modularity.
This I learned through sheer experience. IMHO, it is the only way to learn it.
For the first two or three years out of college, I programmed haphazardly. I suffered the common affliction of many people who enters the work force: an attack of amnesia about stuff they may have tried to teach in college. I found myself writing routines with hundreds of lines of code, lots of global variables of course, routines doing several different unrelated things...
A coworker happened to have Yourdon and Constantine's Structured Design on his bookshelf. Even then it was years old, and out of print, but I started reading it, and after having worked for a couple of years, all of a sudden a lot of the concepts they'd tried to pound into my head in college made sense.
And like you, I think most people need experience before they can properly appreciate the concepts.