There is a major problem with this teaching approach: every module is a pre-requisite for the next one. Therefore, if a student fails one module, he will have to spend time fixing it instead of moving forward.
This not a problem with the teaching approach, it is the problem with "crash course" mentality.
The whole point of this entire course is to acquaint the reader with the foundations of the computer system. If reader does not understand a layer of the course, he SHOULD spend more time in learning that layer, rather than moving forward with half-cooked knowledge.
How is this a problem of the teaching approach? I haven't read the book, but my guess is that it is basically unavoidable, short of providing working code. No OS without a computer, and no game without OS, right?. Plus, it is probably easier to use something you actually built.
Anyway, if you really want to learn this stuff (well, any stuff), you have to "work his ass off until you figure it out"[1]. No pre-set time limit. Someone who is stuck will just take her time, go for help, rest, or whatever.
On a final note, I fail every single program that I write. Several times. Then I fix them. Every single one. And for several failures, I have nothing more than one success. It may sounds gloomy, but it feels good, actually.
They address this by supplying implementations. In principle you could do most of the course backwards, though I haven't heard of anyone doing it that way.
How would one understand calculus without understanding algebra? How would one understand algebra without understanding arithmetic? This isn't a major problem, it's the nature of learning interconnected things. The "major problem" is if the teacher forces the class to the next module without ensuring the students understand the previous one fully. Since this is a book the reader follows, that problem is eliminated.
The whole point of this entire course is to acquaint the reader with the foundations of the computer system. If reader does not understand a layer of the course, he SHOULD spend more time in learning that layer, rather than moving forward with half-cooked knowledge.