clement13.net
Photo d’origine : L'aéroport international de Denver
Description
L'aéroport international de Denver
Source
auteur non indiqué · page d’origine
Licence
PD Domaine public
Photo d’origine, non retouchée. L’arrière-plan en est une version stylisée par le site.

La sur-ingénierie

Une solution à dix couches a l'air plus professionnelle qu'une solution à deux, et c'est justement ce qui la rend dangereuse.

Biais≈ 12 min de lectureVérifiéContrôle effectuéLes faits, chiffres et références ont été contrôlés au regard des sources citées dans la fiche.Rédaction assistée par IA ; sources citées en bas de page. Une erreur ? Signalez-la via le site clement13.net.Lecture
FréquenceOmniprésentOn le croise presque à chaque projet ou chaque semaine.
Où le rencontre-t-on
  • Architecture
  • Conception
  • Choix de technologie
  • Revue de conception
  • Estimation
Aide de l’IABonneUn vrai gain, avec des garde-fous. Voir comment ↓
En bref
  • Quoi : on conçoit plus grand, plus général et plus sophistiqué que le besoin ne l'exige.
  • Pourquoi : la complexité passe pour du sérieux, on veut « être prêt pour la suite », et le concepteur aime son propre travail.
  • Détecter : des abstractions sans second usage, des options que personne n'a demandées, une conception plus longue à expliquer qu'à réaliser.
  • Éviter : partir du besoin actuel, ne généraliser qu'au deuxième ou troisième usage réel, faire défendre la solution la plus simple en revue.
Sur cette page

Définition#

Avatar de Frederick P. Brooks Jr.Illustration fictive
Frederick P. Brooks Jr.Américain19 avril 1931 – 17 novembre 2022Informaticien, auteur de The Mythical Man-Month

La sur-ingénierie (over-engineering) consiste à concevoir une solution plus complexe que le problème ne le demande : trop de couches, trop de paramètres, trop de généralité, trop de précision. Ce n'est pas un biais cognitif au sens strict, mais le résultat d'un ensemble de penchants bien décrits : on juge la sophistication comme un signe de qualité, on surestime les besoins futurs, et l'on s'attache à ce qu'on a imaginé.

Le cas le plus célèbre est l'effet du second système, décrit par Frederick Brooks dans The Mythical Man-Month (1975) : le concepteur qui livre son deuxième système y verse toutes les idées et fonctions qu'il avait dû écarter la première fois, ce qui en fait, selon Brooks, « le système le plus dangereux » qu'il concevra. La parade, côté méthode, s'appelle YAGNI (You Aren't Gonna Need It, issu de l'Extreme Programming) : n'écrivez pas ce dont vous n'avez pas besoin aujourd'hui.

Complexité nécessaire et complexité ajoutée

Toute conception complexe n'est pas du gaspillage : certains problèmes sont difficiles (sécurité, volumétrie, réglementation). Le défaut apparaît quand la complexité ne répond à aucune exigence vérifiable, ou répond à une exigence future que personne n'a confirmée.

Le mécanisme#

Plusieurs penchants se combinent :

  • La sophistication comme preuve de sérieux : une architecture à plusieurs couches, un moteur de règles ou un framework maison impressionnent en revue ; une solution de vingt lignes semble « légère ».
  • L'optimisme sur le futur : on imagine les besoins qui viendront (autres clients, autres bases, autres langues) et l'on construit pour eux, sans mesurer le coût de portage de cette généralité aujourd'hui, ni la probabilité qu'ils se réalisent.
  • Le plaisir et l'image du concepteur : un problème intéressant est plus motivant qu'un problème banal ; une solution ingénieuse valorise son auteur. L'effet IKEA renforce ensuite l'attachement.
  • L'asymétrie des reproches : « ça n'était pas assez flexible » se dit en réunion ; « c'est trop compliqué » ne se dit que plus tard, quand l'équipe l'a déjà payé.
Un besoin simpleest exprimé« Et si demainon devait aussi… ? »On généralise :couches, options,points d'extensionPlus de code,de tests, de docet de configurationLivraison tardive,évolution plus difficile,besoins futurssouvent différentsParadesYAGNI · besoin vérifiégénéraliser au 2e ou 3e usagedéfendre la version simpleavantpendant
Chaque étape paraît raisonnable prise isolément ; c'est la somme qui coûte. La parade consiste à exiger une preuve de besoin avant d'ajouter une couche, et à relire le coût d'entretien de ce qu'on a déjà ajouté.Survolez ou touchez un élément pour en lire le détail.

La complexité a une propriété simple à calculer : le nombre de relations possibles entre composants croît beaucoup plus vite que leur nombre. Entre n composants, il y a jusqu'à n(n − 1) / 2 paires qui peuvent s'influencer.

Relations possibles entre composants

Voir les données
Paires possibles
4 composants6
8 composants28
16 composants120
32 composants496
Calcul n(n − 1) / 2 : un maximum théorique, que l'architecture réduit si elle est bien découpée, mais qu'elle ne fait pas disparaître. Doubler le nombre de composants multiplie les relations possibles par quatre environ.

Où on le rencontre#

En conduite de projet#

  • Architecture : microservices, bus d'événements ou moteur de workflow pour une application utilisée par quarante personnes ; base de données « agnostique » alors que le produit n'en utilisera jamais qu'une.
  • Généralisation prématurée : une interface, une fabrique et trois niveaux d'héritage pour un cas qui n'a qu'une seule implémentation.
  • Paramétrage excessif : tout devient configurable, jusqu'à ce que la configuration soit elle-même un langage de programmation, plus difficile à tester que le code.
  • Exigences non fonctionnelles imaginées : « il faut tenir dix fois la charge actuelle » sans scénario de croissance ni mesure.
  • Outillage : une chaîne de livraison et des environnements dimensionnés pour une équipe dix fois plus grande.

En management#

  • Processus : un circuit de validation à cinq niveaux pour une décision de quelques centaines d'euros ; un modèle de compte rendu de quatre pages pour une réunion de quinze minutes.
  • Organisation : une grille d'évaluation de quarante critères, ou une matrice de compétences plus longue à tenir qu'à utiliser.
  • Cadre méthodologique : adopter la version la plus complète d'un référentiel agile ou qualité « pour être sérieux », alors que l'équipe a besoin de trois pratiques.
  • Reporting : un tableau de bord à trente indicateurs dont quatre sont consultés.
En projet BI

Un modèle sémantique aux dizaines de tables intermédiaires, aux mesures dérivées de mesures et aux schémas hybrides pour des cas qui n'existent pas encore coûte à chaque évolution. Mesurez la valeur d'une généralisation au nombre de rapports qui s'en servent réellement.

Cas célèbres#

Cas célèbre

Le système de bagages de l'aéroport de Denver 1993-1995 (abandon en 2005)#

Biais en jeu : sur-ingénierie, optimisme sur la complexité, escalade d'engagement.

29 octobre 1993date d'ouverture initialement prévue
28 février 1995ouverture réelle, soit environ 16 mois plus tard
193 M$montant du contrat du système de bagages automatisé, selon le GAO (le coût final, selon les bilans, dépasse 200 M$)
360 M$coût total du retard estimé par le GAO pour une ouverture fin février 1995, tous effets inclus

Ce qui s'est passé. Le nouvel aéroport international de Denver devait être doté d'un système de manutention des bagages entièrement automatisé, à base de chariots autonomes sur rails, couvrant l'ensemble des terminaux. La complexité de l'ensemble (logiciel de pilotage, synchronisation de milliers de chariots, matériel) s'est révélée telle que le système n'a pas passé ses tests de certification : bagages mal chargés, mal acheminés ou tombant des chariots. L'ouverture, d'abord reportée de quelques semaines, l'a finalement été de plus d'un an. En 1994, la ville a décidé de construire en parallèle un système conventionnel, estimé par le GAO à environ 51 M$, et l'aéroport a ouvert le 28 février 1995. Le système automatisé n'a finalement fonctionné que de façon partielle (pour United Airlines) avant d'être abandonné en 2005.

Mois entre l'ouverture prévue et l'ouverture réelleprévu : octobre 1993réel : 28 févr. 1995 (≈ 16 mois de retard)
Sources : GAO, briefing RCED-95-35BR (octobre 1994) pour la date prévue ; ouverture effective le 28 février 1995. Le retard est calculé entre la date d'octobre 1993 et celle du 28 février 1995.

Ce que cela illustre

Un système plus ambitieux qu'il n'est nécessaire ne rate pas seulement ses objectifs : il bloque tout ce qui dépend de lui. La solution de repli, conventionnelle et plus modeste, a suffi pour ouvrir. L'enseignement n'est pas « n'automatisez jamais », mais : ce qui est complexe doit être éprouvé par étapes, et un plan B simple doit exister avant que le planning ne dépende du plan A.

Ouvrage de référence

L'effet du second système (Brooks) 1975#

Biais en jeu : sur-ingénierie, surconfiance du concepteur expérimenté.

Ce que Brooks observe. Dans The Mythical Man-Month, issu de son expérience de direction du développement du système d'exploitation OS/360 d'IBM, Frederick Brooks consacre un chapitre au « second système ». Le premier système d'un concepteur est prudent : il sait qu'il ne sait pas, et il fait court. Le deuxième est le plus dangereux : il contient toutes les fonctions et astuces que l'architecte avait dû mettre de côté la première fois, et il se laisse aller à les ajouter toutes. Brooks en tire une discipline : le concepteur doit attribuer à chaque fonction un coût maximal (en mémoire, en temps d'exécution), et le chef de projet doit exiger un architecte qui a déjà au moins deux systèmes à son actif, tout en restant lui-même attentif à ces tentations.

Ce que cela illustre

Ce n'est pas l'inexpérience qui produit la sur-conception, mais la confiance après un premier succès. Dans une équipe, le « deuxième produit » d'un architecte, la « v2 » d'un outil ou la refonte d'un système réussi sont des moments où il faut redoubler de vigilance : budget fixé à l'avance, périmètre défendu, revue indépendante.

Parodie instructive

FizzBuzz Enterprise Edition projet humoristique, dépôt public#

Le dépôt FizzBuzzEnterpriseEdition (projet collectif publié sur GitHub sous le nom EnterpriseQualityCoding) résout le jeu de FizzBuzz, qui tient en quelques lignes, avec des dizaines de classes : fabriques, stratégies, visiteurs, injecteurs de dépendances. C'est une parodie, mais ses patrons sont tous reconnaissables dans de vrais projets. Elle sert de test pratique : si votre solution à un problème de la taille d'un exercice d'entretien ressemble à cela, vous avez peut-être un problème.

Signaux de détection#

  • Une abstraction n'a qu'une seule implémentation et aucune deuxième n'est prévue à l'échéance du projet.
  • « Au cas où… », « pour plus tard », « ce sera utile quand on aura… » dans les justifications.
  • Il faut plus de temps pour expliquer la conception que pour la réaliser.
  • Les nouveaux arrivants mettent des semaines avant de pouvoir faire une modification simple.
  • Des options, des paramètres ou des champs que personne n'utilise depuis la mise en production.
  • La solution consomme plus de ressources de la plateforme (CPU, licences, administrateurs) que le problème qu'elle résout.
  • Une modification d'une ligne demande de toucher cinq fichiers.

Réflexes d'évitement#

  1. Partir d'un besoin vérifié. Pour chaque capacité de la conception, demandez : qui l'a demandée, pour quand, avec quelle preuve ? Un besoin sans demandeur est une hypothèse.
  2. Appliquer YAGNI. Ne construisez pas ce dont vous n'avez pas besoin aujourd'hui, sauf si l'ajouter plus tard coûterait nettement plus cher que maintenant (cas rare, à justifier).
  3. Généraliser au deuxième ou troisième usage réel, pas au premier. Deux cas dessinent mal une abstraction ; trois cas la dessinent mieux.
  4. Faire défendre la solution la plus simple. En revue de conception, quelqu'un a pour rôle d'expliquer pourquoi une version plus simple ne suffirait pas.
  5. Chiffrer la complexité. Pour chaque couche ajoutée : coût de développement, de test, d'exploitation et de formation. Affichez-le à côté du bénéfice attendu.
  6. Livrer petit, d'abord. Une première version minimale, en production, apprend plus que dix semaines de conception. Le principe est celui de Gall : un système complexe qui fonctionne est toujours issu d'un système simple qui fonctionnait.
  7. Prévoir un plan B simple avant de s'engager sur une solution ambitieuse, comme dans le cas de Denver.
  8. Nettoyer. Retirer ce qui n'est pas utilisé : une option jamais activée en production depuis un an est candidate à la suppression.

Avec l'IA : détecter, remédier, atténuer#

Aide de l'IA estimée : bonne, avec un risque propre

L'IA est un bon contradicteur de conception : elle sait proposer la version minimale et énumérer les parties inutilisées. Mais les assistants de code ont une pente inverse : ils produisent volontiers des couches, des interfaces et des gabarits « classiques » même quand le problème n'en demande pas. Sans consigne de sobriété, l'IA peut elle-même fabriquer de la sur-ingénierie, et vite.

Détecter#

  • Repérer dans le code les abstractions à implémentation unique, les paramètres jamais utilisés, les couches de simple délégation.
  • Comparer une conception à la description du besoin et lister ce qui n'y répond pas.
  • Estimer le rapport entre le nombre de concepts de la solution et ceux du problème.

Remédier#

  • Proposer une version minimale qui couvre les exigences confirmées.
  • Rédiger l'argumentaire « pourquoi la version simple ne suffit pas », ou constater qu'il n'existe pas.
  • Décrire les conditions de déclenchement d'une généralisation (« au troisième client, on abstrait »).

Atténuer#

  • Faire jouer à l'IA l'avocat de la simplicité à chaque revue de conception.
  • Poser, dans les consignes de l'assistant de code, une règle de sobriété (pas de couche sans deuxième usage).
  • Faire chiffrer le coût de maintien de chaque option avant de l'accepter.

Prompts à intégrer à vos usages#

1. Avocat de la version simple. À utiliser en revue de conception, sur un dossier d'architecture.

Voici la conception proposée pour [fonctionnalité / système] : [description].
Voici les exigences confirmées (avec leur origine) : [liste].
Joue l'avocat de la simplicité. 1) Propose la version la plus simple qui satisfait les exigences confirmées, en la décrivant en moins de quinze lignes. 2) Pour chaque élément de la conception proposée qui n'est pas dans cette version, dis à quelle exigence il répond, ou signale qu'il ne répond à aucune exigence confirmée. 3) Indique ce qui deviendrait difficile si on choisissait la version simple, sans exagérer.
Ne cherche pas à valider la conception initiale.

2. Audit de complexité d'un module. Sur un extrait de code ou une liste de classes, après anonymisation.

Analyse ce code : [code ou liste de composants].
Repère : les interfaces ou classes abstraites qui n'ont qu'une implémentation, les paramètres ou options qui ne sont jamais utilisés dans les appels fournis, les couches qui ne font que transmettre un appel, et les cas où le nombre de fichiers touchés pour une modification simple paraît excessif.
Pour chaque point, indique ta confiance (certain, probable, à vérifier) et ce qu'il faudrait vérifier dans le reste du dépôt avant de supprimer quoi que ce soit.

Comment les intégrer#

  • Avant la revue : le prompt 1 est lancé par l'auteur lui-même, qui répond aux objections avant la réunion.
  • Au quotidien : mettez une consigne de sobriété dans le fichier de configuration de votre assistant de code, et relisez ses propositions comme celles d'un junior zélé.
  • En rétrospective : le prompt 2 alimente un point « ce que nous avons construit et que personne n'utilise ».

Précautions#

  • Une IA peut juger inutile ce qui répond à une exigence qu'elle ne connaît pas (réglementation, contrainte d'exploitation). Donnez-lui les exigences ; ne lui laissez pas décider seule de supprimer.
  • La version « simple » proposée peut ignorer des cas limites : testez-la.
  • Ne transmettez pas de code confidentiel à un outil non autorisé.

Limites#

  • La sous-ingénierie existe aussi : une solution trop courte coûte cher à reprendre quand le besoin est réel et prévisible (sécurité, conformité, données personnelles). Il ne s'agit pas de refuser toute anticipation, mais de la justifier.
  • La sur-ingénierie n'est pas toujours un biais : elle peut résulter d'exigences contractuelles, d'un cahier des charges imposé ou d'un manque de temps pour faire plus simple (« je n'ai pas eu le temps d'écrire un texte plus court »).
  • Il n'existe pas de mesure objective de la « juste » complexité : le jugement reste contextuel, et deux experts peuvent honnêtement différer.
  • Les chiffres du cas de Denver proviennent du rapport du GAO d'octobre 1994 ; les bilans ultérieurs varient selon ce qu'on compte.

Sources et vérification#

Voir aussi#

Se combine avec, ou renforce#

Ces biais se nourrissent l’un l’autre.

Biais voisins#

Des variantes ou des cousins : à ne pas confondre.

Contrepoids et réflexes associés#

Ce qui le neutralise.

  • YAGNI et la solution la plus simple qui fonctionne (notion ou méthode, sans fiche)
  • Les revues de conception contradictoires (notion ou méthode, sans fiche)
  • L'avocat du diable
  • Le pré-mortem