I agree with you on some points, but disagree on others.
I agree that most of the problem is crappy software. It does, however, make me appreciate the truly good software even more.
I agree that there is something to be said for understanding how everything works to a fine degree. However, I think that ability to mentally "chunk" systems you don't care about, and just think of them on a high level, is absolutely crucial to progress. I also think that kids today will find the same kind of joys writing XNA games, or iPhone apps, or fooling around and making "cool stuff" in just about any language.
I also think that it's possible to constuct a useful conceptual framework of the underlying layers without needing to know what's going on down the nth degree. Depending on how you look at it, that 16k program that you think you grok completely, depends on the interplay of concepts all the way down to the subatomic level. With respect to understanding how your program works, do you really need to know the specifics?
Likewise, if I'm programming in a language, interpreted by a VM, memory managed, providing frameworks to do things like render graphics, play sound, interpret input, etc, do I really need to understand how an ALU works to fully understand my program? I don't think so.
(Playing devil's advocate a bit, as I'm quite obsessive about understanding things from the bottom up. But I understand that this is a personal quirk, and that it's not necessary, given reliable substrates and effective models)