Complexity in a computer program will make it hard to change and to make progress through time. Our goal as programmers and systems designers is to reduce it as much as possible.

There are two types of complexity, essential and accidental. The former is the innate complexity of the domain and is not possible to remove unless the domain itself is changed. For example a system which needs to be translated in multiple languages will have an essential complexity that a system which needs to be written in a single language lacks. The latter complexity, is the one we introduce with our tooling and design.