Using Systems Thinking
As microservice architecture continues to rise in popularity, systems thinking becomes more relevant than ever. In Microservice Architecture (MSA), many services act in coordination to solve a larger problem. In monolithic architectures a single service is responsible for all responsibilities in solving a problem. In MSA, responsibility for solving one aspect of this larger problem is delegated to a single service. A retail system for example is responsible for selling products to customers. This system may consist of many services such as one for inventory management, another service for checkout, and another service to manage shipping. None of these services can independently sell a product to a customer and instead must work together to achieve the larger goal.
Let’s add some definitions to some of the terms used above. A system is a set of parts, or elements, that interact with one another to provide functionality. These individual parts cannot perform the desired functionality by themselves and instead must cooperate together to achieve a larger task. In other words, a system cannot be further divided into independent parts. If you consider the human body as a system, you have parts that work together to perform actions such as moving and thinking. However, if the brains and legs are removed from the body, the body can no longer move or think, nor can the individual pieces move or think by themselves.
Elements of a system do not need to be finely tuned on their own. Instead these elements should be optimized to work together efficiently. If you take the best parts from all of the cars together, you certainly will not end up with the best car that you can make as you will likely have a tough time getting the parts working together. The same could be said about a system of services. Things like data formats must be agreed upon at a system level, rather than at an individual service level, otherwise work will need to be scoped into a project to translate the response of one service, so that the rest of the services can understand it. This adds unnecessary complexity to the system and results in wasted development effort and frustrations when requirements change.
The understanding of a system is typically approached by dividing it into components. Intuitively we assume that we will understand the system, by understanding the individual parts that compose it. This may come in the form of examining the source code of an individual service or examining the individual services of a system. The intuition is that by understanding the components of the system, we gain an understanding of the system itself. This method of understanding a subject by understanding the individual pieces is known as analysis.
Analysis is limited as it cannot answer questions about the purpose of a system. To answer these questions we have to understand what larger system the system plays a role in? What larger problem does is this system trying to help solve? Perhaps the retail system mentioned above is part of another system that a system for presenting the front-end interface to customers. By itself, the retail system cannot sell products to customers, but without the retail system, the larger system cannot sell products.
The act of understanding a system by seeing the role it plays in a larger system is known as synthesis. If we analyze a car, we may have an understanding of how it works, but we have no understanding of its purpose. To answer that question, we have to examine the larger system it is a part of, which is the transportation system. From here we understand that the car is responsible for efficiently transporting passengers to and from their destinations. Similarly, we now understand that the retail system is part of a retail website that is meant to sell products to the website’s customers.
Systems thinking is not a silver bullet, but it is another way to help understand complex systems. Analysis certainly has a place in our understanding of systems, but it does not answer all of the questions that we have. Similarly, synthesis does shine additional light on a system by helping us understand purpose, it does not help us understand how a system works.