Complexity manifests itself in three general ways… Change amplification: The first symptom of complexity is that a seemingly simple change requires code modifications in many different places…Cognitive load: The second symptom of complexity is cognitive load, which refers to how much a developer needs to know in order to complete a task…Unknown unknowns: The third symptom of complexity is that it is not obvious which pieces of code must be modified to complete a task, or what information a developer must have to carry out the task successfully.

— John Ousterhout, A Philosophy of Software Design