Today, there is a grassroots movement for teaching programming languages to kids.
Some of the factors driving this movement include new devices like the Raspberry Pi1, initiatives like Khan Academy2, and a greater global emphasis on math and science education. For policy makers, the stakes are high because computing skills are now seen as an indicator for a nation's economic competitiveness.
But yet, as I will discuss below, we need a fundamental rethink about how we teach kids programming languages to prepare them for the next wave of computing.
From an education standpoint, here are seven goals we pursue when teaching programming. Many of these are not being addressed by current education techniques widely used in this field:
- To achieve a rapid, dramatic change in learning programming
- To be inclusive -- especially in the introduction of women to computing
- To achieve a smooth on-ramp for learning, e.g. maintaining interest for longer so as to reduce early drop-off
- To encourage hacking, or modification of existing software (and hardware) to foster innovation
- To understand the concept of "mastery" in a discipline, recognizing that even if mastery is not achieved, there is still value in learning programming
- To co-relate programming with other math and science disciplines at an early stage, e.g. not teaching programming in isolation
- To encourage systems thinking, the ability to see connections between the parts that interact to form a whole
Based on our work in trials with schools and educational institutions for the feynlabs methodology, here are the first five of our ten principles for transforming how to teach programming languages to kids.
1. Co-Relate the Teaching of Programming Languages to Real-Life Examples in Other Scientific Domains
Mathematician and technologist Conrad Wolfram has an insightful TED talk3 about teaching mathematics to kids in which he says that math as taught in schools looks very different from math as used in practice. In the real world, math is not necessarily done by mathematicians, but rather by other scientists like geologists, etc. The same ideas apply to the teaching of programming. Programming also does not exist in isolation but rather should be seen in the context of other scientific domains. Today, with kids who are aware of scientific developments through the Web, Wikipedia and many other sources, it is easier to co-relate programming to other scientific domains as we teach it.
Radioactive Fluorescent DNA Sequence
For example, consider a type of algorithm called a "pattern matching algorithm." As the name implies, the objective is to find a pattern within a larger pool. This basic technique can be used in many domains such as spam filters. The same ideas of pattern matching algorithms are used in DNA sequencing4, since that process also requires us to find a specific pattern in a larger pool. This is because DNA is made up of four nucleic acid bases ACGT (Adenine, Cytosine, Guanine and Thymine)5. Just like in a text search, DNA sequencing algorithms involve finding patterns based on ACGT nucleic acids within the human genome, which contains about three billion base pairs.
This example of DNA sequencing, although complex for kids, is a good way to make the teaching of algorithms more real. The ability to explore complex topics like these on the Web should be encouraged, especially when kids are new to the idea.
2. Prepare Kids for the Next Wave of Computing
Every decade, computing paradigms change radically. Cloud computing and big data are emphasized today with the "Internet of Things" becoming more common in the near future. These ideas are not too hard to grasp, and one could argue that they are actually very interesting to kids (especially big data principles). In addition, there is a fundamental shift in computing itself. Value will shift to a unique combination of open source hardware, open source software, proprietary software, algorithms and IPR. Making kids aware of these real-life changes in computing cycles helps them to think of becoming computing entrepreneurs.
3. Clarify for Kids the Economic Value of Learning Programming
We want kids to learn programming. But we all see that the best-paid jobs are in investment banking. Add to this the practices of offshoring and outsourcing, many employers' emphasis on very narrow technical skillsets, companies' lack of desire to invest in training, the choice of management as a preferred career path (as opposed to technology skills), ageism and discrimination against women in IT -- and suddenly the economic value of learning programming is less clear.
It is thus even more important to outline the raison d'être for learning programming and to discuss the many counter-arguments that provide a reason why young people should learn programming. For instance, computing will be an integral part of everything from manufacturing (3D printing) and medicine (genomics) to the arts. Almost all interesting jobs will involve computing skills, and many will often be in technology start-ups involving some form of computing at their core. In other words, kids will be the digital cathedral-builders of the future.
4. Delay Coding
Here, I am being a bit controversial. I believe that we place too much emphasis on coding at an early stage. This gives a false sense of achievement. For example, merely running simple programs is good, but it is only a first step which does not involve much thinking. Placing too much early emphasis on coding simple programs and environment setup also mixes the activities of thought and action. For example, the need to download software, compile code, perform initial setup and so forth breaks up the thinking process. Finally, these activities can often lead to an early drop-off in interest – for instance, if the setup is too complex or if the examples are too easy.
5. Discuss the Big Picture and Introduce Systems Thinking
In "Learning to Connect the Dots: Developing Children's Systems Literacy"6, Linda Booth Sweeney emphasises the value of systems thinking, which is broadly the ability to see the connections between the parts that interact to form a whole. This ability makes a big difference to all learning but is not applied much in the learning of programming languages. For instance, Arrays7 and Linked lists8 perform conceptually the same task, but when they are taught, the connections between them are not discussed.
In my next post, I will cover five more strategies for teaching programming which we are using in our trials. Our goal is not to teach a specific programming language. Rather, our goal is to abstract the common elements of programming languages and to create interest such that the participants can go on to master any programming language. I would welcome your comments and feedback if you are using similar tactics in your teaching. Are you using any of the tactics above? Please share your experience.