I have many degrees in computer science, and have used almost none of the knowledge in programming jobs. So, the content is fairly useless, practically speaking. I've also found the more I focus on theoretical elements while at work, the more useless I become. The actually useful elements are big picture, and can probably be taught in one or two classes. Much more useful than technical knowledge are the abilities to…
- Thinking about and fixing bugs related to OS scheduling, like, why doesn’t my time.Sleep work as expected? (Intro to Systems, Operating Systems).
- Understanding the protocol layers involved in a network performance problem; writing network services to RFC specs (Networks and Distributed Systems).
- Selecting, working with, and understanding the limitations of distributed databases (Advanced Distributed Systems).
- Shifting the bulk of tricky computing into pure functions; borrowing design patterns like the state monad (Functional Programming).
- Parsing serialized data (Formal Languages for basic theoretical grounding, Programming Languages for compiler and interpreter implementation).
- Dealing with concurrency and using synchronization primitives (Intro to Systems).
- Awareness of security concerns and techniques, respect for the subtlety of crypto implementation, literacy when reading HN on subjects like ASLR or the Juniper RNG compromise (Intro to Security).
- Basic comfort with C, Make, vim, bash, awk, etc. (Intro to Programming).
The vast majority of my education was spent on programming projects to implement key components up and down the stack. Having a decent understanding of what they’re doing and how to approach writing them has been invaluable. The only thing I truly haven’t touched since college is discrete probability.