The point of teaching some computer science and _programming_ to children, is EXACTLY to teach them:<p>- (very) critical thinking<p>- (very) high attention to detail<p>- using very precise language<p>- navigating multiple levels of abstraction<p>- applying logic and reasoning<p>And definitely NOT to make them professional programmers, or to teach them some programming language or system useful for their professional life.<p>The thing is that learning programming is the most effective way to teach those skills.<p>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).<p>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.<p>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.<p>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.<p>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.<p>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.<p>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.<p>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.<p>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.