Dieser Artikel ist auch auf Deutsch verfügbar
- Part 1: Building, purpose, aesthetics
- Part 2: Terms
- Part 3: Tasks and activities
- Part 4: Who does what?
- Part 5: Where does it go from here? (this article)
But before we enter into this topic, I would like to clarify the terms complicated and complex. This will help us later when it comes to understanding the role of software and IT architecture in large projects. My explanations are based on the well-known Cynefin Framework from British researcher Dave Snowdon.
Complicated
Complicated (Latin complicare, “fold together” in the sense of “intertwined”)
Complicated systems consist of many parts or details whose interactions we can predict specifically and precisely. A sewing machine consists of many individual parts and interrelationships, and we can predict its behavior with great precision. It is possible to learn how to deal with complicated systems based on rules and defined procedures.
Examples of such systems are:
- Mechanical systems and electric circuits: These feature components that interact in defined ways.
- Computer hardware: When something does not work, we can clearly determine the cause based on a systematic diagnosis and respond accordingly.
- Individual software systems are also (merely) complicated, in other words we can predict their behavior fairly exactly (apart from
random()
functions, at least). Working with and on such software is largely deterministic.
Rules and processes are sufficient for dealing with complicated systems.
Early software and IT systems were frequently complicated, meaning we could predict their behavior fairly precisely [1]. Think of simple algorithms like QuickSort or single-user CRUD applications as examples.
Complex
It’s true – even complicated systems can be quite difficult to manage, but it can also be much worse:
Complexity (Latin complexum) refers to the behavior of a system with many elements with relationships that are often not deterministic or predictable. The behavior of such systems is rarely predictable.
Sources: Wikipedia, Cynefin
We cannot predict the overall behavior of a complex system based on the sum of the individual behaviors. For this reason, the results of complex systems are frequently not repeatable. Complex systems are characterized by unpredictability and (apparently) random influences.
Examples include financial markets, ecosystems, or the weather (over the medium term). We cannot deterministically (in the sense of a formula) make dependable or specific forecasts for any of these. Despite plenty of experience and effort, we can at best determine approximate values for the future states of complex systems. Fixed rules and processes fail us here. We have to fall back on short feedback cycles, heuristics, and experience.
Table 1 summarizes and contrasts the key characteristics of complicated and complex systems.
For complex systems, we need experience, heuristics, and – above all – feedback.
Complicated | Complex |
---|---|
Many influencing factors | Many influencing factors |
Stabile, linear relationships | Dynamic, non-linear relationships |
Cause-effect relationships are non-trivial but deterministic and comprehensible. | Cause-effect relationships are not necessarily repeatable |
Calculable, deterministic | Not calculable, non-deterministic |
Plannable | Not plannable |
Table 1: Complicated versus complex [2]
How do these terms help us understand the role of software architecture?
Complexity lurks within large projects/systems
Large software and IT projects with many participants prove to be complex systems with very low plannability. In such systems, the architects must frequently take into consideration many factors at once, without being able to precisely calculate or specifically plan the consequences of their decisions. In Figure 3 (inspired by Uwe Friedrichsen from [3]), I illustrate how today’s IT projects tend to be complex in nature, although also with a sprinkling of complexity, of course. In typical IT projects, there are usually tasks that we can reliably solve with a schematic approach. Unfortunately, we must also deal with tasks of another kind altogether…
Architecture contains uncertainty
Architects of large (and therefore complex) systems must deal with considerable uncertainties and vagaries. The term size refers here not only to the pure technical scope (e.g. lines of code) of IT systems but also to additional elements, such as:
- Scope of performance or functionality: Few and simple requirements can sometimes be implemented by development teams with “industrious coding.” When the requirements are many or difficult, uncertainty (i.e. complexity) emerges practically on its own.
- Number of persons or organizational units involved. After all, all the people or units involved have their own opinions and preferences (which frequently vary almost randomly). Both (people and organizations) sometimes behave irrationally and unpredictably.
- Inter- and intra-team communication and behavior. Just replacing a single person in the development or project teams can significantly influence the atmosphere, communication, and/or performance of the entire team.
- Duration of development projects: The longer the projects last, the higher the likelihood that individual stakeholders will significantly change their goals or preferences.
- Level of innovation, with regard to both the requested functions and technologies.
- System context, such as the type and number of adjacent, external, or third-party systems, external actors.
- Conditions such as the organizational environment, development processes, environmental influences, statutory regulations, scheduling and budget requirements.
- Use of many elements with at least partially non-deterministic behavior – such as large networks, internet services, or even (generative) AI.
Let’s summarize what we have covered so far:
In large (complex) systems, you as the architect must make decisions in the face of considerable uncertainty. Your work largely consists of balancing many different factors, very few of which can be addressed with well established procedures.
Sounds difficult. What can we do?
That’s right, it does sound difficult, and probably also somewhat vague.
For simpler systems (i.e. merely complicated), we explained the tasks involved in designing system architecture in article 3 of this series.
As a reminder, they are shown here again in Figure 5. However, I have updated this version slightly to highlight the areas where there is a particular risk of complexity arising.
More color also means more risk.
Fortunately, we in IT have at our disposal a tried-and-tested tool for dealing with such difficult situations: rapid feedback and adaptive behavior. If you find yourself as an architect in a complex development project and have to make important decisions, try the following tactics:
- Identify and address the areas of tension between stakeholders.
- Show the stakeholders the consequences of their decisions with regard to the requirements.
- Demonstrate which requirements or conditions are producing additional complexity.
- Switch occasionally to the bird’s eye view and take a holistic perspective on the business processes. Include this high level of abstraction when you advise the stakeholders[4]. It will definitely be useful if your toolbox contains a business model canvas or you understand something about business administration and corporate organization.
- Actively search for other stakeholders who may have been forgotten about, such as specialized departments.
- Expand your horizons to include surrounding systems and adjacent projects.
- Ensure the necessary flow of information between stakeholders.
In general, you should be proactive in such projects and view yourself more as an entrepreneur than as just someone taking orders. The amount of time that must be spent on communication is much higher than in simple projects. Assume that you will have no time left over for pure coding. After all, that is primarily a complicated task and one that you can delegate.
Summary
The path from small (a.k.a. complicated) systems and projects to very large (a.k.a. complex) ones is rocky and steep. You will need significantly greater communication skills (i.e. soft skills), empathy, and perseverance. If the range of stakeholders is diverse, expertise in diplomacy, corporate politics, project management, enterprise architecture management, and requirements engineering will be major assets, not to forget a solid overview of current and less-than-current technologies[5]. As a reward, you can expect great responsibility and extensive influence over long-term project/architecture decisions. On the downside: In such roles, your contact with actual source code will likely be restricted to your (minimal) free time.
With that in mind, may the power of smart decision-making be with you.
Acknowledgements
Many thanks to Gerrit Beine for inspiration and “m” for a thorough review.
Sources
-
For the pedants among you: Yes, I am aware of the undecidability of the halting problem. ↩
-
Dave Snowdon: Cynefin Framework. Conceptual framework to aid in decision–making, identifies five categories (clear, complicated, complex, chaotic, and confused) and attempts to offer assistance in each of these areas. Compact introduction on Wikipedia, original at https://thecynefin.co ↩
-
Uwe Friedrichsen: Komplexität – Na und? ↩
-
Gregor Hohpe calls this the architecture elevator and refers to the upper (management) levels as the penthouse and the pure technology as the engine room. Personally, I find the term board room more appropriate for management. What matters here is the pronounced abstraction of specific technology and the close connection to the business. ↩
-
If you are wondering where to find such an all–singing, all–dancing expert, join the club. I am well aware that such a broad spectrum of skills and abilities is extremely rare, but which of them would you be willing to leave out? If you are personally lacking some of these traits, then approach large systems together with a small group of architects. I have offered a suggestion of this nature in article 4 of this series under the name of “architecture agents.” ↩