home | library | resume

Was My CS Degree Worth It?

2017 Jun 01


I don't know. My financial aid made it more than worth it for me, because I didn't pay anywhere near the six figure sticker price - if I had, I don't know if I would be able to justify that cost.

I certainly gained a lot from it. For what it's worth, the core requirements (i.e., the CS-specific ones) of my CS degree were as follows:

It certainly gave me a decent grounding in theory. At the very least, the curriculum (in theory) enables the student to understand:

I have deliberately omitted items such as "how to write code" or "how to design software" from this list. They don't belong there.


To a certain extent, the former ("how to write code") does not belong there because I don't think that's something you can quite teach - rather, it must be learned and gained through experience - experience beyond the scope of an undergraduate education. I am, admittedly, speaking of "writing code" in a poetic sense - specifically, how to write good code: comprehensible, elegant, maintainable, succinct, to name just a few of myriad criteria, many of which are often at odds with each other.

None of this, however, is ever really taught explicitly. That, I think, is probably one of the bigger problems: students are assessed point deductions for violating DRY, perhaps, or because they abused global state and side effects to get their homework to pass the test suites, but there's no class that teaches this. These principles are taught in the offhand comments a professor makes in lecture, in a rambling afterthought inspired by an answer to a novel question.

The latter ("how to design software") suffers from the same challenges, with one more: the decisions are much more difficult. When writing code, you can make decisions much more easily: you can compare different approaches based on, say, performance and memory usage. When designing software - by which I mean the high-level design decisions, such as the choice of programming language, monolith vs. microservices, how dependencies are split, whereas I refer to the low-level design decisions as "writing code" - the metrics are much more opaque, if quantifiable/qualifiable in any meaningful way at all.

One potential solution that might mitigate these somehow is a course devoted entirely to case studies and code review of open source projects. Do deep dives into codebases, studying the various design decisions that were made, and what might have been if a decision had gone another way. Potential topics include


Beyond the above, there are a lot of things that simply aren't covered in any course in the undergraduate curriculum. I'm not talking about highly technical topics (e.g. feedback systems, NLP, or crypto), but rather, general skills and topics that are never explicitly covered:

From a technical standpoint, the list balloons massively:

Those last two notes are a good segue into another list. In addition to the aforementioned hard technical skills, there are plenty of important softer skills that anyone going into software development should train:

These are not exhaustive lists, of course. Some topics were deliberately omitted (because I know there are separate courses that cover them, e.g. compiler optimizations) and there are undoubtedly plenty more that I didn't think of, to say nothing of those that I myself haven't learned of yet.


The basic point, however, I hope is clear: there are plenty of things that you will not get from an undergraduate degree - or, more specifically, there are plenty of things that I did not get from my undergraduate education.

That's not to say that my degree is worthless; I do indeed consider my degree valuable. I gained a lot from my coursework that I wouldn't have in a less structured environment. The fact of the matter, though, is that going to class and completing my coursework was, hands-down, not enough. I would be nowhere near where I am today were it not for the sheer breadth and depth of the learning I did on my own, outside my classes.