For someone who already has several years experience with programming, through open-source, side-projects, and commercial work, what can they gain from a university computer science course?

Initially I doubted Cornell’s CS2112 course, taught by Andrew Myers. The curriculum sounded like a standard Java class, going through various aspects of the language before touching upon data structures, GUI toolkits, and HTTP servers. And superficially, that was the course. Where CS2112 succeeded was in taking those concepts and challenging us with them—sure, we might think we know how a hashtable works, but can we actually implement one? We might’ve used Git for our side projects before, but can we actually work in pairs to write software?

And Myers emphasized software engineering as well, requiring us to design and specify our software before starting on the work. Because our last four assignments were cumulative, those who glossed over design initially were given a quite intimate lesson on what technical debt actually entails.

Overall, the class wasn’t about specific knowledge—it wasn’t about graphs, or data structures, or generics—it was about how to design, write, and test software. How to be a capital-S Software Developer, and how to reason about complex design and implementation problems in the context of a larger project, instead of in isolation as a cute “programming challenge” like so many of us focus on today. Sure, this isn’t the flashy algorithmic wizardry, obsessive performance optimization, or mystic code golfing that so many of us associate with skill in our code jams and competitions. It’s stolid, maybe even a little boring—but it’s what makes programming a craft, in addition to an art and (someday) a science.

For any future Cornell students debating between 2110 and 2112, I highly recommend the challenge of 2112. Just don’t procrastinate.