Détection du drift d'architecture : gardez votre code aligné avec le design - Archyl Blog

Le drift d'architecture est la divergence silencieuse entre votre conception documentée et votre codebase réelle. Ce guide explique ce qui le cause, comment le détecter, et comment l'empêcher de transformer vos diagrammes d'architecture en fiction.

Détection du drift d'architecture : gardez votre code aligné avec le design

Quelque part dans votre organisation, il y a un diagramme d'architecture qui est faux. Peut-être qu'il montre un microservice qui a été fusionné dans un autre il y a six mois. Peut-être qu'il liste Redis comme couche de cache alors que l'équipe est passée à Memcached lors d'un incident de production. Peut-être qu'il décrit une architecture hexagonale propre dans un service qui a accumulé suffisamment de raccourcis et de contournements pour ressembler à du spaghetti.

C'est le drift d'architecture : la divergence graduelle et silencieuse entre la documentation de votre système et son fonctionnement réel. Contrairement aux bugs, le drift ne déclenche pas d'alertes. Contrairement aux régressions de performance, il n'apparaît pas dans le monitoring. Il reste tranquillement en place jusqu'à ce que quelqu'un prenne une décision basée sur une documentation obsolète -- et que cette décision s'avère être fausse.

Le drift d'architecture est universel. Chaque équipe en fait l'expérience. La question n'est pas de savoir si votre documentation va dériver, mais à quelle vitesse vous le détecterez et ce que vous ferez à ce sujet.

Qu'est-ce que le drift d'architecture ?

Le drift d'architecture survient quand l'implémentation réelle d'un système logiciel diverge de son architecture documentée ou prévue. Le terme a été inventé dans la communauté académique du génie logiciel, mais le concept est douloureusement familier pour tout ingénieur praticien.

Le drift se manifeste à tous les niveaux de la documentation architecturale :

Drift structurel

La structure documentée ne correspond plus à la codebase :

  • Un service documenté comme un container autonome a été absorbé dans un monolithe
  • Un component a été renommé mais le diagramme montre toujours l'ancien nom
  • Un nouveau service a été créé mais jamais ajouté au modèle d'architecture
  • Une base de données a été migrée de MySQL à PostgreSQL mais le diagramme de containers dit toujours MySQL

Drift comportemental

Le comportement documenté ne correspond plus à la réalité :

  • Un appel API synchrone a été remplacé par un message asynchrone, mais la relation dit toujours "REST/HTTP"
  • Un flux de données a été modifié pour passer par un API gateway, mais le diagramme montre une communication directe service-à-service
  • Une étape d'authentification a été ajoutée qui n'est pas reflétée dans le diagramme de contexte système

Drift de dépendances

Les dépendances documentées ne correspondent plus aux intégrations réelles :

  • Une API tierce a été remplacée par une solution interne
  • Une nouvelle dépendance externe a été ajoutée (fournisseur de paiement, service de monitoring) mais pas documentée
  • Une intégration a été décommissionnée mais apparaît toujours dans le diagramme de contexte système

Drift de décisions

Les décisions architecturales documentées ne sont plus suivies :

  • Un ADR dit "utiliser PostgreSQL pour tout le stockage persistant" mais une équipe a commencé à utiliser MongoDB
  • Les règles de conformité disent "pas d'accès direct à la base de données depuis le frontend" mais quelqu'un a ajouté une intégration Supabase côté client
  • L'architecture de déploiement dit "région unique" mais des services ont été déployés dans plusieurs régions

Pourquoi le drift d'architecture se produit

Comprendre les causes du drift est essentiel pour le prévenir. Le drift n'est généralement ni malveillant ni même négligent -- c'est une conséquence naturelle de la façon dont le logiciel est développé.

La vitesse avant la documentation

Quand il faut livrer une feature pour vendredi, mettre à jour le diagramme d'architecture est la première chose qui saute. Le changement de code est le livrable. La mise à jour de documentation est du overhead. C'est un comportement rationnel à court terme et dévastateur à long terme.

De nombreux petits changements

Le drift survient rarement en un moment dramatique. Il s'accumule à travers des centaines de petits changements, chacun trop mineur pour justifier une mise à jour de documentation :

  • Renommer un fichier
  • Ajouter un package utilitaire
  • Changer une dépendance de bibliothèque
  • Extraire une fonction dans un module séparé

Aucun changement individuel n'est suffisamment significatif pour déclencher une mise à jour de documentation. Ensemble, ils transforment l'architecture.

Turnover de l'équipe

Quand les ingénieurs partent, ils emportent le savoir implicite avec eux. La nouvelle équipe hérite de la codebase mais pas de la compréhension de pourquoi elle est structurée ainsi. Ils font des changements basés sur ce qu'ils voient dans le code, pas sur ce que dit la documentation, élargissant le drift.

Absence de boucles de feedback

Si personne ne vérifie si la documentation correspond à la réalité, le drift est invisible. Sans mécanisme de détection, la seule façon de découvrir le drift est pendant un incident, un audit, ou quand un nouvel ingénieur fait remarquer que le diagramme ne correspond pas au code. À ce stade, le drift peut être considérable.

Changements d'urgence

Les incidents de production nécessitent souvent des raccourcis architecturaux : une connexion directe à la base de données au lieu de passer par la couche API, une configuration codée en dur au lieu d'utiliser le service de config, un cache temporaire qui devient permanent. Ces changements contournent les processus normaux de revue et sont rarement documentés.

Le coût du drift d'architecture

Le drift n'est pas juste un problème esthétique. Il a des coûts concrets et mesurables.

Mauvaises décisions

Quand les architectes prennent des décisions basées sur une documentation obsolète, ces décisions peuvent être fausses. "Ce service a peu de trafic, donc on peut se permettre une dépendance synchrone" -- sauf que la documentation est obsolète et que le service gère en réalité 10x la charge documentée.

Onboarding lent

Les nouveaux ingénieurs s'appuient sur la documentation d'architecture pour construire leur modèle mental. Si la documentation est fausse, ils construisent des modèles mentaux faux. Ils écrivent du code qui ne correspond pas à l'architecture réelle. Ils posent des questions qui révèlent leur confusion, consommant le temps des ingénieurs seniors.

Réponse aux incidents

Pendant un incident de production, les diagrammes d'architecture devraient aider les équipes à comprendre le rayon d'impact et les dépendances. Si ces diagrammes sont faux, les équipes perdent des minutes précieuses à tracer les mauvaises chaînes de dépendances ou à manquer des systèmes amont critiques.

Échecs de conformité et d'audit

Dans les industries réglementées, la documentation d'architecture est souvent requise pour la conformité (SOC 2, ISO 27001, HIPAA). Si les auditeurs trouvent que la documentation ne correspond pas à la réalité, c'est une constatation -- potentiellement sérieuse.

Confusion des agents IA

À mesure que les agents de codage IA deviennent plus répandus, ils s'appuient de plus en plus sur la documentation d'architecture pour le contexte. Un agent qui lit un modèle C4 obsolète générera du code qui correspond à l'architecture documentée, pas à la réelle. Cela amplifie le drift au lieu de le corriger.

Comment détecter le drift d'architecture

Revue manuelle (approche traditionnelle)

L'approche la plus simple est la revue manuelle périodique : réunissez l'équipe, parcourez les diagrammes d'architecture, et vérifiez s'ils correspondent encore à la réalité.

Quand ça fonctionne : Petites équipes, architectures simples, cadence trimestrielle.

Quand ça échoue : Systèmes larges, équipes qui avancent vite, ou quand les personnes qui connaissent le mieux le code n'ont pas le temps pour des réunions de revue. La revue manuelle souffre aussi du biais de confirmation -- les gens ont tendance à voir ce qu'ils s'attendent à voir.

Fonctions de fitness d'architecture

Les fonctions de fitness, popularisées par Neal Ford et le livre "Building Evolutionary Architectures", sont des tests automatisés qui valident les propriétés architecturales :

// Exemple : Vérifier qu'il n'y a pas d'imports de base de données dans les packages handler
func TestNoDatabaseImportsInHandlers(t *testing.T) {
    packages := analyzeImports("./internal/handler/...")
    for _, pkg := range packages {
        for _, imp := range pkg.Imports {
            assert.NotContains(t, imp, "database/sql",
                "Handler %s imports database/sql directly", pkg.Name)
            assert.NotContains(t, imp, "gorm.io",
                "Handler %s imports GORM directly", pkg.Name)
        }
    }
}

Les fonctions de fitness sont puissantes pour appliquer des règles spécifiques, mais elles nécessitent un effort initial pour les écrire et les maintenir. Elles vérifient des contraintes, pas le modèle complet.

Outils d'analyse statique

Des outils comme ArchUnit (Java), Deptrac (PHP) et go-arch-lint (Go) analysent la structure du code et appliquent des règles de dépendances :

// Configuration go-arch-lint
components:
  handler:
    in: ./internal/handler/
  service:
    in: ./internal/service/
  repository:
    in: ./internal/repository/

rules:
  handler:
    can_depend_on: [service]
  service:
    can_depend_on: [repository]
  repository:
    can_depend_on: []

Ces outils sont excellents pour appliquer une architecture en couches au sein d'une seule codebase. Ils n'adressent pas le drift inter-services ni ne valident que le modèle d'architecture correspond au code.

Scoring automatisé du drift

C'est l'approche d'Archyl. Au lieu de vérifier des règles spécifiques, il valide l'ensemble du modèle d'architecture par rapport à la codebase :

  • Chaque système documenté correspond-il à un dépôt ?
  • Chaque container documenté correspond-il à un répertoire dans la codebase ?
  • Chaque élément de code documenté référence-t-il un fichier qui existe toujours ?
  • Les deux extrémités de chaque relation documentée sont-elles toujours valides ?

Le résultat est un score de drift (0-100) et un détail montrant exactement ce qui a dévié. C'est l'approche la plus complète car elle valide le modèle complet, pas juste des contraintes spécifiques.

Les décisions clés de conception dans la détection de drift d'Archyl :

Léger. Pas de tokens IA consommés, pas de contenu de fichier lu. Juste des vérifications d'existence de chemins de fichiers via l'API du fournisseur Git. Cela signifie que le scoring de drift prend des secondes, pas des minutes.

Déterministe. Même codebase, même modèle, même score. Pas de variabilité liée à la température du LLM ou au prompt engineering.

Économique. Lancez-le à chaque push sans souci de coût. Une centaine de calculs par jour, pas de problème.

Actionnable. Le détail montre exactement quels éléments ont dévié, vous savez donc quoi corriger.

Comment prévenir le drift d'architecture

La détection est nécessaire mais pas suffisante. L'objectif est d'empêcher le drift de s'accumuler en premier lieu.

Faire des mises à jour de documentation partie de la Definition of Done

Si un changement de code modifie l'architecture, la PR devrait inclure une mise à jour de documentation. Ajoutez une case à cocher à votre template de PR :

## Checklist
- [ ] Tests passent
- [ ] Code reviewé
- [ ] Documentation d'architecture mise à jour (si applicable)

Ça ne capte pas tout, mais ça établit l'attente que la documentation est un livrable de premier plan.

Automatiser la détection de drift dans la CI

Le mécanisme de prévention le plus efficace est une porte CI qui échoue quand le drift dépasse un seuil :

on:
  push:
    branches: [main]

jobs:
  drift:
    runs-on: ubuntu-latest
    steps:
      - uses: archyl-com/actions/drift-score@v1
        with:
          api-key: ${{ secrets.ARCHYL_API_KEY }}
          organization-id: ${{ secrets.ARCHYL_ORG_ID }}
          project-id: 'your-project-uuid'
          threshold: '70'

Quand le build échoue parce que le score de drift a chuté, quelqu'un doit le corriger avant de merger. La précision de la documentation devient aussi non-négociable que les tests qui passent.

Commencez avec un seuil bas (50-60 %) et augmentez-le progressivement à mesure que l'équipe construit l'habitude.

Utiliser l'architecture as code

Quand votre modèle d'architecture est défini dans un format textuel (Structurizr DSL, Archyl YAML), il peut être versionné aux côtés de votre code. Cela signifie :

  • Les changements d'architecture apparaissent dans les pull requests
  • Les changements sont revus par l'équipe
  • L'historique de l'évolution architecturale est capturé dans Git

C'est significativement mieux qu'une architecture définie dans un outil GUI où les changements sont invisibles et non-reviewables.

Mettre en place des alertes de drift

Archyl supporte les alertes webhook pour les événements de drift :

  • drift.score_computed : Se déclenche à chaque calcul de drift. Postez dans un canal Slack pour la visibilité.
  • drift.score_degraded : Se déclenche quand le score chute de 10+ points. C'est votre système d'alerte précoce.

Configurez ces alertes vers un canal que votre équipe surveille. La prise de conscience est la première étape vers l'action.

Conduire des revues d'architecture

Les revues d'architecture mensuelles ou trimestrielles servent plusieurs objectifs :

  • Valider que l'architecture documentée correspond toujours à la réalité
  • Identifier le drift que les outils automatisés ont manqué (le drift comportemental, par exemple)
  • Discuter de si les components qui ont dévié doivent être mis à jour dans le code ou dans la documentation
  • Revoir et mettre à jour les ADR pour les décisions qui pourraient nécessiter d'être reconsidérées

Adopter des règles de conformité

Les règles de conformité définissent les contraintes architecturales qui devraient toujours être vraies :

  • "Le container frontend ne doit pas dépendre du container de base de données"
  • "Toutes les API publiques doivent passer par l'API gateway"
  • "Chaque service doit posséder sa propre base de données (pas de bases de données partagées)"

Dans Archyl, les règles de conformité sont définies dans la plateforme et appliquées via la fonctionnalité de vérification de conformité. Les agents IA peuvent lire ces règles via MCP et les respecter lors de la génération de code.

Les règles de conformité sont complémentaires à la détection de drift. La détection de drift vérifie si votre modèle correspond à la réalité. La vérification de conformité vérifie si la réalité suit vos règles.

Drift d'architecture vs. érosion d'architecture

Ces termes sont liés mais distincts :

Le drift d'architecture est la divergence entre documentation et implémentation. Le code peut être parfaitement correct -- la documentation est juste fausse.

L'érosion d'architecture est la dégradation de l'architecture elle-même. Le code viole les principes architecturaux, accumule la dette technique, et devient plus difficile à maintenir. L'érosion est un problème de qualité de code. Le drift est un problème de précision de documentation.

Ils coexistent souvent. Quand la documentation dérive, les équipes perdent la conscience de l'architecture prévue. Sans cette conscience, elles font des changements qui érodent l'architecture. Le drift permet l'érosion.

C'est pourquoi la détection de drift compte au-delà de la simple précision de documentation. Une documentation précise sert de référence qui prévient l'érosion. Quand tout le monde peut voir l'architecture prévue, ils sont plus enclins à la maintenir.

Mesurer et suivre le drift dans le temps

Un score de drift unique est utile. Une tendance est puissante.

Établir une ligne de base

Lancez votre premier calcul de drift pour établir où vous en êtes. Ne paniquez pas si le score est bas -- la plupart des équipes qui n'ont pas activement maintenu leur documentation d'architecture verront des scores entre 40-70 %.

Fixer des objectifs

Établissez des objectifs réalistes d'amélioration :

  • Mois 1 : Passer de la ligne de base à 60 % en corrigeant le drift le plus évident
  • Mois 3 : Atteindre 75 % en intégrant les mises à jour de documentation dans le workflow
  • Mois 6 : Maintenir 80 %+ grâce aux portes CI et aux revues régulières

Suivre la tendance

Archyl stocke chaque calcul de drift avec son détail complet. La vue d'historique de drift montre une chronologie des scores, vous pouvez donc voir :

  • Le drift s'améliore-t-il ou s'aggrave-t-il dans le temps ?
  • Un sprint ou une release spécifique a-t-il causé une chute significative ?
  • Le seuil CI prévient-il la dégradation ?

Célébrer les améliorations

Quand l'équipe améliore le score de drift, reconnaissez-le. La documentation d'architecture est un travail ingrat. Rendre le progrès visible et reconnu renforce le comportement.

Le rôle de la détection de drift dans le développement assisté par IA

L'essor des agents de codage IA rend la détection de drift plus importante que jamais.

Les agents IA s'appuient de plus en plus sur la documentation d'architecture pour le contexte. Via des protocoles comme MCP, les agents peuvent lire votre modèle C4, vos ADR et vos règles de conformité avant de générer du code. Cela les rend plus efficaces -- ils génèrent du code qui correspond à votre architecture au lieu de deviner.

Mais ça ne fonctionne que si la documentation est précise. Un agent qui lit un modèle C4 obsolète et génère du code basé dessus produira du code qui correspond à la mauvaise architecture. L'agent amplifie le drift au lieu de le prévenir.

La détection de drift crée la boucle de feedback qui garde les agents IA honnêtes :

  1. L'agent lit l'architecture via MCP
  2. L'agent génère du code qui correspond à l'architecture documentée
  3. Le code est mergé, changeant potentiellement l'architecture réelle
  4. La détection de drift s'exécute et capte toute divergence
  5. La porte CI échoue si le drift dépasse le seuil
  6. L'équipe met à jour la documentation pour refléter la réalité
  7. L'agent lit l'architecture mise à jour -- la boucle se ferme

Sans l'étape 4, la boucle est ouverte. La documentation devient de plus en plus fictive. Les agents génèrent de plus en plus du code qui correspond à une architecture imaginaire. L'écart se creuse à chaque commit.

La détection de drift est le mécanisme qui ferme cette boucle.

Commencer avec la détection de drift

Si vous n'avez pas de documentation d'architecture

Commencez avec la découverte IA. Connectez votre dépôt à Archyl, lancez la découverte, et revoyez le modèle C4 généré. Cela vous donne un modèle de référence précis à environ 70-80 %. Puis mettez en place la détection de drift pour maintenir cette précision.

Si vous avez une documentation existante

Importez ou recréez votre modèle d'architecture dans un outil qui supporte la détection de drift. Lancez le premier calcul de drift. Le score vous dira exactement la précision de votre documentation actuelle -- et le détail vous montrera quoi corriger en premier.

Si vous suivez déjà le drift

Intégrez la détection de drift dans la CI. Définissez un seuil. Configurez des alertes. Commencez à suivre les tendances. Faites du drift une métrique d'équipe, pas un audit ponctuel.

Peu importe d'où vous partez

Le plus important est de commencer. Le drift d'architecture est comme la dette technique -- il s'accumule avec le temps. Plus vous attendez pour le traiter, plus le rattrapage demande d'effort. Mais contrairement à la dette technique, la détection de drift peut être mise en place en quelques minutes et apporte une valeur immédiate.

Votre documentation d'architecture reflète soit la réalité, soit elle ne la reflète pas. Maintenant vous pouvez mesurer laquelle des deux c'est.


En savoir plus sur la maintenance de la documentation d'architecture : Score de drift d'architecture : comment ça fonctionne | Qu'est-ce que le modèle C4 ? | Documentation d'architecture alimentée par l'IA. Ou essayez Archyl gratuitement et calculez votre premier score de drift en quelques minutes.