Should Everyone Learn to Code?
This is a repost of a post I wrote for Instructure's Keep Learning blog. I had a couple other paragraphs that got cut out that I'll slip in here as well. Enjoy!
Should computer programming be standard curriculum? This question seems to come up every few months, and it came up again for me a few weeks ago, so I thought I’d take a crack at it. I’m a programmer by training, and I spent two years in a computer science research lab, so I have some inherent biases, but I’m also a dad who’s very concerned with how my kids are shaped by what they learn in school, so hopefully my input is useful.
Of course everyone should learn to code. Just like everyone should learn to change a leaky pipe or a flat tire, and to multiply decimals, and to manage their finances, and to present a compelling argument in front of a group of people. You don’t learn to code just so you can be a professional coder.
To me, learning isn’t so much about developing skills as it is about having the contextual understanding to make sense of the world around you. We try to reduce observed chaos by finding mental models that match reality as closely as possible. When we understand something it’s less scary and more predictable—and predictability is empowering. When our culture can’t function without software, but for most people that software is still a voodoo art, it’s high time we gave more people the context to know what’s going on.
A common argument against everyone learning to program is that there will be more bad programmers in the world. Sure. Just like there are at least five bad, self-declared plumbers on my street. And while they may not know their limits exactly, none of them try to tackle industrial plumbing projects that are clearly out of their league. It’s not the end of the world if newbie programmers cut their teeth on hobby projects and don’t write perfect code.
Programmers have the whole world at their fingertips. A programmer can ply their trade in anything from medicine to finance to farming. As a programmer, I can answer my own questions, almost without fail. I can write a quick script and see if my new idea will really make things more efficient or not. And, just as importantly, I can recognize which of my questions are tractable and which aren’t. That’s hugely empowering, and it means I can be more productive than many other people in similar situations.
Saying everyone needs to code just because every industry needs coders is like saying everyone needs to know accounting or law. People should be able to manage their own finances and understand a basic legal contract on their own, sure, but not much more than that. It’d be great if everyone had all those skill sets, but that’s not reasonable to expect. It’s not such a bad thing if “code” lives in the same realm for most people as “legalese” and “accountant-speak.” There’s a limit to how deep you should need to go into any non-essential subject. Remember, most programmers can’t code in binary or assembly and can’t solder their own circuits. Maybe the typical software user’s expertise can stop at power user rather than armchair coder—which would still be a huge step forward.
There’s also the concern about creating a generation of same-mindedness. Studying computer theory isn’t a trivial endeavor, and quite frankly, ends up rewiring your brain in some very noticeable ways. Most programmers have a very similar perspective on how the world works and how to tackle problems. Maybe they’ve found the optimal mindset, but maybe not. I would be reluctant to raise up an entire generation of students to have that particular perspective without some serious thought first.
I want to take this argument, “everyone should learn to code,” and tweak it. The goal of teaching everyone to program shouldn’t be to make everyone a programmer. That’s just silly. I work at a software company, and I’d say that at best one-third of the people in our office would benefit from having coding skills. There are many jobs that will still need to be filled, and just as many skill sets outside of programming that are going to be important for the foreseeable future.
I think everyone deserves a contextual understanding of how the world around them functions. I think everyone should learn to code—a little bit. I don’t think everyone needs to know the ins and outs of JavaScript or Python or Java or whatever. Even more importantly, I don’t think everyone needs to know (or ought to know) decision trees, binary search, complexity classes, or tail recursion. But I think everyone deserves to know:
How the Internet works (and that it’s not the same thing as a web browser)
How to craft a set of instructions that drive a system (for Codecademy, Lego Mindstorms, Scratch, or whatever)
How to tinker and troubleshoot (to help overcome the fear of breaking things, which is a legitimate, but crippling factor in tech adoption)
And also maybe (but maybe not) a couple other things:
How to break down a complex problem into smaller, more manageable sets of problems
How to test the correctness and robustness of a solution to a problem
I guess you could say I think everyone doesn’t need to intimately know how to code, but everyone should learn how coding works, and how to use it to solve the problem at hand.
Where does that need to happen? It doesn’t need to be a full-year class. I’d love to see a mandatory introductory class in high school that covered things like computer programming, electronics (this type of stuff), and other applied STEM topics (sort of a modern shop class). It doesn’t sound unreasonable, and it would be a great jumping-off point for those that do discover a passion for coding or any number of related areas.
This is the stuff that got cut out. The concern was that it made the argument against a little too strong and lengthy, but this is something I think about a lot so I've added it here I guess for my own selfish purposes.
As a Computer Science student in college, I had my brain very literally rewired. I can vividly remember walking around campus talking to myself, moving and twisting imaginary figures in front of me as I tried to make sense of finite state machines, …, and …. I’m not sure if I didn’t think the same way after that, or if I always thought a little bit differently, but I came out of that education with a very distinct perspective on how the world works.
There is no doubt in my mind that most programmers have a similar mental model for the world, and a similar approach to tackling projects. Part of it is that sense of empowerment I talked about earlier, but part of comes from seeing everything as a set of differently-sized algorithms with a well-defined problem and a testable, possibly inevitable solution. It comes out in the typical programmer’s style of humor, their language, their approach to meetings, etc. There are TV shows that target nerd culture, and there’s a rising trend in media for the nerd-hero that fits a very distinct persona.
All of these things concern me. I suppose it sounds elitist to say “I don’t want more people in the workforce just like me,” but that’s exactly how I feel. Is the programmer mindset the *right* way to tackle the problems of the future, or is it just *one* way? As a programmer myself I don’t think I’m the best person to be answering that question. One of the problems with a data-driven mindset is that you are inevitably drawn to answer the questions that can be effectively measured, not necessarily the questions that can lead to the right solution.
If we decide it’s worthwhile to train up an entire generation of learners to start thinking a certain way, what does that do to our population’s cognitive diversity? I don’t actually know, but I don’t think we should try it without at least thinking really hard about it first.
Should computer programming be standard curriculum? This question seems to come up every few months, and it came up again for me a few weeks ago, so I thought I’d take a crack at it. I’m a programmer by training, and I spent two years in a computer science research lab, so I have some inherent biases, but I’m also a dad who’s very concerned with how my kids are shaped by what they learn in school, so hopefully my input is useful.
On The One Hand …
Of course everyone should learn to code. Just like everyone should learn to change a leaky pipe or a flat tire, and to multiply decimals, and to manage their finances, and to present a compelling argument in front of a group of people. You don’t learn to code just so you can be a professional coder.
To me, learning isn’t so much about developing skills as it is about having the contextual understanding to make sense of the world around you. We try to reduce observed chaos by finding mental models that match reality as closely as possible. When we understand something it’s less scary and more predictable—and predictability is empowering. When our culture can’t function without software, but for most people that software is still a voodoo art, it’s high time we gave more people the context to know what’s going on.
A common argument against everyone learning to program is that there will be more bad programmers in the world. Sure. Just like there are at least five bad, self-declared plumbers on my street. And while they may not know their limits exactly, none of them try to tackle industrial plumbing projects that are clearly out of their league. It’s not the end of the world if newbie programmers cut their teeth on hobby projects and don’t write perfect code.
Programmers have the whole world at their fingertips. A programmer can ply their trade in anything from medicine to finance to farming. As a programmer, I can answer my own questions, almost without fail. I can write a quick script and see if my new idea will really make things more efficient or not. And, just as importantly, I can recognize which of my questions are tractable and which aren’t. That’s hugely empowering, and it means I can be more productive than many other people in similar situations.
On The Other Hand …
Saying everyone needs to code just because every industry needs coders is like saying everyone needs to know accounting or law. People should be able to manage their own finances and understand a basic legal contract on their own, sure, but not much more than that. It’d be great if everyone had all those skill sets, but that’s not reasonable to expect. It’s not such a bad thing if “code” lives in the same realm for most people as “legalese” and “accountant-speak.” There’s a limit to how deep you should need to go into any non-essential subject. Remember, most programmers can’t code in binary or assembly and can’t solder their own circuits. Maybe the typical software user’s expertise can stop at power user rather than armchair coder—which would still be a huge step forward.
There’s also the concern about creating a generation of same-mindedness. Studying computer theory isn’t a trivial endeavor, and quite frankly, ends up rewiring your brain in some very noticeable ways. Most programmers have a very similar perspective on how the world works and how to tackle problems. Maybe they’ve found the optimal mindset, but maybe not. I would be reluctant to raise up an entire generation of students to have that particular perspective without some serious thought first.
Therefore, What?
I want to take this argument, “everyone should learn to code,” and tweak it. The goal of teaching everyone to program shouldn’t be to make everyone a programmer. That’s just silly. I work at a software company, and I’d say that at best one-third of the people in our office would benefit from having coding skills. There are many jobs that will still need to be filled, and just as many skill sets outside of programming that are going to be important for the foreseeable future.
I think everyone deserves a contextual understanding of how the world around them functions. I think everyone should learn to code—a little bit. I don’t think everyone needs to know the ins and outs of JavaScript or Python or Java or whatever. Even more importantly, I don’t think everyone needs to know (or ought to know) decision trees, binary search, complexity classes, or tail recursion. But I think everyone deserves to know:
How the Internet works (and that it’s not the same thing as a web browser)
How to craft a set of instructions that drive a system (for Codecademy, Lego Mindstorms, Scratch, or whatever)
How to tinker and troubleshoot (to help overcome the fear of breaking things, which is a legitimate, but crippling factor in tech adoption)
And also maybe (but maybe not) a couple other things:
How to break down a complex problem into smaller, more manageable sets of problems
How to test the correctness and robustness of a solution to a problem
I guess you could say I think everyone doesn’t need to intimately know how to code, but everyone should learn how coding works, and how to use it to solve the problem at hand.
Where does that need to happen? It doesn’t need to be a full-year class. I’d love to see a mandatory introductory class in high school that covered things like computer programming, electronics (this type of stuff), and other applied STEM topics (sort of a modern shop class). It doesn’t sound unreasonable, and it would be a great jumping-off point for those that do discover a passion for coding or any number of related areas.
The End
Extras: More on why not everyone should learn to code
This is the stuff that got cut out. The concern was that it made the argument against a little too strong and lengthy, but this is something I think about a lot so I've added it here I guess for my own selfish purposes.
As a Computer Science student in college, I had my brain very literally rewired. I can vividly remember walking around campus talking to myself, moving and twisting imaginary figures in front of me as I tried to make sense of finite state machines, …, and …. I’m not sure if I didn’t think the same way after that, or if I always thought a little bit differently, but I came out of that education with a very distinct perspective on how the world works.
There is no doubt in my mind that most programmers have a similar mental model for the world, and a similar approach to tackling projects. Part of it is that sense of empowerment I talked about earlier, but part of comes from seeing everything as a set of differently-sized algorithms with a well-defined problem and a testable, possibly inevitable solution. It comes out in the typical programmer’s style of humor, their language, their approach to meetings, etc. There are TV shows that target nerd culture, and there’s a rising trend in media for the nerd-hero that fits a very distinct persona.
All of these things concern me. I suppose it sounds elitist to say “I don’t want more people in the workforce just like me,” but that’s exactly how I feel. Is the programmer mindset the *right* way to tackle the problems of the future, or is it just *one* way? As a programmer myself I don’t think I’m the best person to be answering that question. One of the problems with a data-driven mindset is that you are inevitably drawn to answer the questions that can be effectively measured, not necessarily the questions that can lead to the right solution.
If we decide it’s worthwhile to train up an entire generation of learners to start thinking a certain way, what does that do to our population’s cognitive diversity? I don’t actually know, but I don’t think we should try it without at least thinking really hard about it first.
Comments