When does having a CS background make sense?

4 min read Original article ↗

John Chow

Press enter or click to view image in full size

In the end of a recent interview with a junior-level candidate for Reflektive, the dev bootcamp grad asked me:

“I’m trying really hard to better my computer science fundamentals [i.e. data structures, algorithms], but I don’t see when I’d actually use it in my job, and I feel like I’m struggling to learn it. Do you think it matters to really know the CS fundamentals?”

This is a common question for most software engineers starting in their career (I know I asked this myself a million times after UCLA). The growth of dev bootcamps is yet another data point that software engineering doesn’t require CS fundamentals. Most day-to-day application work requires a foundation of solid software engineering principles: writing simple/testable code that reflects the business domain, leveraging the right technologies based on different tradeoffs to address the business requirements and making sure our applications are operationally sound. I’ve seen many successful senior engineers who were either self taught or went to some dev bootcamp. If you were to ask me 3 years ago this question, I’d flat out say that you wouldn’t need any kind of formal CS education (unless you’re trying into something that needs it, like machine learning or embedded systems).

Get John Chow’s stories in your inbox

Join Medium for free to get updates from this writer.

However, I’ve now grown to really appreciate computer science. I’ve worked on many scaling problems throughout my career, and they all required me to understand on a deeper level how different technologies really worked. Understanding read/write performance characteristics for data stores (e.g. Redis, PostgreSQL, ElasticSearch, Kafka) required knowledge of data structures and basic operating system principles. Relatedly, having a strong understanding of data structures and networking have helped me in both understanding and designing large systems along with communicating those designs with other engineers. Even when optimizing SQL queries using EXPLAIN ANALYZE, you’ll see many artifacts of algorithms, data structures and operating system principles. The deeper my knowledge goes, the simpler the problems seem to become. (Side nerd note: there’s a sense of beauty in seeing how some of the most impressive pieces of technologies today are built on the data structures you first learn about like hash tables and trees).

Despite how beneficial CS has been later in my career, I don’t think going to a 4-year university for a bachelors in CS is the best choice for everyone (although I absolutely loved my time at UCLA for the friends and new experiences). Computer science is different than software engineering. Traditional universities can still fail preparing students for the real world because a majority of the coursework leans theoretical; software engineering isn’t emphasized as much (although I think that’s starting to change). Also, colleges are expensive.

It’s hard to have a general recommendation because every person’s situation and personality is different. If you have the resources and desire for having a wide breadth of knowledge, attending 4-year universities first can be absolutely amazing. However, if you’re looking to get into the workforce ASAP or make an impact in the real world, going through the dev bootcamp route will prepare you for an awesome career. The one bonus side effect about working first is that having real world experience will actually make learning computer science concepts much easier. By grounding computer science to real world problems that you’ve encountered, the abstract concepts will more likely stick.

Regardless of your decision, software engineering is a craft, and to be considered good, one requires a lifelong commitment to learning. Learning requires dedication and discipline, so make sure to carve out time in your life to learn as much as you can.

There are a few things I do to continually deepen my CS knowledge. One is to read white papers about new technologies like Raft, Kafka and Google Spanner. (You’ll be surprised how easy of a read these white papers are, since they’re written by engineers for engineers). Additionally, I’ve taken Andrew Ng’s Machine Learning course on Coursera, which was an absolute blast. Finally, I read textbooks that’s listed on Stanford’s CS course websites. I know, I know; this sounds super nerdy. But like white papers they’re actually pretty approachable to read, and I supplement the readings with the course slides (they’re usually posted on the website). A couple of my favorites that have really impacted my day-to-day work are Database Systems: The Complete Book and Operating Systems Concepts.