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?
It depends on how high-level your development is.
But in all development, you probably should know the fundamentals. E.g.,
On the other hand, I don’t think knowing the specifics like what memory-mapped IO is, or knowing the difference between NAND and NOR flash is really important for an average* (desktop/web) developer. Even the knowledge of the architecture of a modern CPU is probably going to be a science in itself seeing how complex they’ve got in the past years, not to mention that the code emitted by modern compilers is becoming more difficult to predict (the article linked shows that it’s harder now to outsmart the compiler at low-level optimizations). It’s similar to being a car mechanic was easier a few decades ago, today not that many people will try to fix their cars by themselves.
**Definition of “average” may vary.*