On the Importance of Programming
This essay was originally published in The Stag Hunt Special Issue on Human Education .
I recently represented the company I work for at a career fair in New York City. The ranks of job-seekers were large and diverse in terms of background, age, and experience. Among the job-seekers, however, one group stood out: people in their late 20s to mid-30s who were looking to start a new career as programmers, having recently made up their minds to dramatically change paths. Here were former investment bankers applying for an entry-level programming position. By itself this is not particularly surprising: many people realize that the careers they enter right out of college are not quite what they expected and decide to switch tracks. Given increasing demand for programming and computer science-related jobs, it is natural that many turn to explore this field.
This group of people, however, had something much more intriguing in common. When asked about their first ventures into programming, many people used phrases such as “I never knew it was so easy…” or “it really surprised me that…”. Here were bright, curious people, most of whom had done reasonably well in their past lives, accidentally catching glimpses of how some very simple programs work and being taken completely off-guard by it. These people were so intrigued by the world of programming that they could not help but dive deeper into the rabbit hole. A common path was an intensive program taken over the course of a few weeks (General Assembly was a popular option) and then a full plunge into the world of entry-level job hunting.
This leads to a very important question: why had these people never been exposed to something with so much utility and transformative potential throughout the many years they had spent in the education system?
The gaps in our education system
At the source of this is an educational system based on an outdated view of what it means to be computer-literate. With regards to any kind of technology, people fall into one of three broad categories: those who do not know how to use it, those who do know how to use it, and those who understand how it works and can manipulate the technology for their own purposes. For the modern digital age, these groups could roughly be described as those who have never used a computer or smartphone, those who use one or both, and those who can program.
It seems generally understood that those who do not know how to use a computer are significantly hindered not only in today’s job market, but also in significant ways in their personal lives. In response to this, schools across grade levels invest significant resources into furnishing computer labs and into integrating computer use into their courses. Students are taught to search for books in the library system, use specialized software to process data from science experiments, and research and write essays on computers.
This process, however, succeeds only in preparing students to be users or consumers of technology. Ask a graduate to perform a task on a computer that he has been shown before and he will likely have little trouble doing so. Even tasks that are new to people often pose little issue: provided with software designed to accomplish a particular task, a technologically-savvy person will typically have little trouble learning how to use a particular function, being able to access a wealth of tutorials and guides on the internet. But ask a typical graduate to automate anything that their software wasn’t designed to do, and they will be a dumbfounded. How do they accomplish something when they haven’t been given the software to do it? Where would they even start?
Programming isn’t just for nerds
The answer, of course, is that they will need to be able to program, which is something that most graduates have never been exposed to. This makes the task seem particularly and unnecessarily daunting. Programming is still seen as the domain of nerds and geeks who have mastered arcane skills through countless lonely hours in front of their computer screens. This is unfortunate not only because it is inaccurate, but also because it discourages people from finding out for themselves, creating a self-perpetuating myth.
The root of the problem in embedded in our educational system. According to code.org, a non-profit dedicated to growing computer science education, nine out of ten US high schools do not offer programming classes. Where programming classes are offered, it is often as an afterthought or niche: in 37 states, computer science courses don’t count towards high school graduation math or science requirements. In higher education the situation is better in terms of accessibility to computer science courses as well as the credits awarded for taking such courses, which makes programming skills more accessible to those who want them. On the other hand, taking a programming course is often not a requirement for students of all majors, which does nothing to remove the aura of technological mysticism that many non-technical people perceive around programming.
Just like writing has uses well beyond english courses and numbers have uses well beyond mathematics, programming could pervade many lines of inquiry and belongs in much more than specialized computer science courses. In a literature course, a student might run a few queries to acquire sentence length data in Thoreau’s Walden and strengthen their argumentative essay that the book is long winded. In science, a student might use a script to automate taking pictures of Saturn each night with a remote telescope, or to model the planet’s orbit. In history, a student might build a game to analyze the decisions that JFK and Nikita Krushchev faced in the Cuban missile crisis. Throughout these exercises, students would learn how to manipulate programming abstractions to concrete situations, increasing not only their programming skill but also their understanding of the classes’ subject matter at a fundamental level.
In fact, the core concept behind programming – unambiguous, logical thinking – is so intuitive, naturally interesting, and ultimately rewarding, that it is a waste not to introduce young people to the concept of creating programs even before high school. Courses designed to teach programming to pre-high school children have already been developed. These often involve writing simple programs to guide a virtual robot or dog, and are designed to keep young children entertained. The tasks involved are simple, yet sufficient to teach the basic concepts of programming. Given the ease with which new programming skills can be learned once a basic foundation is in place, this can be enough to have a profound impact on a person’s life.
Like any language, programming forms a scaffold, and early programming education empowers students to teach themselves. Because programmers are by necessity a tech-savvy bunch, an extensive support network for just about any programming-related task can be found online. This includes not only documentation on all the features of a particular language, but crucially also mature question and answer communities that can guide individuals through anything particular tricky, from low-level language details to high-level algorithmic considerations. A noteworthy example is Stack Overflow, the success of which has led to the creation of a whole family of similar question and answer sites on topics as diverse as chess or the english language.
An important factor contributing to the broad transformative potential of the ability to program is the fact that many of the tools programmers use are free to use (or, at least, free alternatives exist). This minimizes the cost to schools to train their students in industry-standard environments and techniques, and gives individuals access to many of the same tools that a large corporation might use. This includes even highly specialized libraries, such as OpenCV, the computer vision library. OpenCV is free, includes implementations of the best algorithms published in recent research papers, and is the de facto standard in programmatical image manipulation. As a result of such free and open source software, programming skills are highly transferrable between companies as well as industries.
Regarding this broad utility of programming, Gabe Newell, founder of computer game maker and online distributor Valve, says “the programmers of tomorrow… are going to look like they have magic powers compared to everybody else”. At a different time in human history, writing was the provenance of a small educated elite. Today, the democratization of programming has the potential to be just as transformative as the near universal literacy that exists in the developed world today.
Programming can help you, your boss, and your mom
Allow me to illustrate with an example. A friend of a friend was fresh out of college and needed to get a job fast. He found a data entry position in a large company, where he would be one of many people doing the same task. This person had a degree in literature, but had taken an introductory programming class during his undergraduate studies. Within a few days, he had written a script to automate the data entry process, allowing him to finish each week’s workload in a few hours. Here was a task that people had been the same time-consuming way for months, and someone with a basic knowledge of programming was able to automate it in a few days’ time in a manner that increased productivity by a ludicrous amount. Why shouldn’t every person be exposed to the skills that have this transformative potential?
These skills are useful across the working hierarchy. An executive at the company I work for recently needed to make some decisions that would impact the user experience. To make these decisions, he needed data. And we had the data – as thousands of entries in a database. He could spend hours or days going through this data and trying to glean insights from the information, but if he had basic programming skills, he could have written a script to parse the data and produce informative charts for him automatically. What ended up happening, of course, was that he asked a programmer to do this for him. This got him the data he wanted – but it was through a middleman programmer, and that programmer had to fit this task into his schedule, resulting in unnecessary delay and lost productivity. Ultimately, the process would have been much more straightforward if the executive had had basic programming skills.
I’m not arguing that we should all be programmers as our primary job function, or that programming should replace other skills – far from it. Programming is just one tool that should be in the toolbox of any effective human being, along with skills like reading, writing, mathematics or communication. It is not a replacement for any of those other skills, but rather a complementary skill that should always be at the ready. Given that more and more of the information we process and produce is digital, it is only natural that being able to rapidly analyze, use, or transform it programmatically is an asset that will grow in importance for people of all walks of life.
Indeed, programming isn’t just for the people we think of as “programmers”. The very distinction of programmers as opposed to non-programmers is bound for obscurity, because programming is for everyone. It is the foundation of a massive and forever-increasing slice of our lives, and even today the ability to program separates passive consumers from active creators where technology is concerned. In the same way that those who couldn’t read and write a century ago were locked into a marginal, ever-disappearing way of life, those who do not understand the concepts of programming will become marginalized a decade from now. A vast online ecosystem already exists for learning these skills, and the time has come for our education system to fully embrace this change and unlock the transformative potential of programming so that all students can benefit from the revolutionary power of the digital age.