It’s impossible to get a solid, well-rounded CS education without understanding computer organization and architecture because too many things depend on such understanding.
- Performance analysis of practical software
- Parallel software and its execution
- Embedded and mobile computing
- High-performance game programming
- High-performance databases
- Accelerators, GPGPU computing and related topics
- Modern compilers and code optimization
- Low- and mid-level networking issues
Computer Organization and Architecture lets you know how exactly each instruction is executed at the micro level. If you plan to study embedded systems/ processor design, these concepts are very important, as they form the basis of design strategy. It is also a well-known fact that assembly coding is closest to the computer, and it is always most optimum, if written properly. This is very important for real-time or time critical systems coding, as each millisecond is very important. Knowing the architecture completely helps you write assembly codes. If you are writing assembly codes, you know exactly how many instructions-cycle it will take to execute it, which is generally not possible in higher languages like C/Java etc.
The memory hierarchy model lets you optimize the Page file/cache/RAM, etc. to get the code execute in least time. Also, it lets you know how your own personal computer will perform, and what limits it can reach. It can let you decide what specifications your PC should have to perform well!
Also, it is useful for a coder or compiler-designer as computer organization teaches us how ‘hazards’ and ‘stalls‘ can be avoided by changing the coding order, and algorithms and to make use of the ‘pipeline‘ as best as possible. It basically gives us a very fundamental understanding of how things work in computers.
A few hard-core technical companies and design houses though might go a level deeper. These include the likes of Nvidia, Intel, Samsung, Qualcomm and some EDA companies (Synopsys, Cadence) etc. Since these companies are in a niche domain of chip-designing, you’ll definitely stand an advantage by knocking off a few questions about computer organization and architecture.
If you’re going to do low level coding, ie device drivers, operating systems, compilers, or even some embedded stuff, knowing how a computer works under the hood is basically mandatory.
For higher level languages and use case where you’re writing user-level code, it’s not a requirement. You can write python code without knowing how the computer works. You can even do a substantial amount C++ w of hile knowing very little to nothing about the computer under it. And that code will be portable.
But I’d argue that knowing how the hardware operates makes you a better coder, ESPECIALLY if you’re writing high performance code.