Why I'm revisiting software fundamentals and my learning plan


I'm sure we all agree that mastering the fundamentals is important. This is true for any discipline. In this blog post, I will be sharing my learning roadmap/plan for revisiting the fundamentals of CS/Software and discuss why I'm doing this. I will also discuss with my thoughts about a master's, an actual software engineer job, and the bigger picture.

Why go back to the basics?

First, a little background. I earned a Bachelor’s degree in Computer Science & Engineering back in 2019. It took me four years. Between 2019 until now, I got 3.5 years of professional software engineering experience. I also had some career gaps in between due to personal reasons.

I started programming at the age of 16, during my junior year of high school. I am now 28, so that's over 10 years. Though I had a few years in between where I didn't code due to life circumstances.

I feel like I did a solid job at learning the fundamentals during my undergrad. I was motivated, curious, learned how to learn, and practiced deep work principles. I had good exposure to math, algorithms, data structures, basics of programming, computer organization/architecture, networks, OS, etc. You can find my relevant course work on my LinkedIn profile under the Education section.

But as time has passed, I’ve realized there were areas I never got to touch (such as other programming languages theory, databases, compilers, cybersecurity, software architecture, etc). These are areas that I feel like if I learn them, I would be a stronger engineer. I'm also curious about learning new areas.

Was my degree not enough? I wouldn't say that. My degree was useful in helping me lay down a proper foundation. I am extremely grateful for the great professors that taught me during my undergrad. Shoutout to Kelvin Lwin, Daniel, Alberto Cerpa, Florin Rusu, and Angelo Kyrilov. My apologies if I may have missed other great professors. But a CS degree doesn't cover everything. And that's okay. That's what independent learning is for.

If I really wanted to, I could go all in on interview prep and maybe land a job in the next 6-12 months. But I'm not. I'm just taking a more hollistic, longer-term approach. I will still do interview prep though, as I will mention below in a later section.

I'm revisiting the fundamentals because I want to refine my understanding, close knowledge gaps, visit untouched areas, and revisit concepts with more maturity and context than I had back in school. I'm also rebuilding my career from the ground up and this is a way to get my bases covered. I want to widen and deepen my base of knowledge. I also love learning !

My Learning Roadmap

The goal is to complete the necessary courses from Open Source Society University Computer Science curriculum. Just in case you're not familiar with OSSU, it's a list of online courses meant to mirror the curricululm of an actual Bachelor's degree in Computer Science. It has online courses from top universities such as Harvard, Princeton, MIT, Stanford, etc. The courses are free or cheap.

I started about a month ago, currently taking the courses Systematic Program Design and Mathematics for Computer Science.

Systematic Program Design focuses on how to think systematically about programming. The focus is not the language used but the core principles of program design, which can be applied to any programming language.

Math for Computer Science is also known as discrete math. The topics covered are proofs, structures, counting, and probability. I'm taking this to sharpen my brain. It's also a prerequisite to some of the more math-heavy algorithms courses in the curriculum.

After SPD, I will probably take the next course in its section, which is Class-based Program Design. After Math for CS, I will probably take the course Build a Modern Computer from First Principles: From Nand to Tetris, and continue in that section. But this is subject to change.

I'll keep going down the list for Core Programming section, while concurrently going through another course from another section. Doing just 2 courses concurrently for now but that may change.

I don't plan on completing all of the courses. I'm picking and choosing what I believe to be the most important or relevant, in an order that makes sense. Courses such as computer graphics, or machine learning, for example, I might not be taking because I'm not targeting that specific type of job. If I have some extra time, I might take them out of curiosity, but I need balance that with pragmatism.

I won't be taking the calculus courses from the core math section since I already took them in college and feel like I could easily pick up necessary info if needed.

What about a Master's degree?

At one point, I considered pursuing a master’s degree. People sometimes ask me, “Why not just go for a master’s?” The more I thought about it and researched, the more I realized that mastering the fundamentals instead would be a better investment for me in the long run, especially since my goal is to work in industry in a non-research-related role as a software engineer.

Some might argue that you need strong foundations to complete one in the first place, and that's probably true. If you are strong in your fundamentals and want to pursue a master's in a topic of interest, then by all means go ahead. I'm not against a master's, it's just not the right fit for my situation.

I think of getting a master's like adding branches to a tree of CS/Software knowledge. And I think of getting a bachelor's as strengthening the trunk of said tree. I already have a bachelor's, but going through another one will make my knowledge tree trunk even stronger, which is more important to me right now because I believe a stronger/bigger trunk may allow for a taller tree with more branches in the future.

Sure, some master's programs teach the fundamentals as well, such as knowledge-based Master's. But from the curriculum's I've seen, grad level courses tend to be more advanced and therefore assume prerequisite knowledge. There's also the money aspect. I could find the same or similar grad course topic online for free and of high quality. If not, then I can find a high quality book on the topic. Money saved.

As for research-based Master's, I have respect for Computer Science research but it's just not a right fit for me and the type of jobs I will be looking for in the future. Also, not interested in staying in academia, with all due respect. I know not all master's degrees make you write a research thesis. The ones that just focus on courses I can replicate for free or a lot cheaper as mentioned above.

I understand the credential aspect of a master's. But at the end of the day it's just a piece of paper. Most important of course is the knowledge obtained from the degree. Although I won't be getting a credential for OSSU, the knowledge is important to me and I have this blog to showcase my learnings and reviews of each course I take. Not to mention I will be putting OSSU on my LinkedIn.

What about a job?

I'm currently unemployed. Yes, a job is important. After all, we study and learn in order to eventually become employed so that we can earn a living. I kinda don't want to start working yet though so that I can focus on this learning path instead. I love having free time.

Long term, I believe this will make me a better overall engineer for if I do land an offer later. With a stronger base of core, foundational knowledge, I believe I can reach a higher ceiling for my technical career, which may lead to more money and can make up what I lost from not working.

However, it could be argued that getting a job ASAP instead and just learning on the job may be more valuable rather than revisiting the fundamentals full time. And that's valid. There's the money aspect too, of course.

The money is important, yes. But more important to me is becoming great at software engineering, learning for the love of it, and satisfying my curiosity.

If I was offered a job at a company that's a right mutual fit today though I might just take it. Then, I'll learn these online courses on the side. This will stretch out my learning timeline, which I'm okay with. But it has to be the right opportunity. I'm doing okay with enough resources to keep me afloat for a while without having to work.

I plan on doing interview prep along with going through the curriculum. This includes leetcode, system design, mock interviews, etc. This is so I'll be prepared towards the end of the curriculum when I'll be looking for a job anyway.

The experience from on the job learning will be valuable, of course. I just don't think many companies will let you use company time to focus on fundamentals learning at a deep level. They want you to already have strong fundamentals, which is fair, of course. I believe I do have strong fundamentals already, and that I'm good enough now to adapt and perform well in many software engineer positions. But I'm taking a few steps back to try to get to a whole new level.

I might apply for Google Summer of Code though.

The Bigger Picture

This isn’t just about landing a job or checking boxes on a résumé. I’m taking a long-term view.

I don’t just want a job. I want a thriving career as a software engineer. That means investing in the skills that will still matter decades from now: fundamentals, reasoning, design, and adaptability.

By revisiting the core ideas behind programming and computer science, I’m (re)building a foundation that will support everything else I learn moving forward.

Looking Ahead

I'm genuinely excited to learn! I’ll be documenting this entire journey through blog posts, notes, and reflections. I want this blog to serve as both a record of my growth and a resource for others walking a similar path.