Its not that we don't have the right tools to teach kids how to code, its that (as usual) we don't have the right teachers. I taught myself/was taught by my brother when I was in 6th grade. In high school, I took the compSci AP (and spent about half the time taking a nap). The year after that, I took the 1 programming class my school offered, which was a project based intro to programming (with an awesome teacher who made sure I got something out of the class).
What struck me about the class was the way it was taught. We used Java (actually, Processing [1]). In most of the early lectures (which there weren't many of), he would say 'for now, this is just syntax, it will make sense later' instead of explaining the more advanced concepts needed to understand why we write certain things. The main flow of the course was (I am inventing the details):
Calling a function tells the computer to do something. Here is a bunch of drawing functions, make a picture.
Then, using that he would ask students to make minor changes, like shift the entire thing 5 pixels.
Then he would introduce variables and assignments.
Using that, he would ask them to draw parallel lines.
Then, he would introduce loops.
Then he had them make a bouncing ball simulator (just 2 balls)
Then he introduced objects
Every time a new concept was introduced, its use and benefit was clear because people had already seen the code duplication that it solves. After the initial lessons (which only took about a month), the class was pretty much entirely project based, where we were given (loose) guidelines and had to design and code a program.
Most of the time spent in that class was problem solving. Because math is an incredibly powerful problem solving tool, much of that time was spent doing math. But it was spent using math as a tool to solve a larger problem.
After (and during) that class, many of the other students (whom had never coded prior to taking the class) asked me for advice on programs they were writing that were completely unrelated to the class.
So, it is quiet possible to teach kids how to code without scaring them off. It generally helps if you don't show them pointers, or bit shifting, or linking, ETC until they are ready.
What struck me about the class was the way it was taught. We used Java (actually, Processing [1]). In most of the early lectures (which there weren't many of), he would say 'for now, this is just syntax, it will make sense later' instead of explaining the more advanced concepts needed to understand why we write certain things. The main flow of the course was (I am inventing the details): Calling a function tells the computer to do something. Here is a bunch of drawing functions, make a picture. Then, using that he would ask students to make minor changes, like shift the entire thing 5 pixels. Then he would introduce variables and assignments. Using that, he would ask them to draw parallel lines. Then, he would introduce loops. Then he had them make a bouncing ball simulator (just 2 balls) Then he introduced objects
Every time a new concept was introduced, its use and benefit was clear because people had already seen the code duplication that it solves. After the initial lessons (which only took about a month), the class was pretty much entirely project based, where we were given (loose) guidelines and had to design and code a program.
Most of the time spent in that class was problem solving. Because math is an incredibly powerful problem solving tool, much of that time was spent doing math. But it was spent using math as a tool to solve a larger problem.
After (and during) that class, many of the other students (whom had never coded prior to taking the class) asked me for advice on programs they were writing that were completely unrelated to the class.
So, it is quiet possible to teach kids how to code without scaring them off. It generally helps if you don't show them pointers, or bit shifting, or linking, ETC until they are ready.
[1]http://processing.org/