I really have to applaud how astute you've been with your observations of how your son is learning things. That's quite difficult.
Additionally, I'm glad you weren't afraid to hand your son the real tools and let him build and break stuff. For some reason with programming, so much of the curriculum (even for adults) spends a lot of effort to hide away the things that are perceived as too difficult (e.g., pointers, memory allocation, etc). For children in particular it seems to be the actual code itself, and so we have things like scratch. It's quite refreshing to see a parent go against the grain on this one.
As a programmer, I feel the 'fundamentals' are very important. Because, well, then there's no magic.
I think the curriculum hides the code because its just so complicated. For example, just to build on the web he has to learn 3 different languages (HTML, CSS, JS). To do anything simple (like move a box on a screeen) there are too many choices (animated gif, CSS animation, JS animation, etc). Then there's complexity of code management (eg: this game uses just 1 big file) or deployment (how do you "run" your code).
So I believe simplifying things (i.e. Scratch) is a way to get people to do it without getting scared of the complexity. In our case, the goal is to learn the complexity, just in baby steps.
I agree with you that I want a non-magic approach. I want to understand the nitty gritty so I am building my code with solid foundations based on how the actual hardware works.
However, this is not an approach that works for the masses. The vast majority of programmers are quite happy to work at the surface level and they can tackle a huge amount of the work doing things I consider too easy to be interesting. That's good, because I can't motivate myself to do that boring stuff either.
You are right that baby steps is always the way. Especially good when you can get something basic working, then test & iterate.
Additionally, I'm glad you weren't afraid to hand your son the real tools and let him build and break stuff. For some reason with programming, so much of the curriculum (even for adults) spends a lot of effort to hide away the things that are perceived as too difficult (e.g., pointers, memory allocation, etc). For children in particular it seems to be the actual code itself, and so we have things like scratch. It's quite refreshing to see a parent go against the grain on this one.