Along the way, you will want to try: - Using a debugger to step through simple programs at the machine level and see what happens to the registers, stack, etc - Using tracing tools like strace (for Linux) to see what syscalls various programs issue (this is after you learn what syscalls are and how your OS handles them) - Playing some old-school hacking wargames like vortex, utumno, etc. These are fun and really make you learn the low-level details of how your OS loads binaries, memory layout of processes, etc.
Most developers don't know this level of the stack, and when you are the one guy on the team who does, it's a bit like having superpowers.