Well, part of the problem here is obviously Java. Most really good programmers choose their language for the language itself -- and they wind up with things like Scheme, Ruby, or Python. People who are in programming just for the money learn Java, Visual Basic, or C#. Paul Graham's Python Paradox is that as Python grows in popularity, the quality of Python programmers may decline as people use it out of job requirement, not desire to program in Python. (http://www.paulgraham.com/pypar.html)
Regarding apprenticeship -- the problem here is that a lot of experienced programmers aren't good. Having 10 years of experience writing bad software is just that -- reinforcement of bad skills. The truly good programmers don't always (but not never) have the aptitude for guiding a creative skill. Joel himself comes to mind.