There's IMO a kind of quadrant going on.
People without CS background who don't see where it would be useful
People with CS background who don't know how to use it
People without CS background who realizes where the science can be useful.
People with CS background who know where and how to apply it to every day problems.
Unless someone is building forms all day long (and even then), it's going to be useful. Sure, you can build apps without it. but they'll be mediocre instead of good.
- 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.