I’ve been in the software development space for several years now, and have seen a consistent message from a whole lot of people: you don’t need a computer science degree. And it’s true — you don’t need one… but you should definitely get one if you can, and I’m gonna argue that side of the coin in this article.
Note: I wrote an article previously discussing the question of whether or not developer’s need computer science degrees, and I’m going to make some amendments to my original position in this piece.
Base context
The typical argument behind not getting a CS degree is that you can learn all that you need to online. And that’s true — you can, for the most part. The nice thing about computer science is that a whole bunch of it has taken place on the internet, because of the internet. From documentation to specifications to textbooks to video courses, you can find virtually everything you need to be a really good software developer online, and most of it’s free!
But just because the resources are available does not mean they’re utilized.
Due to the shift in skill sets that we’ve seen over the past two decades with the rise in popularity frameworks like React, Django, Tensorflow, et cetera, a divide has formed between low-level knowledge and high-level knowledge. You can get a job as a React developer without the slightest knowledge of algorithms or data structures, whereas 20-odd years ago, you needed to know a lot more about how the technology worked on a lower level in order to build advanced websites. With that divide, a whole new profession has emerged: online course instructors.
Before I begin, I must make it clear that I have nothing against online course instructors or their content. The content they create is helpful and should be utilized.
A hypothetical
I’m going to introduce a character for us: Udemy Pat, a web developer who loves React, so much that Pat started created courses on Udemy to help other people learn how to use Pat’s favorite front-end framework.
Pat spent countless hours preparing content for these courses, but it paid off — lots of people signed up! Sadly, they all signed up when it was on sale for $14 as opposed to the original $250… Oh well. Regardless, Pat taught the growing audience in the ways of React, and they all went out to create fast and stylish SPAs with their new skills.
But — oh no! Pat forgot to teach the students about object-oriented design patterns and the countless dangers of undesigned software! And 50% of the students were professionals switching industries to learn how to write code, and the other 50% were novice programmers with no formal training or education!
So 257 course attendees went out and built their SPAs favoring class inheritance over object composition, tightly coupling classes with fragile bases, creating inflexible hierarchies and duplication upon duplication. Their projects died off within a few months of being created because client desires and specifications changed, and their projects were unable to change efficiently without breaking.
Well Pat had no idea — Pat went to the local state university and got a computer science degree for relatively cheap, and was already familiar with all those concepts… So why were all the students so unprepared?
Because despite the wealth of knowledge and information detailing design patterns and other core software engineering concepts, the dominant narrative was that spread by the majority of socially influential developers on platforms like Instagram and Twitter: screw school! You don’t need a CS degree! Take my React course instead…
An example from experience
Now I admit, I used to be in this camp. Before I started my formal education, I thought school was a joke and all I needed to do was learn on the go and I’d be set. And in all honesty, with a heavy heart, I admit I wasn’t completely wrong. A lot of companies hire developers with no formal training or education, and they do what all of Pat’s students did: they create inflexible, inefficient, poorly-designed software, because they don’t know important theory, because it sounds lame and they know a guy who makes a ton of money even though he dropped out of college.
But then I took my first official above-100-level computer science course in college, CS220: Object-Oriented Programming in C++ and learned a ton about how to design OO programs. And then I looked back at old code I’d written when I was thrashing school for being a dumb waste of time. And then I shuddered and sought forgiveness for my foolishness. And then I refactored all of my old code because I couldn’t bear the thought of code that bad being attached to my name.
Here’s my point: you don’t need a CS degree in order to get a job, but getting one will allow you to do a better job. I realized that traditional CS courses that detail theoretical topics like design patterns, data structures, and algorithms aren’t 100% necessary in building a functioning app, but having knowledge of those things will make an app 100% better.
Pros and cons
Let’s make this a little more visual — how about a pros and cons list for a formal education in computer science?
Pro: you will learn and reinforce skills that will make you a better team members, system designer, and engineer.
Knowing design patterns not only gives you a big tool kit of ready-to-use, tried-and-true solutions to problems, but it also gives you a shared vocabulary with your team that enables you to spend more time in design and less time in implementation detail. And on top of that, if a system is designed better, and you have a deeper understanding of that design, you can build it better.
Pro: you will exercise certain problem solving muscles more than you would otherwise.
Computer science course content includes a lot of puzzles and problem solving, and it’s not because instructors don’t want you to implement “real-life” solutions, it’s so that you learn how to think creatively on an abstract level with familiar concepts before you dive into the real world with its fast-paced, high-complexity nature. Most online courses won’t push your brain beyond its limit so it can actually learn and grow, and learning properly takes some guidance.
Pro: you will open up more opportunities if you have some level of formal education.
Whether it’s a full-fledged degree, a series of classes, or a certification of some sort, having those on your resume will make you stand out when compared to (new character) Charlie who took 10 of Pat’s Udemy courses but only knows how to build 10 different types of blogs and ecommerce websites with React. It’ll also give you an edge when it comes to technical interviews — those often feature difficult, abstract questions that require a lot of low-level and theoretical knowledge.
Con: college is expensive.
Yes, for the most part, it is very expensive. But, there are a lot of ways to get around that barrier to entry.
Method 1: Community college transfer! I took this route — I attended a local community college to get my first two years out of the way, then transferred to a local state university to finish my degree, and it saved me tens of thousands of dollars, and I didn’t even get any scholarship money. You don’t need to be at a four-year university for four years, and you don’t need to go out of state. Take the cheap route.
Method 2: Online courses! Top schools like MIT, Stanford, and Harvard all offer free computer science courses that you can take or watch online. Check out this article for a huge list of those courses.
With those most prominent pros and cons out of the way, I’m going to address some common excuses that I see when it comes to a college education.
Excuse: it’s a waste of time.
It’s only a waste of time if you choose to waste that time. I know countless people who dug into their classes and sank their teeth into the content and came out the other end having a wealth of knowledge beyond the majority of their peers, and now they enjoy solving difficult problems with innovative technology at cool companies for a huge amount of money.
Make the most of what’s in front of you. That’s just a general life lesson, doesn’t just apply to computer science.
Excuse: academic CS is so far behind the industry.
While that’s true in a lot of ways, it doesn’t change the fact that it teaches timeless lessons and practices that have been used by countless engineers and have impacted technology in ways most can’t even understand. Just because your university uses Java 6 and an old build of Eclipse doesn’t mean that you aren’t learning valuable information about how to build software.
Plus, you can rely on the internet for all that juicy cutting-edge stuff.
Conclusion
Finally, I’m going to address those who hold fast to the anti-school narrative. If you believe with all your heart, despite the points I’ve proposed, that formal education is still not worth it, at the very least encourage people to dig deeper than the framework layer and do their own independent study, and warn people about what can happen if you don’t take things like system design seriously.
It is an injustice to steer novice developers into a life of bad design, poor practice, and digital suffering, not only because they will produce low-quality work, but also because the things they create might impact other people, from future maintainers to users who suffer due to bad design, whether it be security issues, accessibility issues, or even worse issues in things like cars or airplanes.
In summary, there is more to software development than the functionality of a product; how it works behind the scenes matters, and it’s important that developers learn how to build things that work well, and that’s something that formal education offers in a meticulously structured manner.
Top comments (5)
As a student pursuing a degree in Computer Science, this article is conforting 😀
Good! I'm happy to hear that. Always hoping to empower peers!
I've been trying to teach myself. My struggle lies in building a curriculum and holding myself to it. I'd prefer a degree, but I can't justify debt to change roles when my current role pays decent.
And sometimes school just isn't an option, I understand. Timing and financial restraints are surely primary factors. I would encourage you to look to books and community - if you'd like help/direction, I might be able to offer a hand. Teaching yourself alone can be very challenging, especially if you want more than surface-level knowledge.
Thank you for your response. I'd be interested in any communities that promote independent code learning.