I think there is huge value in trying to become what has been called a "full stack programmer". In the maning of: try to understand how computer systems work by understanding how each part of the stack works. Don't try to completely understand every subtle detail of every part - try to understand it like you understand how a combustion engine works.
My list would be:
- basic electronic concepts, ie. transistors, XOR / NAND, bit shifters, adders
- assembly language
- hardware layout: CPU, registers, main memory, MMU, interrupts
- operating systems: hardware interface, multi processing, file systems
- networking: packet networks, ethernet, TCP/IP (sliding window, congestion control)
- low level programming: C with fopen & co, sockets, structs, system calls
- compiler construction (this is important!), parsers, translators, programming language implementation and virtual machines
- algorithms: complexity theory, automata, CFGs, common data structures (heaps, maps, trees)
- discrete mathematics, statistics
I think if you can explain all of these in at least a sort-of, hand wavy way, then you're on a good path to become an excellent programmer. I also think that is what a good CS degree should teach you. Try to explain to yourself in a children's story way what actually happens when you click your mouse button. If you don't know something, look it up.
Who has the time? And you can be employable knowing only 1 of those.
I've done that stuff; by necessity, I'm old enough to have grown up with computers and didn't have it all on a platter. My sons are learning "top down" and doing fine.
My list would be:
I think if you can explain all of these in at least a sort-of, hand wavy way, then you're on a good path to become an excellent programmer. I also think that is what a good CS degree should teach you. Try to explain to yourself in a children's story way what actually happens when you click your mouse button. If you don't know something, look it up.