Deliberate practice to make for a better developer
andrewcooke: maybe you can, to some extent, exploit the nature of software?  i'm thinking about how i have learnt, and how that ties in to the points you list above, and one obvious connection is that you are automatically guided to "highly granular areas for improvement" if you continuously refactor and revise (polish) you code.typically, to learn a new language, i solve a problem.  the result of solving that problem is a chunk of code and it's usually a bit of a mess.  you can use the mess to help identify what needs to be refactored.  this then guides you towards learning more about the language, because often the mess is a direct result of not using the tool well.note that what you're exploiting here is the fact that it's a lot easier to identify "a mess" than it is is to identify a gap in your understanding of the language; identifying the mess helps guide you to the gap.at a higher level, the conclusion here is that you have not finished learning once you've written some code in a new language.  in fact, you are just starting.  it's only through repeated (obsessive?) polishing of the code that you achieve a deep understanding of the language.(and i think this also applies to languages you know pretty well - i use python at work, and have used it for years, but i am currently working on the fourth major revision of my lepl parser library and am still learning as i rewrite particular aspects).