Can (and Should) Everyone Learn to Program?

Photo by Luca Bravo on Unsplash

Fair warning: The following article is long, rambly, and contains no code. It does, however, contain some rumination on the idea that everyone can and should learn to program. Want to put your two cents in on the topic? Skip straight to the comments – I look forward to reading what you think.

So, I was just thinking, it would be really great if you could come present to my CS class – talk about programming in general, as a job, that kind of thing.

Recently an old university friend of mine, now a Math and Physics teacher, was tasked by his administration with teaching computer science to his highschool students.

His experience with CS being limited to the half a dozen or so courses he took years ago to fill out the minor requirements of his degree, and the prescribed curriculum being heavy on the history and ethics of computing and light on actual programming content, he’s been struggling with how best to present the essential concepts in a way that would appeal to typically lethargic teenagers.

They really need to be taking the work home, exploring the concepts on their own – there’s only so much we can do in an hour a day. There’s all sorts of resources out there – I just need a way to spark some excitement about programming in them. Maybe having a ‘real’ programmer come in would be helpful?

I agreed, and began to prepare my presentation. While the Way of the Programmer had been known to me since the childhood discovery of the QBasic interpreter in DOS, it wasn’t until highschool that I truly took the first steps on this Path to Enlightenment – thanks in large part to a wise teacher/mentor, as per the trope. Doing my part to introduce some young minds to this sometimes frustrating, but often rewarding discipline would be a Good Deed®.

I had an additional ulterior motive, however. I had often seen espoused – mostly in various communities populated primarily by programmers (such as Hacker News) – the opinion that programming was/is the new literacy; that is, a basic element of education that everyone can and should learn. Both they and my teacher friend had noted the ever-expanding collection of sites dedicated to teaching programming: Code Academy, Starter League, Code.org, amongst many others. They seemed certain that not only could anyone learn programming, but everyone should learn programming.

I wondered if anyone not already committed to our discipline felt the same way – particularly the students who should apparently be learning their if, while, foreach alongside their ABCs.

Here was a chance to find out.

While I mostly wanted to present on programming as a career, my friend had asked that I cover some programming topics and be receptive to any questions the students might have. Also, I wanted to present them with a little programming challenge to cap off the presentation – something simple they could achieve that might spark interest in some of the more complex challenges or learning resources on the web. So, before preparing my presentation, my friend and I had a chat about where his students currently were, programming-wise, three months into the course.

Well, I started off trying to take them through some basic control structures – if/else, loops, etc. – but they just couldn’t follow the logic. They had a tough time grasping why functions or classes were better than just writing everything in main(), so I had to back off there too. I’m hoping to work them back up to it, but we’ve really only gotten as far as some basic string manipulation.
They… really like video games, though.

I thanked my friend for his time, feeling reflective. These were students who had chosen to take a programming course, in place of another science-related elective – assumably amongst their student population, they would be the ones most interested in (and, by extension, most capable of) learning to program. The unworthy thought that perhaps my teacher friend was just teaching it wrong flitted across my mind – while he is a far better mathematician than I will ever be, his CS experience is, as previously mentioned, fairly limited.

But even if this were true (and I’m quite certain it is not), by the arguments of many of the programming literacy advocates, that shouldn’t really matter – these students could always supplement a lackluster in-school education with any of the numerous self-teaching resources.

The presentation itself went well, I feel – the class was attentive and responsive (as much so as any group of teenagers early in the morning ever are). It was, however, easy to pick out those in the class with minds inclined towards programming. There were moments of dawning comprehension that could be seen in them – not just a matter of possessing more knowledge than their fellows, but the ability to grasp abstractions and make logical connections that the others in the class could not.

Before expanding upon the previous comment, let’s note again the assertions we are considering: that everyone can learn programming, and that everyone should learn programming.

I’ve been an athlete for much of my life, and in that arena of life, it’s no secret that some people have significant advantages over others. Training is required to reach the pinnacle of personal ability – but it is one’s personal ability that is in question. Some people are, and with all else equal will continue to be, taller, stronger, or faster than others; genetics does not adhere to egalitarian principles.

I strongly suspect that this is true of the mind as well. That’s not to say that some people have strong minds, and others weak, anymore than one would categorize all bodies as either strong or weak. Rather, in much the way that an individual might be predisposed towards excellent performance in basketball by being exceptionally tall and possessing good hand-eye coordination, or succeed as a contest-winning bodybuilder by possessing the genetic predisposition towards lean muscle gain; in this way, so too are some minds better equipped ‘out of the box’ for various types of mental tasks and, all else being equal, will always excel at them relative to their peers. Training can benefit any body, and so too any mind – but there are natural limits imposed by the individual’s physical ‘hardware’ (or wetware, in this instance).

So, can anyone learn to program? Probably – but maybe not to the same degree.

Aside: I know this is a major claim to make on the basis of a single presentation to a single class and some years worth of anecdotal evidence. Luckily, scientific rigour is not a requirement for blog posts. 🙂
I look forward to seeing some real studies done on this topic, someday… perhaps if/when programming truly becomes considered as essential as primary human language literacy.

Let’s turn our attention on the second part of the premise, now: that everyone should learn to program. It seems obvious to a programmer, of course – computers are everywhere, and programming is how one interacts most directly and powerfully with these devices. The more computer-centric our society becomes, the more imperative it is that everyone know how to program.

In the classroom, the scenario plays out differently. Near the middle of the presentation, I broke out the whiteboard marker and began an exploration of binary and hexadecimal with them. After breaking down the place value of each bit, we talked about the total value of a single byte – 128+64+32+16+8+4+2+1 = decimal 255. Then, we broke apart a two-digit hexadecimal number.

So, if the ones column can contain values from 0-15, represented by 0-9, A-F, and what would be the ‘tens’ column for decimal is here the ‘sixteens’ column, and we have the hexadecimal number FF, what does that represent?

The light came on almost immediately for one student – I ignored his hand, though, waving at me from the back row, as he’d had been the one who always ‘got it’ first. After a few more moments, another student tentatively offered: 255? Yes, I said, which is the same as… and after a few more moments, his face brightened as he made the connection between hexadecimal as a sort of shorthand representation for binary.

The other students, however, complained that I had told them math wasn’t important for programming (which was true – I’d only just finished explaining how programming was really an extension of language skills, while specific algorithms were where math found its expression in programming).

That’s true, I did say math wasn’t important. But we aren’t talking math – this is still language. Can anyone tell me why?

Only the one eager grade 12 in the back row was able to make the connection that binary was the ‘language’ of the computer (which I’d already mentioned earlier), and everything else – hexadecimal, assembly, C and the other programming languages we’d spoken about – were ‘translation layers’ between the computer and the programmer.

Continuing, I told them that, although they should never have to program in binary, or even hexadecimal, a computer programmer should have some idea of how a computer actually works, and the language it understands. One of the students who hadn’t got it sort of shrugged and volunteered on the class’ behalf that:

I don’t think any of us actually wants to be a programmer.

This didn’t strike me as too surprising – not too many teenagers have a strong sense of what they want their eventual career to be. The more telling point was that, on further conversation, most of the students admitted that while they appreciated the end results of programming (such as video games), and enjoyed a superficial understanding of how they worked, the actual details of classes and objects and models and servers and so on, left them feeling much the way many do when faced with the prospect of math – uncomfortable, and decidedly disinterested in pursuing it.

After the class, my teacher friend and I were able to head for coffee over his lunch break, and we talked about his efforts in teaching computer science, alongside his math and science classes.

It’s pretty much the same for all of them,” he admitted. “A few students are really enthusiastic and pick up concepts quickly. Others – they may never get it, and many don’t even really want to. They’re not necessarily stupid or inattentive – their marks in other courses can be anywhere from terrible to great – they just don’t have any interest in the sciences.

A key part of higher education is picking a specialization – even the most capable human needs to shy away from attempting be a polymath given the sheer breadth of human knowledge in the modern era. During our conversation, we made the comparison to understanding an internal combustion engine (I know, car metaphors – bear with me). Most people have an extremely superficial understanding of how an internal combustion engine (and their car in general) works – and as long as that doesn’t impede them in the tasks they want to pursue with that device, they have no desire to learn more. Indeed, learning more would be an undesirable burden that would get in the way of performing other tasks, including those involving the vehicle in question.

Someone with in-depth knowledge of how a car works might argue that they could get so much more out of the vehicle if they understood how it actually worked, and could tweak it as they desired – or at least maintain it properly. They’d be right, of course – but the time cost involved in becoming intimately acquainted with the operation of the vehicle is prohibitive to anyone who isn’t making their living as a mechanic.

It took us two coffees and a bagel each to reach the conclusion that probably, most people weren’t going to want to be programmers if they weren’t going to make money at it. In the foreseeable future, most people will continue to have a superficial understanding of how their various computing devices work ‘under the hood’, and will be entirely content with that. Even if programming did become a new ‘literacy’ requirement in the future, it would likely be at the same level that writing is for most of the populace – that is, while any literate individual can write, only a small percentage of the population write well enough to make a living at it.

And one other nightmare scenario that occurs to me just now… who will be tasked with repairing/maintaining the code generated by these citizen programmers in the future, I wonder? I hope I’m retired by then…

What do you think? Is programming going to become a primary concern of education in the coming years? If it does, will people really embrace it, or remember it about as well as they do their highschool trig lessons? And what happens to programming as a discipline if ‘anyone’ could write a program, the same way that ‘anyone’ could write a story?

Christopher Keefer

Christopher Keefer

Christopher Keefer is a Senior Software Engineer at Art+Logic. He generally spends his spare time on the computer too, so there isn't much hope for him.
Christopher Keefer

Latest posts by Christopher Keefer (see all)

Tags:

Creative Commons License

This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

2 Comments

  1. bgporter

    I’ve written up my thoughts on this topic a few times here (cf: http://www.alproduction.local/blog/2012/05/yes-do-learn-to-code/, http://www.alproduction.local/blog/2012/09/learnable-programming/, http://www.alproduction.local/blog/2013/01/start-them-young-all-of-them/ ), but something that I’ve been thinking about lately is that guys like us often think of ‘programming’ in terms of ‘writing code to be executed on a more or less traditional computer’ — that’s changing rapidly because software is continuing to eat everything. When you’re setting your house up to control things with Belkin WeMo switches and a Nest thermostat and more and more things are coming with an API, and as the degree of difficulty to start programming goes back down closer to the way it was when as kids we fired up our first computer (an Atari 800 for me) and immediately landed on a Basic prompt. Will everyone be capital-P Programmers? No way. Will more people, and more different kinds of people program things? You bet. I derailed the tour of an architecture program my son is looking at when the guide mentioned that he was working with procedural architecture. Turns out that the CAD software he uses includes a full Python interpreter.

  2. Andrew Vogan

    Enjoyed your post, Christopher. I have sat through a (required) CS 101 type of class where the rate of progress was limited by the struggles of classmates without real interest or aptitude in programming. For me, it was an incredibly inefficient and boring way to learn something. There has to be a better way that avoids throttling forward progress of students who can jump ahead. So I think I agree with your conclusions — and I feel for the student in the back frantically waving his hand.

    I think one of the ways you can recognize aptitude for CS is in giving somebody the tools and seeing what they do with them. On that note, I’ve been meaning to install Python on my son’s computer and show him a list of commands for Turtle Graphics. Maybe I’ll do that this evening.