Should software developers understand how operating systems work?

I hear this question frequently, and the answer is a resounding “Yes.”

Operating system knowledge absolutely, positively has a use in the software development field.

Being a software developer and not knowing how an operating system works is similar to being a software developer and not knowing what a CPU does. Sure, there are some software developers who don’t know anything about either topic, but they are at a distinct disadvantage, and it will show in the software they develop.

If you don’t know anything about how an OS works, you can certainly develop software at some level, but your hands are tied and you’re at a disadvantage when it comes to dealing with issues surrounding debugging, performance, concurrency (race conditions, deadlocks, etc.), memory management, file systems, process management, thread management, networking, communicating with devices, scheduling, virtual memory and paging, etc. All of these and more can directly or indirectly affect the software you’re developing. If you don’t understand these OS-related concepts, you would need to go find someone who does. That’s the antithesis of self-reliance. Learning them yourself will make you a better software developer.

And, without knowing anything about operating systems, you’ll be hard pressed to develop truly portable source code. Portability revolves around both hardware differences and operating system differences.

The only area of software development that might not need any knowledge about how an operating system works might be certain classes of embedded systems, which have no operating system at all (not even an RTOS). But, the concepts you typically learn about when studying operating systems would even apply in an environment with no OS at all. In effect, part of your embedded system application probably acts as a mini OS for the rest of the application, and if you don’t understand how to properly implement concurrency, for example, you’re likely going to make blatant mistakes that will lead to reliability issues (race conditions, deadlocks, etc.) that could be the death of your product.

Of course, if you’re tasked with writing a small OS for an embedded system, or you want to contribute to an operating system (e.g., Linux through the open source community, Windows as a Microsoft employee, a mainframe OS as an IBM employee, etc.), you’re going to need to understand how operating systems work.

In addition, if you ever need to develop a device driver, you’re not going to be able to accomplish the task without knowledge of how the target operating system works and how your code needs to safely interact with it. Knowing how operating systems work, in general, will make it easier to understand the details of a specific operating system.

Donald Knuth, author of The Art of Computer Programming series has said:

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird.

I would take that one step further, and paraphrase to add a part about operating system knowledge:

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like, and at least some idea of how the underlying operating system works (if any). Otherwise the programs they write will be pretty weird.

Software developers are (or had better be) more than casually interested in computers.

The more you know about the environment in which your software will run, the better software you’ll develop. Don’t try to skimp or “cheap out” on topics you learn in this field. Chances are, you’ll have to learn them someday, anyway.

In this field, count on continually learning, throughout your career. You need a passion for technology and for continuous learning, if you’re going to have any hope of long-term success. If you don’t like learning about how different types of software and hardware work, it’s not a very good sign. If you are interested, it’s a very good sign.