Fuel on the Fire


Specific Factors

What are the factors that cause software to become unmanageable?

Luckily, the same factors are at play in other systems besides software. This allows us to develop a more comprehensive understanding of the problem, as well as adapt solutions from these other systems.

What other systems show this type of progression toward unmanageability? Consider these examples:

What do these have in common? First, they are all large. Second, they all have a lot of complexity. So, we can conclude that Size and Complexity are major factors. But, more interestingly, why? Why do these systems have a lot of complexity, and what do we mean by "large"?


What is size? For our purposes, we will define size as:

Size = The number of entities comprising a system.


What is complexity? The meaning tends to be a bit fuzzy:

In order to make headway, we need to do better than this. Here is a much more useful definition of complexity:

Complexity = The number of dependencies within a system.

This immediately explains why larger systems would tend to be more complex: Larger systems have the potential for more dependencies.

This also explains why older systems tend to be more complex: Older systems have had more time to accumulate both entities and dependencies.

So, it stands to reason: systems that are both old and large would tend to be the most complex - which takes us back to our original list:

All of these are both large and old, host a lot of dependencies - and are therefore complex.

Note: A benefit of these definitions for Size and Complexity is that they are suitable for mathematical treatment and analysis. Later, we will use this to examine the relationship between complexity and various methodologies for addressing it.


How does this relate to software?

It turns out that software is the perfect environment to host complexity, because:

Interestingly, complexity is both the "Fuel" and the "Fire", which is why actions taken to fix "out of control systems" often have the opposite effect.


This understanding of complexity points the way toward specific methodologies we can use to control it.

In following posts we will discuss these methodologies and ways to implement them incrementally and in a non-disruptive fashion.