I was originally going to write about the new computer science curriculum that I had a heavy hand in designing. But the curriculum is currently going through the college-level approval process, so I don’t want to say anything that won’t be in the final curriculum. I also realized that I didn’t have anything concrete to say without showing what the curriculum itself. So instead, I’m going to talk about what I think a computer science curriculum should cover in general. I talked about what I didn’t like about the Liberal Arts Computer Science (LACS) Consortium’s curriculum several weeks ago; this post is the opposite of that, about what I would like to see in computer science.
The first thing to admit is that there are a lot of different view points of what computer science should be at the college level. For example, some people say that we should be focusing on programming and not computer science; others say that the science in computer science is paramount, and so the discipline should be taught using as much rigorous mathematical theory as possible. (Some schools offer separate degrees for computer science and software development.) There’s also the overlap with computer engineering which, at least in the discussions around Oxy, is often considered unsuitable for a liberal arts setting. What I think is interesting is that, even outside of “computer engineering”, there are still topics in “computer science” that deal with the engineering artefact that is the modern computer, and I think there can be another long discussion about whether that has a place in computer science.
Let’s start with the basics. Learning to write code is certainly part of computer science; it’s hard to argue that you know computer science without knowing how to program (although I know some people who try really hard to do exactly that…). The question I find myself asking is: is writing code an end in computer science education, or is it merely a (necessary) means along the path to learn something else? Writing code is central enough to computer science that the question might be hard to answer, but similar questions can be asked of other skills, such as the ability to use version control. At least to me, version control leans toward the side of being only a means to other things – there’s nothing critical in the use of version control that would broaden a student’s view of computer science, although of course it’s almost a necessary skill for any technical software development position.
If programming is an end in computer science education, then there’s not much more to say. If it’s only a means, however, it’s worth considering what the end(s) may be. One blog post that I keep referring back to lists several topics, both abstract and concrete, that are often considered goals in a computer science curriculum. Discarding the obvious skills such as debugging and testing – although there may also be important lessons learned there, especially for testing – what’s left for me is data representation, computational thinking, and problem solving.
I should take an aside and explain why I did not include data structures and algorithms in the list. It’s true that they are central to any computer science curriculum – but then, so is programming. As with the mathematics and theory that was in the LACS curriculum, I think these are all necessary for computer science, but I don’t think they are not the reason why people study computer science. They are all means, tools for achieving something, although at a sufficiently advanced level the tools themselves become the object of study.
This is definitely biased, but my answer to the central question of this post – what is the end goal of computer science education – is the ability to, with the aid of a computer, specify problems and their solutions and evaluate the latter. Computer science is about using the computer as a tool for thought. Under this goal, programming is merely the method of specification, and data structures and algorithms standardized tools to express common relationships. The three topics from the other blog post all play roles. Data representation is us picking the relevant features; computational thinking is our internal process that guides the programming; and problem solving is what generates the solutions that we are specifying.
There are, of course, many uses of computers that do not appear to be problems to solve, especially in more creative domains such as media arts – animation, video games, website design, and so on. But I think you would be hard pressed to argue that these products are not also driven by a thought with some goal – to tell a certain story, to provide a certain experience, or to present certain information. These drives to create, together with the more traditional uses of a computer to model and to analyze, are what draws students to computer science.
And I think this is why I object to emphasizing the mathematical or engineering aspects of computer science – these are only interesting after people understand why the computer as a tool is worth being understood/improved upon. And to do that, we need to first show them what computers are capable of – or rather, what they are capable of with the help of a computer.