No, really, (re)learn the fundamentals
A few days ago, I read through the Behind The Scenes of Bun Install and the article is so fun to read: From memory hierachy and efficiency, caching mechanism, to OS-specific system calls, everything is wonderfully written in a clear manner. (TLDR: Bun team treats Javascript package installation as a system programming problem and not a Javascript application problem). Not that I’m a talented engineer (but if you insist, thank you!) so I can understand probably like 95% of it, but I believe what helped me understand most of the article is that I got quite a firm grasp on the fundamentals.
Another example: I’m going through the book Dive into Systems* (it’s free) on the chapter about call stack frames, and at the same time I was implementing the frames for the compiler of my toy programming language in Go. The same concept of frames in computer architecture can be applied to the frames in a compiler, so I have twice the opportunity to learn about frames and pages. That kind of coincidence always excites me.
What is the point here? For programmers, as people who work with/on computers, the fundamentals are, apparently, how computers work. I’m talking about how a computer boots up, loads the OS, displays the programs, and performs — all the stuff we programmers already have an advantage over normal computer users is that we can understand how it works as we are more experienced with programming. Granted, but why am I going through the fundamentals while there are plenty of things to learn out there? A few years ago, I was still working as an English teacher before taking a leap of faith to become a software engineer. I realized I only know really high-level stuff like how to make an app, how to call REST APIs, how to change CSS, etc. and there was this thing stuck in my head: I lack the basics of a CS student, so I must make up for it. And the simplest idea I had at that time is that I need to understand thoroughly the tools that I work with. What’s the point of programming if I cannot understand the computer I use to build software with?
Some might say “Oh you really don’t need to understand the fundamentals, you’re not going to work on low-level stuff anyways” or “You don’t need to understand how a hammer is made before you use it”. Those are really valid points I have to admit, and they bring us to the 2nd reason why we should (re)learn the fundamentals: To understand things from the ground up. Back to the hammer example, I may not know where the materials used to make the hammer come from, but at least I know what the hammer is made of to hit the right kind of nails. I think the same logics could be applied to working with computers: We don’t have to know that particularly bright-minded person who invented the caching mechanism, but at least we know what it does and how it helps with our work. Low-level enough so we can see the big picture.
Another bonus from knowing the fundamentals, IMO, is that you get the high-level stuff much easier and faster. This is more of a remix of the points I made above, but when you understand and caching of a computer, understanding the caching idea behind Redis is much easier. The same thing applies to storage: Understanding the memory hierarchy and I/O helps you a lot with working with databases, be it relational or non-relational.
So I think it would be great if CS and non-CS students, and even professionals who are now a bit detached from the basics, spend a small amount of time each day (re)learning the fundamentals. It might be useless, but at least it is fun (that I can guarantee).
*: While the book Dive into Systems is not super challenging like CS:APP, it also covers a whole lot areas of computer architecture with each topic low-level enough to truly understand a computer.


