Why should we teach programming (Hint: It’s not to learn problem-solving)

October 18, 2017 at 12:30 pm 29 comments

This is a revision of the original post. Several readers pointed out on Twitter that my original post was insensitive. It read like an attack on Brenda, a woman of color, from a senior white guy (me). That was not my intent, and I apologize for that. I am grateful to Joseph P. Wilson who helped me understand how to avoid that impression. I can’t change the post that went out yesterday, but I will be more careful in future blog posts.

At the CS for All Consortium Celebration Tuesday, Brenda Wilkerson gave the closing keynote. The full livestream of the CS for All Summit is available here, and it includes Brenda’s talk. I’m a huge fan of Brenda, and she’s done fabulous work in Chicago. She is a leader in bringing CS to All.

I have not seen Brenda’s talk or any of the livestream. My experience of the Consortium Celebration was through reading the Twitter stream as I found time during the day. Brenda had one slide (which you can see in the tweet linked here) that I disagreed with, and because it’s an important point, I’m going to respond to it here.

It says, “Computer science builds the mental discipline for breaking down problems, and solving them.” There are few studies that test this claim as “computer science,” but there have been lots of studies looking for transfer from teaching programming to general problem-solving skills. Probably the first study investigating this claim is Roy Pea and Midian Kurland’s paper On the cognitive effects of learning computer programming. You can find this claim in a paper by Henry Walker to which I responded in this blog. You can see it in posts all over the Internet, from this blog post to this article from a teacher in England. There is a strong belief out there that learning computer science, and programming called out specifically, leads to new problem-solving and “a new way to think.”

There is simply not evidence in support of these claims. I talk about these in my book, I reference the Palumbo meta-review in this blog post, and NYTimes wrote about it this last spring. Like “learning styles” and “Latin teaches thinking,” this is a persistent myth that learning computing leads to problem-solving skills, and we have no support the claim.

I tweeted in response to Brenda’s slide, and several CS teachers asked me, “So why teach programming or computing at all?”  That’s a great question!  Here are some of my top reasons:

  1. To understand our world. The argument that Simon Peyton Jones made in England for their computer science curriculum is that Computer Science is a science like all the others. We teach Chemistry to students because they live in a world with chemical interactions. We teach Biology because they live in a world full of living things. We teach Physics because they live in a physical world. We should teach Computer Science because they live in a digital world.
  2. To study and understand processes. Alan Perlis (first ACM Turing Award laureate) argued in 1961 that everyone on every campus should learn to program. He said that computer science is the study of process, and many disciplines need people to know about process, from managers who work on logistics, to scientists who try to understand molecular or biological processes. Programming automates process, which creates opportunities to simulate, model, and test theories about processes at scale. Perlis was prescient in predicting computational science and engineering.
  3. To be able to ask questions about the influences on their lives. C.P. Snow also argued for everyone to learn computing in 1961, but with more foreboding. He correctly predicted that computers and computing algorithms were going to control important aspects of our lives. If we don’t know anything about computing, we don’t even know how to ask about those algorithms. It shouldn’t be magic.  Even if you’re not building these algorithms, simply knowing about them gives you power. C.P. Snow argues that you need that power.
  4. To use an important new form of literacy. Alan Kay made the argument in the 1970’s that computing is a whole new medium. In fact, it’s human’s first meta-medium — it can be all other media, and it includes interactivity so that the medium can respond to the reader/user/viewer. Computing gives us a new way to express ideas, to communicate to others, and to explore ideas.  Everyone should have access to this new medium.
  5. To have a new way to learn science and mathematics. Mathematics places a critical role in understanding our world, mostly in science. Our notation for mathematics has mostly been static equations. But code is different and gives us new insights. This is what Andy diSessa has been saying for many years. Bruce Sherin, Idit Harel, Yasmin Kafai, Uri Wilensky, and others have shown us how code gives us a powerful new way to learn science and mathematics. Bootstrap explicitly teaches mathematics with computing.  Everyone who learns mathematics should also learn computing, explicitly with programming.
  6. As a job skill. The most common argument for teaching computer science in the United States is as a job skill.  The original Code.org video argued that everyone should learn programming because we have a shortage of programmers. That’s just a terrible reason to make every school child learn to program. That’s what Larry Cuban was arguing this last summer. Tax payers should not be funding a Silicon Valley jobs program. Not everyone is going to become a software developer, and it doesn’t make any sense to train everyone for a job that only some will do. But, there’s some great evidence from Chris Scaffidi (that I learned about from Amy Ko’s terrific VL/HCC summary) showing that workers (not software developers) who program make higher wages than those comparable workers who do not. Learning to program gives students new skills that have value in the economy. It’s a social justice issue if we do not make this economic opportunity available to everyone.
  7. To use computers better. This one is a possibility, but we need research to support it. Everyone uses computers all the time these days. Does knowing how the computer works lead to more effective use of the computer?  Are you less likely to make mistakes? Are you more resilient in bouncing back from errors? Can you solve computing problems (those that happen in applications or with hardware, even without programming) more easily?  I bet the answer is yes, but I don’t know the research results that support that argument.
  8. As a medium in which to learn problem-solving. Finally, computer programming is an effective medium in which we can teach problem-solving. Just learning to program doesn’t teach problem-solving skills, but you can use programming if you want to teach problem-solving. Sharon Carver showed this many years ago. She wanted students to learn debugging skills, like being able to take a map and a set of instructions, then figure out where the instructions are wrong. She taught those debugging skills by having students debug Logo programs. Students successfully transferred those debugging skills to the map task. That’s super cool from a cognitive and learning sciences perspective. But her students didn’t learn much programming — she didn’t need much programming to teach that problem solving skill.But here’s the big caveat: They did not learn enough programming for any of the other reasons on this list!  The evidence we have says that you can teach problem-solving with programming, but students won’t gain more than that particular skill. That is a disservice to students.

Certainly there are more reasons than these, and I’ve seen several in the response to this blog post, and some in the comments below.

This was just one slide in Brenda’s talk. Her overall point was much more broader and more significant. I strongly agree with Brenda’s key point: CS for All is a social justice issue. Learning computing is so important that it is unjust to keep it from some students. Currently, CS is disproportionately unavailable to poorer students, to females, and to minority ethnic groups. We need CS for All.

Entry filed under: Uncategorized. Tags: , , , , , , .

More Teachers, Fewer 3D Printers: How to Improve K–12 Computer Science Education  Georgia Tech Receives CMD-IT University Award for Retention of Minorities and Students With Disabilities in Computer Science

29 Comments Add your own

  • 1. bobirving13  |  October 18, 2017 at 1:17 pm

    Thanks for an extremely thoughtful and research-based article! I can’t say enough how happy I am to see both you and Brenda highlight that this is a social justice issue! Otherwise we perpetuate the digital divide with fearsome consequences for our society and our world.

  • 2. Moti Ben-Ari  |  October 18, 2017 at 1:36 pm

    I support widespread teaching of programming for another reason: Since almost everyone uses computers and software systems, it is important that they _experience_ what it is like to design, write and debug a program. This will give them realistic expectations of what can be required from a program, why it takes so long to develop, why bugs are almost inevitable and why they are so difficult to find and fix. I once heard of a manager of a large multidisciplinary system who was told that the software would take a multi-person team many months to develop. His response: My kid could write the program in three days on his Mac!

  • 3. Josh S  |  October 18, 2017 at 1:37 pm

    Good article, but I’d argue that almost all your points can be achieved by teaching CS generally, and do not require teaching *programming* specifically. Most people learn about DNA without having to learn how to do gene sequencing. Most people learn about physical laws without having to derive them ourselves experimentally. Programming is an important aspect of CS, but it is far from the only one, and I think the focus on teaching programming specifically is harmful to the general digital literacy lacking in our world. I’m not saying we shouldn’t offer programming, but I don’t think *everyone* needs to learn it, nor should it be the main focal point teaching CS to a broad audience.

    • 4. Mark Guzdial  |  October 18, 2017 at 1:46 pm

      I don’t have evidence that we can achieve all of these goals without teaching programming. Most of the evidence that I have says that programming is important. It’s an interesting research question, how much deep understanding we can teach without programming. I don’t think we can, but that’s just my hypothesis.

    • 5. Brian Harvey  |  November 26, 2018 at 5:34 am

      I don’t think it’s honest to say you’re teaching someone “CS” without teaching programming. Yes, there are computer scientists, such as theory researchers, who don’t primarily program. But the reason their work matters is that it makes it easier for programmers to program.

      Web page design isn’t computer science. Using Photoshop isn’t computer science. Programming is the heart of computer science, which consists of programming and thinking about programming.

      That doesn’t mean that we have to teach every kid Java (god forbid). Maybe we don’t have to teach _very much_ programming. But if you want every kid to experience computer science, then every kid has to program!

      • 6. Jeff Graham  |  June 10, 2019 at 8:37 pm

        I think it could be argued that computer science is at leastly partly about what kind of problems can be solved with a program.

  • 7. Rafi Santo  |  October 18, 2017 at 6:18 pm

    Really appreciated this, and particularly that you highlight that the “getting a job” argumentation, which is easily the most predominant in public policy discourse, relies on an idea that we should be subsidizing a jobs training program that industry should be doing itself.

    I think there are a lot more good (and bad) reasons out there, and some colleagues and I did a study last year that examined some of this that we presented at SIGSCE (see here: https://dl.acm.org/citation.cfm?id=3017755). We didn’t take a normative approach/ assess whether or not an argument was good or not, but more tried to develop a framework for making sense of them. Colleen Lewis has a nice chapter titled “good and bad reasons to teach all students computer science” that takes more of a normative approach and is worth reading.

    One of the big things that motivated us in our examination, and that I feel like I don’t see enough of when people get into analyses of the “why cs?” question, is that WHY should guide WHAT. If I say I want to teach CS as a way to uncover new ways of doing science, I better have a curriculum that includes something along the lines of Netlogo that supports scientific modeling. Similarly, if I say I want CSforAll because girls are under-represented in technology culturally and professionally, my district/school policies around course offerings/requirements have to reflect that rationale. If I say that the world is full of technological platforms that have biases baked into them through code, there better be a way for students to, for example, critically assess things like machine learning algorithms, at least in a broad sense if not in the weeds of those types of algorithms.

    All that’s to see is that the answer to “why cs?” has (or should have) implications for policy, curriculum and practice.

  • 8. Dave Frye  |  October 18, 2017 at 7:00 pm

    This is a fantastic article. Thanks so much for pulling this from the Twitterverse and taking the time to share in-depth insights and research. Very glad to see the Summit speakers inspiring social media posts that then spark deeper discussion from an expert with such knowledge and clarity on the issue. It’s greatly appreciated!

  • 9. rtoal  |  October 19, 2017 at 3:17 am

    Nice post. I was very familiar with two other pieces of work that showed the slide to be a misconception and off the mark: Bret Victor’s “Meanwhile at Code.Org” page (http://worrydream.com/MeanwhileAtCodeOrg/) as well as Lorena Barba’s more-or-less ode to Papert’s Power Principle (http://lorenabarba.com/blog/computational-thinking-i-do-not-think-it-means-what-you-think-it-means/). You’ve added quite a few _additional_ points that maybe everyone has not thought of. Much appreciated.

  • 10. OTR Links 10/20/2017 – doug — off the record  |  October 20, 2017 at 1:31 am

    […] Why should we teach programming (Hint: It’s not to learn problem-solving) | Computing Education Bl… […]

  • 11. Charles Kwiatkowski  |  November 19, 2017 at 9:23 pm

    I’m sorry but not everyone can code. If you barely got through Fundamentals of Algebra years ago, and never studied a foreign language, you are lacking the skills for success.
    At community college, there are NO pre-requisites to the course. Anyone, and I mean anyone, can enroll.
    I have taught “Intro to Programming” for over a decade. Over that time, I have worked hard to remove math as a barrier to success. However, without significant analytical skill, the kind developed in College level math, students are up for a significant, often insurmountable, challenge. I don’t have the research data to back it up, (paper idea?), but I would wager that 75% or more of those who take, and drop, Intro to Programming nationwide are not at the college level at math.

    • 12. Mark Guzdial  |  November 20, 2017 at 9:51 am

      Hi Charles — there have been studies trying to measure the withdrawal or failure rates nationally and internationally. Most studies get the worldwide rate around 50-60%, so 75% is a little high.

      How can you claim that “not everyone can code”? You’ve tried everything? You’ve tried new kinds of learning activities like Parson’s problems? You’ve tried successful curricula like Media Computation? You’ve tried changing the programming language? I have been teaching since 1980, from 7 year olds through community college to University level for the last 24 years, and I know I haven’t tried everything yet.

      I know that things can be made better. Before I started Media Computation, the students I targeted were failing the course at around 50%. Since 2002, the Media Computation class at Georgia Tech has never had more than 15% of the students withdraw or fail, and that improved retention has been replicated in published studies at other institutions.

      I find it sad that any CS teacher would give up. Teachers are in the hope business. We should always enter every class believing that every student in the class can succeed — EVERY student.

  • […] 소스: Why should we teach programming (Hint: It’s not to learn problem-solving) […]

  • 14. Reading 14: Finally! – Allie Olshefke  |  December 1, 2017 at 4:32 pm

    […] CS and its concepts (which I think are elegantly laid out in the misleadingly titled article “Why Should We Teach Computer Science (Hint It’s Not to Learn Problem Solving)” (Hint, it kinda is to learn problem solving, but it depends on what you define […]

  • 15. Introduction to Computer Programming | Share My Write  |  January 3, 2018 at 8:13 am

    […] Guzdial has a blog post, Why should we teach programming, that elaborates on many reasons learning computer programming is […]

  • […] Computing Education Research Blog argues for computing by saying that it will help us: understand our world, study and understand […]

  • […] Making?” with Yasmin Kafai, Quincy Brown, and Colleen Lewis. The session was inspired in part by my blog post listing the reasons for teaching programming, and was framed in our preliminary discussions as a debate. Is there a difference between CS […]

  • 18. Ayako Shimizu  |  October 10, 2018 at 3:20 pm

    I really enjoyed reading your post because this is concept that I struggle with often – What is the purpose of learning/teaching how to code in the K-12 setting? I think the answer becomes easier to answer as one goes to a post-secondary setting, where students have the freedom to choose if they want to learn how to code or not. I think my struggle stems from the big argument of today, which is whether high schools should require coding as part of high school graduation. Of course, not every school has the capacity or resources to make that possible, but I feel like the trend in education is heading that way.

    I am not against learning coding at all. I think all students should learn how to code. My struggle lies in the question that students may bring up when they ask why THEY need to learn how to code. I do believe that the popular answer that is given to students who ask this question is ‘because it helps you learn how to solve problems.’ This answer never clicked with me personally because I like problem-solving (and solving puzzles, like Sudoku) and I did not learn coding until after I graduated from college. That is why your point #8 really resonated with me. Learning coding does help model problems and is one method of solving a problem. However, the problem-solving aspect lies in the conceptual “how” to write code to model the situation, not in the actual writing of code.

    Thank you for the thought provoking post!

  • […] Note: Computer science doesn’t teach problem-solving. Dewey’s and Schank’s point is that problem-solving is a natural way in which people learn. Learning to program still doesn’t teach problem-solving skills. […]

  • 20. Jeff Graham  |  June 10, 2019 at 8:40 pm

    I’ve struggled with this topic for 20 years. I’ve always tried to combine problem solving with the programming. Haven’t succeeded yet.

  • […] Note: Computer science doesn’t teach problem-solving. Dewey’s and Schank’s point is that problem-solving is a natural way in which people learn. Learning to program still doesn’t teach problem-solving skills. […]

  • 22. Teaching Tech Together – TechBits  |  July 22, 2019 at 6:43 pm

    […] power to decide what kinds of jobs there are and to ensure that those jobs are worth doing. And asMark Guzdial points out, there are actually many reasons to learn how to […]

  • 23. Teaching Tech Together – News94  |  July 22, 2019 at 6:52 pm

    […] power to decide what kinds of jobs there are and to ensure that those jobs are worth doing. And as Mark Guzdial points out, there are actually many reasons to learn how to […]

  • […] Guzdial has a blog post, Why should we teach programming, that elaborates on many reasons learning computer programming is […]

  • […] students should study computer science. Several of them overlap with reasons I’ve suggested (see blog post here). He […]

  • […] that don’t easily map to a focus on code and mathematics. I still believe in the value of having students program for learning lots of different things, but I’m no longer convinced that the “hard […]

  • […] Mark Guzdial has a blog post, Why should we teach programming, that elaborates on many reasons learning computer programming is […]

  • […] Mark Guzdial has a blog post, Why should we teach programming, that elaborates on many reasons learning computer programming is […]

  • […] So why teach programming or computing at all?”  That’s a great question!  Here are some of my top reasons […]


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Trackback this post  |  Subscribe to the comments via RSS Feed

Enter your email address to follow this blog and receive notifications of new posts by email.

Join 10,185 other subscribers


Recent Posts

Blog Stats

  • 2,060,328 hits
October 2017

CS Teaching Tips

%d bloggers like this: