Systems thinking is a new and evolutionary way of looking at a problem and attempting to gain understanding and knowledge about a system. A system is “set of elements standing in interrelations” as defined by Ludwig von Bertlanffy in his book General Systems Theory. My understanding of this is that a system is a mathematical set of physical parts and a set of physical relationships between the parts. It should be noted that the parts themselves are often but not necessarily systems too. It is important to understand what a system is before trying to how a system operates and why it does.
As Systems thinking is the topic this week for my subject “Systems Engineering for Software Engineers” there are associated readings (and viewings) to push us to think about the topic. The first is a short lecture given by Dr Russel Ackoff. In the video he briefly goes into his view of systems thinking and what it actually is.
He defines systems thinking to be synthetic. By nature we think analytically, pulling apart a system to analyses it as a collection of components and then combining the individual understanding of each component in an attempt to understand the system as a whole. He posits that this gives us no understanding, only knowledge (which is still very useful).
Synthetic thinking is in direct opposition to analytical thinking, it requires that you view the system as a component in a larger containment system, communicating with other components. By determining the behavior and functionality of the containment system as a whole and them dismantling the containing system by identifying the underlying functionality of the system as a component. Dr Ackoff stresses the importance of considering the function of the system as being more important than the internal knowledge of how the system works.
This seems counter intuitive to me. A system is the product of the sum of its parts and the sum of its internal interactions. Considering this, analytical thinking is often flawed by ignoring the interaction. Chemistry education relies on this flaw to help students understand quantized energy of electrons in an atom. By ignoring the interaction of the electrons with each other (by considering on the base case hydrogen) we can grasp the way that energy can influence the properties of an atom and we can do so without much difficulty. In order to overcome the challenge of considering the electron-electron interactions (which often depend on complex computational math) chemistry appears to have developed a similar approach to systems thinking in regard to the wider context of a chemical in a system.
Chemistry is defined as “the science of substances: their structure, their properties, and the reactions that change them into other substances” in Linus Paulings Text book ‘General Chemistry. This definition embodies the systems thinking process. Chemistry takes a molecule and looks internally at it’s structure (analytically) and at its properties as it interacts within a neutral context as well as the reactions that it undergoes within the system that it came from (systematically). A chemist would then attempt to match the properties and reactions in its natural context to the molecules internal components and there interactions (atoms, electrons, protons etc.)
We can see that chemistry is an example of where analytically assessing a system (a chemical or a molecule) gives only half the picture, and that we quite often need a context and a functionality of the system as a whole to even comprehend its internal interactions. As systems become more complex not only does analytic thinking not provide real understanding of a system but without a systematic thought process, we may misunderstand the way that the internal interactions either should or do behave.
This brings us to the relevance at the core of the subject. Why should software engineers think about systems engineering and systems thinking? Without a greater understanding of the larger system, a software component may not function appropriately within the system or by misinterpreting the system provide a flawed or incorrect implementation of what is required. It is only by considering the larger system as a whole that we can effectively develop correct and appropriate software.