Following the previous post about teaching programming languages to kids, here are five more strategies which we are using in our trials at feynlabs. Our goal is to maintain young people's interest in learning programming so that the participants will acquire enough depth to take independent steps beyond what they learn. As usual, I welcome comments and feedback

6. Use Hacking as a Fundamental Teaching Tool

We often start teaching new students about code by writing new programs. However, we don't emphasize modifying existing programs. Yet, in many real-life instances, we often spend large amounts of time modifying existing programs. The ability to make small, incremental changes to an existing program is a valuable tool to learn programming, especially because it provides a quicker payoff. It is a softer way to start programming and to focus the mind on specific changes.

Here is an example. I used a program on the Web called w3schools9 to introduce my then eight-year-old to JavaScript. When he saw code for a simple alert box for the first time, he quickly made it into a prank by changing the message text to a shutdown alert (an error message). In other words, he did not write the program but instinctively understood what it could do and saw the value of modifying it to create another function. Modifying programs instead of writing them from the start could thus be a simple and effective learning tool.

w3schools Code for Shutdown Alert

Credit: Ajit Jaokar

7. Start with One Programming Language But Don’t Limit Yourself

To teach programming, you have to start with a specific programming language -- but you need not confine yourself to only one programming language. The popularity of programming languages is based on various factors which are often commercial. Thus, in the '80s, if you started learning programming, you used Basic/Pascal. In the '90s, you may have used Java or JavaScript, and so on. Today, as computing continues to evolve, there are many programming languages which are popular. Teaching only one gives a limited perspective. Also, thanks to the Web, it is now possible to look at more than one language. This idea lays the foundation of our work in teaching concepts of programming languages to kids.

8. Use Multimedia for Learning and for Content Creation

Most people would agree that multimedia plays a major part in education today. On almost any given topic, you can find some great video on the Web for free (on YouTube, for example). However, multimedia -- and especially video -- can be used as a content creation tool. We are using this approach in a trial where we create video with ScreenChomp10. The advantage here is that in creating video, participants learn programming concepts and techniques in a much more dynamic way. This reduces drop-off rates.

9. Separate the Exceptions from the Rules

Programming is taught linearly, topic by topic. But it could be easier to teach in two passes or stages -- first the core idea and then the exceptions. This makes it easier to get the basic idea first and then build upon it subsequently. For example, explaining passing parameters by reference vs. by value11 to a function can quickly get complex. Hence, it is easier to first explain parameters and functions and then come back to more complex topics like passing parameters by reference.

10. Discuss Learning About Learning

Finally, in all learning it is important to understand "learning about learning." There are three phases of learning. First is the aptitude/interest stage, when the educator either recognizes the student's inborn aptitude in a subject or fosters the student's interest in it. Essentially, all the work we are doing at feynlabs is in this stage.

The second stage is the apprenticeship stage, where the apprentice engages in extensive training under an expert. In Star Wars, the apprentice is the "padawan," and this three-stage process is enshrined in Jedi training.

The third stage is the mastery stage, where the participant is able to see the complete picture and recognize interconnections between components such that she can extend her existing body of knowledge. For example, Charles Darwin embarked on a voyage to South America. In doing so, he collected so many specimens that a theory began to form in his mind where he was able to see connections between specimens which others could not see. This is the "mastery" stage.

In teaching computing and programming, here are some observations:

Not everyone will want to master programming. Many will want to take their interest to the next level. This would be useful, considering that computing will be a central element to many jobs.

The ability to "hack" or change many physical objects in future will require the ability to understand some programming. In that sense, knowledge of programming will be useful even if mastery in programming is not attained.

The Internet allows us to accelerate the path towards mastery. Howard Rheingold, in his book NetSmart12, sees the ability to engage with cyberculture as a core skill, much like driving a car for the current generation. This ability will be an asset to acquiring mastery.

The Key to Future Innovation

To conclude, why should we rethink and accelerate the way programming is taught?

Programming as a skill will be critical to the economic prosperity of future economies. There is a fundamental shift towards "knowledge-based creative activities,"13 which will be driven by computing and programming skills, since programming allows you to think, hack objects and create. Hence, it is a fundamental skill to future innovation.

In terms of rules and exceptions, I think the "why" is always really important. To explain a new concept (say like passing parameters by reference) needs a real explanation as to why it is necessary especially when you can (in many cases) program the same thing in two different ways. Having the right example which shows the efficiency of why you would do it (speed or number of lines of code) - or something else is necessary.

I am an athletics coach in my spare time and encourage children to do warm up, cool down and drills during a training session. I have rarely found a child who wants to do these things rather than just going out and just running (or jumping, throwing etc.). In early years, therefore, it is just part of the game they play. As they grow older and more proficient, they start to understand why they do these parts of a session (ie to become a better athlete) and hence start to appreciate what individual things need to be practiced in order to become better as a whole. Although the analogy is not great, I think the same applies to programming. Children cannot really appreciate the individual components of programming until they have played with them as a whole and start to appreciate why each of them has a role to play.

These strike me as being valuable strategies for teaching programming. One thing that I don't see, though, is any mention of computer science. Maybe this is part of "other math and science disciplines" in the first Principles post, but I can't tell--and of course there's a tight relationship between programming and other topics in computer science, which would be worth emphasizing independent of connections to other fields.

its very good information about computer providing such information is an inspiring because its really helpful for the readers and very useful technology. I like your post its very informative and very awesome. Keep providing such kind of good post.