Over the years, I've been asked to provide some suggestions regarding what programming language should be mandated by government curriculum for teachers to teach.
One excuse for having a curriculum mandated programming language is that it'd help teachers with less knowledge tap into a bigger wealth of information as all teachers would be teaching the same language. Or at least having a main, recommended language would help curricula development, again because everyone would teach the same thing.
I can't agree with that position.
The government mandated curriculum should be language and vendor neutral, or else it'll be captured by greed, special interest lobbies, and corporations. It'll be technologically held back while the rest of the world moves forward until the next curriculum update (in about 10 years time --- that's more than one lifetime in technological progress).
Of course, the next curriculum update won't change much in the curriculum because of path dependence. Because so much resources has been created for the old outdated stuff, and so the curriculum would lock in a specific technology for decades at a time even if it gets outdated.
Do we want to lock into the curriculum for decades at a time: COBOL? FORTRAN? C? Java? C#? Python?
It's pedagogically unsound. We've seen this before as happened with TI-8x calculators. We ended up teaching in math "here's the buttons and the order to push them in, for solving a system of equations". I'm sure Texas Instruments thanks us and our students for being loyal customers. It's no better than having an ELA curriculum that mandates the teaching of a particular version of English: Old English? Queen's English? Voice of America's Special English?
In math, we teach mathematical thinking without mandating a common "main line" language or notation across the district. There are a few symbols they define in the curriculum, but there isn't a complete formal notation and language stipulated.
And that's a good thing. Almost every math class in university has a slightly different notation that was optimal for the kind of thinking demanded by that particular niche and level of understanding. It turns out using the "right" set of notations can make a problem next to unthinkable, vs. easily solvable. Einstein and Feynman invented their own mathematical notation (i.e. "langauge") for solving problems that went on to become "standards".
Programming languages are no different. It's just notation invented to solve problems and help us clarify computational thinking. We need to be teaching computational thinking, and the kind of notation we commonly use for teaching computational thinking is pseudo code (and despite Python being nearly "executable pseudo code", it's still too implementation specific to be truly pseudo code).
Certainly on a sufficiently local level (e.g. within a single classroom), it's good to have a common notation for students. But mandating that and pushing that on a provincial, policy, or government mandated curriculum level is just no good.
"But what about helping teachers who are not subject matter experts learn to teach computing science? Using a dozen languages within a district doesn't give them as much material to draw upon," a critic complains.
The problem of how to help teachers, who don't know computing science or programming, how to teach computing science is like the problem of how to help teachers, who don't know math or calculating, how to teach math. The answer isn't to mandate a standardized math notation or a particular brand of calculators. The answer is: they have to learn some math (i.e. mathematical thinking)!
Funny enough, I wrote most of the above quite a few years ago and left it to rot until now. And now, College Board is introducing a new Computer Science Principles course that does NOT mandate any particular programming language (unlike their older CS 'A' course that mandates Java, and before that, mandates C++).