It struck me the other day that I know nearly nothing about the hardware I expect my software to run on. I've been a dev for around 5 years but I haven't looked into hardware theory/design since i left University. I don't even build my own machines anymore because, being brutally honest, I'd rather pay the extra few bucks and let the Comp Sci drop-out build it at the shop for me.
Whilst it's clearly important to have a good understanding of the basics of what's going on under the hood, it's abstracted so far away from us as devs we really don't need to concern ourselves with the intricacies of Programmed I/O
or Memory-Mapped I/O
etc,..
Or do we?
Note that I'm talking about your every-day LOB dev here and not the dedicated bare-metal guys.
So, define 'average' how you will but overall, how deep should a competent programmer be able to dive?