Best Way to Learn Coding: CS Degree, Bootcamp, or Self Teach? From Someone Who Did All Three
Table of Contents
- Undergraduate Computer Science Degree
- Self Teaching/Autodidactism
- Coding Bootcamp
- MS Computer Science Degree or 2nd Bachelor's
Code is ubiquitous. This is especially obvious as one looks around today's educational landscape. Learning to code, whether to become a software engineer or just to be more technical, is an extremely popular topic. At the same time, tech jobs that require some element of writing or understanding code are among the highest paying gigs, so the demand for technical education makes sense.
Nowadays, there's an abundance of ways to learn how to code, but the four main ways are through:
- A traditional university Computer Science degree
- Teaching oneself via online or textbook resources
- A coding bootcamp
- A MS in Computer Science or 2nd Bachelor's
This is a topic near and dear to my heart: I began my career as a Technical Project Manager at consultancies before ultimately getting a Master's degree in Computer Science and pivoting to software engineering. At the time, I had multiple options and tried both self teaching and a coding bootcamp before ending up back in a university.
Rather than just give you the pros and cons, which are easy to find online, I'll also sprinkle in my personal observations when going through them, and share thoughts about who should go in what direction.
Before talking about options for non-traditional students, let's talk about what the traditional path is.
Undergraduate Computer Science Degree
I'm going to make a distinction between being a Computer Science major in undergrad (this section) versus majoring in something else and then doing a Master's or second Bachelor's.
If you're in high school, and want to become a software engineer, the easiest way is to go attend a well respected undergraduate college and major in Computer Science. This is the standard path nowadays. In this, you'll take a mix of theoretical Computer Science, math, programming, and science courses. In addition, because it's undergrad, you might also get the opportunity to take some liberal arts courses to round out your education.
Average CS majors per unit are double what they were at the peak of the dotcom bubble, so competition is fierce. However, there's a well-oiled pipeline and infrastructure to get smart CS majors into jobs. Much of recruitment happens in this early stage, especially at the internship level. Getting a summer internship gets you a chance at landing a full time software engineering return offer, so if you can major in CS in college, try to do it.
With that said, you're probably not reading this article if you're in this position, so let's explore some non-traditional paths that I've tried.
Doesn't everyone else start here? Most people usually decide they want to learn to code, and google search "learn to code". Then they'll find a resource and just start going for it, usually copying code samples and trying to make sense of them.
There's an abundance of free resources.
There might literally be a million free coding education resources online-- from wonderful sites like freecodecamp to Codecademy, to awesome tutorials like Michael Hartl's Rails Tutorial, to the thousands of MOOCs.
The internet has made this path very accessible.
It costs nothing.
Notice the price tag: free. If you have an internet connection, and a few hours a day, you can learn to code.
The idea is that you keep working through courses and tutorials, build a nice portfolio, and just start applying to software engineering jobs. Many people have done this successfully, including some engineers I deeply respect, but a huge caveat:
If you're really determined to become a professional software engineer, this approach is the one most likely to fail.
No, I don't know you, or your personality traits, but the biggest thing this method lacks is discipline. Are you the kind of person who can create a system for themselves, who has the long-term discipline to stick with something hard even without social support or pressure? I've met very few people who have actually self taught themselves coding without any assistance, but I've often found these are some of the strongest engineers in the game. Jamie Zawinski comes to mind.
It's usually because self-taught developers continue to teach themselves well after getting their first, second, or third jobs. The ability to learn quickly and well, with discipline, is rare.
Most people want to believe they have this ability, but I sure did not. I would do a few tutorials, get stuck, give up for a few weeks, and try again. I'd try one of the online courses but never could power through for more than a few weeks at a time. So I looked into bootcamps.
Bootcamps, especially those in-person, have a structure that forces you to do the hard work to learn to code. I'm sure online bootcamps are just as good, but having the social pressure of attending classes in-person is a great substitution when your motivation is zapped.
Why didn't I go for a Computer Science degree immediately? Time.
Bootcamps are a 6-month (or less) commitment rather than a 2-year (or more) one.
If your purpose is to get as much technical knowledge as possible in as short a timespan as possible, bootcamps cannot be beat. This is especially true of ones that are project based (most are), where the focus quickly shifts to building things rather than sitting in lectures.
This can be a pro and con, as we'll discuss later. The shortened timeframe leads to higher learning density, which Tim Ferriss argues is good:
"Density of practice is very, very important. One hour a day per year is only 1 percent as effective as cramming for 52 hours in two weeks -- distributing your time over a year is not nearly as successful"
You also learn practical skills.
When I later studied computer science in an MS degree, I took a lot of math, science, and theory courses– most of which I rarely use. Sure, such classes absolutely improve one’s logical thinking skills and problem-solving abilities, but you're not actually paid to solve discrete math problems. 90% of the time, unless you're working on machine learning models, firmware, high frequency trading, or some other niche programming-- you're paid to build and support applications or software.
During my bootcamp, I learned the frameworks React and Rails, which I ended up using heavily in my first few years of being a software engineer. They are still wonderful tools that I use for personal projects today.
It costs money, but it's about 1/4 of the price of a degree.
When I was shopping around for master’s degrees, the tuition for some of them go up to $2000 a credit. That’s over $6,000 for a single course. Most formal programs range between 30-36 credits for the degree itself, and 3-12 for prerequisites. Total tuition can quickly go up to near 6-figures after the degree is completed.
You usually work directly on a portfolio that you can show.
Personal projects are important for two reasons: firstly, they force you to utilize what you’ve learned. Secondly, your portfolio is a nice compliment to your resume when you have zero experience. After going through a bootcamp, you will definitely have built at least 3-4 projects that you can show off and be proud of.
This sounds great, so why did I eventually leave to go back to school and get a computer science degree?
MS Computer Science Degree or 2nd Bachelor's
You can do it part-time.
At the time, I had a full time job and wasn't ready to leap into a full-time educational commitment. I'm pretty risk adverse and the job paid well, so I had been doing the coding bootcamp part-time.
I found it incredibly difficult to do a bootcamp after work-- because the timeline is much more compressed, I was working nearly all the time. Remember the density thing? It's great if your only goal is to learn something, but holding down a full time Project Management job made maximizing coding density quite intense.
I ended up spending 3 full years part-time (a little more if you count the prerequisite classes) on my MSCS degree. It was a slower pace, but I ended up getting several times more cumulative exposure to technology stacks. I also hacked it a bit-- a year into my MS degree, I made the transition in my full time gig from Project Management to Software Engineering, allowing me to optimize learning density then.
This is the route I personally recommend anyone who can muster it for a year or two (learning enough to land a full time dev gig). Most universities will negotiate courseload with you too.
The professors are usually brilliant.
No knock to bootcamp instructors (mine were personally wonderful), but on average they didn't have as much software engineering experience as my adjuncts in the MS degree. Many of the adjunct professors had been developers for 10-20 years (or taught part-time).
The full time professors, on the other hand, always had a Ph.D and contributed to some aspect of computer science. My networking professor was a key contributor to cellular networks, and my thesis professor was a leader in cryptography.
You get really good exposure to math and theory.
Remember the point in the bootcamps section about practical knowledge versus theory? If you're a bit of a nerd like me (I literally run an algorithms/software blog site), Rails and React are great, but I love knowing how things fundamentally work.
It's one thing to know Rails, but my classes in Database Systems, OOP Design, and Programming Languages taught me what the framework was built on.
Note: do you hate math and theory? If so, you will not enjoy a Computer Science degree and should go another route to become a developer. If you do get excited reading wikipedia articles on optimization problems, grammars, NP-hard algorithms, ARM architecture, and the like-- consider this path.
But it can be expensive.
Unfortunately, there's not a ton of graduate school scholarships or financial aid, so you're usually on your own here.
With that said, software engineering is a lucrative profession that I believe will continue to pay a handsome return on investment, regardless of the approach taken to break in.
Best of luck.