I'm comfortable programming in JavaScript, including object-oriented programming, although most of my practical experience comes from the Minecraft Bedrock scripting API. I enjoy that work and plan to keep doing it, but I'd like to broaden my understanding of programming and computer science.
I have experimented a little with Electron, but using libraries and APIs sometimes makes me feel like I'm relying on tools without understanding what they are built on. I've considered learning C because I'm interested in memory, hardware, and how software works across different architectures. I'm also curious about assembly, but I'm unsure whether starting there would provide useful insight or simply make learning unnecessarily difficult.
I'm currently leaning toward embedded programming because it seems like a way to build practical things from relatively low-level components, develop career opportunities, and potentially create ethical products that respect user ownership and privacy. What would be a good learning path for someone who wants to understand computers from the hardware level upward? Should I begin with C, assembly, or something else?
3 Answers
You don’t need to understand every layer before building software. Abstractions are useful, and even experienced programmers rely on libraries and tools. The important thing is to study the layers that interest you one at a time and build projects at each level.
A practical sequence could be Nand2Tetris or another computer-architecture course, followed by C, data structures, microcontrollers, and then some assembly for the processor you’re actually using. That gives you hands-on experience without getting stuck in architecture-specific details too early.
The next topic should depend partly on the kind of work you want to do. Data science, application development, operating systems, device drivers, and embedded systems all lead to different paths. Since embedded programming interests you, learning C, computer architecture, memory management, digital logic, and basic operating-system concepts would be especially useful.
Assembly probably isn’t the best first step. It’s tied closely to a particular processor architecture and can involve a lot of tedious detail before you understand the bigger picture. C is a much better fit for embedded programming because it exposes memory and low-level behavior while still letting you build useful, reasonably complex programs.
For the hardware-to-software path you’re describing, take a look at the Nand2Tetris course. You build logic gates, a CPU, an assembler, a compiler, and a basic operating system yourself. It’s a great way to replace the feeling of using mysterious abstractions with an understanding of how those layers are constructed.
That sounds exactly like what I’m looking for. I’m going to start with Nand2Tetris and use it to build the foundation before moving further into C and embedded programming.

I’m still exploring which area of computer science suits me best, but embedded programming currently seems the most appealing. My main goal right now is understanding how software connects to the hardware rather than choosing a specialization immediately.