Why? I think every programmer who didn't grow up using a machine with a few kilobytes of RAM misses out on lots of fun, and it is true that some people need to know this (e.g. to write efficient hashing code, video compressors, networking code, etc), but I also think there is a place for programmers who only work at way higher levels, glueing together libraries others wrote with a decent UI.
"if they can swap two variable without a third"
I can, but I also know it may be harder to optimize for the compiler, and introduces a data dependency that many current processors have problems handling, and I know I never felt the need to remember which those processors were. More info at http://en.wikipedia.org/wiki/XOR_swap_algorithm#Reasons_for_....
When I take a step back for wider perspective, your question "Why?" is a
surprisingly good, and oddly enough, and it keeps working across the
various knowledge "areas". For example, should an assembly coder know
HDL (verilog/vhdl) and understand the basics of chip circuits, limits,
and timing well enough to leverage them in assembly code?
Whether you're looking "down" the stack to the details of saving a
"file" on a piece of rotating rust, or looking "up" the stack to the
details of browsers, the question of "Why?" one should know the details
of the other parts/levels is still poignant.
The most fair answer is unfortunately a wishy-washy "yes and no". There
are times when having both deep and wide knowledge is extremely
important, potentially even a requirement, but there are other times
when the task is simple enough for it to be accomplished without
extensive knowledge.
Another way to look at it is through abstractions. The entire point of
abstraction is to hide enough details to make things easier. The trouble
is, when abstractions fail, you really do need to know those hidden
details.
Though you can often accomplish your goals without knowing all the
details of the other layers, you are still better prepared by knowing
them, and can be more efficient by knowing them.
BTW, Excellent link on the basic issues with XOR swapping on modern
systems, but it leaves out a lot of details. ;-)
Why? I think every programmer who didn't grow up using a machine with a few kilobytes of RAM misses out on lots of fun, and it is true that some people need to know this (e.g. to write efficient hashing code, video compressors, networking code, etc), but I also think there is a place for programmers who only work at way higher levels, glueing together libraries others wrote with a decent UI.
"if they can swap two variable without a third"
I can, but I also know it may be harder to optimize for the compiler, and introduces a data dependency that many current processors have problems handling, and I know I never felt the need to remember which those processors were. More info at http://en.wikipedia.org/wiki/XOR_swap_algorithm#Reasons_for_....