(Preface: Edsger Dijkstra isn’t the source of the following quote; Hal Abelson is.)
Every time Edsger Djikstra is quoted as saying
Computer Science is no more about computers than astronomy is about telescopes.
I want to commit acts of violence, because it’s always used in conjunction with ignoring someone’s concerns.
An article titled Let’s Not Call It “Computer Science” If We Really Mean “Computer Programming” was recently posted to Hacker News, which was promptly jumped on by a number of commentors. One of the common responses to the article was that it was effectively saying “Math is hard, let’s go shopping.”
This is what I like to call “bullshit.”
(This is my blog, I get to swear on it. If you object to me swearing when I find a topic frustrating, please fuck off.)
If you decide to go to university and are interested in programming, the obvious program is Computer Science. After all, if you want to work with computers, what other degree is there for you? So you enroll and take the first few 100 and 200 level courses, and in general it’s a lot of programming with some odd discrete math and logic courses on the side. It’s odd that there’s this math component added in, but at the end of the day it’s really about programming right? Heck, you probably programmed your calculator to solve quadratic equations for high school algebra so you can hack propositional logic and the like, right?
And then the quotation about telescopes gets thrown around with increasing frequency, the classes start getting increasingly abstract, less programming is done, and then suddenly people start realizing that somewhere along the line they were mislead. Instead of learning how computers work and how programming really works, they’re actually in a mathematics program and they’re mocked for finding this situation disagreeable.
What, you don’t like the math and logic component? You expected to focus on programming? Look at this plebian over here; he thinks that converting a pushdown automata to a context free grammar is difficult. He’s clearly not a computer scientist - he’s just another code monkey.
This is the genuine attitude of many Computer Science departments - any interest in real world examples is somehow less worthy than entirely theoretical aspirations.
One of my own personal experiences underscored this point. After I completed one of my courses that went deeply into graph theory, I asked my professor how we could expect to use what we had learned. He had no answer, and more or less said that the application of the material wasn’t relevant. I was stunned - that it was considered unreasonable to expect that we have clear motivations for our studies! And there are so many examples of how graphs can be used! We have the Puppet catalog graph, we have graph theory applied to routing topology, it’s an underpinning of Spanning Tree Protocol, and none of this was deemed important enough to mention!
I am not against the study of theoretical Computer Science. I’ll admit - I’ve not found it the easiest of fields to understand, but I can see the value of a background of some of the standard CS fare. Being to understand the difference between logarithmic and exponential algorithms is very important; being able to determine if a language is regular or context free is absolutely critical for parsing. I have a fabulous example - Upstart configuration files are context free as is demonstrated by this pull request. To properly enable or disable a service you have to count parentheses, which is context free, not regular. This makes a difference.
And instead of saying “Here’s a real world example that requires a context free grammar,” you get slapped with a 4-tuple. Any sort of context or relevance for this material is almost completely omitted and you’re expected to memorize the aforementioned definition. At best a casual reference to parentheses counting might be made, but it’s only a footnote in the course - the real material is the formalism.
While my capacity for whining about Computer Science is nearly unlimited, my fundamental problem with Computer Science as an educational program is that it is misrepresenting itself.
If someone was trying to determine if they should major in CS, they would run across this “should I major in Computer Science FAQ” page. Say they take these courses, and decide they like it. In the first and second year, actual programming classes largely dominate. Only when people have a significant amount of time invested in the degree, the material promptly changes and suddenly juniors in the program can find themselves writing less code in a year than they would have written in a single term in previous years. Bright, eager students that were making video games, writing programs and were generally doing great work before they enrolled would find themselves in the back of the class, praying for sweet death to overtake them to end the misery of being trapped in a major that was wrong for them. And at this point, they’ve spent thousands and thousands of dollars on prerequisites that are not applicable to anything else, so switching to a different degree isn’t an option if they’re not wealthy.
I’ve had the good luck to be in classes with some stunningly bright people, who have done incredible technical feats and write excellent code. They’ve failed courses like I’ve described - not for lack of intelligence or aptitude, but out of sheer boredom and frustration. All of the joy of creation, discovery, and exploration of this field has been completely removed, programming assignments are few and far between, and are completely detached from real world concerns.
Some people just want to make telescopes. There is nothing wrong with this - we desperately need bigger and better telescopes, and real world demand for telescopes does not diminish the importance of telescope making. A good background of astronomy can certainly make telescope makers better at their craft, but it should be taught with the consideration that people want to make telescopes. And if you’re only going to be teaching astronomy and only astronomy, don’t advertise it as the place where people can go to learn to make telescopes.
This entire post is the result of my own experiences. There are certainly CS programs out there to which none of my complaints apply. And I don’t want to see all CS programs turn into a Bachelors degree of Science in Microsoft SQL Server.
However, I think it’s unfair to expect all CS students to dedicate their careers to theoretical Computer Science. The mathematical underpinnings that are being taught should be continued to be taught, but with real world context and real world examples available. If someone wants to study exclusively CS theory, they should absolutely have options to do this - but CS students that are hoping for more of an education in the creation of actual software should have opportunities as well.