Software Design/Complexity (primary quality)

Complexity is a software, interface, and code quality characterizing the number of different states and the number and the non-regularity of interactions (relations, transitions) between the states of the software (states of the abstraction behind the interface, elements of code). This notion corresponds to Wikipedia's definition of programming complexity.

Alternatively, according to Rich Hickey, complexity (or, framed in the opposite direction, simplicity) is the quality characterized by intertwining of multiple roles, tasks, concepts, dimensions, or concerns in one entity (such as code construct, interface, or software).

Difference with the definition from A Philosophy of Software Design
The definition of complexity used in the Software Design project differs from the John Ousterhout's definition from A Philosophy of Software Design: "complexity is anything related to the structure of a software system that makes it hard to understand and modify the system." In other words, the Software Design project's complexity is a primary quality, whereas Ousterhout's complexity is a high-level quality derived from the Software Design project's complexity, but also from many other primary qualities:
 * Traceability of behavior
 * Interface size and its conceptual weight
 * Naturality
 * Structuredness
 * Apparency of semantics
 * Change amplification
 * Code clarity
 * Code size
 * How much navigation is needed while working with code
 * Etc.

See Software Design § Primary vs. high-level qualities.

Relevant practices

 * Hide an object access chain
 * Share state by communicating