I've read so many blog posts like this that, at first, it felt done to death, like there's nothing original I could add. But on further thought, maybe it's only because I've been immersed in this world for the past year that I felt this way, and that sharing my journey could be useful for others starting out. I'd like to think that hearing my perspective now a year ago would've been motivating during times I wanted to give up.
I majored in Social Welfare and started to become interested in programming almost by accident by taking an intro class for fun. One big advantage I had was that this was UC Berkeley, and the professor of that class was a world-class instructor. Dan Garcia was the type of teacher that could've made any topic fascinating with the way he taught. Computer science had (at least at Berkeley) a reputation of being impenetrably hard for the type of people who aren't left-brained enough to love math at an early age. Dan took topics like bits and bytes, iteration and recursion, and classes and objects from academic jargon to understandable concepts by using clear examples and having the most passionate energy I've ever seen. Here's a video of him to show you what I mean: Youtube link.
That's what pulled me in. The idea that software enabled individuals to make tremendous impact had been etched into me throughout my years at Berkeley (friends hacking away for a weekend and making things that'd make me say, "you made this?!"), but I just never thought I'd be able to be good enough to do it myself. I had things that I knew I was good at, but math was never one of them, and I held this notion that that's what it took to get "in". That intro class showed me that that wasn't the case. I did well. I helped peers understand when they were lost. And most of all, I loved it. Once past the mental hurdle of "can I do this?", I wanted to go beyond the intro class. My time at Berkeley was coming to an end after four years, so, I decided to just self-study.
I don't think the option to self-study would've been possible just 5 years ago. That's another big advantage I had on my side: the timing. I decided not to go the option of a bootcamp because of the resources online. I had access to Berkeley's recorded lectures for computer science classes, and started there. For concepts that the professor mentioned that I didn't quite understand, it was a very short distance to getting 10 different explanations through an internet search and find one that clicked for me.
I think the hardest part of self-studying was steering my learning in the right direction throughout. Schools and bootcamps have set out curriculums and experts telling you what to do — online, you find conflicting opinions and a paralyzing number of options of what to learn next. I consulted some industry friends of mine, and the advice, luckily, was quite consistent. For building knowledge: start with the fundamentals, understand everything you need to do the next thing, and if something doesn't make sense, go back to where it started to not make sense and repeat. For what technology or tools or domain to choose: just pick one and stick with it, the skills end up being quite transferrable.
So that's what I did. I started with a Berkeley class that went through a more rigorous approach to learning about computer programs culminating with a end-of-year project to build a basic compiler for a basic programming language in Python. Then I went through the course on data structures in Java, diving in to the theory even more. And again, it wasn't just the lecture that was available — I had homework material, labs, and of course, projects. After I finished mine, I would find public Github repositories of other students' projects by searching part of the project boilerplates and look for any interesting implementations I had missed. As much as I enjoyed these theory courses, I was itching to apply what I learned and I had no idea how to do that.
I didn't ever really feel ready to start building my own ideas (it seemed so daunting), but one day I just started on one and kept going. Whenever I got stuck about how to do something, I just searched it up. Since that day, I've been going "off-course". Working on my self-directed projects, which in a way is like creating your own problems to figure out. I watched lectures briefly for new technologies or tools when a good one exists (like Dan Abramov's for React), but in order to do things myself, I really had to just learn how to efficiently search for the answers.
My last project reached enough complexity that I often found myself having to refactor code to make it more readable and manageable, so I started reading books on more general software engineering. It does feel a little like no matter how far I feel like I've come, there's so much more to learn — but it doesn't feel discouraging like it did at times in the beginning. I think actually shipping things helps a lot with quelling that feeling. It's something tangible I can point to with pride that shows progress.
Another piece of advice I'd for self-studying programming is to have people you can ask questions to. Something I'm very thankful for, which I briefly mentioned, is having friends in the industry who were willing to sync with me every once in a while for me to ask questions to and review code. I don't know if it's essential, but it let me fix my coding mistakes quickly and highlighted the right way to do things a lot quicker.
As a closing thought, I wish I had was more peers to learn with. I think that's the big advantage of going the bootcamp route. I miss collaborating with others in my class. It felt discouraging at times when I got stuck because I didn't know if it was a common problem that others in my shoes would've faced. Luckily it's getting a little better. There's so many online communities that you can join to get a piece of that social aspect, which I've always been told is a big part of software engineering. If you're thinking about self-studying, try to reach out to people who might be interested in accompanying you.
Overall, I've really enjoyed this journey. I feel like I've learned more applicable skills than I had in a year of college, and I'm excited for the next phase of contributing code with others and continuing to level up my ability to build things.