Why I'm revisiting software fundamentals and my learning plan

Posted on Sun 30 November 2025 in misc

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.

My Learning Roadmap

The goal is to complete the necessary courses from Open Source Society University Computer Science curriculum. It has online courses from top universities such as Harvard, Princeton, MIT, Stanford, etc.

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 language used is Racket, which is a dialect of Lisp and descendant of Scheme. In this course, we learn the basics of Racket (data types, built-in functions, libraries, images, functions, etc). Then, we learn particular code structures/patterns to assist in building more complex programs. One of the final projects is to build the game Space Invaders, which should be fun. I'll probably write a blog post about it in the future. Racket is a good pedagogical language to learn core principles that can be applied to any programming language.

Math for Computer Science is basically discrete math. The topics covered are proofs, structures, counting, and probability. I'm taking this to keep my brain sharp. It's also a prerequisite to some of the more math-heavy algorithms courses in the curriculum. The instructor states that one of the most important skills we can have in life is being able to tell the difference between a logical argument that seems to be right, but is actually wrong, and a logical argument that is actually sound.

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.

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 won't be taking because I'm not targeting that specific type of job.

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.

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 feel like I did a solid job at learning the fundamentals during my undergrad. I was motivated, learned how to learn, practiced deep work, and 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, databases, compilers, cybersecurity, software architecture, etc). These are areas that I feel like if I learn them, I'll be a stronger engineer.

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.

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.

What about a job?

I'm currently unemployed. Yes, a job is definitely 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.

Long term, I believe this will make me a better overall engineer for when 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. And there's the money aspect too.

The money is important, yes. But more important to me is becoming a highly skilled engineer, learning for the love of it and satisfying my curiosity. Being highly skilled is more likely to attract money.

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 also doing okay with enough resources to keep me afloat for a while without having to work.

I am 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.

Plus, 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. I think I'm good enough now though 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.

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 building a foundation that will support everything else I learn moving forward. Strong fundamentals make you adaptable. They allow you to see patterns others miss and approach problems from first principles.

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.