The Gong Show: Exploding Computer Science
Great post about what a Computer Science major should look like. This goes along well with my Masters Degree in Internet Entrepreneurship. There seems to be a lot of agreement that academic institutions are behind the time with their curriculum. Hopefully some of these ideas will make their way to progressive universities.
I was talking with Bijan the other day, and he mentioned he heard it’s possible to get through a Computer Science (CS) major these days without learning the language C. I had heard the same thing (though I couldn’t tell you at what program that’s true), and I do know for certain that many introductory programming classes have moved away from C in favor of Java.
It’s really surprising that you could escape an undergrad program with a CS major without touching such a core tool as C. If you don’t learn C, how will you know the origin of Hello World? Of course I say that tongue in cheek, but I do feel that real-world engineering will require strong C skills at some point or another, missing out on it in undergrad would be a shame.
I don’t know exactly what an undergrad program in CS looks like today, but I’m a pretty young guy, so I’m going to assume it looks pretty similar to what it looked like back when I was in undergrad (minus this C controversy).
It’s remarkable how little a computer science education matches up to the real-world building of large scale applications. I think the whole disipline would be best served if it were broken down into a few component parts, rather than being the hodge-podge that it is today.
Paul Graham poked at this subject in Hackers and Painters, so big hat tip to him for getting my mind going on this subject. If I had my way, I’d explode CS into the following pieces. Each might be its own major:
Architecture: This is what I think an academic CS prof spends most of their time thinking about… building new languages, operating systems and compilers that will probably never see the light of day in real-world engineering… but, architecture is an important discipline in that all CS professionals are standing on the shoulders of architecture giants that designed the tools used across the discipline. This would be the most academic track.
Networking: The networks we rely on have gotten so complex, with so many layers of abstractions in the lower levels of the stack, that I feel this could be a discipline of its own at this point. This component of CS would likely be an academic/engineering hybrid: some network theory, topology, etc… and some flavor of modern day sys admin skill set on top of major networks at scale.
Engineering: This is how to build something massive. It some ways it’s the opposite of the architecture track… for example, if you take a Database class in CS undergrad, you will be taught how to create am ideally normalized database where data is only found in one table and can be joined with data from other tables via keys. In the real world, major databases at scale are highly denormalized, because joins are too computationally expensive, and so data is duplicated everywhere, but everything is optimized for speed.
This real world example of databases is how I think about engineering. It’s using what you know empirically about performance and speed to implement what an architect or designer wants to do in the most efficient and sustainable way possible, even if it would make academics and architecture nuts roll in their graves. In a typical CS undergrad program, I think engineering is the biggest hole in fresh CS graduate’s skill set. They typically pick up these skills in a summer internship where they see real-world code being developed at a big company.
Design: Software design (the UX/UI side of design) is closer to sociology than any other discipline, but it’s in the hodge podge along with many other course in a CS major. Understanding how to do needs finding, contextual inquiries, iterative design with user feedback, and even the art necessary to execute well-intended designs… these types of skills would all live in this track. Some school like Carnegie Melon and Georgia Tech have independent programs in HCI, which is a step in the right direction, but this is typically a subset of a CS major, and yet there is very little traditional (think Architecture when I say “traditional”) CS involved.
Applied Math: Computer software is a finite state machine, and as such, all of CS is really just Discrete Math. It’s not even all of Discrete Math… it’s actually just Applied Discrete Math, because Discrete Math can be done in theory, on paper, which some CS majors are forced to do in a class or two, but this process has little real-world relevance. That said, CS departments are full of guys pushing the envelope on Applied Math, and if someone wanted to major in just that discipline, there’s definitely more than enough meat on the bone to do so.
So, that’s how I’d split it up. What did I miss? I was trying to figure out where key tools like AI, Machine Learning, NLP, etc fit in… but in the end I decided that these topics are not organizing principles… they’re applications of the breakdown I prescribed above. Feel free to tear this apart in the comments here or on your own blog.
As computers are now an essential tool of every type of engineering, it seems silly that we have a department that could grant you an undergrad degree in computer science. It’s like granting you a degree in Abacas Science 100 years ago (another finite state machine)… no one would do such a thing… so why do we do it today?
Disclosure: I wasn’t a CS major in undergrad, so maybe I have no idea what I’m talking about, but I did take courses all over the department and saw first hand what a hodge-podge it was.
