Programming education is broken because it focuses almost exclusively on how to tell the computer to do something (henceforth "the first skill"), rather than what we should be telling the computer to do.
Sure, plenty of people struggle a lot with the first skill. But it's almost entirely pointless to teach the first skill to someone who lacks the second.
It's as if you taught a pet how to indicate letters in sequence from among a pile of cards, found that they could spell no meaningful sentences, yet declared "ah, I have been successful, and to compound on my success I will teach them to do this with the Greek alphabet too!"
Thus we get legion programmers who can tell a computer to model a chessboard with `class WhiteRook extends Piece`, but fail to understand that this is a bad solution and bitboards are better. Or put in your favorite example.
This point comes up when we discuss the low relevance of specific language skills to hiring "senior developers" (this being how we refer to people who have gained the second skill). The usual story told to explain this phenomenon is that senior developers have mastered the first skill to such an extent that they can pick up any language quickly. There's an element of truth to that, but I think it is more accurate to say that the first skill is simply not very useful in the day to day job of a senior developer. Someone who has the second skill but lacks the first is simply better at the job than vice versa.
On the other end of the spectrum, I encounter this phenomenon in a forum for helping beginner programmers: time and again a beginner will ask "how do I frobulate the encabulator? I tried encabulator.frobulate()" - but when queried, they cannot explain in any terms why they are attempting to do such a thing. Upon further inspection it turns out that encabulators should not in fact be frobulated under any circumstances. But because the beginner only had the skill of figuring out how to do such a thing, it simply never occurred to them to figure out whether it should be done! Again, it's not merely that they were wrong about it, but rather, lacking the skill to make such judgment, the question itself is missing entirely from the repertoire of tools they have at hand for doing their work. Their problem-solving process is "1. Read the problem 3. Tell a computer to output the answer" but this is missing the most critical, maybe the only critical step: "2. Find a solution". This is instead treated as a minor interior part of step 3, which is a woefully ineffective process.
I'll throw out one more concrete example, although I know I'll lose some readers who will insist this is actually a reasonable thing to do: it is a perennial question, "how do I get $0.20 + $0.10 not to output $0.300000004" (or whatever it is). The correct answer is "don't use floating point math for currency", but the beginner gets so focused on that '.' in the input and the question "how do I make that '.' happen in my programming language?" that they fail to ask better questions like "what does that '.' mean?", "what is a floating point number?", "are they the same thing?", "What am I actually trying to accomplish?"
Sure, plenty of people struggle a lot with the first skill. But it's almost entirely pointless to teach the first skill to someone who lacks the second.
It's as if you taught a pet how to indicate letters in sequence from among a pile of cards, found that they could spell no meaningful sentences, yet declared "ah, I have been successful, and to compound on my success I will teach them to do this with the Greek alphabet too!"
Thus we get legion programmers who can tell a computer to model a chessboard with `class WhiteRook extends Piece`, but fail to understand that this is a bad solution and bitboards are better. Or put in your favorite example.
This point comes up when we discuss the low relevance of specific language skills to hiring "senior developers" (this being how we refer to people who have gained the second skill). The usual story told to explain this phenomenon is that senior developers have mastered the first skill to such an extent that they can pick up any language quickly. There's an element of truth to that, but I think it is more accurate to say that the first skill is simply not very useful in the day to day job of a senior developer. Someone who has the second skill but lacks the first is simply better at the job than vice versa.
On the other end of the spectrum, I encounter this phenomenon in a forum for helping beginner programmers: time and again a beginner will ask "how do I frobulate the encabulator? I tried encabulator.frobulate()" - but when queried, they cannot explain in any terms why they are attempting to do such a thing. Upon further inspection it turns out that encabulators should not in fact be frobulated under any circumstances. But because the beginner only had the skill of figuring out how to do such a thing, it simply never occurred to them to figure out whether it should be done! Again, it's not merely that they were wrong about it, but rather, lacking the skill to make such judgment, the question itself is missing entirely from the repertoire of tools they have at hand for doing their work. Their problem-solving process is "1. Read the problem 3. Tell a computer to output the answer" but this is missing the most critical, maybe the only critical step: "2. Find a solution". This is instead treated as a minor interior part of step 3, which is a woefully ineffective process.
I'll throw out one more concrete example, although I know I'll lose some readers who will insist this is actually a reasonable thing to do: it is a perennial question, "how do I get $0.20 + $0.10 not to output $0.300000004" (or whatever it is). The correct answer is "don't use floating point math for currency", but the beginner gets so focused on that '.' in the input and the question "how do I make that '.' happen in my programming language?" that they fail to ask better questions like "what does that '.' mean?", "what is a floating point number?", "are they the same thing?", "What am I actually trying to accomplish?"