Published on

Accidental complexity and essential complexity

2 min read - 283 words
Authors
  • avatar
    Name
    Cédric RIBALTA
    Twitter
post image

Introduction

The distinction between accidental complexity and essential complexity is an important concept in software development.
It was introduced by Fred Brooks in his famous book "The Mythical Man-Month."

These two types of complexity are crucial for understanding the challenges of project management and software design.

So, we will attempt to explain each of these concepts.

Accidental complexity :

Accidental complexity refers to the complicated and confounding aspects of a software project that are not intrinsically tied to solving the problem at hand.

It typically results from choices such as:

Design decisions Technology selection Development processes Excessive documentation Over-optimization Poor communication Project mismanagement Organizational constraints ... or other factors that do not contribute real value to the problem being addressed. Accidental complexity makes development more challenging, consumes time and resources, increases the likelihood of errors, and can make the software more expensive to maintain in the long term.

The Pragmatic Programmer book

Necessary complexity :

On the other hand, necessary complexity is the complexity inherent to the problem itself. It is the amount of complexity you must have to effectively solve the given problem.

This complexity is often unavoidable because certain problems are inherently complicated. The developer's task is to manage this complexity effectively and minimize accidental complexity.

Necessary complexity may include:

Sophisticated algorithms Complex data structures Specific functional requirements ... The goal in software development is to minimize accidental complexity while effectively addressing necessary complexity.

This can be achieved by:

Using good software design practices Choosing appropriate technologies Simplifying development processes Promoting communication and collaboration within the team Eliminating unnecessary features Avoiding overengineering

History teachers in 2040

Conclusion :

Understanding this distinction is crucial for project management and software quality.
It allows resources to be focused on aspects that bring real value while avoiding the pitfalls of accidental complexity that can make development more challenging and costly.