It’s Worth It: Leaving a Full-time Software Development Job at 18 to Learn Computer Science

In high school, I assumed I would go to a university. I grew up in a family that valued education, so even after I graduated and started a gap year, I wasn’t seriously considering any alternatives. I planned on studying computer science in college — as a self-taught web programmer who didn’t know much about the underlying concepts, I thought a degree from a good school would help my career.

Pictured: a visionary technologist poses with some guy who was early enough on Twitter to get the handle @jack

That plan was scrapped when I got a full-time programming job at Braintree during my gap year. At first, I felt way out of my depth. Sooner or later, I’d be exposed, and I’d be forced to head back to school; shame on me for thinking I could take a shortcut!

But as time went on, I got better at my job. Eventually, I felt like I more or less “belonged” as a productive junior developer, which once seemed impossible given my lack of credentials. I was familiar with the tools and the team, and I was working on increasingly challenging problems. I almost deluded myself into thinking I was figuring everything out, so it was hard to imagine gaining anything from a university computer science education that I couldn’t learn on the job.

Then I met Oz and Myles.

Why learn computer science?

They pitched me their mission: teach computer science to folks who have practical programming knowledge but are missing fundamentals.

I thought it might work for others, but I was doing fine at my job and didn’t see how discussing compiler theory would make me any better at it. But over the next few weeks, I realized something: maybe I wasn’t noticing computer science concepts around me because I wasn’t equipped to participate at that level of discourse.

When my team decided to use Apache Kafka to pass messages between two applications, I thought, “Sounds great, what Ruby methods do I use?” instead of “Is a real-time fault-tolerant distributed streaming platform the best choice here?” If I had a valid-looking ORM statement but the database query was still slow, my solution was to pull up the query plan and hand it off to a senior engineer. And if I couldn’t configure something, I rolled up my sleeves…and opened Slack to message the last editor of the Wiki page I was following.

Teachers performing a teaching

Was this really holding me back day-to-day? Maybe, maybe not. But I was afraid of the idea that I’d eventually plateau: I might know Rails stone cold, but where would I go from there? I wasn’t sure how to reach higher levels of abstraction, where I could pick the right tool for a problem or quickly conceptualize complex systems. Lower levels of abstraction, like optimizing database queries beyond “cross your fingers and add an index!”, were equally out of reach. In the long run, this seemed both unacceptable and unsustainable.

Taking the Plunge

Now I had the vague idea that “learning computer science” was a “good” and “worthwhile” thing to do. Okay. I was still 17 at the time, so my first instinct was to give it the ol’ college try. But then I thought: does it have to take four years, and are all those general ed classes mandatory, and is a lecture hall with hundreds of other students the best environment for me to learn this material?

Well, I’m pretty self-motivated, so maybe online courses are an option. Let me just go on Coursera and…whoa, that’s a lot of choices. Hmm, I mostly see “beginner” and “advanced” courses, but where should someone with working web development knowledge start? Did I need to know operating systems before I learned networking? Could I learn about distributed systems without doing computer architecture first?

I settled on trying an Algorithms class. I got through the first week, found myself stuck on a problem in the second week, and stopped there because…well, was this really providing value to my company’s users? That’s what I told myself, anyways. Some superheroes might be able to power through on their own, but I felt like I’d have a better time in a setting with clear focus, great teachers, and bright peers.

Study, sleep, 🔁

So, to make a short story long, that’s how I ended up at Bradfield. I committed to studying computer science full-time from this past January through March. The goal was to learn enough to be indistinguishable from somebody with a four-year CS degree, at least so far as my future colleagues could tell.

(I want to quickly make a distinction between programming and computer science, in case it sounds like I was leaving my job to learn how to do my job. As user4501 on StackOverflow puts it, “computer science is the study of what computers (can) do; programming is the practice of making computers do things”. While they are related, it’s possible to program and get paid for it without knowing computer science.)

I took all nine classes offered, in order:

  • Computer Architecture
  • Languages and Compilers
  • Algorithms and Data Structures
  • Operating Systems
  • Databases
  • Computer Networking
  • Distributed Systems
  • Program Interfaces
  • Discrete Math
Rare candid picture of the craftsman honing his trade

This was divided into three classes every three weeks. Classes were every weekday evening and weekends during the day, to accommodate students with full-time jobs. I spent most of my days reviewing previous sessions and preparing for future sessions. It added up to ~50 hours per week, split evenly between class and studying. The material mirrored university courses; we used textbooks and online videos published by schools like Berkeley and Stanford. In fact, Oz and Myles have graciously created a site with more or less the same curriculum I went through.

Class was generally split in half, starting with a concept-driven discussion led by the instructor. Since we had already read about these concepts, this was less a lecture and more a time to fill in gaps and go over the confusing stuff. The second half was spent applying those concepts. In one class, for example, we discussed what a database’s query planner does, and then analyzed SQL statements and their query plans with a live PostgreSQL database.

In addition to class time, I had open lines of communication with the teachers, both in person and on Slack. I used this for things like asking for one-on-one time to solidify concepts I had trouble grasping, or discussing how the different classes tied together.

Whiteboarding a finite state machine that describes a reliable transport layer network protocol

Reflections

Here are some thoughts on my experience:

  • All of my classmates were sharp, motivated, excellent people. Learning hard things with them was a pleasure.
  • Most were professional web developers, so we were able to anchor new concepts to existing practical knowledge. Thoughts like “wow, I wish I had known this when designing/developing/debugging project ABC” were commonly echoed during class. This also meant that we were able to jump quickly into deeper subject matter, without spending time on things like development environments or syntax.
  • Since a lot of the coursework is theory-heavy, I was worried about getting bored or losing motivation like I had with the Coursera course. Oz and Myles are engaging and responsive teachers, and they have created an environment with self-motivated students who are all eager to learn. There were lulls, and some topics were more interesting than others, but I never felt checked out or unengaged. They deserve a lot of credit for that.
  • This was Bradfield’s first time using structured classes, and some parts were rough around the edges. Some in-class exercises ran into unfortunate blockers that took up class time. Some classes dragged and could have been covered in an hour and a half, while others felt like they needed five hours. But these weren’t deal-breakers, and Oz and Myles are so responsive that they’ve probably ironed most of this out by now.
Some notes from the operating systems class

The most important takeaways for me were new mental models and increased confidence in approaching difficult subjects.

These mental models unlock new abilities and better ways of doing common things. For example, I can now start on even footing in an evaluation of a distributed system’s consistency, reliability, and availability. While I frustrated myself trying to memorize jQuery’s library of function calls to navigate the DOM before, now I can view the DOM as a tree in my head, and recognize that moving around it is just like traversing any other tree. These kinds of pattern-matching and critical assessment skills are universally useful and unlikely to go out of style.

The course list above was very intimidating at first. Discrete math?! I hadn’t done math of any kind since high school, and definitely none of the discrete variety. Each course title was scary in its own way and, as a whole, the subjects seemed like they were for people smarter than me.

And the curriculum did turn out to be extremely challenging. But it was not impossible! And that was ultimately comforting. My brain dragged its feet as it stretched in new ways, but eventually pieces started to fall together, and I could feel myself learning! Oz even made that math class bearable. Now that I’m on the other side of these “unreachable” things, I’m no longer afraid of situations like staring at a 1000-page computer networking textbook without any knowledge of computer networking. Call me a lunatic, but it was actually kind of fun.

Annotating a copy of Amazon’s DynamoDB paper

Regarding my original goal of quacking like somebody with a more formal computer science education, the jury’s still out. My narrative is incomplete — I obviously don’t have experience with university computer science, and I haven’t gone back to the workforce to apply what I’ve learned in earnest. Reflecting recently with Oz, he told me that no one really uses everything in computer science every day. Instead, I should aim to solidify the most important concepts, but know the fringier ones well enough to reach the “same level of fuzziness” on them as classically trained folk — not necessarily immediate recall, but an idea of the vocabulary and where to look for an answer. That seems realistic to me.

Even though I don’t feel like an expert yet, I’m happy with what I learned in those three months. Say I took a year off from programming without attending Bradfield: upon returning, I would have despaired at three new Ruby releases, six Rails updates, and 47 new Node.js versions. It would be a nightmare to get back up to speed! If I had a similar chunk of time away from programming now, I could take some comfort in knowing that computers are just carefully organized sand, CPUs still execute assembly instructions, and that my copy of “The C Programming Language” is still the latest version. Then I suppose I’d buckle in, read some patch notes, and be on my way. Knowing these fundamental concepts now will save me from infinite pain if I want to keep programming for as long as people like Oz and Myles.

Onwards

I believe that studying computer science will greatly benefit any practicing software developer who learned how to program without a computer science background. While a four-year university degree has been the traditional way to get this material, Bradfield was perfect for me, and I’m confident that my investment will pay for itself many times over.

What’s next for me? I’m starting a logistics software company that you’ll hear more about soon :). Less than a year ago, being a technical co-founder seemed well beyond my limits. But now that I have some sturdy tools under my belt to support any new ones, I feel well equipped for the challenge!

I don’t social medias too good, so comment below or reach out to me at tigertigertigershen@gmail.com if you want to chat about any of this. If you’re feeling brave you can poke me on Twitter @_tigershen