Chapter 2 The Nature of Complexity

Chapter 2 The Nature of Complexity

This book is about how to design software systems to minimize their complexity. The first step is to understand the enemy. Exactly what is “complexity”? How can you tell if a system is unnecessarily complex? What causes systems to become complex? This chapter will address those questions at a high level; subsequent chapters will show you how to recognize complexity at a lower level, in terms of specific structural features.

This book is about how to design software systems that minimize complexity. The first step is to know the enemy. So what exactly is “complexity”? How can you tell if a system is too complex? What makes the system complicated? This chapter addresses these questions at a high level; Subsequent chapters will show you how to understand complexity at a low level by following a specific set of structural features.

The ability to recognize complexity is a crucial design skill. It allows you to identify problems before you invest a lot of effort in them, and it allows you to make good choices among alternatives. It is easier to tell whether a design is simple than it is to create a simple design, but once you can recognize that a system is too complicated, you can use that ability to guide your design philosophy towards simplicity. If a design appears complicated, try a different approach and see if that is simpler. Over time, you will notice that certain techniques tend to result in simpler designs, while others correlate with complexity. This will allow you to produce simpler designs more quickly.

The ability to recognize complexity is a crucial design skill. It allows you to identify a problem before you put a lot of effort into it, and it allows you to find good options among multiple alternatives. It is much easier to see if a design is more simple than it actually is than to build a simple design. But once you can see that the system is too complex, you can use this ability to construct a “philosophy that leads to simplicity.” If the design looks complicated, find another way to see if you can simplify it. Over time, you’ll notice that there are certain technologies that lead to simplicity in design, and it’s beyond those technologies that lead to complexity. This way you can create more minimalist designs more quickly.

This chapter also lays out some basic assumptions that provide a foundation for the rest of the book. Later chapters take the material of this chapter as given and use it to justify a variety of refinements and conclusions.

This chapter also lays out some basic assumptions that will pave the way for the rest of the book. The rest of the chapter will use the information presented in this chapter to demonstrate a series of improvements and conclusions.