The Progression Paradox, or Getting Ahead of Ourselves

I am archiving older pieces I have written on other sites, making this the definitive home for all my work. This is one of several I am porting over from my GameDev.Net user journal. Enjoy!

Learning resources identify a problem/challenge and then supply methodologies, techniques, best practices, rules of thumb and whatnot for avoiding/overcoming/solving it. The nature of the problem can vary from fatal - the program doesn't run, for example - to structural - the program is hard to maintain and extend - and so on. The one is obvious to all; the other, in this case, is meaningful only to those sufficiently advanced to have encountered it.

When writing a learning resource suitable for complete beginners, then, how do you address the challenge of presenting a technique or practice that solves a problem the student has not yet encountered? This is why most introductory C++ texts read so horribly; using inheritance to solve the "problem" of making different mammals "speak" is meaningless because most beginners aren't interested in that issue (and probably never would be, if it weren't for classes/textbooks). Similarly, refactoring x- and y-axis velocities into a single vector type is meaningless to beginners because they haven't experienced the downsides of not doing so yet.

How do you present a good practice like refactoring without getting ahead of your audience?