I’m Old, Part LXII: College CS Value

I recently saw this tweet from Stephanie Hurlburt:

I have a 4-year CS degree, it helped me get my 1st job (via referral from my professor), but the actual education was not useful or worth it

And I won’t argue with her on that. Her experience was her own. More than anything else, I would like to hear more detail of her experience and how it could be improved.

I went to Oberlin for CS. At the time, it was a very young program and only became an actual major while I was there. I was the 5th student to declare.

Up until my third year, I would agree with Ms. Hurlburt. The classes that I took during that time were only putting names on things that I invented myself or encountered in the wild. That changed more in the 300 level classes and some of the 200 level classes. Some of the classes have been no use to me. Discrete Structures was super cool – I really liked the notion of being able to treat programming language elements as mathematical entities and subject to proofs of correctness. For day-to-day engineering, I’ve had no application of that.

There were some game changers (in no particular order):

  • Compilers – this class kicked my ass, but I learned a hell of a lot from it including how to design a decent, easy-to-parse Domain Specific Language. I learned how to write a tokenizer, scanner, and parser. As a professional, I’ve implemented compilers/interpreters for 4 languages, including one that was specifically not subject to the Halting Problem. It also taught me how to decompile assembly back into a high level language on sight. In my current job I need this skill frequently.
  • Theory Of Computer Science – this was a class on automata theory. Finite state automata have been hugely useful in my professional career. A decade ago, I wrote a PDF parser that included an FSA running the tokenizer and another running the interpreter. At one job, I designed an AI scripting language for a game engine that used a state machine as the central control flow.
  • Algorithms/Analysis – making something work is only part of the job. Making it work well is where this comes in and needs to be in the wheelhouse of every software engineer. It also reminds me of the time I was reworking some code in Acrobat and I found a chunk of code to do string comparison that was O(n2). That was an easy fix.
  • Functional Programming – one of the professors did a seminar class on functional programming based on Simon Peyton Jones’ book The Implementation of Functional Programming Languages. Having the background in FP made it much easier to make the decision to use F# as the main language for creating a pure managed, performant .NET graphics library port of a C++ version.

One thing that wasn’t in my CS program, is practice in communication and writing. If you’re going to work in a group or have your work made public, you need to be able to write clearly.

I don’t think that any particular class got me a job. In fact, I know that even the things in my CV had little impact on my first full-time job out of college at Adobe. I had a boatload of Macintosh coding experience and figured that was what I was going to be brought in to do. Nope. PostScript printer engineering – embedded systems. I didn’t know PostScript. I didn’t know what an ICE was. I didn’t really know hardware, but I ended up doing/working with all those things.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.