The Internet is full of discussion about teaching Computer Science. It’s kind of weird. There is lots of criticism being lobbied at groups like Code.org, among others, that fall into roughly two categories: a) we shouldn’t teach this at all, you’re crazy and b) we should teach something like this, but not like this, aka Ur Doing It Wrong. The first comes from, mostly, non-CS educators, occasionally from those in the tech industry. The second comes from primarily CS Educators. Mark Guzdial has a good assessment of the various arguments, and the comments are good as well.
So, the CS Educators say, well, we’re teaching problem solving through coding. Or we’re teaching logical thinking. Etc. Etc. They want to point out that CS is more than just coding. And yeah, it is. But, as Mark points out, programming itself does not teach these things. I’m going to argue, though, that talking about coding/programming is an easier discussion to have with average people. As Mark says, the jobs argument may not be the best one, but it’s the one that makes sense to most people, especially in a down economy. I would argue, as Mark and others do, that understanding computing is important to being a citizen. I’ll never forget watching a roundtable conversation moderated by William F. Buckley with some Congresspeople and public intellectuals all discussing the impact of technology on various laws and work, etc. They had no tech people, and their lack of knowledge was embarrassing. This was 1990, maybe, and they mispronounced basic things. They didn’t know what an operating system was. And some of those people are still serving in Congress and still don’t know much more.
So, if programming doesn’t teach the big things we say it does and yet, we think it’s important, what are we doing when we teach CS (or programming?). When I teach, my first goal is never about teaching the subject that’s listed on the syllabus. It’s about getting kids to learn how to learn. It is about solving problems, but I’m not getting at it through programming, but in the way I structure my class. Mark, in fact, points to a paper along these lines, about the importance of the class ethos. I have honestly done this for most of my teaching life. I have always tried to decenter my classroom so that the students learn to trust themselves and not totally rely on me. Yes, I’m often more of an expert than they are and yes, I sometimes directly tell them things, but mostly, I’m trying to guide them through the process of creating something (a poem, a paper, a program, a web site) using me as one of many possible sources of information and feedback. And I hope, through reflection and feedback of various kinds, they come to understand deeper concepts related to what they’re creating.
I think one of my students says this best:
I really like the project oriented nature of this class. I like that we learn a lot from our own
mistakes. Most classes teach you information directly, but in Computer Science, we learn a lot
more through trying out different ideas. While we may not get as far in our projects this way, I
think learning to find your own solution to a problem is a really good thing to know. Computer
Science is more creative than most classes because there are multiple ways to reach a goal.
Sometimes the way that you figure out isn’t the most effective way of doing something, but if it
works, having figured it out on your own is very rewarding.
However, creating this ethos is ridiculously hard. The dynamic of a classroom can change daily. The kids bring with them their own issues. And the younger the kids, the harder it is to get them to tap into some kind of intrinsic motivation. I seriously struggle with this every day. But it’s also what makes my job so. much. fun. That is a big problem to solve and I get to try to solve it every day.
But that’s not a fair answer, is it? I skirted the issue with an answer that should be true of everyone’s classroom: the real goal should be about teaching kids to learn for themselves, to continue to learn, to know how to learn something new on their own.
But what about programming? What does it teach and why teach it? Programming is hard and frustrating for many people. One semi-colon out of place and nothing works. Sometimes you do something and what you think should happen just doesn’t. And you don’t know why. What programming (or any difficult subject) can teach is persistence, of sticking with something until you understand it or figure it out. Grit, to use a popular term.
The thing that sits on your desk or in your pocket shouldn’t be a mystery to you. You should know what 1′s and 0′s are and why they’re there. You should control it, not the other way around, and if you need to write code to do that, so much the better. But even if you don’t, you should know that you *could* write code to control it. To use a current issue, people should know what metadata is and why, if the NSA collects it, that might be a bad thing and more revealing than you think. What does machine readable mean, anyway? Programming doesn’t necessarily teach you these things, but it provides a window into some of these things in a better way than some other methods.
It’s funny, the only reason we’re having to answer this question at all is because CS isn’t in the curriculum right now. No one asks why we teach foreign languages, math, or science (very often, anyway). But I think all of those would be equally hard to argue for beyond some basic level of understanding. Some would make the same arguments that CS is making now: there are jobs in the field, good just to expose kids to, and it’s more about learning a process. If those are good arguments to keep a discipline, why can’t they be good ones for including one?