I got my B.S. C.S. 12/07. Most of my courses were programming in C++ and ignored the hardware, except for the mandatory Computer Architecture and elective Microprocessors. They were essentially the same course, except in the first we learned x86 and the in second Motorola 68k assembler. They were actually 2 of my favorite (and most challenging) courses. We learned the basics of how a processor works (registers, pipelines, etc) and wrote some relatively simple assembly programs, but that was it. I now work at a small custom industrial electronics engineering company. I do all my programming in C++/CLI and C# now, but most of the my job involves writing utility programs to interface with the hardware the electrical engineers design. I work with the embedded programmers to know what the command format to send (typically over a COM port as raw hex data). So I don't worry too much about how the low-level stuff works, but for me it's useful so I can tell if any bugs are due to hardware, embedded software, or my utility software. Dybs