I teach programming for two reasons: to increase the diversity of the tech industry, and because I believe that the skills used for programming are both relevant to our lives and transferable to non-programming fields.
I’ve read arguments that everyone should learn to code, and I’ve read arguments that not everyone should learn to code. I’ve even read arguments that not everyone *can* learn to code. I don’t feel that I need to pick one side or the other in these arguments – for me it is enough to say that, at the very least, more people should learn programming than do now.
Diversity in the Tech Industry
Lack of diversity in the tech industry is a problem. It is a problem because it creates a culture in which women feel excluded and demeaned. It is a problem because it fails to provide identifiable role models to vast numbers of children growing up and wondering what they can do in their lives. It is a problem because it results in products that perpetuate exclusion.
In my school, basic coding is a required subject, because I teach all technology students in grades 8-10 and I designed the curriculum that way. I explicitly think of this as a feminist project (among other things). Based on the model of Stuyvesant High School – my alma mater – we can conclude that introducing girls to the realities of computer science at the earliest opportunity increases their participation and interest in the subject later. My hope when starting out was that I could have a similar effect on the gender ratio in my school’s upper level, elective CS courses. Of course, I can’t know that until next year at the earliest, but it’s something that’s always in my mind.
What I do know is that many of the students in my classes who are the most engaged, productive, and creative with coding are the girls. By coincidence, the four best projects in my classes so far have been made by girls (you can view them on my class demo site), and I am very proud of this fact inasmuch as it relates to my goal of promoting gender equality.
The drawback of both my school and Stuyvesant is that they are elite – mine due to price, and Stuyvesant due to a competitive entrance exam. Both of these barriers to entry perpetuate exclusion. What I would like to do as one of my next products is to see if I can promote CS education across lines of race and class. This is why I am in favor of initiatives to introduce rigorous and comprehensive CS classes to all public schools.
Computer science and programming education promotes computational thinking. Computation is, at its core, the execution of a set of ordered instructions. Learning to work with sets of ordered instructions – how to give them, how to understand them, and how to anticipate their outcome – has applications in virtually every field of human activity. This is especially true when some of those instructions are repeated – when they become an algorithm.
Many students only learn algorithms in the context of mathematics – they learn one algorithm for each arithmetic operation (or two, in the case of division: long and short), and perhaps later they learn some more, or perhaps they don’t. Algorithms are immensely important, though, and so it is unfortunate that people don’t study them explicitly. Most things run on algorithms. Nearly everything that I am notably good at, I am notably good at because there is an underlying algorithm which I have learned and optimized. I have an algorithm for packing a car trunk. I have an algorithm for winning 2048. I have an algorithm for finding something out on Google. I have an algorithm for debugging code.
You probably have algorithms, and the better you are at something, the more likely you are to be able to articulate one. What you might now know is that being able to think algorithmically will make you able to get really good at a lot of things really quickly. If you don’t believe me, try it!
At a higher level, computation is about breaking problems into smaller pieces and articulating a solution for each piece. It is about building and understanding systems. These are valuable life skills. The world is full of systems to understand and problems to solve.
We teach biology, chemistry, physics, geology, and general science to students – not because we think they will all become biologists, but because we want them to understand the scientific method. The scientific method is important, but computational thinking is more important. Computational thinking fully encompasses the scientific method – which is, after all, precisely an algorithm: a set of ordered instructions which becomes immensely powerful through repetition.
Of course, the hard sciences also teach students how the world works – and our world is a computed world, which means that computer science ought to take its place among the hard sciences. There’s no compelling reason why it’s more important for me to know what mitochondria do than to know what a DNS server does, and yet I learned about mitochondria in High School but I learned about DNS servers in my late twenties, in the course of fixing some problem I was having with my computer.
And that brings me to one last point: computer skills are of immense value both theoretically *and* practically. Computational thinking is an immensely valuable cognitive tool but computer science also provides you with the experience to be able to make the most of the physical tools that we encounter every day.
Some have argued that just as you don’t need to know how an engine works to drive a car, you don’t need to know how a program works to use a computer. Correct, but my dad taught me how an engine works anyway, along with how to change a tire and check the oil, because he thought there was value in having the theoretical and practical skills needed to understand and maintain something that I used every day.
So that’s why I teach kids to code.