Computer science, as an academic discipline, has been the subject of a great deal of scrutiny lately. Of particular interest has been the worth of a CS degree to us, the fee-paying consumers who apparently want nothing more than to transform their college dollars into CV-ready bullet points that will smooth the path to the cubicle job of our dreams.Many of the arguments in these recent exchanges have been predictable. Java is used as a placeholder for all that is wrong with the subject, because teaching it as an introductory language sacrifices pedagogical merit for practical applicability. Proponents of its use retort that they’ll never use type theory anyhow, so what use is it learning it in the first place? The reply is that if they knew about it, they’d get a job where they had to know about it, and so on.
What has surprised me most is that no-one has stood up and defended computer science on its own merits: as an academic subject of some breathtaking beauty and profundity.
Seasoned programmers, some with a chip on their shoulder, bemoan the fact that recent graduates can’t program, as if that was the ultimate aim of three years of study. What they usually mean is that they can’t instantly get to grips with Java, or C#, or whatever is ‘industry-standard’ these days. Certainly, a CS graduate who can’t respond to training in a programming language hasn’t learnt as much as they should. It is important for the rudiments of software engineering to be taught, so as to prepare the CS graduate for the next chunk of learning they will need to do, once they have left university and if they have plumped for a software development role. But expecting CS graduates to be fully competent software developers – a much more vocational trade – having just completed an entirely academic degree is doing disservice to both roles. It is clear that software development is not easy, and that it is actually poorly understood in comparison to, say, civil engineering. But it is not an academic pursuit. There is little profound theory behind its practice, rather a body of accumulated experiential knowledge which comprises best practice.
This makes it an excellent course to take if you wish to become a software developer. This is what vocational courses are about: training people to take on specific roles. If all you wish to do is design systems, follow this path. It will lead to some pretty good job security and some decent money.
So why study computer science? The job prospects at the end are usually pretty good – because, if nothing else, you can become a pretty good software developer fairly quickly – but they are unknown. My argument is that the study of computer science is enough of an incentive enough to make it worthwhile.
Rather than justify the existance of computer science from first principles, I’d rather illustrate some of the highlights that a good CS course would teach its students, drawn from my own experience.
I agree with Abelsson and Sussman that computer science is actually the study of processes, how things are done and what we can know about them. This is an exceptionally broad topic, and has direct practical application every time we solve a problem: at some level, some tenet of computer science is being applied.
I learnt new ways of thinking about the world. Abstraction, for example, is one of the most powerful intellectual tools for reasoning about complex systems. The idea is universally applicable, to all sorts of non-computer-science systems: systems of government, philosophy, music all benefit from the ability to think in terms of abstractions. I didn’t realise how great a benefit this was until I met people who weren’t able to think in this way, and were consistently bogged down by details. Abstraction is the cornerstone of computer science, without it little is beautiful.
I learnt the limits of the power of computers, not just in vulgar dimensions such as how fast they might go, but hard boundaries on what they might ever compute. Along the way I learnt ideas about the completeness of systems of logic, and the beautiful result that there will always be true things that we cannot prove (I’m taking slight liberties with precision). These results are fundamental to the development of computer science as the study of the process of computation, and tell us as much about ourselves and our ability to reason.
I learnt about how long things take to do, how quickly we can solve problems and how we can show that we can never do any better. I learnt how to create languages that we can use to solve problems, and how if we design our languages carefully we can prove things about our solutions that are important to us. I learnt about processes that communicate, and limits on what they can do cooperatively. I learnt how we layer abstraction upon abstraction to give our solutions idealised environments in which to operate, and how we make those abstractions efficient. At any level, I was able to break into the abstraction and study the details.
If these ideas don’t appeal to you, you’re probably not interested in computer science. That’s cool, lots of people aren’t. But let’s not lose sight of the fact that this subject only tangentially has something to do with software development, and instead really is trying to tell us some new things about this abstract world that we’re lucky enough to work in.
The world is your oyster with a computer science degree because you have not yet committed yourself to a career path. This is at the same time wonderfully unrestrictive and terrifying. Computer scientists should be feeling the same kind of angst that students of all the traditional academic disciplines – physicists, historians and psychologists alike – might feel towards graduation. Rather than being trained you have been taught. And that process should have been its own reward.