- (very) critical thinking
- (very) high attention to detail
- using very precise language
- navigating multiple levels of abstraction
- applying logic and reasoning
And definitely NOT to make them professional programmers, or to teach them some programming language or system useful for their professional life.
The thing is that learning programming is the most effective way to teach those skills.
Teaching mathematics (and making them build theorem proof) fails to teach that to most pupils, because they don't see the purpose of maths (it remains too abstract to them). Teaching them any other matter is even worse for this same reason. Also, one problem of maths teaching (and also for other matters), is that the entity that detect errors and correct or help the pupil find a correction, is the human teacher. This error detection and correction made by a human is loaded with human relation interferences that are often nefarious for the learning experience. ("I wasn't good at maths because the teacher didn't like me", or "I didn't like the teacher", etc).
On the other hand, the computer is a neutral tool, and when the computer system signals an error, and give some clues as to how to correct it, the pupil can remain receptive, without any emotional involvement about it. The error is not something that is wrong with the pupil, but really something that is wrong in the program, external to the pupil, and that the pupil can correct. And as importantly, as mentionned above, contrarily to maths, when the program is done and correct, you obtain a concrete result, a running program! Once you've led a pupil to the steps showing him how to write his first program and have it run successfull, they are generally hooked and can't stop making progress.
What's the point of using a precise orthography, (beside avoiding bad grades given by this evil teacher)? But when the computer says invalid token or undefined variable, the pont of using a precise orthography is immediately clear, and the correction gives an immediate positive feedback in the form of a running program.
What's the point of logic and reasoning? (All this mathy stuff, useless!) Well, not so useless, when it allows you to build a program doing what you want in all cases, or when it allows you to find the bugs in it.
What's the point of being attentive to details? Nowhere, in the life a children, do details matters. But when he writes a program, all the details will matter, producing results differing to what he wants to obtain. Here he will learn to be attentive to details.
And where else do you have multiple level of abstraction available to you, for study, creation and modification? Can you play with your cat, and deconstruct it's biological system, enter a cell, and study its thermodynamics, enter the molecule and play with its electron cloud? Can you change the charge of the electron and see what changes two level up for the poor cat? NO WAY! Only when writing programs, you can build such layers of abstractions and there you can learn how to navigate them. There is ABSOLUTELY NO OTHER WAY to teach that to pupils.
And finally critical thinking. While some critical thinking could be taught without learning programming, it is not something that's usually taught early, because it relies on logic and reasoning and knowledge of a lot of historical, sociological, and philosophical data that is available only later. Some stuff could be done with physics or chemistry EXPERIMENTS, but the problem is that it seems that it is much more costly in time and resources to have pupils perform enough physical or chemistry experiments than merely having them program. So here, since programming will teach earlier logic and reasoning, and attention to details, it will also, in the context of programming, but also extending to the wider real world, if they write "useful" programs in relation to the world (a game with a physical simulation, a social application, or any program whose specifications are actually imposed by "users"), they will have to learn at least some form of critical thinking. At the very least, when they'll learn the other matters, they will already have tools to extend their critical thinking to those other domains.
Really, the only thing you need to teach before Computer Science, is reading writing calculating, some maths, some physics, and that's about it. Having to write a program will then motivate them to learn the application domains.
If you want to write a realistic 3D game, you will learn some physics, if you want to write a translation program, you will learn some linguistics and statistics, etc. At this point what teaching programming has done, is basically to introduce the Montessori method surreptitiously.
Maybe not even. Alan Kay & co, with Scratch, used to teach physics and Science (with a big S) with the aid of programming. One of my favourite example was the teaching of Galilean physics by filming the fall of a rock. The reported result was that without the computer, almost no child could understand how it worked. With the computer, almost all children were able to derive a model by themselves —I suppose with some guidance.
TL;DR: Want better teachers??
Raise their salaries and respect them professionally, like some countries in southeast Asia and Japan do. Don’t let parents tell teachers that the teacher should have given them a perfect A+, and their corn-flake special child is perfect and isn’t understood by the rest. Teacher, after all, are professionals trained in the art of education, child psychology, etc. Reduce the amount of bureaucracy, or completely reboot the public school system by some disruptive measure.
-- My full arguments here
I think your arguments are on the right track, and I agree that (very) critical thinking should definitely be part of a school's (heck, even federal) curriculum, but in practice, I think mayor's De Blasio's program (http://www1.nyc.gov/office-of-the-mayor/education-vision-201...) is a good policy to effect the kind of change we want to see.
As someone who has gone through the public education system in the United States, Argentina, and Israel, whose parents are (still) high school teachers, whose wife was a public school teacher, I can tell you first-hand that most school teachers get paid a really crappy salary; in New York City (see charts http://schools.nyc.gov/nr/rdonlyres/eddb658c-be7f-4314-85c0-... and http://www.uft.org/files/attachments/secure/teacher-schedule... ), the starting salary is $45,000 annual, and the current ABSOLUTE MAXIMUM (22 years of experience with a bachelors and a masters degree) is $100,049. There are some ridiculous things about this chart, including the fact that it's set UNTIL freakin' 2018.
Teacher often barely get a 1% salary raise (on a good year), and, to make things worse, are the only professionals in the US where the government tells them exactly what they should teach each day, every day, only so kids could pass some standardized national test (see: the No Child Left Behind act that Bush gave us).
Don't forget that these are just salaries, in New York city, which are unusually high for the rest of the United States. Look up Texas -- the starting salary is $27,540 (http://tea.texas.gov/Texas_Educators/Salary_and_Service_Reco...), which is hovering near the poverty line in the United States. And yes, some schools actually give teachers these salaries (usually in more rural areas). Compare that to the average threshold of poverty(https://www.census.gov/hhes/www/poverty/about/overview/measu...) in the US, and you will be embarrased to live in this country, and awed.
That means that, those really smart people you want to be teaching your future children are going to, by an large, opt-out and become lawyers, doctors, or, case-in-point software developers, but not teachers.
I have seen this at every step of my education, where my teachers often told me that I had a lot of potential, but they often failed to really challenge and in the math and logic department.
(e.g.: If it hadn't been for my middle-school physics class in Argentina (Jesuit schools for the win), I would have failed college physics, because my public US high school teacher couldn't really teach it.)
This is why private and charter schools exist. The US public school system is cyclical with its policy (more testing, 10 years pass, do less testing), slow to move, inefficient, beaurocratic, and by and large broken. Even Zuckerberg tried to donate some money recently, and I believe it didn't really work out very well in that regard.
But hey, some of us made it out of there and did okay.
On the flipside: English teachers (in my experience) generally do a good job at teaching critical thinking and writing because there is a large number of people with degrees in the language arts, so there's plenty of healthy competition there. Not so many CS graduates go straight into teaching.
-- Arie Litovsky, Co Founder of Teaching Table [@arie_speaks](https://twitter.com/arie_speaks)**