Should You Study Computer Science to Become a Software Engineer?

Maybe, it depends.

by Nik MalevSeptember 22 2022

Crossroads Crossroads - image courtesy of Midjourney AI

There’s a bit of a joke in software engineering about the job interview whiteboarding session and the daily duties of a engineer.

In the interview, you’re asked to sort a binary tree in O(log(n)) time complexity using nothing but a car battery and Casio calculator. But once you get the job, you spend most of your time copy pasting code from Stack Overflow.

A solid understanding of data structures and algorithms has merit. There are times where these concepts have helped me write faster, more efficient code. But those efficiencies were often just a nice-to-have. I was proud when I improved our page load by 100ms. When I told my team no one cared except for a couple other engineers.

The reason no one cared is because, as a web engineer, I do not work at a layer of abstraction where I am required to push the hardware to its computational limits.

So should you study Computer Science?

It depends. Which level of abstraction do you want to work in?

Understanding your abstraction layer

CsvWD Abstraction layers of a computer system

Technology is built with abstracted toolset upon abstracted toolset. The carpenter has an advanced set of tools, but they do not (need to) understand how the electrical engineer created the power drill. Just as the electrical engineer does not know how the software engineer creates the CAD tool.

Consider the microwave. It has a simple API, all you do is press “quick start”. You click one button to send low frequency radio waves in to your food, it vibrates the water molecules and heats up your leftovers. It’s a complicated process, we only discovered it recently. But it has interface easy enough for a child to operate.

When John Carmack invented the first person shooter game in the 90s, he was pushing the hardware of 1992 beyond the capability of its time. A deep understanding of computing allowed him to design a revolutionary graphics engine. Today, he is applying the same principles at Meta to bring virtual reality to the smartphone.

Wolfenstein3D Wolfenstein 3d on DOS, the first FPS game. (1992)

I work at a company specializing in machine learning. My colleague has a PhD in Computer Science. He has developed an artificial intelligence system called Adiona. It automatically generates truck delivery routes and it leans heavily on a k-means clustering algorithm.

He absolutely needs a deep understanding of computer science to work at this level of computing and it allowed him to create a powerful tool; all the user needs to know is how to input the data in to the web interface.

Our users are delivery routers and they are mastering the discipline of logistics management. Adiona is the abstraction layer they work in and the power-users know how to use it better than we do.

K-means K-means clustering algorithm

Adiona Adiona AI generated delivery routes in Melbourne.

If you want to develop cutting edge machine learning systems, or push hardware to render graphics beyond the limits of its processing capability then you must understand computing at a low level.

If you want a comfy, well-paid job creating REST API endpoints, configuring cloud architecture or building single page web apps then you probably don’t need to study computer science.

I am not trying to downplay the depth or complexity of these disciplines. Web engineering is not necessarily easier or harder than computer science. They are just different disciplines, which get confused with each other because there’s some overlap in the Venn diagram.

CsvWD Okay, there is a little more overlap than that.

So how do people end up studying computer science for the wrong reasons?

The three most common reasons I see people studying CS are

  • They believe it will help them in their tangentially related abstraction layer (e.g design, sales, management)
  • They have incorrectly assumed that it is their abstraction layer (e.g system admin, web development, data science)
  • They actually do not know which abstraction layer they aspire towards

1. They believe it will help them in their tangentially related abstraction layer

Every day I meet and tutor people that are struggling in their computer science degree. When I ask them why they are studying it - 9/10 the answer is “because I want to work in tech”.

A lot of times it isn’t because they want to be a software engineer, they just want a career in tech at some level of abstraction.

I’ve met a lot of people studying CS that aspire to work in sales or project management. The idea being that if they understand the fundamentals of computing, they will be equipped to work at any level.

F*** that. It’s a waste of time and money. And It’s an insult to the all the experts operating at a high level of abstraction. Mastery takes time no matter what you practice. Ten thousand hours is ten thousand hours. You don't master Italian cuisine by cultivating tomatos.

2. They have incorrectly assumed that it IS their abstraction layer

You can’t blame the universities for not teaching people JavaScript. Nor can you blame the students misconception that CS == SE. They signed up to learn computer science, unaware of what they were getting themselves in to. Even if they tried to do their research there is a lot of misleading information.

CsvWD The first result on Google. They aren't wrong. But they aren't exactly right either.

We have a cultural unawareness around the varying paths towards software engineering. You can read more about this in my post University vs Bootcamp vs Self-taught - Becoming a Dev .

It doesn't help either that choosing a degree is a vague, unclear process. You apply from a list of interesting sounding degrees with limited information. Sometimes your parents are pressuring you to just pick something. Which is a catalyst to the next issue:

3. They do not know which abstraction layer they aspire towards

Form follows function and you will become good at you spend your time doing. But figuring out what you should spend your time doing is hard. You have to ask yourself a a lot of questions.

  • What do I like doing?
  • How do I like helping people?
  • Why do I want to learn software engineering?
  • What kind of work do I want to do?
  • What am I naturally good at?
  • Do I like programming?
  • Do I like to be creative?
  • Do I like managing other people?
  • Do I want to further technological advancement?
  • Do I enjoy meetings?
  • Do I want to work for myself?
  • Do I want to work part time?
  • Do I want to make a lot of money?

The most value usually comes from the follow-up question. For example:

  • I want to work out so I can be more attractive. Why do I want to be more attractive?
  • I want to learn software engineering so I can make a lot of money. Why do I want to make a lot of money?.

CsvWD Find your Ikigai.

Clarity of intention is crucial for motivation. You can put up with all the hard work and sacrifice when you can visualize how amazing it will be once you get it. With a precise target, the path forward illuminates and shows you exactly what you must do (and what you must sacrifice) to get it.

If you can't answer why you are doing what you are doing, then you will most likely end up in the midst of a career you despise, asking yourself How the hell did I get here?.

So to answer the question of “Should I learn computer science?”. It depends on your goals. Just keep in mind that CS lends itself to a narrow slice of the abstraction layer. Find your layer and follow the path towards it.

Thank you for reading 😄

BLOG

Our Thoughts, Written Down

LET'S TALK

Interested In Working Together? Let Us Know!

I'm interested in...
How Would You Like To Get In Touch?