I think the fundamental problem with teaching code is that teaching code is not math, it's language, and language is quickly internalized once you 'get' it.<p>Most of the people who write books and web tutorials teaching code already know the code, but don't realize the extent to which they've internalized a large amount of understanding of the subject. So what makes perfect sense to them either gets dropped on the table without explanation, or struggles to actually give a clear <i>why</i> of the thing. Being able to recognize that, and explain those things clearly, is a very specific skill in programming just as it is in language, and just as sometimes language classes get given to someone who just happens to speak the language rather than who is a linguist, you will often find someone who speaks, say, Java or C++, but can't necessarily explain clearly <i>why</i> or <i>how</i> the patterns and techniques they've internalized work.<p>I'm increasingly a believer in more interactive methods of code teaching, because I think like language it's a subject that requires immediate practice to facilitate that internalization. Exercises like the Codecademy courses, or the Koans, which pair explanation with specific examples, immediate practice with new concepts, and equally immediate feedback about failures/successes, do a far better job of teaching a language than anything else I have seen.