Publié le

Complexité accidentelle et complexité essentielle

2 min lecture - 361 mots
Auteurs
  • avatar
    Nom
    Cédric RIBALTA
    Twitter

Introduction

La distinction entre la complexité accidentelle et la complexité nécessaire est un concept important en développement logiciel.
Elle a été introduite par Fred Brooks dans son fameux livre "The Mythical Man-Month".

Ces deux types de complexité sont essentiels pour comprendre les défis de la gestion de projet et de la conception logicielle.

Nous allons donc tenter d'expliquer chacun de ces concepts.

Complexité accidentelle :

La complexité accidentelle fait référence aux aspects compliqués et compliquants d'un projet logiciel qui ne sont pas intrinsèquement liés à la résolution du problème à traiter.

Elle résulte généralement de choix :

  • de conception
  • de technologies
  • de processus de développement
  • de documentation excessive
  • de sur-optimisation
  • de mauvaise communication
  • de mauvaise gestion de projet
  • de contraintes organisationnelles
  • ... ou d'autres facteurs qui n'apportent pas de réelle valeur ajoutée au problème à résoudre.

La complexité accidentelle rend le développement plus difficile, prend du temps et des ressources, augmente la probabilité d'erreurs et peut rendre le logiciel plus coûteux à maintenir à long terme.

The Pragmatic Programmer book

Complexité nécessaire :

En revanche, la complexité nécessaire est la complexité inhérente au problème lui-même.
C'est la quantité de complexité que vous devez avoir pour résoudre efficacement le problème donné.

Cette complexité est souvent inévitable, car certains problèmes sont intrinsèquement compliqués.
La tâche du développeur consiste à gérer cette complexité de manière efficace et à minimiser la complexité accidentelle.

La complexité nécessaire peut inclure :

  • des algorithmes sophistiqués
  • des structures de données complexes
  • des exigences fonctionnelles spécifiques
  • ...

L'objectif en développement logiciel est de minimiser la complexité accidentelle tout en traitant efficacement la complexité nécessaire.

Cela peut être accompli :

  • en utilisant des bonnes pratiques de conception logicielle
  • en choisissant des technologies appropriées
  • en simplifiant les processus de développement
  • en favorisant la communication et la collaboration au sein de l'équipe
  • en éliminant les fonctionnalités inutiles
  • et en évitant la sur-ingénierie
History teachers in 2040

Conclusion :

La compréhension de cette distinction est cruciale pour la gestion de projet et la qualité du logiciel.
Car elle permet de concentrer les ressources sur les aspects qui apportent une véritable valeur tout en évitant les pièges de la complexité accidentelle qui peut rendre le développement plus difficile et coûteux.