Tangentially related to this issue: I went back to university for a CS undergrad in my mid-20s after already having some experience writing code. One thing that really struck me while both TAing and informally supporting others in an intro programming class with somewhat subpar teaching was how many people went through the whole thing never grokking how the code was actually parsed by the computer. They would sort of learn how to solve problems, but many would still constantly get tripped up by things like confusing meaningful keywords and function names with arbitrary naming of variables and so on. At the beginning, the course just sort of jumped straight to showing finished code for simple problems, introducing python library functions, and so on — without ever really having students develop a low-level understanding of what was going on (by which I don't mean "what's the machine code this turns into", just "how is this code structured at the low level").