Here at Geekology, we like to make the technical world less cryptic. We do so by breaking down technical words in laymen terms. One of which, is the distinction between a software engineer and systems engineer. People are often unclear about the differences, especially when talking about software-intensive systems. Within these systems, there is a blurry line that separates the two, which is where the confusion can happen.
First and foremost, it helps to understand what a system is to better understand what each engineer does. To me, a system is made of a set of building blocks. Each block serves a specific purpose as a part of the whole. If any block were to stop working or go missing, the system could not function correctly.
We had the opportunity to interview, Shyam Prasad Srinivasan, a software/firmware engineer from Microsoft on the Surface team. He used the Surface Pro 3 as an example to explain these terms. The Surface Pro 3 is the entire system—the tablet and keyboard are subsystems. Each subsystem could be broken down further. For example, the tablet itself has many parts that comprise the whole system, including the display, RAM, CPU, memory storage, battery, wireless adapter, cameras, so on and so forth.
To make the tablet alone would require many different types of engineers separately, such as thermal engineers, display engineers, camera engineers, plastic engineers (I kid you not), user experience (UX) engineers, electric engineers, product design engineers and software engineers. To put together all this engineering effort is a systems engineer’s job. A systems engineer needs to understand what other engineers do and, most importantly, needs to know what he wants from all these engineers.
The systems engineer makes the decisions for the team. All these engineers will come to the system engineer with different designs and options for the subsystem they are responsible for. The systems engineer needs to strike a balance in order to deliver a final product.
Software is usually a sub-system within the entire system. But, in a software-intensive system, the software system either represents the bulk of the entire system or IS the entire system. This is where we see a lot of overlap between the work of a software engineer and a systems engineer. Oftentimes, a software architect would play the role of a systems engineer when developing a purely software system.
- Focus on the software portion of the system
- Programming skills
- Software-specific tools: UML (Unified Modeling Language), IDE (integrated development environment), test plans / test scripts / test cases, etc.
- Focus on the end product as the entire system
- Inter-disciplinary background and training
- System-level tools: SysML (Systems Modeling Language), CAD (computer-aided design), functional failure analysis, etc.
This is our take on the differences between a software and systems engineer. Let us know your thoughts and questions in the comments!