I'm comfortable programming in JavaScript and understand object-oriented programming, although most of my practical experience comes from the Minecraft Bedrock scripting API. I've also experimented with Electron, but working with libraries I don't understand internally makes me feel like I'm using tools without knowing how they work.
I'm considering learning C because I'm interested in embedded programming and want a stronger understanding of memory, hardware, and how software interacts with different architectures. However, I'm wondering whether C would still leave me relying on abstractions that hide too much. Would starting with assembly give me a better foundation, or would it add complexity without helping me understand the bigger picture?
I'm still deciding which area of computer science to pursue, but embedded programming appeals to me because it could let me build useful products from the ground up. Eventually, I'd like to run a small, self-funded company that creates ethical products without data harvesting and gives users more ownership. I'm looking for a practical learning path that helps me understand computers deeply rather than simply learning to use existing libraries.
2 Answers
Take a look at the Nand2Tetris course. It’s almost tailor-made for this goal: you start with basic logic gates, then build a computer, CPU, assembler, compiler, and simple operating system. Instead of only reading about the layers beneath a programming language, you construct those layers yourself. It should give you the foundation to decide whether C, assembly, embedded systems, or another area is the right next step.
If you’re considering the course, you can generally work through the material for free. A certificate is optional and is unlikely to be as valuable as actually completing the projects and understanding the concepts.
Assembly probably isn’t the best first step. It’s tightly tied to one processor architecture and can become very tedious before you’ve developed a broader mental model. C is a better next language for embedded work because it exposes memory, pointers, data layout, and low-level operations while still letting you build substantial programs.
That makes sense. I’m mainly trying to understand what’s happening underneath the abstractions, not just collect another language, so I’ll look for a path that gives me hands-on experience with those concepts.

I looked into it and it seems exactly like what I’ve been searching for. I’m going to start there.