What got me interested in programming beyond application level?
Application development is, and always will be, necessary to make computers useful. Abstractions allow us to turn tasks that would otherwise require specialized knowledge — such as command-line proficiency — into simple applications with intuitive interfaces.
However, the amount of abstraction and the lack of control it sometimes gives the user always bothered me. I would occasionally find myself wishing I could change some aspect of how an application's internals were structured to better suit my own needs.
That was one of the things that first got me into programming: wanting to build my own solutions to problems that only I, or perhaps a very small group of people, might have.
That eventually led me to systems programming.
It wasn't enough to simply make my own software. My curiosity about how computers actually worked kept pushing me further down the rabbit hole. After learning the fundamentals — pointers, memory management, ownership, and other concepts — and building a number of user-space applications, I started wondering about what was happening underneath them.
What exactly happens between a program I write and the hardware executing it? How does the operating system manage memory? How does a program become something the CPU can actually execute? Where do firmware, bootloaders, kernels, and device drivers fit into all of this?
Eventually, I decided it was time to start looking underneath the operating system itself.
That's where I am now: learning about operating systems, kernels, embedded systems, and the lower levels of the software stack. I'm still very much learning, but that's exactly what I want to document here.
What have I been learning or experimenting?
Right now, I'm trying to build a stronger foundation in systems programming and understand the layers between the software I write and the hardware that eventually executes it.
I've been spending a lot of time in C, learning more about memory, linking, executable formats, and the details that are usually hidden by more high level languages. I've also been learning Assembly to understand the instructions that the machine executes.
More recently, I've been exploring Ada, which has been particularly interesting because of how much of the language is designed around correctness, strong typing, and explicit control. It's really no surprise it's used in fiels that require bug free code, such as aeronautics. I'm also learning Rust and trying to understand how its ownership and type systems approach problems that are traditionally handled manually in languages like C.
I'm still at the beginning of this journey, and there is a lot that I don't understand yet. That's also part of what makes it interesting. Every layer I learn about seems to expose another one underneath it.
Where I want to go
Eventually, I want to work closer to the boundary between software and hardware, particularly in operating systems and embedded systems.
I'd like to become comfortable enough with the entire stack that I can go from understanding a piece of hardware, to writing the low-level software that interacts with it, to building the higher-level systems that make it useful.
That means learning much more about kernels, device drivers, firmware, compilers, computer architecture, and bare-metal development.
I don't have a single predefined project or destination in mind yet. For now, I'm more interested in following the questions that come up as I learn and seeing how far down the rabbit hole I can go.
Top comments (0)