Salut, moi c'est Kamanga

À 8 ans, je bricolais une radio FM avec mes jouets; aujourd'hui, j'ai plus de 25 ans d'expertise en développement. J'applique les principes de software craftsmanship pour créer de la valeur dans mes projets. Résultat ? Des logiciels robustes, maintenables, de nombreux bénéfices financiers et des coûts réduits pour mes projets.

{
  "message": "You should use slots with <ContentList>",
  "slot": "default",
  "data": [
    {
      "_path": "/fr/dette-technique/ingenierie-logicielle-avantage-concurrentiel",
      "_dir": "dette-technique",
      "_draft": false,
      "_partial": false,
      "_locale": "",
      "title": "L'ingénierie logicielle comme avantage concurrentiel durable",
      "description": "Dans un monde où l'IA accélère tout le monde, la qualité d'engineering devient le différenciateur durable. Ce que les CTOs qui l'ont compris font différemment.",
      "id": 36,
      "date": "2026-03-27",
      "listed": true,
      "nocomments": false,
      "hidden": false,
      "categories": [
        "dette-technique"
      ],
      "tags": [
        "Engineering Excellence",
        "Avantage Compétitif",
        "Leadership"
      ],
      "--cover": "covers/articles/ingenierie-avantage-concurrentiel.jpg",
      "readingTime": {
        "text": "9 min read",
        "minutes": 8.605,
        "time": 516300,
        "words": 1721
      },
      "body": {
        "type": "root",
        "children": [
          {
            "type": "element",
            "tag": "h1",
            "props": {
              "id": "lingénierie-logicielle-comme-avantage-concurrentiel-durable"
            },
            "children": [
              {
                "type": "text",
                "value": "L'ingénierie logicielle comme avantage concurrentiel durable"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "J'ai accompagné un éditeur santé, 35 développeurs, sur douze mois. Le déclencheur n'était pas une vision technique du CTO ni un grand programme de transformation : deux seniors venaient de partir en pointant \"un environnement technique trop dégradé\", un troisième hésitait, et la roadmap produit que le COMEX avait validée six mois plus tôt commençait visiblement à déraper. Les engagements pris en interne ne tenaient plus, et les recrutements engagés pour compenser n'inversaient pas la tendance."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "À l'arrivée, le constat était cohérent avec ces signaux : un "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/pratiques-agiles/reduire-work-in-progress-velocite"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "lead time"
                  }
                ]
              },
              {
                "type": "text",
                "value": " d'environ six mois entre la décision produit et la mise en production, un taux d'incidents en prod que l'équipe n'arrivait plus à tenir, et une part importante de la capacité absorbée par la maintenance corrective. Aucun de ces points n'a bougé pendant les premiers mois. Les six premiers, justement, ont surtout servi à poser les fondations qu'on ne voyait pas dans les métriques : CI/CD remise d'aplomb, découpage des stories, stratégie de tests, gouvernance de la dette, rituels de delivery. Les premiers résultats mesurables sont arrivés à partir de là."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Au terme des douze mois, le lead time tournait autour de 4 à 8 semaines (2 à 3 sprints). Ce n'est pas le standard DORA \"elite\", mais c'est l'écart qui change le quotidien : l'équipe redevient capable d'absorber un cycle d'itération produit dans la même release, le COMEX retrouve une visibilité réaliste sur les engagements, et deux seniors ont rejoint l'équipe sur la deuxième moitié de l'accompagnement en citant explicitement la qualité de l'environnement technique comme raison principale. Ce n'est pas une transformation spectaculaire, c'est un retour de capacité."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'IA a rendu le code accessible à tout le monde. Elle n'a pas rendu la qualité d'engineering accessible à tout le monde. Et c'est là que se creuse le prochain écart concurrentiel."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "En 2024-2025, les outils de génération de code ont nivelé la vitesse de production du code. Une startup de 5 personnes peut générer autant de code qu'une équipe de 50 il y a 3 ans. Ce nivellement a changé les règles du jeu : la compétition ne se joue plus sur qui écrit le code le plus vite, mais sur qui le maintient, l'améliore, et le gouverne le mieux."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "lia-comme-égalisateur-et-révélateur"
            },
            "children": [
              {
                "type": "text",
                "value": "L'IA comme égalisateur et révélateur"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "L'IA a réduit le coût marginal de production de code à presque zéro. Un développeur augmenté par Copilot produit 20 à 40% de code supplémentaire selon les études GitHub. C'est un gain réel."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Mais ce gain amplifie ce qui existe déjà. Une équipe avec de bonnes pratiques d'architecture, de test, et de revue de code bénéficie pleinement de l'IA : le code généré est bien intégré, testé, et maintenu. Une équipe avec de mauvaises pratiques produit plus de dette technique plus rapidement. L'IA amplifie les équipes solides et fragilise les équipes fragiles."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La donnée qui change tout"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : le State of DevOps Report 2023 (DORA) montre que les équipes \"elite\" ont un deployment frequency 973 fois supérieur aux équipes \"low performers\", et un lead time 6 570 fois inférieur. L'IA n'a pas réduit cet écart. Elle l'a amplifié. Ce n'est pas de la théorie : c'est le résultat de 10 ans de données sur des milliers d'équipes."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "les-3-dimensions-de-lavantage-engineering"
            },
            "children": [
              {
                "type": "text",
                "value": "Les 3 dimensions de l'avantage engineering"
              }
            ]
          },
          {
            "type": "element",
            "tag": "h3",
            "props": {
              "id": "dimension-1-la-vitesse-de-livraison-time-to-market"
            },
            "children": [
              {
                "type": "text",
                "value": "Dimension 1 : La vitesse de livraison (time-to-market)"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La capacité à livrer des fonctionnalités en semaines plutôt qu'en mois est un avantage concurrentiel direct. Sur les marchés où les cycles d'innovation sont courts, une équipe qui déploie en production plusieurs fois par semaine peut itérer sur le feedback utilisateur 10 fois plus vite qu'une équipe qui déploie une fois par mois."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Ce n'est pas une métrique technique, c'est une métrique business. Chaque semaine gagnée sur le lead time est une semaine d'avance sur le concurrent qui a eu la même idée."
              }
            ]
          },
          {
            "type": "element",
            "tag": "h3",
            "props": {
              "id": "dimension-2-la-qualité-comme-réducteur-de-risque"
            },
            "children": [
              {
                "type": "text",
                "value": "Dimension 2 : La qualité comme réducteur de risque"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Dans les secteurs régulés (finance, assurance, santé), la qualité d'engineering est une condition de survie réglementaire. Un incident lié à un code de mauvaise qualité peut déclencher une enquête de l'autorité de tutelle, une amende significative, et un dommage réputationnel durable. J'ai vu cela chez des clients dans le secteur bancaire, Canal+, BNP Paribas, Agirc-Arrco, où un incident technique mal géré avait des conséquences réglementaires immédiates."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Mais dans tous les secteurs, la qualité réduit le coût opérationnel. Une équipe avec une absorption de dette technique à 20% (vs 40%) a 20% de capacité supplémentaire disponible pour l'innovation. Sur une équipe de 50 développeurs, c'est 10 développeurs-équivalents récupérés sans recrutement."
              }
            ]
          },
          {
            "type": "element",
            "tag": "h3",
            "props": {
              "id": "dimension-3-lattractivité-des-talents"
            },
            "children": [
              {
                "type": "text",
                "value": "Dimension 3 : L'attractivité des talents"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Les meilleurs développeurs choisissent leurs employeurs sur les pratiques techniques, pas seulement sur la rémunération. Une enquête Stack Overflow 2023 montre que 62% des développeurs considèrent la qualité technique de l'environnement de travail comme un critère de choix primaire."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Une équipe avec un "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/dette-technique/introduction-maturite-engineering-5-niveaux"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "niveau 4-5 de maturité engineering"
                  }
                ]
              },
              {
                "type": "text",
                "value": " attire et retient les développeurs seniors. Une équipe au niveau 1-2 a un turnover plus élevé et un coût de recrutement proportionnel. Le cercle vicieux : les bons développeurs partent à cause de la dette, les remplaçants sont moins expérimentés, la dette augmente."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Réserver mon diagnostic gratuit →",
              "href": "https://app.kamanga.fr/forms/discovery-call",
              "title": "Votre engineering est-il un avantage concurrentiel ou un frein à la croissance ?",
              "type": "call"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Vous sentez que votre engineering ne vous donne pas l'avantage qu'il devrait donner : le lead time est trop long, les bugs reviennent, les bons développeurs hésitent à rejoindre l'équipe. Un diagnostic de maturité engineering prend 2 jours. Il produit une vue claire de votre position et un plan d'action concret pour transformer votre engineering en levier de croissance."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "ce-que-les-équipes-délite-font-différemment"
            },
            "children": [
              {
                "type": "text",
                "value": "Ce que les équipes d'élite font différemment"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La recherche DORA identifie 5 pratiques qui distinguent les équipes \"elite\" des autres, indépendamment de la taille ou du secteur :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "1. Le trunk-based development"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : intégration sur la branche principale au moins une fois par jour, feature flags pour isoler le code non-terminé. Réduit le coût de merge et les conflits d'intégration."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "2. La suite de tests automatisés"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : tests qui s'exécutent en moins de 10 minutes sur chaque commit, avec un objectif de non-régression garanti. Conditionne la confiance pour déployer fréquemment."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "3. Le continuous deployment"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : automatisation complète du pipeline de déploiement. Aucune intervention manuelle entre le commit et la prod. Réduit le risque humain et le lead time."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "4. Le monitoring et l'observabilité"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : visibilité temps réel sur les métriques de performance et d'erreur. MTTR < 1 heure pour les incidents P1."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "5. La culture du learning"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : blameless post-mortems, partage de knowledge structuré, temps dédié à l'apprentissage. Les équipes qui apprennent progressent ; les autres stagnent. C'est ce que les travaux de Nicole Forsgren sur la culture DevOps démontrent de façon rigoureuse."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "comment-traduire-la-qualité-engineering-en-langage-board"
            },
            "children": [
              {
                "type": "text",
                "value": "Comment traduire la qualité engineering en langage board"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Le board ne comprend pas \"maturité engineering\" ou \"dette technique\". Il comprend :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Risque opérationnel"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : \"Notre taux d'incidents de prod génère X€ de coût direct et Y€ de risque réglementaire par an. Un investissement de Z€ en qualité technique réduit ce risque de 70% en 12 mois.\""
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Efficacité du capital"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : \"Nous investissons 40% de notre capacité engineering à maintenir l'existant. Un programme de 6 mois ramène ce chiffre à 20%, soit l'équivalent de 8 développeurs à plein temps récupérés pour l'innovation.\""
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Avantage compétitif"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : \"Notre lead time actuel de 6 semaines signifie que nous mettons 6 semaines à répondre aux opportunités de marché. Nos principaux concurrents sont à 2 semaines. Le delta nous coûte X% de chiffre d'affaires sur les opportunités time-sensitive.\""
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Ces trois angles permettent à un board de comprendre que l'investissement en qualité engineering n'est pas une dépense technique, c'est un levier de performance business. Ce changement de cadrage est souvent ce qui débloque les budgets que les CTOs n'arrivaient pas à obtenir en présentant le sujet dans sa version technique."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "le-plan-daction-pour-les-12-prochains-mois"
            },
            "children": [
              {
                "type": "text",
                "value": "Le plan d'action pour les 12 prochains mois"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Si vous êtes au niveau 2-3 aujourd'hui et souhaitez faire de l'engineering un avantage concurrentiel, voici la séquence :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Trimestre 1"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : Mesurer. Implémenter les 4 métriques DORA, quantifier l'absorption de la dette technique, identifier les 2-3 modules critiques qui génèrent le plus de coûts."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Trimestre 2"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : Stabiliser. Programme de réduction de la dette sur les modules critiques, stabilisation de la CI/CD, installation des "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/dette-technique/outils-analyse-statique-2026"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "outils d'analyse statique"
                  }
                ]
              },
              {
                "type": "text",
                "value": "."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Trimestre 3"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : Accélérer. Réduction du lead time sur un flux de delivery cible, introduction du continuous deployment, formation sur les pratiques avancées (TDD, "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/dette-technique/pair-programming-roi-conditions"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "pair programming ciblé"
                  }
                ]
              },
              {
                "type": "text",
                "value": ")."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Trimestre 4"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : Consolider et mesurer le ROI. Comparer les métriques de T4 vs T1. Préparer le business case pour le prochain cycle d'investissement."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "faq-sur-lengineering-comme-avantage-concurrentiel"
            },
            "children": [
              {
                "type": "text",
                "value": "FAQ sur l'engineering comme avantage concurrentiel"
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "1. L'IA ne va-t-elle pas rendre ces investissements obsolètes en quelques années ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Non, et c'est précisément l'inverse. L'IA rend les pratiques d'engineering solides plus importantes, pas moins. Le code généré par l'IA doit être testé, reviewé, maintenu et gouverné. Une équipe sans bonnes pratiques génère de la dette technique à la vitesse de l'IA. Une équipe avec de bonnes pratiques bénéficie pleinement de la productivité de l'IA tout en maintenant la qualité."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "2. Ces pratiques sont-elles accessibles aux petites équipes (< 10 développeurs) ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Oui, et souvent plus rapidement. Une équipe de 8 développeurs peut atteindre le niveau 4 en 6 mois : la coordination est simple, les standards s'adoptent vite, et l'impact de chaque amélioration est immédiatement visible. Les pratiques DORA (CI/CD, trunk-based development, monitoring) s'appliquent quelle que soit la taille de l'équipe."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "3. Comment prouver la valeur de l'investissement engineering à un investisseur lors d'une due diligence ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Quatre métriques convaincantes pour une due diligence : deployment frequency (> 1/semaine), lead time (< 1 semaine), change failure rate (< 5%), MTTR (< 1 heure). Ces chiffres montrent la capacité à itérer rapidement et à maintenir la stabilité. Je recommande de préparer un \"engineering health report\" avant toute due diligence : un document court (5 à 10 pages) qui présente ces métriques sur 12 mois glissants, l'évolution de la dette absorbée, et les pratiques DORA en place. C'est ce qui transforme l'engineering d'un risque à expliquer en argument à valoriser."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "4. Par où commencer si le board ne voit pas encore la valeur de l'engineering ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Commencer par un incident et le transformer en business case. La prochaine fois qu'un incident de prod a un impact business mesurable, calculer le coût total : temps de résolution, impact sur le revenu, coût réputationnel. Montrer que des pratiques standard auraient prévenu cet incident. Un seul incident bien documenté vaut mieux que dix slides de théorie."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "5. Comment maintenir les standards de qualité quand la croissance crée une pression intense sur la livraison ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La croissance augmente la pression et teste les standards. Les équipes qui maintiennent la qualité pendant la croissance ont toutes une chose en commun : le \"budget technique\" est non-négociable. 20% de la capacité de l'équipe est protégée pour la qualité, les tests, et la réduction de la dette, quelles que soient les pressions externes. Sans ce budget explicite et défendu par le CTO, la qualité se dégrade invariablement sous la pression."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Accéder à l'assessment gratuit →",
              "href": "/mes-ressources",
              "title": "Ressource gratuite : Engineering Maturity Self-Assessment",
              "type": "resource"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "30 questions pour évaluer votre maturité engineering sur 5 dimensions. Score automatique, positionnement sur les 5 niveaux, et les 3 actions prioritaires pour transformer votre engineering en avantage concurrentiel mesurable."
                  }
                ]
              }
            ]
          }
        ],
        "toc": {
          "title": "",
          "searchDepth": 2,
          "depth": 2,
          "links": [
            {
              "id": "lia-comme-égalisateur-et-révélateur",
              "depth": 2,
              "text": "L'IA comme égalisateur et révélateur"
            },
            {
              "id": "les-3-dimensions-de-lavantage-engineering",
              "depth": 2,
              "text": "Les 3 dimensions de l'avantage engineering",
              "children": [
                {
                  "id": "dimension-1-la-vitesse-de-livraison-time-to-market",
                  "depth": 3,
                  "text": "Dimension 1 : La vitesse de livraison (time-to-market)"
                },
                {
                  "id": "dimension-2-la-qualité-comme-réducteur-de-risque",
                  "depth": 3,
                  "text": "Dimension 2 : La qualité comme réducteur de risque"
                },
                {
                  "id": "dimension-3-lattractivité-des-talents",
                  "depth": 3,
                  "text": "Dimension 3 : L'attractivité des talents"
                }
              ]
            },
            {
              "id": "ce-que-les-équipes-délite-font-différemment",
              "depth": 2,
              "text": "Ce que les équipes d'élite font différemment"
            },
            {
              "id": "comment-traduire-la-qualité-engineering-en-langage-board",
              "depth": 2,
              "text": "Comment traduire la qualité engineering en langage board"
            },
            {
              "id": "le-plan-daction-pour-les-12-prochains-mois",
              "depth": 2,
              "text": "Le plan d'action pour les 12 prochains mois"
            },
            {
              "id": "faq-sur-lengineering-comme-avantage-concurrentiel",
              "depth": 2,
              "text": "FAQ sur l'engineering comme avantage concurrentiel"
            }
          ]
        }
      },
      "_type": "markdown",
      "_id": "content:fr:dette-technique:ingenierie-logicielle-avantage-concurrentiel.md",
      "_source": "content",
      "_file": "fr/dette-technique/ingenierie-logicielle-avantage-concurrentiel.md",
      "_stem": "fr/dette-technique/ingenierie-logicielle-avantage-concurrentiel",
      "_extension": "md"
    },
    {
      "_path": "/fr/architecture-craft/database-per-service-microservices",
      "_dir": "architecture-craft",
      "_draft": false,
      "_partial": false,
      "_locale": "",
      "title": "Database per Service : quand ça vaut vraiment la complexité",
      "description": "Le pattern Database per Service est présenté comme obligatoire en microservices. Il ne l'est pas. Le critère objectif pour décider — et les alternatives ignorées.",
      "id": 35,
      "date": "2026-03-25",
      "listed": true,
      "nocomments": false,
      "hidden": false,
      "categories": [
        "architecture-craft"
      ],
      "tags": [
        "Microservices",
        "Database per Service",
        "Architecture Distribuée",
        "Base de Données"
      ],
      "--cover": "covers/articles/database-per-service-microservices.jpg",
      "readingTime": {
        "text": "8 min read",
        "minutes": 7.61,
        "time": 456600,
        "words": 1522
      },
      "body": {
        "type": "root",
        "children": [
          {
            "type": "element",
            "tag": "h1",
            "props": {
              "id": "database-per-service-quand-ça-vaut-vraiment-la-complexité"
            },
            "children": [
              {
                "type": "text",
                "value": "Database per Service : quand ça vaut vraiment la complexité"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "J'ai accompagné un client dans le secteur du commerce en ligne qui avait adopté Database per Service dès le début, par principe, avant même d'avoir 5 développeurs. 18 mois plus tard, l'équipe de 6 développeurs backend passait "
              },
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "30% de son temps"
                  }
                ]
              },
              {
                "type": "text",
                "value": " à gérer l'infrastructure de 20 bases de données, les sagas qui échouaient partiellement, et les incohérences de données entre services."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La décision que nous avons prise ensemble : migrer 15 des 20 services vers un schéma-per-service dans une base partagée. Seuls les 5 services critiques (ceux qui avaient vraiment des besoins différents de performance, d'isolation, ou de moteur) ont conservé leur base dédiée."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Résultat : le temps passé à l'infrastructure est passé de 30% à 8%. L'équipe a pu réinvestir ces heures dans de la valeur produit."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Database per Service n'est pas un impératif des microservices. C'est un trade-off. Et comme tout trade-off, il se décide selon le contexte, pas selon un dogme."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "le-problème-réel-que-database-per-service-résout"
            },
            "children": [
              {
                "type": "text",
                "value": "Le problème réel que Database per Service résout"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Sam Newman dans \"Building Microservices\" (2014) a popularisé l'idée que chaque microservice devrait posséder ses données. L'intention était valide : éviter le couplage de base de données partagée qui crée des dépendances implicites entre services."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Ces couplages sont réels :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Couplage de schéma :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " si le service A modifie la table "
              },
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "className": []
                },
                "children": [
                  {
                    "type": "text",
                    "value": "orders"
                  }
                ]
              },
              {
                "type": "text",
                "value": ", le service B qui lit cette table peut casser sans que l'équipe A s'en rende compte."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Couplage de déploiement :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " une migration de base de données doit être coordonnée avec tous les services qui lisent ou écrivent les tables concernées."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Couplage de performance :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " une requête lente du service A consomme des ressources de connexion qui dégradent les performances du service B."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Couplage de technologie :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " tous les services sont contraints d'utiliser le même moteur de base de données, même si certains auraient besoin d'un graph database et d'autres d'un document store."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Ces couplages valent la peine d'être éliminés, mais la question est : à quel coût, et avec quelle alternative ? Et la décision de les éliminer (ou de les tolérer) mérite d'être consignée dans un "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/architecture-craft/adr-architecture-decision-record"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "Architecture Decision Record"
                  }
                ]
              },
              {
                "type": "text",
                "value": " pour que le contexte reste accessible à toute l'équipe."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "le-coût-réel-de-database-per-service"
            },
            "children": [
              {
                "type": "text",
                "value": "Le coût réel de Database per Service"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Complexité opérationnelle :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " 10 services = 10 bases de données à provisionner, monitorer, sauvegarder, mettre à jour, et maintenir en haute disponibilité. Sur AWS, 10 instances RDS PostgreSQL coûtent entre 500 et 2 000€ par mois selon la taille, avant les coûts d'ingénierie pour les gérer."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Transactions distribuées :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " sans base de données partagée, une opération qui modifie des données dans plusieurs services (créer une commande ET décrémenter le stock ET enregistrer le paiement) ne peut plus être traitée dans une transaction ACID."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Il faut implémenter le pattern Saga, décrit en détail par Vernon Vaughn dans \"Implementing Domain-Driven Design\" :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "Saga chorégraphie pour la création d'une commande :\nOrderService.createOrder() → publie OrderCreated\n→ InventoryService réserve le stock → publie InventoryReserved\n→ PaymentService charge le paiement → publie PaymentProcessed\n→ OrderService confirme la commande\n\nEn cas d'échec du paiement :\n→ PaymentService publie PaymentFailed\n→ InventoryService libère la réservation\n→ OrderService annule la commande\n"
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "text",
                    "value": "Saga chorégraphie pour la création d'une commande :\nOrderService.createOrder() → publie OrderCreated\n→ InventoryService réserve le stock → publie InventoryReserved\n→ PaymentService charge le paiement → publie PaymentProcessed\n→ OrderService confirme la commande\n\nEn cas d'échec du paiement :\n→ PaymentService publie PaymentFailed\n→ InventoryService libère la réservation\n→ OrderService annule la commande\n"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Chaque étape peut échouer, les messages peuvent être perdus ou dupliqués, et les états intermédiaires sont difficiles à debugger. Pour renforcer la robustesse de ces flux, les "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/architecture-craft/patterns-resilience-circuit-breaker-retry"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "patterns de résilience : circuit breaker, retry, timeout"
                  }
                ]
              },
              {
                "type": "text",
                "value": " sont indispensables dès lors que les services communiquent de manière asynchrone."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Requêtes cross-services :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " une requête qui joint des données de plusieurs services (liste des commandes avec le nom du client et le stock disponible) devient une API composition : plusieurs appels HTTP en séquence ou en parallèle, avec de la logique d'agrégation en mémoire. Cette communication asynchrone entre services introduit un "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/architecture-craft/couplage-temporel-code-asynchrone"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "couplage temporel"
                  }
                ]
              },
              {
                "type": "text",
                "value": " qu'il faut gérer explicitement, notamment avec des garanties d'idempotence et d'ordre sur les événements."
              }
            ]
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Réserver mon diagnostic gratuit →",
              "href": "https://app.kamanga.fr/forms/discovery-call",
              "title": "Vous migrez vers les microservices et vous hésitez sur la stratégie de base de données ?",
              "type": "call"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Choisir la bonne stratégie de base de données pour une architecture distribuée dépend de nombreux facteurs contextuels que j'ai appris à évaluer sur le terrain, dans la finance, les médias, la logistique. En 30 minutes, on peut évaluer les trade-offs et définir l'approche adaptée à votre situation réelle."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "le-cadre-de-décision-objectif"
            },
            "children": [
              {
                "type": "text",
                "value": "Le cadre de décision objectif"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La question n'est pas \"devrions-nous faire Database per Service ?\", c'est \"quel niveau de couplage de base de données est acceptable dans notre contexte ?\""
              }
            ]
          },
          {
            "type": "element",
            "tag": "table",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "thead",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Critère"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Favorise Database per Service"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Favorise Base partagée"
                          }
                        ]
                      }
                    ]
                  }
                ]
              },
              {
                "type": "element",
                "tag": "tbody",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Taille de l'équipe"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "> 15 développeurs, équipes indépendantes"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "< 15 développeurs, une seule équipe"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Fréquence de changement de schéma"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Fréquente (plusieurs fois par semaine)"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Rare (quelques fois par mois)"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Exigences de performance"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Services avec des profils d'usage très différents"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Profils d'usage similaires"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Exigences de disponibilité"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "SLAs différents par service"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "SLA uniforme"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Transactions cross-services"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Rares"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Fréquentes et critiques"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Maturité opérationnelle"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "SRE dédié, infrastructure mature"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Pas d'équipe infra dédiée"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La règle empirique :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " si les équipes qui développent les services peuvent déployer indépendamment et que les transactions cross-services sont rares, Database per Service a du sens. Sinon, le coût dépasse la valeur."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "les-alternatives-ignorées"
            },
            "children": [
              {
                "type": "text",
                "value": "Les alternatives ignorées"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Avant de sauter à \"une base de données par service\", il existe des options intermédiaires qui réduisent le couplage sans la complexité complète."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Option 1 : Schema per Service (dans la même base de données)"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Chaque service possède son schéma (namespace) dans une base de données partagée. Le service A ne peut accéder qu'aux tables du schéma A."
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "-- Service A n'accède qu'à son schéma\nSET search_path TO ordering;\nSELECT * FROM orders;  -- → ordering.orders\n\n-- Service B n'accède qu'à son schéma\nSET search_path TO inventory;\nSELECT * FROM products;  -- → inventory.products\n",
              "language": "sql",
              "meta": "",
              "className": "language-sql shiki shiki-themes catppuccin-frappe github-dark",
              "style": ""
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 1
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "-- Service A n'accède qu'à son schéma\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 2
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "SET"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " search_path "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "TO"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ordering;\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 3
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "SELECT"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " *"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " FROM"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " orders;  "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "-- → ordering.orders\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 4
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 5
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "-- Service B n'accède qu'à son schéma\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 6
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "SET"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " search_path "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "TO"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " inventory;\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 7
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "SELECT"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " *"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " FROM"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " products;  "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "-- → inventory.products\n"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Avantages : les transactions ACID restent possibles si nécessaire. Complexité opérationnelle minimale (une seule base de données)."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Option 2 : Read replicas dédiées par service"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La base de données principale est partagée pour les écritures, mais chaque service lit depuis sa propre replica read-only synchronisée. Utile quand le problème principal est la contention de lecture."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Option 3 : CQRS sans séparation de base"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Séparer les modèles de lecture et d'écriture sans nécessairement avoir des bases de données séparées. Les requêtes complexes lisent des vues matérialisées maintenues à jour par des événements."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "quand-migrer-vers-database-per-service"
            },
            "children": [
              {
                "type": "text",
                "value": "Quand migrer vers Database per Service"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les signaux que la base partagée devient un problème :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les migrations de base de données nécessitent de coordonner 3 équipes ou plus"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Un service lent dégrade régulièrement les performances des autres"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Deux services ont des besoins contradictoires sur le schéma d'une table partagée"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'équipe veut utiliser un moteur de base de données différent pour un service spécifique"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La migration progressive :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " commencer par les tables du service le plus indépendant. Migrer la table, mettre en place la synchronisation des données si nécessaire (CDC avec Debezium, événements de domaine), valider, puis passer à la table suivante."
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "Plan de migration en 4 phases :\nPhase 1 : service de notifications (aucune dépendance cross-service)\nPhase 2 : service de recherche (lecture seule, pas d'écriture cross-service)\nPhase 3 : service de catalogue produit (écriture rarement liée aux autres)\nPhase 4 : service de commandes (transactions complexes — laisser pour dernier)\n"
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "text",
                    "value": "Plan de migration en 4 phases :\nPhase 1 : service de notifications (aucune dépendance cross-service)\nPhase 2 : service de recherche (lecture seule, pas d'écriture cross-service)\nPhase 3 : service de catalogue produit (écriture rarement liée aux autres)\nPhase 4 : service de commandes (transactions complexes — laisser pour dernier)\n"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "le-cas-particulier-du-polyglot-persistence"
            },
            "children": [
              {
                "type": "text",
                "value": "Le cas particulier du polyglot persistence"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Database per Service devient moins coûteux quand les services utilisent des bases de données managées (DynamoDB, MongoDB Atlas, Redis Cloud) avec une facturation à l'usage. Le coût opérationnel est absorbé par le fournisseur."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Le pattern polyglot persistence (chaque service utilise le moteur adapté à ses besoins) ne vaut sa complexité que si les besoins sont vraiment distincts et que l'équipe a la maturité opérationnelle pour gérer plusieurs moteurs."
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Service de recherche → Elasticsearch"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Service de sessions → Redis"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Service de catalogue → MongoDB (documents flexibles)"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Service de commandes → PostgreSQL (transactions ACID)"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "faq-sur-database-per-service"
            },
            "children": [
              {
                "type": "text",
                "value": "FAQ sur Database per Service"
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "1. Comment gérer la cohérence des données entre services sans transactions distribuées ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Eventual consistency avec compensation. Accepter que les données ne soient pas instantanément cohérentes entre services, seulement éventuellement cohérentes. Pour les cas où une cohérence forte est nécessaire, utiliser le pattern Outbox : écrire l'événement dans la même transaction que la donnée, puis publier l'événement de façon asynchrone. Pour les cas d'échec, implémenter des compensating transactions explicites plutôt que des rollbacks automatiques."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "2. Peut-on utiliser des transactions distribuées (2PC) à la place des Sagas ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Techniquement oui, mais déconseillé. Le Two-Phase Commit est lent (lock pendant la phase de préparation), fragile (coordinator failure = système bloqué), et complexe à implémenter correctement. Les Sagas sont plus complexes à concevoir mais plus robustes en production. La recommandation de Sam Newman et de l'industrie : éviter 2PC, préférer les Sagas ou revoir l'architecture pour réduire les transactions cross-services."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "3. Comment gérer les reportings qui nécessitent des données de plusieurs services ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Data warehouse ou OLAP dédié. Chaque service publie ses événements vers un pipeline de données (Kafka → Spark/Flink → Data Warehouse). Les analyses et rapports lisent le data warehouse, pas les bases des services. C'est le principe CQRS à l'échelle de l'architecture : les services gèrent les écritures, le data warehouse gère les lectures analytiques complexes."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "4. Quel outil utiliser pour la synchronisation de données entre services ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Change Data Capture (CDC) avec Debezium : il capture les changements PostgreSQL/MySQL en temps réel et les publie sur Kafka. Pour des cas plus simples : événements de domaine publiés sur une queue à chaque changement d'état. L'approche CDC est plus robuste (aucun changement applicatif requis) mais plus complexe à opérer. Les événements de domaine sont plus simples mais nécessitent une discipline applicative."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "5. Database per Service est-il compatible avec les architectures serverless (Lambda, Cloud Functions) ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Oui, et c'est souvent plus simple. Les bases de données managées à l'usage (DynamoDB, Firestore, Aurora Serverless) s'adaptent naturellement au modèle serverless : pas de pool de connexions à gérer, facturation à la requête. Le principal défi est la gestion des connexions (Lambda peut créer des milliers de connexions simultanées), résolu par des proxy de connexions comme RDS Proxy pour PostgreSQL/MySQL."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Faire mon auto-évaluation →",
              "href": "/ema",
              "title": "Ressource gratuite : Engineering Maturity Self-Assessment",
              "type": "resource"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'Engineering Maturity Self-Assessment couvre le domaine Architecture Distribuée : évaluez votre maturité sur le découpage des services, la gestion des données, et la résilience. Score et plan d'action en 10 minutes."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "style",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"
              }
            ]
          }
        ],
        "toc": {
          "title": "",
          "searchDepth": 2,
          "depth": 2,
          "links": [
            {
              "id": "le-problème-réel-que-database-per-service-résout",
              "depth": 2,
              "text": "Le problème réel que Database per Service résout"
            },
            {
              "id": "le-coût-réel-de-database-per-service",
              "depth": 2,
              "text": "Le coût réel de Database per Service"
            },
            {
              "id": "le-cadre-de-décision-objectif",
              "depth": 2,
              "text": "Le cadre de décision objectif"
            },
            {
              "id": "les-alternatives-ignorées",
              "depth": 2,
              "text": "Les alternatives ignorées"
            },
            {
              "id": "quand-migrer-vers-database-per-service",
              "depth": 2,
              "text": "Quand migrer vers Database per Service"
            },
            {
              "id": "le-cas-particulier-du-polyglot-persistence",
              "depth": 2,
              "text": "Le cas particulier du polyglot persistence"
            },
            {
              "id": "faq-sur-database-per-service",
              "depth": 2,
              "text": "FAQ sur Database per Service"
            }
          ]
        }
      },
      "_type": "markdown",
      "_id": "content:fr:architecture-craft:database-per-service-microservices.md",
      "_source": "content",
      "_file": "fr/architecture-craft/database-per-service-microservices.md",
      "_stem": "fr/architecture-craft/database-per-service-microservices",
      "_extension": "md"
    },
    {
      "_path": "/fr/management/delegation-technique-confiance",
      "_dir": "management",
      "_draft": false,
      "_partial": false,
      "_locale": "",
      "title": "Délégation technique : la matrice par niveau de séniorité",
      "description": "La délégation technique ne se fait pas de la même façon selon le niveau du développeur. La matrice qui évite le micro-management et l'abandon — et comment construire la confiance progressivement.",
      "id": 34,
      "date": "2026-03-23",
      "listed": true,
      "nocomments": false,
      "hidden": false,
      "categories": [
        "management"
      ],
      "tags": [
        "Délégation",
        "Management",
        "Séniorité",
        "Confiance"
      ],
      "--cover": "covers/articles/delegation-technique-confiance.jpg",
      "readingTime": {
        "text": "8 min read",
        "minutes": 7.99,
        "time": 479400,
        "words": 1598
      },
      "body": {
        "type": "root",
        "children": [
          {
            "type": "element",
            "tag": "h1",
            "props": {
              "id": "délégation-technique-la-matrice-par-niveau-de-séniorité"
            },
            "children": [
              {
                "type": "text",
                "value": "Délégation technique : la matrice par niveau de séniorité"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "J'ai fait les deux erreurs. Chez Crédit Agricole, j'ai micro-managé un développeur senior sur son domaine de compétence : je relisais ses PR ligne par ligne, je lui demandais de justifier chaque choix d'implémentation. Il est parti au bout de 8 mois. Son feedback d'adieu : \"Je me sentais traité comme un junior.\" Dans une autre organisation, j'ai délégué une décision d'architecture à un développeur junior sans filet de sécurité. Il a passé 3 semaines à tourner en rond sans oser dire qu'il était perdu. La feature a pris 6 semaines de retard."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Le micro-management détruit les meilleurs. L'abandon détruit les moins expérimentés. La délégation efficace est la zone entre les deux, et elle se calibre par personne, par tâche, et par contexte."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Hersey & Blanchard ont formalisé ce principe dans le modèle du Situational Leadership : le niveau d'autonomie accordé doit correspondre au niveau de compétence et de motivation du collaborateur "
              },
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "sur la tâche spécifique"
                  }
                ]
              },
              {
                "type": "text",
                "value": ". Pas sur la personne en général. Un développeur senior peut être en pleine autonomie sur l'architecture d'un service et avoir besoin d'accompagnement sur la facilitation d'un atelier. La délégation se calibre par tâche, pas par titre."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "les-4-niveaux-de-délégation"
            },
            "children": [
              {
                "type": "text",
                "value": "Les 4 niveaux de délégation"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Niveau D1 : Direction :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " faible compétence, forte motivation. Le développeur est enthousiaste mais ne sait pas encore faire. Je décide et j'explique pourquoi."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Niveau D2 : Coaching :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " compétence croissante, motivation variable. Le développeur commence à maîtriser mais manque de confiance. Je décide après discussion, j'explique le raisonnement."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Niveau D3 : Support :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " compétence forte, motivation variable. Le développeur sait faire mais hésite à décider seul. Il propose, je valide ou je questionne."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Niveau D4 : Délégation complète :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " compétence forte, forte motivation. Le développeur sait faire et veut le faire. Il décide, je suis informé."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'erreur que je vois le plus souvent :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " traiter une personne au même niveau sur toutes les dimensions. Un développeur senior peut être D4 sur son périmètre technique et D1 sur la conduite d'un entretien de recrutement. La matrice ne s'applique pas à la personne : elle s'applique à la combinaison personne + tâche."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "la-matrice-de-délégation-par-domaine-et-séniorité"
            },
            "children": [
              {
                "type": "text",
                "value": "La matrice de délégation par domaine et séniorité"
              }
            ]
          },
          {
            "type": "element",
            "tag": "h3",
            "props": {
              "id": "développeur-junior-0-2-ans-dexpérience"
            },
            "children": [
              {
                "type": "text",
                "value": "Développeur junior (0-2 ans d'expérience)"
              }
            ]
          },
          {
            "type": "element",
            "tag": "table",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "thead",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Domaine de décision"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Niveau de délégation"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Ce que ça signifie en pratique"
                          }
                        ]
                      }
                    ]
                  }
                ]
              },
              {
                "type": "element",
                "tag": "tbody",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Implémentation d'une story"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D2"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Le junior propose l'approche, validation avant de commencer"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Choix de librairie"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D1"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Je choisis avec explication"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Architecture d'un service"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D1"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Décision manager/senior, explication détaillée"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Refactoring local"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D2"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Proposition + validation avant merge"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Tests à écrire"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D2"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Proposition + review attentive"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Communication avec le PO"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D1"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Manager/senior présent ou brief avant"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ma règle pour le junior :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " jamais de décision irréversible sans validation. Les décisions réversibles (un commit sur une branche locale, une exploration technique) peuvent être prises en autonomie. Les décisions irréversibles (merge en production, modification de schéma de base de données) nécessitent une validation."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h3",
            "props": {
              "id": "développeur-intermédiaire-2-5-ans-dexpérience"
            },
            "children": [
              {
                "type": "text",
                "value": "Développeur intermédiaire (2-5 ans d'expérience)"
              }
            ]
          },
          {
            "type": "element",
            "tag": "table",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "thead",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Domaine de décision"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Niveau de délégation"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Ce que ça signifie en pratique"
                          }
                        ]
                      }
                    ]
                  }
                ]
              },
              {
                "type": "element",
                "tag": "tbody",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Implémentation d'une story"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D3-D4"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Pleine autonomie sur l'implémentation"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Choix de librairie"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D3"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Propose + justifie, validation légère"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Architecture d'un service"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D2-D3"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Co-construction avec le manager/senior"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Refactoring de périmètre moyen"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D3"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Autonomie avec point d'étape"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Découpage de stories"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D3"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Propose le découpage, validation PO/manager"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Mentoring d'un junior"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D2"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Encadré par le senior au début"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ma règle pour l'intermédiaire :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " autonomie sur l'exécution, validation sur les décisions d'impact moyen à fort. L'intermédiaire doit être challengé à prendre des décisions et à les justifier, pas protégé de toute décision. C'est dans cet espace inconfortable que la progression se fait."
              }
            ]
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Réserver mon diagnostic gratuit →",
              "href": "https://app.kamanga.fr/forms/discovery-call",
              "title": "Vous peinez à calibrer le bon niveau d'autonomie pour chaque membre de votre équipe ?",
              "type": "call"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Vous avez peut-être des seniors frustrés par trop de contrôle et des juniors perdus par trop de liberté, dans la même équipe. Construire un système de délégation progressive adapté nécessite un audit des compétences et des niveaux de confiance actuels. En 30 minutes, je peux définir avec vous la matrice de délégation adaptée à vos 3 à 4 profils clés."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h3",
            "props": {
              "id": "développeur-senior-5-ans-dexpérience"
            },
            "children": [
              {
                "type": "text",
                "value": "Développeur senior (5+ ans d'expérience)"
              }
            ]
          },
          {
            "type": "element",
            "tag": "table",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "thead",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Domaine de décision"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Niveau de délégation"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Ce que ça signifie en pratique"
                          }
                        ]
                      }
                    ]
                  }
                ]
              },
              {
                "type": "element",
                "tag": "tbody",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Architecture d'un service"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D3-D4"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Décision senior, information manager"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Choix technologique d'impact limité"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D4"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Pleine autonomie"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Choix technologique d'impact fort"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D3"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Proposition structurée (ADR), validation manager/CTO"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Standards d'équipe"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D3"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Propose, présente à l'équipe, manager valide"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Recrutement technique"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D3"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Conduit les entretiens techniques, input sur la décision"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Architecture cross-services"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "D2-D3"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Co-construction avec le CTO"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ma règle pour le senior :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " autonomie forte sur son périmètre de compétence, co-construction sur les décisions d'impact organisationnel. Le micro-management d'un senior sur son domaine de compétence est la première cause de départ des profils techniques forts. J'ai appris ça de la pire façon."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "comment-construire-la-confiance-pour-déléguer-davantage"
            },
            "children": [
              {
                "type": "text",
                "value": "Comment construire la confiance pour déléguer davantage"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La délégation ne se donne pas avec l'ancienneté. Elle se construit dans les deux sens, elle repose sur la "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/management/confiance-equipe-engineering"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "confiance"
                  }
                ]
              },
              {
                "type": "text",
                "value": " comme substrat indispensable : le développeur démontre qu'il peut gérer une décision, je délègue la suivante. Le cycle est symétrique."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les 4 étapes du cycle de délégation que j'utilise :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Étape 1 : Mission claire :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " je définis clairement le périmètre de la décision, les contraintes, et les critères de succès. Pas \"améliore les tests\" : \"augmente la couverture du service X de 40% à 70% en ciblant les fonctions critiques, budget : 3 jours.\""
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Étape 2 : Filet de sécurité défini :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " je définit en avance ce qui déclencherait une escalade. \"Si tu rencontres des dépendances avec le service Y ou si l'implémentation prend plus de 5 jours, viens me voir avant de continuer.\" Le filet rassure le développeur et me protège."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Étape 3 : Autonomie réelle :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " entre le début et le filet de sécurité, le développeur décide seul. Je ne vérifie pas l'avancement quotidiennement, sauf si le développeur le demande."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Étape 4 : Débriefing :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " après la mission, un point sur les décisions prises. \"Qu'est-ce que tu ferais différemment ? Qu'est-ce que tu as appris ?\" Ce n'est pas un contrôle : c'est un apprentissage partagé."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "les-signaux-dune-délégation-mal-calibrée"
            },
            "children": [
              {
                "type": "text",
                "value": "Les signaux d'une délégation mal calibrée"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Signaux de sur-délégation (trop d'autonomie trop tôt) :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le développeur pose des questions sur chaque micro-décision"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les délais glissent sans alerte de sa part"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La qualité du travail est irrégulière"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Il dit \"j'ai fait X\" mais ne peut pas expliquer pourquoi"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Signaux de sous-délégation (trop de contrôle) :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le développeur \"fait valider\" des décisions triviales"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Il n'apporte plus de propositions, il attend les instructions"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Il exprime de la frustration sur son manque d'autonomie"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Il perd en motivation visible sur plusieurs semaines"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le recalibrage :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " la délégation peut monter ou descendre selon l'évolution des compétences et de la confiance. Un développeur qui traverse une période difficile peut temporairement revenir à un niveau de délégation plus supporté, sans que ce soit perçu comme une rétrogradation, à condition d'expliquer pourquoi."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "la-délégation-comme-outil-de-développement"
            },
            "children": [
              {
                "type": "text",
                "value": "La délégation comme outil de développement"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La délégation progressive n'est pas seulement un outil de management : c'est un outil de développement. Vygotsky appelle ça la zone proximale de développement : déléguer légèrement au-delà de ce que le développeur sait faire aujourd'hui, avec un filet de sécurité, accélère son développement. Déléguer dans la zone de confort maintient le statu quo. Déléguer trop loin au-delà génère de l'anxiété et des erreurs."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Dans un client dans l'édition logicielle (30 personnes), j'accompagnais un développeur intermédiaire qui se plaignait de manque d'autonomie. Son manager lui faisait valider toutes ses PRs, même les plus triviales. Après un audit de délégation et la mise en place de la matrice, le développeur a obtenu l'autonomie complète sur son périmètre (service de notifications) avec un seul filet de sécurité (escalader si impact sur d'autres services). En 3 mois, il avait redesigné l'architecture du service, documenté ses décisions, et formé un junior sur son périmètre. Ces trois choses étaient impossibles dans l'ancien mode de fonctionnement."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "faq-sur-la-délégation-technique"
            },
            "children": [
              {
                "type": "text",
                "value": "FAQ sur la délégation technique"
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Comment gérer la délégation quand un développeur senior refuse les responsabilités ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La résistance à la délégation est souvent une protection contre l'échec ou un manque de clarté sur les attentes. Je distingue les deux cas. Si c'est la peur de l'échec : je rends les filets de sécurité plus explicites et les conséquences de l'erreur moins sévères. Si c'est le manque de clarté : je redéfinis la mission avec des critères de succès très précis. Un senior qui refuse systématiquement les responsabilités sur un horizon de 6 mois a peut-être atteint son niveau de confort dans son rôle actuel : conversation honnête nécessaire lors de l'"
                  },
                  {
                    "type": "element",
                    "tag": "a",
                    "props": {
                      "href": "/fr/management/entretien-annuel-developpeur-format"
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "entretien annuel"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " sur les aspirations et les attentes mutuelles."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Comment documenter les niveaux de délégation pour éviter les ambiguïtés ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Un simple document partagé avec l'équipe qui liste les domaines de décision et le niveau de délégation pour chaque niveau de séniorité. Je le mets à jour lors des promotions ou changements de périmètre. L'important n'est pas la précision exhaustive : c'est que le développeur et moi ayons la même compréhension des zones d'autonomie. En cas d'ambiguïté, la règle par défaut est D3 (le développeur propose, je valide), ce qui laisse l'autonomie sur l'exécution et la validation sur les décisions."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Quelle est la différence entre délégation et abandon ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La délégation a trois éléments que l'abandon n'a pas : une mission claire (périmètre et critères de succès définis), un filet de sécurité (les conditions d'escalade sont définies en avance), et un débriefing (retour sur l'expérience). L'abandon, c'est \"débrouille-toi\" sans ces trois éléments. La délégation sans mission claire ressemble à de l'abandon, même si l'intention du manager est bonne."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Comment déléguer dans un contexte de forte dette technique où chaque décision a des conséquences importantes ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "En rendant les filets de sécurité plus explicites et plus fréquents. Pas \"viens me voir si tu as un problème\", mais \"viens me voir après J+2 pour un point d'étape, et immédiatement si tu rencontres X ou Y.\" Dans un contexte de "
                  },
                  {
                    "type": "element",
                    "tag": "a",
                    "props": {
                      "href": "/fr/dette-technique/programme-refactoring-approuve-business"
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "forte dette technique"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": ", la délégation est possible et nécessaire, mais avec des checkpoints plus fréquents pour détecter tôt les décisions qui pourraient avoir des effets de bord non anticipés."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Comment calibrer la délégation pour un nouveau membre de l'équipe, même senior ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Je commence à D2 pour les 30 premiers jours, quelle que soit la séniorité. Non pas parce que le développeur manque de compétence, mais parce qu'il manque de contexte sur le codebase, les décisions passées, et les normes de l'équipe. La montée en délégation est rapide (D2 → D4 en 4 à 6 semaines pour un senior compétent) mais elle doit partir de là. J'explique cette progression explicitement à l'onboarding pour éviter la frustration."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Faire mon auto-évaluation →",
              "href": "/ema",
              "title": "Ressource gratuite : Engineering Maturity Self-Assessment",
              "type": "resource"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'Engineering Maturity Self-Assessment couvre le domaine Management Technique : évaluez votre niveau de maturité sur la délégation, le développement de l'autonomie, et les pratiques de feedback. Score et recommandations en 10 minutes."
                  }
                ]
              }
            ]
          }
        ],
        "toc": {
          "title": "",
          "searchDepth": 2,
          "depth": 2,
          "links": [
            {
              "id": "les-4-niveaux-de-délégation",
              "depth": 2,
              "text": "Les 4 niveaux de délégation"
            },
            {
              "id": "la-matrice-de-délégation-par-domaine-et-séniorité",
              "depth": 2,
              "text": "La matrice de délégation par domaine et séniorité",
              "children": [
                {
                  "id": "développeur-junior-0-2-ans-dexpérience",
                  "depth": 3,
                  "text": "Développeur junior (0-2 ans d'expérience)"
                },
                {
                  "id": "développeur-intermédiaire-2-5-ans-dexpérience",
                  "depth": 3,
                  "text": "Développeur intermédiaire (2-5 ans d'expérience)"
                },
                {
                  "id": "développeur-senior-5-ans-dexpérience",
                  "depth": 3,
                  "text": "Développeur senior (5+ ans d'expérience)"
                }
              ]
            },
            {
              "id": "comment-construire-la-confiance-pour-déléguer-davantage",
              "depth": 2,
              "text": "Comment construire la confiance pour déléguer davantage"
            },
            {
              "id": "les-signaux-dune-délégation-mal-calibrée",
              "depth": 2,
              "text": "Les signaux d'une délégation mal calibrée"
            },
            {
              "id": "la-délégation-comme-outil-de-développement",
              "depth": 2,
              "text": "La délégation comme outil de développement"
            },
            {
              "id": "faq-sur-la-délégation-technique",
              "depth": 2,
              "text": "FAQ sur la délégation technique"
            }
          ]
        }
      },
      "_type": "markdown",
      "_id": "content:fr:management:delegation-technique-confiance.md",
      "_source": "content",
      "_file": "fr/management/delegation-technique-confiance.md",
      "_stem": "fr/management/delegation-technique-confiance",
      "_extension": "md"
    },
    {
      "_path": "/fr/intelligence-artificielle/ia-code-review-retour-experience",
      "_dir": "intelligence-artificielle",
      "_draft": false,
      "_partial": false,
      "_locale": "",
      "title": "IA en code review : retour d'expérience après 6 mois",
      "description": "Après 6 mois d'outils IA dans les code reviews : ce qu'ils trouvent bien, ce qu'ils ratent systématiquement, et comment les intégrer sans dégrader la culture de review.",
      "id": 37,
      "date": "2026-03-20",
      "listed": true,
      "nocomments": false,
      "hidden": false,
      "categories": [
        "intelligence-artificielle"
      ],
      "tags": [
        "Code Review",
        "IA",
        "Retour d'expérience",
        "Qualité"
      ],
      "--cover": "covers/articles/ia-code-review-retour-experience.jpg",
      "readingTime": {
        "text": "9 min read",
        "minutes": 8.765,
        "time": 525900,
        "words": 1753
      },
      "body": {
        "type": "root",
        "children": [
          {
            "type": "element",
            "tag": "h1",
            "props": {
              "id": "ia-en-code-review-retour-dexpérience-après-6-mois"
            },
            "children": [
              {
                "type": "text",
                "value": "IA en code review : retour d'expérience après 6 mois"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "En janvier 2026, j'ai accompagné un client (15 développeurs) dans l'adoption de CodeRabbit. Le CTO avait une attente simple : réduire le temps de review sans dégrader la qualité. Six semaines plus tard, le temps de review humaine avait baissé de 35% (de 45 minutes à 30 minutes par PR en moyenne). Le taux de faux positifs de l'IA était à 28% initialement, réduit à 15% après ajustement de la configuration avec les conventions de l'équipe. Les reviewers disaient \"je me concentre sur ce qui compte\"."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Mais dans une autre équipe, chez un éditeur de logiciels de 18 développeurs, l'adoption du même type d'outil avait produit l'effet inverse : une \"alert fatigue\" qui avait dégradé la culture de review. Les développeurs ignoraient les commentaires IA en masse, y compris les commentaires importants."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La différence entre ces deux résultats n'était pas l'outil. C'était la méthode d'intégration."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "ce-que-lia-trouve-bien"
            },
            "children": [
              {
                "type": "text",
                "value": "Ce que l'IA trouve bien"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "L'IA en code review excelle sur les patterns connus et répétables."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Problèmes de sécurité évidents :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " injections SQL, secrets hardcodés, XSS potentiels, dépendances avec CVE connus, des "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/intelligence-artificielle/llm-securite-code-vulnerabilites"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "vulnérabilités typiques du code LLM-généré"
                  }
                ]
              },
              {
                "type": "text",
                "value": ". L'IA les détecte mieux que la review humaine moyenne, non pas parce qu'elle est plus intelligente, mais parce qu'elle ne fatigue pas et applique systématiquement les patterns connus. Une étude de "
              },
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Stanford (2023)"
                  }
                ]
              },
              {
                "type": "text",
                "value": " documentait que 40% du code IA-généré contenait des vulnérabilités dans des contextes de sécurité spécifiques : l'IA en code review détecte précisément ces patterns."
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "className": "language-python shiki shiki-themes catppuccin-frappe github-dark",
              "code": "# L'IA détecte ce pattern immédiatement\nquery = f\"SELECT * FROM users WHERE email = '{email}'\"  # SQL injection\n# Et suggère\nquery = \"SELECT * FROM users WHERE email = %s\"\n",
              "language": "python",
              "meta": "",
              "style": ""
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 1
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "# L'IA détecte ce pattern immédiatement\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 2
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "query "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-default-font-style:italic;--shiki-dark:#F97583;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " f"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\"SELECT * FROM users WHERE email = '"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#F4B8E4;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "{"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "email"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#F4B8E4;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "}"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "'\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "  # SQL injection\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 3
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "# Et suggère\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 4
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "query "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " \"SELECT * FROM users WHERE email = "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#F4B8E4;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "%s"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\"\n"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Problèmes de style et de conventions :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " nommage incohérent, fonctions trop longues, complexité cyclomatique élevée, code dupliqué détectable par pattern matching. L'IA commente ces points avec une régularité que les reviewers humains n'ont pas, car ils s'habituent aux patterns de l'équipe et les ignorent progressivement."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Documentation manquante :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " fonctions publiques sans docstring, paramètres non typés, valeurs de retour non documentées. L'IA les signale systématiquement et peut générer la documentation manquante en temps réel."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Tests manquants :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " branches de code non couvertes par les tests présents dans la PR. L'IA peut identifier \"ce bloc else n'est pas testé\" avec une précision correcte."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "ce-que-lia-rate-systématiquement"
            },
            "children": [
              {
                "type": "text",
                "value": "Ce que l'IA rate systématiquement"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Après 6 mois d'observation, j'ai identifié 5 angles morts récurrents."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La cohérence avec le reste du codebase :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " l'IA revoit la PR en isolation. Si la base de code utilise un pattern de gestion d'erreur spécifique, l'IA peut suggérer un pattern différent, techniquement correct mais incohérent avec le reste. Après 6 mois, c'est le problème numéro un des équipes : l'IA crée du bruit avec des suggestions valides techniquement mais inadaptées au contexte."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La logique métier incorrecte :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " une fonction qui calcule incorrectement une remise selon des règles business spécifiques : l'IA ne voit pas le problème si le code est techniquement correct. Ce bug ne sera trouvé que par un reviewer humain qui connaît les règles métier."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'impact architectural :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " un changement qui passe tous les tests et respecte tous les patterns de style peut introduire un couplage architectural problématique à long terme. L'IA ne voit pas les implications systémiques d'un changement local."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La duplication de logique métier cross-services :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " deux services qui implémentent la même règle légèrement différemment. L'IA revoit un service à la fois, elle ne peut pas détecter la duplication sans contexte étendu."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'intention du changement :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " une PR qui modifie une constante de configuration. L'IA commente sur le style. Elle ne peut pas dire \"cette constante avait été fixée à cette valeur pour contourner un bug du service X, la modifier va créer des problèmes en production.\""
              }
            ]
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Réserver mon diagnostic gratuit →",
              "href": "https://app.kamanga.fr/forms/discovery-call",
              "title": "Vous adoptez des outils IA dans votre workflow de review et vous voulez éviter les pièges ?",
              "type": "call"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Vous avez adopté ou envisagez d'adopter un outil IA en code review, mais vous ne savez pas comment l'intégrer sans dégrader la culture d'équipe. En 30 minutes, on définit les règles d'utilisation, les limites, et le processus adapté à votre contexte."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "limpact-sur-la-culture-de-review"
            },
            "children": [
              {
                "type": "text",
                "value": "L'impact sur la culture de review"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Ce que les équipes rapportent après 6 mois :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce qui s'améliore :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " les reviews humaines se concentrent plus sur le fond (logique métier, architecture, cohérence) et moins sur la forme (style, conventions). L'IA filtre le bruit. Les développeurs juniors reçoivent plus de feedback structuré et rapide, l'IA joue un rôle de \"premier reviewer\" qui leur permet d'améliorer leur code avant la review humaine."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce qui se dégrade si mal géré :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " dans plusieurs équipes, le volume de commentaires IA a créé une \"alert fatigue\". Les développeurs commencent à ignorer les commentaires IA en masse, y compris les commentaires importants. Une équipe a constaté une augmentation de 30% du nombre de commentaires de PR, avec une diminution de la qualité de l'engagement sur chacun."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le risque principal :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " la délégation de responsabilité. \"L'IA a approuvé, donc ça doit être bon.\" Ce pattern crée une fausse sécurité dangereuse. Les reviewers humains réduisent l'intensité de leur review quand l'IA a déjà commenté. J'ai vu ce pattern se répéter dans chaque équipe qui n'avait pas défini explicitement la séparation des responsabilités."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "les-règles-dintégration-qui-fonctionnent"
            },
            "children": [
              {
                "type": "text",
                "value": "Les règles d'intégration qui fonctionnent"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Règle 1 : Séparer les commentaires IA des commentaires humains"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Les commentaires IA doivent être visuellement distincts. Le reviewer humain sait que l'IA a déjà reviewé les aspects de style/sécurité et peut se concentrer sur le fond. CodeRabbit et les intégrations GitHub Copilot le font nativement. Si vous utilisez une intégration personnalisée, utilisez un bot account dédié."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Règle 2 : Définir ce que l'IA revoit, définir ce que l'humain revoit"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Complétez ce tableau avec la "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/intelligence-artificielle/tester-code-genere-ia-checklist"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "checklist de validation du code IA"
                  }
                ]
              },
              {
                "type": "text",
                "value": " pour les PRs à fort contenu généré."
              }
            ]
          },
          {
            "type": "element",
            "tag": "table",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "thead",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "L'IA revoit"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "th",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "L'humain revoit"
                          }
                        ]
                      }
                    ]
                  }
                ]
              },
              {
                "type": "element",
                "tag": "tbody",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Sécurité (injections, secrets)"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Logique métier"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Style et conventions"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Impact architectural"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Tests manquants"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Cohérence avec le codebase"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Complexité excessive"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Intention du changement"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "tr",
                    "props": {},
                    "children": [
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Documentation manquante"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "td",
                        "props": {},
                        "children": [
                          {
                            "type": "text",
                            "value": "Trade-offs de design"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Règle 3 : Ne pas rendre la review IA bloquante par défaut"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La review IA ne doit pas bloquer le merge de façon automatique sur les commentaires non-critiques. Seuls les commentaires de sécurité (injection, secrets, vulnérabilités connues) méritent un blocage automatique. Les autres sont des suggestions que l'auteur de la PR peut accepter ou rejeter explicitement."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Règle 4 : Conserver la review humaine comme étape obligatoire"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Même avec un outil IA excellent, la review humaine reste obligatoire. La tentation de supprimer la review humaine pour les \"petites PR\" est dangereuse, car c'est souvent sur une \"petite PR\" que le bug critique est introduit."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "les-métriques-de-suivi-à-6-mois"
            },
            "children": [
              {
                "type": "text",
                "value": "Les métriques de suivi à 6 mois"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Time to first review :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " le temps entre la création d'une PR et le premier commentaire. Avec un outil IA, ce metric descend à moins de 5 minutes (le bot review instantanément). C'est un gain réel pour les développeurs qui attendent un feedback."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Human review time :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " le temps que les développeurs humains passent sur les reviews. L'objectif est que ce temps reste stable ou diminue légèrement (l'IA a filtré le bruit) tout que la qualité augmente."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "False positive rate de l'IA :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " le pourcentage de commentaires IA que l'auteur de la PR rejette comme non-pertinents. Un taux supérieur à 30% signifie que l'IA génère trop de bruit : ajustez la configuration ou le prompt système."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Bug escape rate :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " le nombre de bugs trouvés en production par rapport aux bugs trouvés en review. Si ce ratio s'améliore avec l'IA, l'outil fonctionne. S'il se dégrade, l'IA crée une fausse sécurité."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "les-outils-et-leur-positionnement"
            },
            "children": [
              {
                "type": "text",
                "value": "Les outils et leur positionnement"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "GitHub Copilot Code Review :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " intégration native dans GitHub, activée au niveau de la PR. Bon pour le style et les patterns de sécurité courants. Limite : connaissance du codebase limitée au diff de la PR."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "CodeRabbit :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " outil spécialisé review avec contexte étendu du codebase. Meilleur pour la cohérence avec le codebase que Copilot. Configuration par règles yaml."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Claude / GPT-4 via API :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " intégration personnalisée avec contexte métier. Le plus flexible : vous pouvez injecter les conventions de l'équipe, les règles métier critiques, et l'architecture dans le prompt système. Le plus complexe à configurer."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Cursor :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " IDE avec review intégrée en cours d'écriture, pas seulement sur la PR. Utile pour les développeurs qui veulent le feedback avant même de créer la PR."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "L'IA en code review est un amplificateur, pas un remplacement. Elle amplifie la capacité de détection sur les patterns connus et libère le temps humain pour ce que l'IA ne peut pas faire. Les équipes qui sortiront gagnantes de cette transition ne seront pas celles qui délèguent le plus à l'IA. Ce seront celles qui comprennent précisément ce qu'elles lui délèguent."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "faq-sur-lia-en-code-review"
            },
            "children": [
              {
                "type": "text",
                "value": "FAQ sur l'IA en code review"
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "1. Quelle est la différence entre un linter et un outil de review IA ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Un "
                  },
                  {
                    "type": "element",
                    "tag": "a",
                    "props": {
                      "href": "/fr/dette-technique/outils-analyse-statique-2026"
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "linter"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " applique des règles déterministes prédéfinies : syntaxe, style, patterns interdits. Il est rapide, sans faux positifs sur ce qu'il est configuré à détecter. Un outil IA applique un raisonnement contextuel sur le code : il peut détecter des problèmes que le linter ne peut pas formaliser en règles (ex : \"cette fonction fait trop de choses\"). La complémentarité est optimale : linter pour les règles déterministes, IA pour les jugements contextuels."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "2. L'IA peut-elle reviewer du code dans des langages peu courants ou des DSLs internes ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les LLMs sont entraînés principalement sur les langages populaires (Python, JavaScript, Java, Go, TypeScript). Pour les langages peu courants ou les DSLs internes, la qualité du review IA est dégradée. Dans ce cas, utilisez l'IA uniquement pour les aspects génériques (sécurité, documentation) et laissez les aspects spécifiques au langage aux reviewers humains."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "3. Comment gérer le coût des reviews IA sur un grand nombre de PRs ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les coûts varient selon l'outil. GitHub Copilot Code Review est inclus dans l'abonnement Copilot (19"
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "className": [
                        "katex"
                      ]
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "className": [
                            "katex-mathml"
                          ]
                        },
                        "children": [
                          {
                            "type": "element",
                            "tag": "math",
                            "props": {
                              "xmlns": "http://www.w3.org/1998/Math/MathML"
                            },
                            "children": [
                              {
                                "type": "element",
                                "tag": "semantics",
                                "props": {},
                                "children": [
                                  {
                                    "type": "element",
                                    "tag": "mrow",
                                    "props": {},
                                    "children": [
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {
                                          "mathvariant": "normal"
                                        },
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "/"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "m"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "o"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "i"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "s"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {
                                          "mathvariant": "normal"
                                        },
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "/"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "d"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mover",
                                        "props": {
                                          "accent": "true"
                                        },
                                        "children": [
                                          {
                                            "type": "element",
                                            "tag": "mi",
                                            "props": {},
                                            "children": [
                                              {
                                                "type": "text",
                                                "value": "e"
                                              }
                                            ]
                                          },
                                          {
                                            "type": "element",
                                            "tag": "mo",
                                            "props": {},
                                            "children": [
                                              {
                                                "type": "text",
                                                "value": "ˊ"
                                              }
                                            ]
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "v"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "e"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "l"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "o"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "p"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "p"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "e"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "u"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "r"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mo",
                                        "props": {
                                          "stretchy": "false"
                                        },
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": ")"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {
                                          "mathvariant": "normal"
                                        },
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "."
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "C"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "o"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "d"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "e"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "R"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "a"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "b"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "b"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "i"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "t"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "a"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "u"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "n"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "t"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "i"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "e"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "r"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "g"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "r"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "a"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "t"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "u"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "i"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "t"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "l"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "i"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "m"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "i"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "t"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mover",
                                        "props": {
                                          "accent": "true"
                                        },
                                        "children": [
                                          {
                                            "type": "element",
                                            "tag": "mi",
                                            "props": {},
                                            "children": [
                                              {
                                                "type": "text",
                                                "value": "e"
                                              }
                                            ]
                                          },
                                          {
                                            "type": "element",
                                            "tag": "mo",
                                            "props": {},
                                            "children": [
                                              {
                                                "type": "text",
                                                "value": "ˊ"
                                              }
                                            ]
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "e"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "t"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "u"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "n"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "t"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "i"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "e"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "r"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "p"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "a"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "y"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "a"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "n"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "t"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mo",
                                        "props": {
                                          "stretchy": "false"
                                        },
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "("
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mtext",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": " "
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mn",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "19"
                                          }
                                        ]
                                      }
                                    ]
                                  },
                                  {
                                    "type": "element",
                                    "tag": "annotation",
                                    "props": {
                                      "encoding": "application/x-tex"
                                    },
                                    "children": [
                                      {
                                        "type": "text",
                                        "value": "/mois/développeur). CodeRabbit a un tier gratuit limité et un tier payant (~19"
                                      }
                                    ]
                                  }
                                ]
                              }
                            ]
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "className": [
                            "katex-html"
                          ],
                          "ariaHidden": "true"
                        },
                        "children": [
                          {
                            "type": "element",
                            "tag": "span",
                            "props": {
                              "className": [
                                "base"
                              ]
                            },
                            "children": [
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "strut"
                                  ],
                                  "style": "height:1em;vertical-align:-0.25em;"
                                },
                                "children": []
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "/"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "m"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "o"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "i"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "s"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "/"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "d"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "accent"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "element",
                                    "tag": "span",
                                    "props": {
                                      "className": [
                                        "vlist-t"
                                      ]
                                    },
                                    "children": [
                                      {
                                        "type": "element",
                                        "tag": "span",
                                        "props": {
                                          "className": [
                                            "vlist-r"
                                          ]
                                        },
                                        "children": [
                                          {
                                            "type": "element",
                                            "tag": "span",
                                            "props": {
                                              "className": [
                                                "vlist"
                                              ],
                                              "style": "height:0.6944em;"
                                            },
                                            "children": [
                                              {
                                                "type": "element",
                                                "tag": "span",
                                                "props": {
                                                  "style": "top:-3em;"
                                                },
                                                "children": [
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "pstrut"
                                                      ],
                                                      "style": "height:3em;"
                                                    },
                                                    "children": []
                                                  },
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "mord",
                                                        "mathnormal"
                                                      ]
                                                    },
                                                    "children": [
                                                      {
                                                        "type": "text",
                                                        "value": "e"
                                                      }
                                                    ]
                                                  }
                                                ]
                                              },
                                              {
                                                "type": "element",
                                                "tag": "span",
                                                "props": {
                                                  "style": "top:-3em;"
                                                },
                                                "children": [
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "pstrut"
                                                      ],
                                                      "style": "height:3em;"
                                                    },
                                                    "children": []
                                                  },
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "accent-body"
                                                      ],
                                                      "style": "left:-0.1944em;"
                                                    },
                                                    "children": [
                                                      {
                                                        "type": "element",
                                                        "tag": "span",
                                                        "props": {
                                                          "className": [
                                                            "mord"
                                                          ]
                                                        },
                                                        "children": [
                                                          {
                                                            "type": "text",
                                                            "value": "ˊ"
                                                          }
                                                        ]
                                                      }
                                                    ]
                                                  }
                                                ]
                                              }
                                            ]
                                          }
                                        ]
                                      }
                                    ]
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.03588em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "v"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "e"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.01968em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "l"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "o"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "pp"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "e"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "u"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.02778em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "r"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mclose"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": ")"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "."
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.07153em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "C"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "o"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "d"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "e"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.00773em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "R"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "abbi"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "t"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "a"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "u"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "n"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "t"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "i"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.02778em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "er"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.03588em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "g"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.02778em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "r"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "a"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "t"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "u"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "i"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.01968em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "tl"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "imi"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "t"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "accent"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "element",
                                    "tag": "span",
                                    "props": {
                                      "className": [
                                        "vlist-t"
                                      ]
                                    },
                                    "children": [
                                      {
                                        "type": "element",
                                        "tag": "span",
                                        "props": {
                                          "className": [
                                            "vlist-r"
                                          ]
                                        },
                                        "children": [
                                          {
                                            "type": "element",
                                            "tag": "span",
                                            "props": {
                                              "className": [
                                                "vlist"
                                              ],
                                              "style": "height:0.6944em;"
                                            },
                                            "children": [
                                              {
                                                "type": "element",
                                                "tag": "span",
                                                "props": {
                                                  "style": "top:-3em;"
                                                },
                                                "children": [
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "pstrut"
                                                      ],
                                                      "style": "height:3em;"
                                                    },
                                                    "children": []
                                                  },
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "mord",
                                                        "mathnormal"
                                                      ]
                                                    },
                                                    "children": [
                                                      {
                                                        "type": "text",
                                                        "value": "e"
                                                      }
                                                    ]
                                                  }
                                                ]
                                              },
                                              {
                                                "type": "element",
                                                "tag": "span",
                                                "props": {
                                                  "style": "top:-3em;"
                                                },
                                                "children": [
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "pstrut"
                                                      ],
                                                      "style": "height:3em;"
                                                    },
                                                    "children": []
                                                  },
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "accent-body"
                                                      ],
                                                      "style": "left:-0.1944em;"
                                                    },
                                                    "children": [
                                                      {
                                                        "type": "element",
                                                        "tag": "span",
                                                        "props": {
                                                          "className": [
                                                            "mord"
                                                          ]
                                                        },
                                                        "children": [
                                                          {
                                                            "type": "text",
                                                            "value": "ˊ"
                                                          }
                                                        ]
                                                      }
                                                    ]
                                                  }
                                                ]
                                              }
                                            ]
                                          }
                                        ]
                                      }
                                    ]
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "e"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "t"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "u"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "n"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "t"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "i"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.02778em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "er"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "p"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "a"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.03588em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "y"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "an"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "t"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mopen"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "("
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mspace",
                                    "nobreak"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": " "
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "19"
                                  }
                                ]
                              }
                            ]
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": "/mois/utilisateur). Une intégration API directe coûte environ 0,5 à 2"
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "className": [
                        "katex"
                      ]
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "className": [
                            "katex-mathml"
                          ]
                        },
                        "children": [
                          {
                            "type": "element",
                            "tag": "math",
                            "props": {
                              "xmlns": "http://www.w3.org/1998/Math/MathML"
                            },
                            "children": [
                              {
                                "type": "element",
                                "tag": "semantics",
                                "props": {},
                                "children": [
                                  {
                                    "type": "element",
                                    "tag": "mrow",
                                    "props": {},
                                    "children": [
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "p"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "a"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "r"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "P"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "R"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "s"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "e"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "l"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "o"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "n"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "l"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "a"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "t"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "a"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "i"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "l"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "l"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "e"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {
                                          "mathvariant": "normal"
                                        },
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "."
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "S"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "u"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "r"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mn",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "50"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "P"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "R"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "s"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {
                                          "mathvariant": "normal"
                                        },
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "/"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "s"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "e"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "m"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "a"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "i"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "n"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "e"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mo",
                                        "props": {
                                          "separator": "true"
                                        },
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": ","
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "l"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "e"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "c"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "o"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mover",
                                        "props": {
                                          "accent": "true"
                                        },
                                        "children": [
                                          {
                                            "type": "element",
                                            "tag": "mi",
                                            "props": {},
                                            "children": [
                                              {
                                                "type": "text",
                                                "value": "u"
                                              }
                                            ]
                                          },
                                          {
                                            "type": "element",
                                            "tag": "mo",
                                            "props": {},
                                            "children": [
                                              {
                                                "type": "text",
                                                "value": "^"
                                              }
                                            ]
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "t"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "e"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "s"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "t"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "d"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mi",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "e"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mn",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "25"
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mover",
                                        "props": {
                                          "accent": "true"
                                        },
                                        "children": [
                                          {
                                            "type": "element",
                                            "tag": "mi",
                                            "props": {},
                                            "children": [
                                              {
                                                "type": "text",
                                                "value": "a"
                                              }
                                            ]
                                          },
                                          {
                                            "type": "element",
                                            "tag": "mo",
                                            "props": {},
                                            "children": [
                                              {
                                                "type": "text",
                                                "value": "ˋ"
                                              }
                                            ]
                                          }
                                        ]
                                      },
                                      {
                                        "type": "element",
                                        "tag": "mn",
                                        "props": {},
                                        "children": [
                                          {
                                            "type": "text",
                                            "value": "100"
                                          }
                                        ]
                                      }
                                    ]
                                  },
                                  {
                                    "type": "element",
                                    "tag": "annotation",
                                    "props": {
                                      "encoding": "application/x-tex"
                                    },
                                    "children": [
                                      {
                                        "type": "text",
                                        "value": " par PR selon la taille. Sur 50 PRs/semaine, le coût est de 25 à 100"
                                      }
                                    ]
                                  }
                                ]
                              }
                            ]
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "className": [
                            "katex-html"
                          ],
                          "ariaHidden": "true"
                        },
                        "children": [
                          {
                            "type": "element",
                            "tag": "span",
                            "props": {
                              "className": [
                                "base"
                              ]
                            },
                            "children": [
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "strut"
                                  ],
                                  "style": "height:1em;vertical-align:-0.25em;"
                                },
                                "children": []
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "p"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "a"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.02778em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "r"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.00773em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "PR"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "se"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.01968em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "l"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "o"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "n"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.01968em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "l"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "a"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "t"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "ai"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.01968em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "ll"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "e"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "."
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.05764em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "S"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "u"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.02778em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "r"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "50"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.00773em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "PR"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "s"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "/"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "se"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "main"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "e"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mpunct"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": ","
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mspace"
                                  ],
                                  "style": "margin-right:0.1667em;"
                                },
                                "children": []
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ],
                                  "style": "margin-right:0.01968em;"
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "l"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "eco"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "accent"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "element",
                                    "tag": "span",
                                    "props": {
                                      "className": [
                                        "vlist-t"
                                      ]
                                    },
                                    "children": [
                                      {
                                        "type": "element",
                                        "tag": "span",
                                        "props": {
                                          "className": [
                                            "vlist-r"
                                          ]
                                        },
                                        "children": [
                                          {
                                            "type": "element",
                                            "tag": "span",
                                            "props": {
                                              "className": [
                                                "vlist"
                                              ],
                                              "style": "height:0.6944em;"
                                            },
                                            "children": [
                                              {
                                                "type": "element",
                                                "tag": "span",
                                                "props": {
                                                  "style": "top:-3em;"
                                                },
                                                "children": [
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "pstrut"
                                                      ],
                                                      "style": "height:3em;"
                                                    },
                                                    "children": []
                                                  },
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "mord",
                                                        "mathnormal"
                                                      ]
                                                    },
                                                    "children": [
                                                      {
                                                        "type": "text",
                                                        "value": "u"
                                                      }
                                                    ]
                                                  }
                                                ]
                                              },
                                              {
                                                "type": "element",
                                                "tag": "span",
                                                "props": {
                                                  "style": "top:-3em;"
                                                },
                                                "children": [
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "pstrut"
                                                      ],
                                                      "style": "height:3em;"
                                                    },
                                                    "children": []
                                                  },
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "accent-body"
                                                      ],
                                                      "style": "left:-0.2222em;"
                                                    },
                                                    "children": [
                                                      {
                                                        "type": "element",
                                                        "tag": "span",
                                                        "props": {
                                                          "className": [
                                                            "mord"
                                                          ]
                                                        },
                                                        "children": [
                                                          {
                                                            "type": "text",
                                                            "value": "^"
                                                          }
                                                        ]
                                                      }
                                                    ]
                                                  }
                                                ]
                                              }
                                            ]
                                          }
                                        ]
                                      }
                                    ]
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "t"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "es"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "t"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "d"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "mathnormal"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "e"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "25"
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord",
                                    "accent"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "element",
                                    "tag": "span",
                                    "props": {
                                      "className": [
                                        "vlist-t"
                                      ]
                                    },
                                    "children": [
                                      {
                                        "type": "element",
                                        "tag": "span",
                                        "props": {
                                          "className": [
                                            "vlist-r"
                                          ]
                                        },
                                        "children": [
                                          {
                                            "type": "element",
                                            "tag": "span",
                                            "props": {
                                              "className": [
                                                "vlist"
                                              ],
                                              "style": "height:0.6944em;"
                                            },
                                            "children": [
                                              {
                                                "type": "element",
                                                "tag": "span",
                                                "props": {
                                                  "style": "top:-3em;"
                                                },
                                                "children": [
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "pstrut"
                                                      ],
                                                      "style": "height:3em;"
                                                    },
                                                    "children": []
                                                  },
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "mord",
                                                        "mathnormal"
                                                      ]
                                                    },
                                                    "children": [
                                                      {
                                                        "type": "text",
                                                        "value": "a"
                                                      }
                                                    ]
                                                  }
                                                ]
                                              },
                                              {
                                                "type": "element",
                                                "tag": "span",
                                                "props": {
                                                  "style": "top:-3em;"
                                                },
                                                "children": [
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "pstrut"
                                                      ],
                                                      "style": "height:3em;"
                                                    },
                                                    "children": []
                                                  },
                                                  {
                                                    "type": "element",
                                                    "tag": "span",
                                                    "props": {
                                                      "className": [
                                                        "accent-body"
                                                      ],
                                                      "style": "left:-0.25em;"
                                                    },
                                                    "children": [
                                                      {
                                                        "type": "element",
                                                        "tag": "span",
                                                        "props": {
                                                          "className": [
                                                            "mord"
                                                          ]
                                                        },
                                                        "children": [
                                                          {
                                                            "type": "text",
                                                            "value": "ˋ"
                                                          }
                                                        ]
                                                      }
                                                    ]
                                                  }
                                                ]
                                              }
                                            ]
                                          }
                                        ]
                                      }
                                    ]
                                  }
                                ]
                              },
                              {
                                "type": "element",
                                "tag": "span",
                                "props": {
                                  "className": [
                                    "mord"
                                  ]
                                },
                                "children": [
                                  {
                                    "type": "text",
                                    "value": "100"
                                  }
                                ]
                              }
                            ]
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": "/semaine, marginal par rapport au coût d'un développeur. Le ROI est positif dès qu'une review IA prévient un seul bug en production."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "4. Comment éviter que les développeurs seniors rejettent l'IA en code review ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "En les impliquant dans la configuration. Les seniors qui configurent les règles de l'outil (quels patterns l'IA doit signaler, quels patterns ignorer) deviennent propriétaires de l'outil plutôt que sujets. Leur expertise améliore la qualité de l'IA, et leur résistance diminue quand ils voient leurs propres standards appliqués automatiquement."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "5. L'IA en code review peut-elle nuire à l'apprentissage des développeurs juniors ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Risque réel si mal géré. Un junior qui reçoit du feedback uniquement de l'IA apprend les patterns que l'IA connaît, mais pas les jugements contextuels que les seniors auraient partagés. La règle : l'IA est le premier reviewer pour les juniors (feedback immédiat sur style et sécurité), mais la review humaine d'un senior reste obligatoire. Le senior peut commenter sur \"pourquoi cette architecture plutôt qu'une autre\", ce que l'IA ne peut pas faire."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "6. Comment mesurer si l'IA améliore réellement la qualité du code sur 6 mois ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Deux métriques combinées : le bug escape rate (bugs détectés en production / bugs détectés en review) et la densité de défauts par KLOC sur le code produit depuis l'adoption. Si le bug escape rate diminue et que la densité de défauts diminue, l'IA améliore la qualité. Si seulement le bug escape rate diminue, l'IA détecte mieux mais ne change pas les pratiques de développement : il faut renforcer la formation."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Testez la readiness IA de votre équipe →",
              "href": "/mes-ressources",
              "title": "Ressource gratuite : AI-Ready Engineering Team Checklist",
              "type": "resource"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La checklist AI-Ready inclut une section dédiée à l'adoption des outils IA en code review : critères de sélection d'outil, règles d'intégration, et métriques de suivi à 30 et 90 jours."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "style",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"
              }
            ]
          }
        ],
        "toc": {
          "title": "",
          "searchDepth": 2,
          "depth": 2,
          "links": [
            {
              "id": "ce-que-lia-trouve-bien",
              "depth": 2,
              "text": "Ce que l'IA trouve bien"
            },
            {
              "id": "ce-que-lia-rate-systématiquement",
              "depth": 2,
              "text": "Ce que l'IA rate systématiquement"
            },
            {
              "id": "limpact-sur-la-culture-de-review",
              "depth": 2,
              "text": "L'impact sur la culture de review"
            },
            {
              "id": "les-règles-dintégration-qui-fonctionnent",
              "depth": 2,
              "text": "Les règles d'intégration qui fonctionnent"
            },
            {
              "id": "les-métriques-de-suivi-à-6-mois",
              "depth": 2,
              "text": "Les métriques de suivi à 6 mois"
            },
            {
              "id": "les-outils-et-leur-positionnement",
              "depth": 2,
              "text": "Les outils et leur positionnement"
            },
            {
              "id": "faq-sur-lia-en-code-review",
              "depth": 2,
              "text": "FAQ sur l'IA en code review"
            }
          ]
        }
      },
      "_type": "markdown",
      "_id": "content:fr:intelligence-artificielle:ia-code-review-retour-experience.md",
      "_source": "content",
      "_file": "fr/intelligence-artificielle/ia-code-review-retour-experience.md",
      "_stem": "fr/intelligence-artificielle/ia-code-review-retour-experience",
      "_extension": "md"
    },
    {
      "_path": "/fr/pratiques-agiles/reduire-work-in-progress-velocite",
      "_dir": "pratiques-agiles",
      "_draft": false,
      "_partial": false,
      "_locale": "",
      "title": "Limiter le Work In Progress : le levier le plus sous-estimé",
      "description": "La loi de Little appliquée à l'engineering : réduire le WIP est plus efficace que d'accélérer les développeurs. La démonstration et le protocole de mise en œuvre.",
      "id": 32,
      "date": "2026-03-18",
      "listed": true,
      "nocomments": false,
      "hidden": false,
      "categories": [
        "pratiques-agiles"
      ],
      "tags": [
        "Work In Progress",
        "WIP",
        "Kanban",
        "Flow"
      ],
      "--cover": "covers/articles/reduire-work-in-progress.jpg",
      "readingTime": {
        "text": "9 min read",
        "minutes": 8.105,
        "time": 486300,
        "words": 1621
      },
      "body": {
        "type": "root",
        "children": [
          {
            "type": "element",
            "tag": "h1",
            "props": {
              "id": "limiter-le-work-in-progress-le-levier-le-plus-sous-estimé"
            },
            "children": [
              {
                "type": "text",
                "value": "Limiter le Work In Progress : le levier le plus sous-estimé"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "J'accompagnais une équipe produit de 8 développeurs chez un client dans le secteur financier. Ils me demandaient comment livrer plus vite. Je leur ai demandé de compter le nombre de stories \"In Progress\" sur leur board."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Il y en avait 22."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "22 stories pour 8 développeurs. Chaque développeur avait en moyenne 2,75 sujets en cours simultanément. Certains jonglaient entre 4 contextes différents dans la même journée."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "J'ai posé la question suivante : \"Quelle est la dernière fois qu'une story est allée de 'To Do' à 'Done' en moins de 3 jours ?\" Silence. L'un d'eux a vérifié Jira. La réponse était : 6 semaines auparavant."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La solution que je leur ai proposée n'était pas d'embaucher, ni de changer de framework, ni d'adopter une nouvelle méthodologie. C'était de réduire le nombre de choses en cours simultanément. Ça semblait trop simple. C'était la bonne réponse."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "la-loi-de-little-la-démonstration-mathématique"
            },
            "children": [
              {
                "type": "text",
                "value": "La loi de Little : la démonstration mathématique"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La loi de Little, formulée par le mathématicien John Dutton Converse Little en 1961, s'applique à tout système de flux (file d'attente bancaire, réseau logistique, ou équipe de développement logiciel)."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Lead Time = Work In Progress / Throughput"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Traduction pour l'engineering : si votre équipe livre 10 stories par semaine (throughput) et a 30 stories en cours simultanément (WIP), le lead time moyen est de 3 semaines. Pour réduire le lead time à 1 semaine sans changer le throughput : réduire le WIP à 10 stories."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La démonstration chiffrée est implacable."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Scénario A : WIP illimité"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : équipe de 5 développeurs, 15 stories en cours (3 par développeur), throughput de 10 stories par semaine. Lead Time moyen : 15 / 10 = "
              },
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "1,5 semaine"
                  }
                ]
              },
              {
                "type": "text",
                "value": "."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Scénario B : WIP limité à 8"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : même équipe, même throughput, 8 stories en cours. Lead Time moyen : 8 / 10 = "
              },
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "0,8 semaine"
                  }
                ]
              },
              {
                "type": "text",
                "value": " (−47%)."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Scénario C : WIP limité à 5"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : 5 stories en cours (1 par développeur). Lead Time moyen : 5 / 10 = "
              },
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "0,5 semaine"
                  }
                ]
              },
              {
                "type": "text",
                "value": " (−67%)."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "En réduisant le WIP de 15 à 5, le lead time est divisé par 3, sans changer une ligne de code, sans recruter, sans changer de framework. C'est contre-intuitif dans une culture qui valorise l'occupation maximale. C'est pourtant ce que la théorie des contraintes de Goldratt et les principes Kanban enseignent depuis des décennies."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "pourquoi-le-wip-augmente-naturellement"
            },
            "children": [
              {
                "type": "text",
                "value": "Pourquoi le WIP augmente naturellement"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Dans la plupart des équipes, le WIP augmente sans décision consciente. Les mécanismes sont structurels."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le multitâche comme norme."
                  }
                ]
              },
              {
                "type": "text",
                "value": " Un développeur bloqué sur une story en attend le feedback, démarre une deuxième story, est interrompu pour une troisième urgence. Sans règle explicite, 3 stories en parallèle par développeur devient la norme, et personne ne la remet en question."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La peur du \"slack\"."
                  }
                ]
              },
              {
                "type": "text",
                "value": " Un développeur qui n'a rien en cours est perçu comme improductif. Résultat : chacun s'assigne une nouvelle story plutôt que d'aider un collègue à terminer. Le système optimise l'occupation individuelle au détriment du flux collectif."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les dépendances non résolues."
                  }
                ]
              },
              {
                "type": "text",
                "value": " Une story en attente d'une décision produit, d'une clarification métier, ou d'une PR de review contribue au WIP sans avancer. Elle bloque la colonne sans produire de valeur."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le "
                  },
                  {
                    "type": "element",
                    "tag": "a",
                    "props": {
                      "href": "/fr/pratiques-agiles/anti-patterns-backlog"
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "backlog infini"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": "."
                  }
                ]
              },
              {
                "type": "text",
                "value": " Si le backlog a 200 stories priorisées et qu'il n'y a pas de limite explicite, l'équipe accepte plus qu'elle ne peut faire. C'est le "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/pratiques-agiles/sprint-planning-efficace"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "sprint planning"
                  }
                ]
              },
              {
                "type": "text",
                "value": " qui génère du WIP excessif."
              }
            ]
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Réserver mon diagnostic gratuit →",
              "href": "https://app.kamanga.fr/forms/discovery-call",
              "title": "Votre lead time dépasse 3 semaines et vous cherchez les bons leviers pour le réduire ?",
              "type": "call"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Identifier les bonnes limites de WIP pour votre équipe nécessite une analyse du flux actuel. En 30 minutes, je calcule votre lead time théorique, j'identifie les goulots d'étranglement, et je définis avec vous les limites de WIP adaptées à votre contexte."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "le-protocole-dimplémentation-en-5-étapes"
            },
            "children": [
              {
                "type": "text",
                "value": "Le protocole d'implémentation en 5 étapes"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Étape 1 : Mesurer le WIP actuel."
                  }
                ]
              },
              {
                "type": "text",
                "value": " Avant d'imposer une limite, mesurer l'état réel. Pendant 2 semaines, poser ces questions en daily standup : combien de stories chaque développeur a-t-il en cours aujourd'hui ? Combien de stories sont en cours depuis plus de 5 jours ? Quel est le nombre total de stories \"In Progress\" sur le board ? Calculer la moyenne. C'est le WIP de départ."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Étape 2 : Définir les limites initiales."
                  }
                ]
              },
              {
                "type": "text",
                "value": " Règle pratique de départ : limite WIP = nombre de développeurs × 1,5. Pour une équipe de 6 : limite WIP = 9. C'est plus restrictif que l'état naturel (souvent 2 à 3 fois le nombre de développeurs) mais pas encore au niveau optimal."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La limite s'applique par colonne du board Kanban, pas au total :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "\"In Progress\" : limite = N développeurs"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "\"In Review\" : limite = N/2"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "\"In Testing\" : limite = N/3"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Étape 3 : Rendre la limite visible et automatique."
                  }
                ]
              },
              {
                "type": "text",
                "value": " Sur Jira, configurer le \"Work In Progress Limit\" sur chaque colonne du board. Jira affiche une alerte visuelle (colonne en rouge) quand la limite est atteinte. La règle doit être visible passivement, pas nécessiter une vérification active."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Étape 4 : Créer la règle \"finir avant de commencer\"."
                  }
                ]
              },
              {
                "type": "text",
                "value": " Quand la limite WIP est atteinte, avant d'ouvrir une nouvelle story : fermer une story en cours. Ce qui implique concrètement d'aider un collègue à débloquer sa story, de prioriser les code reviews en attente (qui bloquent les stories en review), ou de diviser une grande story bloquée en sous-stories terminables."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Étape 5 : Ajuster la limite après 4 sprints."
                  }
                ]
              },
              {
                "type": "text",
                "value": " La limite initiale n'est pas la limite optimale. Si le board n'atteint jamais la limite : trop haute, la réduire de 20%. Si la limite bloque constamment le flux : peut-être trop basse, ou signal d'un goulot d'étranglement à résoudre autrement."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "les-résistances-et-comment-les-adresser"
            },
            "children": [
              {
                "type": "text",
                "value": "Les résistances et comment les adresser"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "\"Je suis bloqué, je dois bien commencer autre chose.\""
                  }
                ]
              },
              {
                "type": "text",
                "value": " Cette résistance est légitime. Ma réponse : le blocage est l'information importante, pas le contournement. Un développeur bloqué doit d'abord chercher à débloquer : escalader la dépendance, poser la question dans Slack, demander de l'aide. Ce n'est qu'après 2 heures de blocage sans perspective de résolution que commencer une autre story est acceptable. Et ce dépassement doit être visible sur le board."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "\"Le business veut des estimations et une limite WIP les rend impossibles.\""
                  }
                ]
              },
              {
                "type": "text",
                "value": " Faux. Avec une limite WIP et la loi de Little, les prédictions sont plus précises, pas moins. \"Nous avons X stories en cours et Y en backlog. Avec notre "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/pratiques-agiles/story-points-estimation-agile-alternative"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "throughput"
                  }
                ]
              },
              {
                "type": "text",
                "value": " de 10 stories par semaine et une limite WIP de 8, la feature Z sera livrée dans cet intervalle de confiance.\" C'est plus précis qu'une vélocité en story points qui dérive avec le temps."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "\"Mes développeurs vont s'ennuyer en attendant.\""
                  }
                ]
              },
              {
                "type": "text",
                "value": " Les développeurs ne s'ennuient jamais : ils ont du backlog et de la dette technique. La vraie question est : qu'est-ce qui est plus précieux, commencer une nouvelle story ou aider à terminer les stories en cours ? La réponse est presque toujours la deuxième option. Finir une story livrée au client vaut plus que démarrer une story qui attendra 3 semaines dans la file."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "ce-que-ça-a-changé"
            },
            "children": [
              {
                "type": "text",
                "value": "Ce que ça a changé"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Dans l'équipe de 8 développeurs mentionnée en introduction, le WIP moyen était de 22 stories simultanées. Après implémentation des limites WIP à 10 et de la règle \"finir avant de commencer\", le WIP a baissé à 9 en 6 semaines. Le lead time moyen est passé de 18 jours à 7 jours. Le nombre de stories livrées par sprint n'a pas changé, mais leur délai de livraison a été divisé par 2,5."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Les métriques à suivre pour mesurer l'impact : WIP moyen hebdomadaire (la tendance doit baisser), age du WIP en jours (les stories vieilles de plus de 2 sprints sont des signaux d'alerte), et distribution du lead time par story (une distribution qui se resserre indique un flux qui se normalise)."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Ce n'était jamais un problème de personnes. C'était un problème de système, et le système a changé quand les règles ont changé."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "faq-sur-les-limites-de-wip"
            },
            "children": [
              {
                "type": "text",
                "value": "FAQ sur les limites de WIP"
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "1. Les limites de WIP s'appliquent-elles en Scrum comme en Kanban ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Oui. En Kanban, les limites WIP sont un principe fondamental. En Scrum, elles s'appliquent au niveau du sprint board. La différence est que Scrum permet de remplir le sprint à 100% de la capacité théorique, ce qui crée du WIP élevé. En ajoutant une limite explicite (ex: max 2 stories par développeur simultanément), l'équipe Scrum bénéficie des mêmes avantages de flux que Kanban."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "2. Comment gérer les urgences qui obligent à dépasser la limite WIP ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les urgences existent et peuvent justifier de dépasser temporairement la limite. La règle : chaque dépassement est une décision consciente et visible, la colonne du board vire au rouge. Après chaque urgence, analyser en rétro : était-ce vraiment une urgence ? Aurait-on pu l'anticiper ? Les équipes qui dépassent la limite pour urgence chaque semaine ont un problème de priorisation, pas de WIP."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "3. Quelle est la limite WIP optimale ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Il n'y a pas de réponse universelle : elle dépend de la taille d'équipe, de la complexité des stories, et du niveau d'interdépendances. La règle empirique est de commencer à 1,5 fois le nombre de développeurs et d'ajuster vers le bas jusqu'à trouver la valeur où le lead time se stabilise sans créer de goulot d'étranglement. En pratique, la plupart des équipes trouvent leur optimum entre 1 et 2 fois le nombre de développeurs."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "4. Comment les limites WIP interagissent-elles avec les bugs urgents ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les bugs urgents (P1/P0) sont traités comme des interruptions explicites. Un bug P1 peut entrer en cours sans respecter la limite WIP, mais il doit être la priorité absolue jusqu'à sa résolution. Le développeur qui prend un bug P1 stationne sa story en cours dans une colonne \"On Hold\". Le WIP réel ne dépasse pas la limite : il y a une substitution consciente et visible."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "5. Comment convaincre le management que moins de WIP n'est pas moins de travail ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Par la démonstration chiffrée de la loi de Little. Montrer le calcul : avec un WIP de 20 et un throughput de 10 stories par semaine, le lead time est de 2 semaines. Avec un WIP de 10, le lead time est de 1 semaine. Même throughput, deux fois plus de réactivité pour le business. Le business valorise la rapidité de livraison : les limites WIP la produisent sans recruter."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Télécharger le guide gratuit →",
              "href": "/mes-ressources",
              "title": "Ressource gratuite : Guide Lead Time -50% en 90 jours",
              "type": "resource"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le guide complet pour réduire votre lead time en 90 jours inclut un chapitre détaillé sur l'implémentation des limites WIP, les métriques de suivi, et les benchmarks par taille d'équipe, avec les données issues de mes accompagnements terrain."
                  }
                ]
              }
            ]
          }
        ],
        "toc": {
          "title": "",
          "searchDepth": 2,
          "depth": 2,
          "links": [
            {
              "id": "la-loi-de-little-la-démonstration-mathématique",
              "depth": 2,
              "text": "La loi de Little : la démonstration mathématique"
            },
            {
              "id": "pourquoi-le-wip-augmente-naturellement",
              "depth": 2,
              "text": "Pourquoi le WIP augmente naturellement"
            },
            {
              "id": "le-protocole-dimplémentation-en-5-étapes",
              "depth": 2,
              "text": "Le protocole d'implémentation en 5 étapes"
            },
            {
              "id": "les-résistances-et-comment-les-adresser",
              "depth": 2,
              "text": "Les résistances et comment les adresser"
            },
            {
              "id": "ce-que-ça-a-changé",
              "depth": 2,
              "text": "Ce que ça a changé"
            },
            {
              "id": "faq-sur-les-limites-de-wip",
              "depth": 2,
              "text": "FAQ sur les limites de WIP"
            }
          ]
        }
      },
      "_type": "markdown",
      "_id": "content:fr:pratiques-agiles:reduire-work-in-progress-velocite.md",
      "_source": "content",
      "_file": "fr/pratiques-agiles/reduire-work-in-progress-velocite.md",
      "_stem": "fr/pratiques-agiles/reduire-work-in-progress-velocite",
      "_extension": "md"
    },
    {
      "_path": "/fr/dette-technique/pair-programming-roi-conditions",
      "_dir": "dette-technique",
      "_draft": false,
      "_partial": false,
      "_locale": "",
      "title": "Pair programming : ROI réel et conditions de succès",
      "description": "Les études montrent un ROI de 15% sur la qualité à long terme — mais seulement dans certaines conditions. Ce que la recherche dit vraiment sur le pair programming.",
      "id": 31,
      "date": "2026-03-16",
      "listed": true,
      "nocomments": false,
      "hidden": false,
      "categories": [
        "dette-technique"
      ],
      "tags": [
        "Pair Programming",
        "ROI",
        "Pratiques Engineering"
      ],
      "--cover": "covers/articles/pair-programming-roi.jpg",
      "readingTime": {
        "text": "8 min read",
        "minutes": 7.08,
        "time": 424800,
        "words": 1416
      },
      "body": {
        "type": "root",
        "children": [
          {
            "type": "element",
            "tag": "h1",
            "props": {
              "id": "pair-programming-roi-réel-et-conditions-de-succès"
            },
            "children": [
              {
                "type": "text",
                "value": "Pair programming : ROI réel et conditions de succès"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "J'accompagnais une équipe dans une banque d'investissement parisienne : 18 développeurs, une culture tech solide. Trois nouveaux développeurs venaient de rejoindre l'équipe. Habituellement, leur montée en compétence prenait 8 semaines avant d'être autonomes sur les modules critiques. J'ai proposé d'introduire le pair programming exclusivement sur leur onboarding : chaque nouveau développeur pairait systématiquement avec un senior sur ses premières stories complexes. Le résultat, mesuré 6 semaines plus tard : les trois nouvelles recrues étaient autonomes en 4 semaines au lieu de 8. Et sans qu'on le planifie, les seniors avaient commencé à se pairer entre eux sur les stories de refactoring difficiles."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le pair programming est soit adulé par les équipes XP, soit rejeté par les managers qui voient \"deux personnes sur un seul clavier\". Rarement évalué objectivement. Or les données sont là, et elles sont plus nuancées que ce que les deux camps affirment."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "J'ai introduit le pair programming dans une dizaine d'équipes au cours des 10 dernières années, dans la finance, les médias, les télécoms. Certaines fois, ça a transformé la culture et la qualité. D'autres fois, ça a créé des tensions et été abandonné en 3 semaines. La différence ne tenait pas à la pratique, mais aux conditions d'introduction."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "ce-que-la-recherche-dit-vraiment"
            },
            "children": [
              {
                "type": "text",
                "value": "Ce que la recherche dit vraiment"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "L'étude de référence est celle de Laurie Williams et Robert Kessler (2000, University of Utah) : sur un projet de développement logiciel, le pair programming produit un code avec "
              },
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "15% moins de défauts"
                  }
                ]
              },
              {
                "type": "text",
                "value": " que le développement solo, mais avec "
              },
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "15% de temps supplémentaire"
                  }
                ]
              },
              {
                "type": "text",
                "value": " à court terme."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Le ROI net sur le long terme est positif pour une raison simple : le coût d'un défaut en production est 10 à 100 fois supérieur au coût de le détecter pendant le développement. 15% de temps en plus pour 15% de défauts en moins, c'est rentable dès que les défauts ont un coût significatif."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Une méta-analyse de 2007 (Hannay et al., 18 études) nuance cependant les résultats : le bénéfice du pair programming est plus élevé pour les "
              },
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "tâches complexes"
                  }
                ]
              },
              {
                "type": "text",
                "value": " et "
              },
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "les juniors qui travaillent avec des seniors"
                  }
                ]
              },
              {
                "type": "text",
                "value": ". Sur des tâches simples ou répétitives, l'overhead est présent sans le bénéfice proportionnel."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce que ça signifie concrètement"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : le pair programming n'est pas une pratique à appliquer uniformément. C'est une pratique à utiliser sur les bonnes tâches, dans les bonnes conditions."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "quand-le-pair-programming-dégrade-la-productivité"
            },
            "children": [
              {
                "type": "text",
                "value": "Quand le pair programming dégrade la productivité"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Avant les conditions de succès, les conditions d'échec, parce qu'elles sont plus fréquentes."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Tâches trop simples"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : un bug trivial, une modification de configuration, une story de 1 point. L'overhead cognitif de coordonner deux personnes dépasse le bénéfice. Résultat : frustration et sentiment de temps perdu."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Parité trop déséquilibrée sans intention pédagogique"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : un senior qui \"dicte\" pendant qu'un junior \"exécute\" n'est pas du pair programming, c'est de la supervision déguisée. C'est épuisant pour les deux et n'apporte pas les bénéfices de qualité attendus."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Sessions trop longues sans rotation"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : après 90 minutes de pair programming intensif, la fatigue cognitive s'accumule. Des sessions de plus de 2 heures sans pause produisent des erreurs que des sessions de 90 minutes n'auraient pas produites."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Introduction imposée sans explication"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : \"Désormais, toutes les stories se font en pair programming.\" Sans comprendre pourquoi, les développeurs perçoivent la pratique comme un manque de confiance. La résistance est immédiate et dure."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Réserver mon diagnostic gratuit →",
              "href": "https://app.kamanga.fr/forms/discovery-call",
              "title": "Vous voulez introduire le pair programming mais vous ne savez pas comment éviter la résistance ?",
              "type": "call"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Vous avez tenté de lancer le pair programming et ça n'a pas pris, ou vous voulez bien faire du premier coup pour ne pas brûler le capital de confiance de l'équipe. L'introduction réussie dépend de la communication des objectifs, du choix des premières tâches, et du format adapté à votre contexte. En 30 minutes, on définit la stratégie adaptée."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "les-4-conditions-de-succès"
            },
            "children": [
              {
                "type": "text",
                "value": "Les 4 conditions de succès"
              }
            ]
          },
          {
            "type": "element",
            "tag": "h3",
            "props": {
              "id": "condition-1-le-bon-contexte-de-tâche"
            },
            "children": [
              {
                "type": "text",
                "value": "Condition 1 : Le bon contexte de tâche"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Le pair programming apporte le plus de valeur sur :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les tâches complexes avec des contraintes non-triviales"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les tâches dans des zones de code peu connues ou à haut risque"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les tâches d'architecture ou de design"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'onboarding d'un nouveau développeur sur un module spécifique"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Il apporte peu de valeur sur :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les tâches répétitives et bien définies"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les investigations longues et exploratoires (pair review après, pas pair programming pendant)"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les optimisations de performance nécessitant du profiling individuel"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "h3",
            "props": {
              "id": "condition-2-la-rotation-du-rôle-drivernavigator"
            },
            "children": [
              {
                "type": "text",
                "value": "Condition 2 : La rotation du rôle driver/navigator"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Le format classique est driver/navigator : le driver écrit le code, le navigator réfléchit à la direction et détecte les erreurs. La rotation doit être explicite et fréquente, toutes les 25 à 30 minutes (technique Pomodoro adaptée)."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Sans rotation, l'un des deux s'ennuie ou se décroche. Avec rotation, les deux restent engagés et le code bénéficie de deux perspectives actives."
              }
            ]
          },
          {
            "type": "element",
            "tag": "h3",
            "props": {
              "id": "condition-3-la-parité-ajustée-à-lobjectif"
            },
            "children": [
              {
                "type": "text",
                "value": "Condition 3 : La parité ajustée à l'objectif"
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "strong",
                    "props": {},
                    "children": [
                      {
                        "type": "text",
                        "value": "Objectif qualité"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " : deux développeurs de niveau similaire, l'un challenge l'autre, la qualité est le produit des deux regards"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "strong",
                    "props": {},
                    "children": [
                      {
                        "type": "text",
                        "value": "Objectif formation"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " : un senior + un junior avec intention pédagogique explicite, le senior explique ses raisonnements, le junior pose des questions sans être jugé"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "strong",
                    "props": {},
                    "children": [
                      {
                        "type": "text",
                        "value": "Objectif connaissance métier"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " : un développeur qui connaît le code + un développeur qui connaît le métier, le knowledge sharing est bidirectionnel"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "h3",
            "props": {
              "id": "condition-4-la-durée-et-le-rythme"
            },
            "children": [
              {
                "type": "text",
                "value": "Condition 4 : La durée et le rythme"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Sessions recommandées : 90 à 120 minutes maximum par bloc, avec une pause de 15 minutes. Maximum 4 heures de pair programming par jour pour une personne. Au-delà, la qualité baisse et la fatigue s'accumule."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "les-3-formats"
            },
            "children": [
              {
                "type": "text",
                "value": "Les 3 formats"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Driver/Navigator (classique)"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : un développeur code, l'autre navigue. Rotation toutes les 25-30 minutes. Format le plus connu, le plus polyvalent."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ping-Pong (TDD)"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : développeur A écrit un test qui échoue, développeur B écrit le code minimum pour le faire passer, développeur A écrit le prochain test. Particulièrement efficace pour ancrer le TDD dans les habitudes de l'équipe, et pour rendre le TDD moins aride pour les développeurs qui résistent à l'écriture de tests."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Mob programming (Ensemble)"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : l'équipe entière (3 à 6 personnes) travaille sur le même problème avec un seul clavier. Un driver, le reste navigue. Rotation toutes les 7-15 minutes. Très efficace pour les décisions d'architecture et l'onboarding accéléré, coûteux en temps d'équipe."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "comment-lintroduire-progressivement-sans-résistance"
            },
            "children": [
              {
                "type": "text",
                "value": "Comment l'introduire progressivement sans résistance"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Semaine 1-2"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : proposition volontaire. \"Si quelqu'un veut essayer le pair programming sur sa prochaine story complexe, voilà comment ça fonctionne.\" Trouver 2 volontaires enthousiastes."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Semaine 3-4"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : débrief public. Partager les retours des premiers pairs en rétrospective. Ne pas idéaliser, partager les difficultés aussi."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Mois 2"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : intégrer dans la "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/dette-technique/definition-of-done-qualite"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "DoD"
                  }
                ]
              },
              {
                "type": "text",
                "value": " pour les stories complexes (score > M en sizing). Pas pour toutes les stories."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Mois 3+"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : laisser l'équipe définir ses propres règles sur quand pairer. Les équipes qui ont le contrôle sur leur pratique l'adoptent plus durablement que celles qui la subissent. Le pair programming s'intègre naturellement dans les "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/management/engineering-culture-rituels"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "rituels de culture engineering"
                  }
                ]
              },
              {
                "type": "text",
                "value": "."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "faq-sur-le-pair-programming"
            },
            "children": [
              {
                "type": "text",
                "value": "FAQ sur le pair programming"
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "1. Le pair programming est-il compatible avec le télétravail ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Oui, avec les bons outils. VS Code Live Share, JetBrains Code With Me, et Tuple sont conçus pour le pair programming à distance. La qualité est légèrement inférieure à l'in-person (plus de latence dans la communication) mais tout à fait viable. La règle : pas de pair programming à distance sur des connexions < 10 Mbps ou avec des outils de visioconférence trop lourds."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "2. Comment gérer le pair programming avec des développeurs introvertis ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le pair programming intense et continu est épuisant pour les introvertis. Solution : sessions de 90 minutes maximum, avec des blocs de travail solo entre les sessions. Le format ping-pong TDD fonctionne souvent mieux que le driver/navigator pour les introvertis : les rôles sont clairs, alternés, et le focus est sur le code, pas sur la conversation."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "3. Faut-il mesurer le ROI du pair programming dans notre équipe ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Oui, et c'est simple. Mesurer sur 2 mois : le taux de bugs sur les stories développées en pair vs solo, et le cycle time des stories complexes. Si le taux de bugs baisse significativement (> 15%), le ROI est positif même avec un overhead de temps modéré. Sur l'équipe bancaire que j'ai mentionnée, la réduction du temps d'onboarding de 8 à 4 semaines représentait seule 20 000€ d'économie par recrue."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "4. Le pair programming remplace-t-il la code review ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Non. Le pair programming réduit le besoin de review approfondie (le code a déjà eu un second regard) mais ne la remplace pas. Une "
                  },
                  {
                    "type": "element",
                    "tag": "a",
                    "props": {
                      "href": "/fr/intelligence-artificielle/ia-code-review-retour-experience"
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "code review"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " asynchrone reste nécessaire pour : la cohérence avec les standards de l'équipe, les aspects de sécurité, et le regard externe d'un développeur non impliqué dans la session."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "5. Comment justifier le pair programming au management qui voit \"deux développeurs sur un seul clavier\" ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le même argument que pour les tests : le coût de corriger un bug en production est 10 à 100 fois le coût de le détecter pendant le développement. 15% de temps en plus pendant le développement pour 15% de défauts en moins, c'est un ROI positif sur la durée. Je propose un pilote de 6 semaines avec mesure des métriques de qualité avant/après : les chiffres parlent d'eux-mêmes."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Accéder à l'assessment gratuit →",
              "href": "/mes-ressources",
              "title": "Ressource gratuite : Engineering Maturity Self-Assessment",
              "type": "resource"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'assessment évalue vos pratiques de collaboration et de qualité, incluant les revues de code et les pratiques de développement collaboratif. Score de maturité et plan d'action sur 90 jours."
                  }
                ]
              }
            ]
          }
        ],
        "toc": {
          "title": "",
          "searchDepth": 2,
          "depth": 2,
          "links": [
            {
              "id": "ce-que-la-recherche-dit-vraiment",
              "depth": 2,
              "text": "Ce que la recherche dit vraiment"
            },
            {
              "id": "quand-le-pair-programming-dégrade-la-productivité",
              "depth": 2,
              "text": "Quand le pair programming dégrade la productivité"
            },
            {
              "id": "les-4-conditions-de-succès",
              "depth": 2,
              "text": "Les 4 conditions de succès",
              "children": [
                {
                  "id": "condition-1-le-bon-contexte-de-tâche",
                  "depth": 3,
                  "text": "Condition 1 : Le bon contexte de tâche"
                },
                {
                  "id": "condition-2-la-rotation-du-rôle-drivernavigator",
                  "depth": 3,
                  "text": "Condition 2 : La rotation du rôle driver/navigator"
                },
                {
                  "id": "condition-3-la-parité-ajustée-à-lobjectif",
                  "depth": 3,
                  "text": "Condition 3 : La parité ajustée à l'objectif"
                },
                {
                  "id": "condition-4-la-durée-et-le-rythme",
                  "depth": 3,
                  "text": "Condition 4 : La durée et le rythme"
                }
              ]
            },
            {
              "id": "les-3-formats",
              "depth": 2,
              "text": "Les 3 formats"
            },
            {
              "id": "comment-lintroduire-progressivement-sans-résistance",
              "depth": 2,
              "text": "Comment l'introduire progressivement sans résistance"
            },
            {
              "id": "faq-sur-le-pair-programming",
              "depth": 2,
              "text": "FAQ sur le pair programming"
            }
          ]
        }
      },
      "_type": "markdown",
      "_id": "content:fr:dette-technique:pair-programming-roi-conditions.md",
      "_source": "content",
      "_file": "fr/dette-technique/pair-programming-roi-conditions.md",
      "_stem": "fr/dette-technique/pair-programming-roi-conditions",
      "_extension": "md"
    },
    {
      "_path": "/fr/architecture-craft/dependency-inversion-pratique",
      "_dir": "architecture-craft",
      "_draft": false,
      "_partial": false,
      "_locale": "",
      "title": "Dependency Inversion Principle : 3 exemples concrets",
      "description": "Le DIP est le principe SOLID le plus mal compris. Pas un pattern de conception — une règle sur la direction des dépendances. Trois implémentations dans trois langages.",
      "id": 30,
      "date": "2026-03-13",
      "listed": true,
      "nocomments": false,
      "hidden": false,
      "categories": [
        "architecture-craft"
      ],
      "tags": [
        "SOLID",
        "Dependency Inversion",
        "Architecture",
        "Clean Code"
      ],
      "--cover": "covers/articles/dependency-inversion-principe.jpg",
      "readingTime": {
        "text": "8 min read",
        "minutes": 7.155,
        "time": 429300,
        "words": 1431
      },
      "body": {
        "type": "root",
        "children": [
          {
            "type": "element",
            "tag": "h1",
            "props": {
              "id": "dependency-inversion-principle-3-exemples-concrets"
            },
            "children": [
              {
                "type": "text",
                "value": "Dependency Inversion Principle : 3 exemples concrets"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Chez un client dans le secteur du retail en ligne que j'accompagnais (20 développeurs, 8 services backend), la suite de tests prenait 18 minutes à s'exécuter. Pas parce que les tests étaient lents. Parce que chaque test unitaire démarrait une vraie base de données PostgreSQL, un vrai serveur Redis, et appelait le vrai Sendgrid."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Ce n'était pas un problème de tests. C'était un problème d'architecture : les modules métier dépendaient directement des implémentations concrètes d'infrastructure."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Après avoir introduit le Dependency Inversion Principle sur les 8 services les plus critiques, la suite de tests est passée à 3 minutes. La couverture de tests a augmenté de 35% à 72% en 3 mois. Pas parce que les développeurs avaient soudain envie d'écrire des tests, mais parce que les tests étaient devenus faciles à écrire."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "le-problème-la-dépendance-directe"
            },
            "children": [
              {
                "type": "text",
                "value": "Le problème : la dépendance directe"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Robert C. Martin (Uncle Bob) a formulé le DIP en 1996 dans ses travaux sur les principes SOLID : \"Les modules de haut niveau ne doivent pas dépendre des modules de bas niveau. Les deux doivent dépendre d'abstractions.\" C'est la règle de dépendance au cœur de la "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/architecture-craft/clean-architecture-3-regles"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "Clean Architecture"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : les flèches de dépendance doivent toujours pointer vers l'intérieur, vers le domaine métier."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "En pratique, la quasi-totalité des codebases sans discipline architecturale viole ce principe :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "# Violation du DIP — le module de haut niveau dépend du module de bas niveau\n\nclass OrderService:\n    def __init__(self):\n        self.db = PostgreSQLDatabase(host=\"localhost\", port=5432)  # dépendance directe\n        self.email = SendgridEmailClient(api_key=\"...\")              # dépendance directe\n\n    def create_order(self, order_data):\n        order_id = self.db.save(order_data)\n        self.email.send_confirmation(order_data[\"email\"], order_id)\n        return order_id\n",
              "language": "python",
              "meta": "",
              "className": "language-python shiki shiki-themes catppuccin-frappe github-dark",
              "style": ""
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 1
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "# Violation du DIP — le module de haut niveau dépend du module de bas niveau\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 2
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 3
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "class"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 4
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    def"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#99D1DB;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " __init__"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "):\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 5
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "db "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " PostgreSQLDatabase"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "host"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\"localhost\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " port"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "5432"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "  # dépendance directe\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 6
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "email "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " SendgridEmailClient"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "api_key"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\"...\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "              # dépendance directe\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 7
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 8
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    def"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " create_order"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_data"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "):\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 9
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        order_id "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "db"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "save"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "order_data"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 10
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "email"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "send_confirmation"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "order_data"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "["
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-default-font-style:italic;--shiki-dark:#9ECBFF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "email"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "],"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_id"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 11
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        return"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_id\n"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce que ça coûte concrètement :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Impossible de tester "
                  },
                  {
                    "type": "element",
                    "tag": "code",
                    "props": {
                      "className": []
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "OrderService"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " sans une vraie base de données PostgreSQL et un compte Sendgrid"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Changer de base de données oblige à modifier "
                  },
                  {
                    "type": "element",
                    "tag": "code",
                    "props": {
                      "className": []
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "OrderService"
                      }
                    ]
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Changer d'email provider oblige à modifier "
                  },
                  {
                    "type": "element",
                    "tag": "code",
                    "props": {
                      "className": []
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "OrderService"
                      }
                    ]
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "code",
                    "props": {
                      "className": []
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "OrderService"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " connaît des détails d'implémentation (host, port, api_key) qui n'ont rien à voir avec la logique métier de commande"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "le-principe-inverser-la-direction-des-dépendances"
            },
            "children": [
              {
                "type": "text",
                "value": "Le principe : inverser la direction des dépendances"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La solution DIP : "
              },
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "className": []
                },
                "children": [
                  {
                    "type": "text",
                    "value": "OrderService"
                  }
                ]
              },
              {
                "type": "text",
                "value": " ne dépend pas de "
              },
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "className": []
                },
                "children": [
                  {
                    "type": "text",
                    "value": "PostgreSQLDatabase"
                  }
                ]
              },
              {
                "type": "text",
                "value": " ni de "
              },
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "className": []
                },
                "children": [
                  {
                    "type": "text",
                    "value": "SendgridEmailClient"
                  }
                ]
              },
              {
                "type": "text",
                "value": ". Il dépend d'abstractions ("
              },
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "className": []
                },
                "children": [
                  {
                    "type": "text",
                    "value": "OrderRepository"
                  }
                ]
              },
              {
                "type": "text",
                "value": ", "
              },
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "className": []
                },
                "children": [
                  {
                    "type": "text",
                    "value": "EmailNotifier"
                  }
                ]
              },
              {
                "type": "text",
                "value": ") que les implémentations concrètes respectent."
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "Sans DIP :\nOrderService → PostgreSQLDatabase\nOrderService → SendgridEmailClient\n\nAvec DIP :\nOrderService → OrderRepository (abstraction) ← PostgreSQLOrderRepository (implémentation)\nOrderService → EmailNotifier (abstraction)   ← SendgridEmailNotifier (implémentation)\n"
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "text",
                    "value": "Sans DIP :\nOrderService → PostgreSQLDatabase\nOrderService → SendgridEmailClient\n\nAvec DIP :\nOrderService → OrderRepository (abstraction) ← PostgreSQLOrderRepository (implémentation)\nOrderService → EmailNotifier (abstraction)   ← SendgridEmailNotifier (implémentation)\n"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La flèche s'inverse : l'implémentation concrète dépend de l'abstraction, pas l'inverse."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "exemple-1-python-injection-par-constructeur"
            },
            "children": [
              {
                "type": "text",
                "value": "Exemple 1 : Python, injection par constructeur"
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "from abc import ABC, abstractmethod\n\nclass OrderRepository(ABC):\n    @abstractmethod\n    def save(self, order_data: dict) -> str:\n        pass\n\nclass EmailNotifier(ABC):\n    @abstractmethod\n    def send_confirmation(self, email: str, order_id: str) -> None:\n        pass\n\n# Le module de haut niveau — dépend uniquement des abstractions\nclass OrderService:\n    def __init__(self, repository: OrderRepository, notifier: EmailNotifier):\n        self.repository = repository\n        self.notifier = notifier\n\n    def create_order(self, order_data: dict) -> str:\n        order_id = self.repository.save(order_data)\n        self.notifier.send_confirmation(order_data[\"email\"], order_id)\n        return order_id\n\n# Les implémentations concrètes\nclass PostgreSQLOrderRepository(OrderRepository):\n    def save(self, order_data: dict) -> str:\n        return self.db.execute(\"INSERT INTO orders ...\", order_data)\n\nclass SendgridEmailNotifier(EmailNotifier):\n    def send_confirmation(self, email: str, order_id: str) -> None:\n        self.client.send(to=email, template=\"order_confirmation\", data={\"order_id\": order_id})\n\n# Composition à la racine de l'application\ndef create_order_service():\n    repository = PostgreSQLOrderRepository(db)\n    notifier = SendgridEmailNotifier(api_key=os.getenv(\"SENDGRID_KEY\"))\n    return OrderService(repository, notifier)\n",
              "language": "python",
              "meta": "",
              "className": "language-python shiki shiki-themes catppuccin-frappe github-dark",
              "style": ""
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 1
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "from"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " abc "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "import"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ABC"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " abstractmethod\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 2
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 3
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "class"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "ABC"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "):\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 4
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    @abstractmethod\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 5
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    def"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " save"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_data"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " dict"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ->"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " str"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 6
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        pass\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 7
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 8
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "class"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " EmailNotifier"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "ABC"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "):\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 9
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    @abstractmethod\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 10
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    def"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " send_confirmation"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " email"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " str"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_id"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " str"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ->"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " None"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 11
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        pass\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 12
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 13
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "# Le module de haut niveau — dépend uniquement des abstractions\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 14
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "class"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 15
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    def"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#99D1DB;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " __init__"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " repository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " notifier"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " EmailNotifier"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "):\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 16
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "repository "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " repository\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 17
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "notifier "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " notifier\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 18
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 19
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    def"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " create_order"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_data"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " dict"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ->"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " str"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 20
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        order_id "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "repository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "save"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "order_data"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 21
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "notifier"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "send_confirmation"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "order_data"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "["
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-default-font-style:italic;--shiki-dark:#9ECBFF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "email"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "],"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_id"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 22
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        return"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_id\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 23
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 24
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "# Les implémentations concrètes\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 25
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "class"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " PostgreSQLOrderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "OrderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "):\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 26
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    def"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " save"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_data"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " dict"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ->"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " str"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 27
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        return"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "db"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "execute"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\"INSERT INTO orders ...\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_data"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 28
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 29
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "class"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " SendgridEmailNotifier"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "EmailNotifier"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "):\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 30
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    def"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " send_confirmation"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " email"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " str"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_id"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " str"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ->"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " None"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 31
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "client"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "send"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "to"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "email"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " template"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\"order_confirmation\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " data"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "{"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\"order_id\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_id"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "})\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 32
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 33
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "# Composition à la racine de l'application\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 34
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "def"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " create_order_service"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "():\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 35
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    repository "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " PostgreSQLOrderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "db"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 36
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    notifier "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " SendgridEmailNotifier"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "api_key"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "os"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "getenv"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\"SENDGRID_KEY\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "))\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 37
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    return"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "repository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " notifier"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")\n"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le gain pour les tests :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "# Test sans base de données ni Sendgrid — s'exécute en millisecondes\nclass InMemoryOrderRepository(OrderRepository):\n    def __init__(self):\n        self.orders = {}\n\n    def save(self, order_data: dict) -> str:\n        order_id = str(uuid.uuid4())\n        self.orders[order_id] = order_data\n        return order_id\n\ndef test_create_order():\n    repository = InMemoryOrderRepository()\n    notifier = MockEmailNotifier()\n    service = OrderService(repository, notifier)\n\n    order_id = service.create_order({\"email\": \"user@example.com\", \"items\": [...]})\n\n    assert order_id in repository.orders\n    assert len(notifier.sent_confirmations) == 1\n",
              "language": "python",
              "meta": "",
              "className": "language-python shiki shiki-themes catppuccin-frappe github-dark",
              "style": ""
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 1
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "# Test sans base de données ni Sendgrid — s'exécute en millisecondes\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 2
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "class"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " InMemoryOrderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "OrderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "):\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 3
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    def"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#99D1DB;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " __init__"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "):\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 4
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "orders "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {}\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 5
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 6
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    def"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " save"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_data"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " dict"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ->"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " str"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 7
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        order_id "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " str"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "uuid"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "uuid4"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "())\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 8
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        self"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "orders"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "["
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "order_id"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "]"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_data\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 9
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        return"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_id\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 10
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 11
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "def"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " test_create_order"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "():\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 12
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    repository "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " InMemoryOrderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "()\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 13
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    notifier "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " MockEmailNotifier"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "()\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 14
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    service "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "repository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " notifier"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 15
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 16
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    order_id "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " service"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "create_order"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "({"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\"email\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " \"user@example.com\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " \"items\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ["
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "..."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "]})\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 17
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 18
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    assert"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order_id "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "in"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " repository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "orders\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 19
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    assert"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " len"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "notifier"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "sent_confirmations"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " =="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " 1\n"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Réserver mon diagnostic gratuit →",
              "href": "https://app.kamanga.fr/forms/discovery-call",
              "title": "Votre codebase est difficile à tester parce que les dépendances sont fortement couplées ?",
              "type": "call"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Introduire le DIP dans un codebase existant nécessite une stratégie progressive, pas un refactoring massif qui bloque toute l'équipe. En 30 minutes, on peut identifier les zones de couplage les plus problématiques et définir un plan de refactoring réaliste avec des gains mesurables."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "exemple-2-typescript-interfaces-et-injection-par-framework"
            },
            "children": [
              {
                "type": "text",
                "value": "Exemple 2 : TypeScript, interfaces et injection par framework"
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "// Les abstractions (interfaces TypeScript)\ninterface OrderRepository {\n    save(orderData: OrderData): Promise<string>;\n    findById(orderId: string): Promise<Order | null>;\n}\n\ninterface PaymentGateway {\n    charge(amount: number, currency: string, paymentMethod: string): Promise<PaymentResult>;\n}\n\n// Le module de haut niveau\nclass OrderService {\n    constructor(\n        private readonly repository: OrderRepository,\n        private readonly payment: PaymentGateway\n    ) {}\n\n    async createPaidOrder(orderData: OrderData): Promise<Order> {\n        const paymentResult = await this.payment.charge(\n            orderData.total,\n            orderData.currency,\n            orderData.paymentMethodId\n        );\n\n        if (!paymentResult.success) {\n            throw new PaymentFailedError(paymentResult.errorCode);\n        }\n\n        const orderId = await this.repository.save({\n            ...orderData,\n            paymentId: paymentResult.transactionId,\n            status: 'paid'\n        });\n\n        return this.repository.findById(orderId);\n    }\n}\n\n// Test — sans Stripe, sans base de données\ndescribe('OrderService', () => {\n    it('should create order with successful payment', async () => {\n        const mockRepository: OrderRepository = {\n            save: jest.fn().mockResolvedValue('order-123'),\n            findById: jest.fn().mockResolvedValue({ id: 'order-123', status: 'paid' })\n        };\n\n        const mockPayment: PaymentGateway = {\n            charge: jest.fn().mockResolvedValue({ success: true, transactionId: 'txn-456' })\n        };\n\n        const service = new OrderService(mockRepository, mockPayment);\n        const order = await service.createPaidOrder({ total: 1000, currency: 'EUR' });\n\n        expect(order.status).toBe('paid');\n    });\n});\n",
              "language": "typescript",
              "meta": "",
              "className": "language-typescript shiki shiki-themes catppuccin-frappe github-dark",
              "style": ""
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 1
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "// Les abstractions (interfaces TypeScript)\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 2
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "interface"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 3
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    save"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "orderData"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderData"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " Promise"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#99D1DB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "<"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "string"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#99D1DB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ">"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 4
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    findById"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "orderId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " string"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " Promise"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#99D1DB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "<"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "Order"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " |"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " null"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#99D1DB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ">"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 5
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "}\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 6
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 7
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "interface"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " PaymentGateway"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 8
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    charge"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "amount"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " number"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " currency"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " string"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " paymentMethod"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " string"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " Promise"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#99D1DB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "<"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "PaymentResult"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#99D1DB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ">"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 9
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "}\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 10
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 11
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "// Le module de haut niveau\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 12
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "class"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 13
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    constructor"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "(\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 14
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        private"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " readonly"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " repository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ",\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 15
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        private"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " readonly"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " payment"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " PaymentGateway\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 16
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    )"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {}\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 17
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 18
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    async"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " createPaidOrder"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "orderData"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderData"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " Promise"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#99D1DB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "<"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "Order"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#99D1DB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ">"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 19
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        const"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " paymentResult"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " await"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " this"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "payment"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "charge"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "(\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 20
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "            orderData"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "total"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ",\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 21
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "            orderData"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "currency"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ",\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 22
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "            orderData"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "paymentMethodId\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 23
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        )"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 24
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 25
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        if"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "!"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "paymentResult"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "success) "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "{\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 26
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "            throw"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-default-font-weight:bold;--shiki-dark:#F97583;--shiki-dark-font-weight:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " new"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " PaymentFailedError"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "(paymentResult"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "errorCode)"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 27
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        }\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 28
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 29
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        const"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " orderId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " await"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " this"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "repository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "save"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "{\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 30
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "            ..."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "orderData"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ",\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 31
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "            paymentId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " paymentResult"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "transactionId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ",\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 32
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "            status"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " 'paid'\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 33
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        }"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 34
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 35
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        return"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " this"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "repository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "findById"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "(orderId)"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 36
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    }\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 37
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "}\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 38
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 39
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "// Test — sans Stripe, sans base de données\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 40
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "describe"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "'OrderService'"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ()"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " =>"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 41
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    it"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "'should create order with successful payment'"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " async"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ()"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " =>"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 42
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        const"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " mockRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 43
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "            save"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " jest"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "fn"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "()"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "mockResolvedValue"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "'order-123'"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ",\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 44
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "            findById"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " jest"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "fn"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "()"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "mockResolvedValue"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "{"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " id"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " 'order-123'"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " status"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " 'paid'"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " }"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 45
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        };\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 46
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 47
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        const"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " mockPayment"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " PaymentGateway"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 48
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "            charge"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " jest"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "fn"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "()"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "mockResolvedValue"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "{"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " success"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " true"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " transactionId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " 'txn-456'"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " }"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 49
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        };\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 50
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 51
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        const"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " service"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-default-font-weight:bold;--shiki-dark:#F97583;--shiki-dark-font-weight:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " new"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "(mockRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " mockPayment)"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 52
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        const"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " await"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " service"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "createPaidOrder"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "{"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " total"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " 1000"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " currency"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " 'EUR'"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " }"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 53
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 54
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        expect"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "(order"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "status)"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "toBe"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "'paid'"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 55
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    }"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 56
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "}"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'avantage TypeScript :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " les interfaces sont vérifiées à la compilation. Si une implémentation ne respecte pas l'interface, le compilateur rejette le code avant même l'exécution."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "exemple-3-java-le-dip-avec-spring"
            },
            "children": [
              {
                "type": "text",
                "value": "Exemple 3 : Java, le DIP avec Spring"
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "// L'abstraction\npublic interface NotificationService {\n    void sendOrderConfirmation(String userId, String orderId);\n    void sendShippingUpdate(String userId, String orderId, String trackingCode);\n}\n\n// Le module de haut niveau (service métier)\n@Service\npublic class OrderFulfillmentService {\n\n    private final OrderRepository orderRepository;\n    private final NotificationService notificationService;\n\n    public OrderFulfillmentService(\n            OrderRepository orderRepository,\n            NotificationService notificationService) {\n        this.orderRepository = orderRepository;\n        this.notificationService = notificationService;\n    }\n\n    public void fulfillOrder(String orderId) {\n        Order order = orderRepository.findById(orderId)\n            .orElseThrow(() -> new OrderNotFoundException(orderId));\n\n        order.setStatus(OrderStatus.FULFILLING);\n        orderRepository.save(order);\n\n        notificationService.sendOrderConfirmation(order.getUserId(), orderId);\n    }\n}\n\n// Implémentation de test\n@Service\n@Profile(\"test\")\npublic class MockNotificationService implements NotificationService {\n\n    private final List<String> sentNotifications = new ArrayList<>();\n\n    @Override\n    public void sendOrderConfirmation(String userId, String orderId) {\n        sentNotifications.add(\"confirmation:\" + userId + \":\" + orderId);\n    }\n}\n",
              "language": "java",
              "meta": "",
              "className": "language-java shiki shiki-themes catppuccin-frappe github-dark",
              "style": ""
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 1
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "// L'abstraction\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 2
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "public"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " interface"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " NotificationService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 3
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    void"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " sendOrderConfirmation"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "String"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " userId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " String"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " orderId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ");\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 4
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    void"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " sendShippingUpdate"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "String"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " userId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " String"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " orderId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " String"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " trackingCode"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ");\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 5
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "}\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 6
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 7
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "// Le module de haut niveau (service métier)\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 8
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "@"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "Service\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 9
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "public"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " class"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderFulfillmentService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 10
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 11
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    private"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " final"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " orderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 12
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    private"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " final"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " NotificationService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " notificationService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 13
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 14
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    public"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderFulfillmentService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "(\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 15
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "            OrderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " orderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ",\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 16
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "            NotificationService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " notificationService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 17
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        this"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "orderRepository "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " orderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 18
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E78284;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        this"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "notificationService "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " notificationService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ";\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 19
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    }\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 20
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 21
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    public"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " void"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " fulfillOrder"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "String"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " orderId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 22
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        Order"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " order "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " orderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "findById"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "orderId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 23
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "            ."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "orElseThrow"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "(()"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ->"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " new"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " OrderNotFoundException"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "orderId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "));\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 24
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 25
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        order"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "setStatus"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "OrderStatus"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "FULFILLING"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ");\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 26
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        orderRepository"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "save"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "order"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ");\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 27
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 28
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        notificationService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "sendOrderConfirmation"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "order"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "getUserId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "(),"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " orderId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ");\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 29
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    }\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 30
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "}\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 31
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 32
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "// Implémentation de test\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 33
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "@"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "Service\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 34
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "@"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "Profile"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\"test\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 35
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "public"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " class"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " MockNotificationService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " implements"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " NotificationService"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 36
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 37
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    private"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " final"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " List"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "<"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "String"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ">"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " sentNotifications "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " new"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ArrayList"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "<>();\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 38
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 39
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    @"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "Override\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 40
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    public"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " void"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " sendOrderConfirmation"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "String"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " userId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " String"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " orderId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 41
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        sentNotifications"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "add"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\"confirmation:\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " +"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " userId "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "+"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " \":\""
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " +"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " orderId"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ");\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 42
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    }\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 43
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "}\n"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'avantage Spring :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " "
              },
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "className": []
                },
                "children": [
                  {
                    "type": "text",
                    "value": "@Profile(\"test\")"
                  }
                ]
              },
              {
                "type": "text",
                "value": " permet d'utiliser automatiquement le mock en environnement de test sans modifier le code métier. Le framework gère le wiring, le code métier reste pur."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "quand-appliquer-le-dip-et-quand-ne-pas-le-faire"
            },
            "children": [
              {
                "type": "text",
                "value": "Quand appliquer le DIP, et quand ne pas le faire"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Appliquer le DIP :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Toute dépendance vers un système externe (base de données, API tierce, service d'email, service de paiement, file de message)"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Toute dépendance vers une infrastructure susceptible de changer"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Tout code que vous voulez unit-tester sans infrastructure"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ne pas appliquer le DIP mécaniquement :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les entités et value objects du domaine (Order, User, Money) : pas de logique d'infrastructure"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les utilitaires purs (calculs mathématiques, formatage de dates) : pas d'effet de bord"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les dépendances stables et peu susceptibles de changer dans des petits projets"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le signal"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : si écrire un test unitaire pour votre classe nécessite de démarrer une base de données, une queue de messages, ou de configurer un service externe, appliquez le DIP. Cette question est aussi centrale dans les "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/dette-technique/tests-integration-legacy-pieges"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "tests d'intégration sur du code legacy"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : l'absence de DIP est souvent ce qui rend ces tests si difficiles et si fragiles à mettre en place."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "faq-sur-le-dependency-inversion-principle"
            },
            "children": [
              {
                "type": "text",
                "value": "FAQ sur le Dependency Inversion Principle"
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "1. Quelle est la différence entre DIP et Dependency Injection ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le DIP est un principe architectural : les modules doivent dépendre d'abstractions. La Dependency Injection (DI) est une technique d'implémentation du DIP : les dépendances sont fournies de l'extérieur plutôt que créées à l'intérieur. On peut respecter le DIP sans DI (ex : factory pattern). On peut utiliser la DI sans respecter le DIP (ex : injecter une classe concrète sans interface). En pratique, les deux vont généralement ensemble."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "2. Les containers DI (Spring, .NET DI, Angular) font-ils le travail à notre place ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ils automatisent le wiring (qui injecte quoi), mais ne créent pas les abstractions à notre place. Spring injecte les classes concrètes si vous ne créez pas d'interfaces. La discipline architecturale de créer des interfaces pour les dépendances d'infrastructure reste une décision de l'équipe. Le framework ne peut pas la prendre à votre place."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "3. Le DIP ne crée-t-il pas trop d'abstractions ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Oui, si mal appliqué. Créer une interface pour chaque classe, même les plus stables, est du sur-engineering. La règle que Martin Fowler formule clairement : créer une abstraction quand il y a au moins 2 implémentations possibles (production + test, provider A + provider B) ou quand la dépendance est vers un système externe. \"Pas d'abstraction prématurée\" s'applique au DIP comme à tout principe."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "4. Comment introduire le DIP progressivement dans un codebase existant ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le strangler fig pattern appliqué au DIP : ne pas refactorer tout le code existant d'un coup. À chaque nouvelle fonctionnalité ou bug fix qui touche une classe avec dépendances directes, extraire l'interface et introduire l'injection. Après 6 mois de cette discipline, les zones les plus actives du codebase respectent le DIP. Les zones stables peuvent rester dans l'état existant si elles ne causent pas de problèmes. Dans un contexte de "
                  },
                  {
                    "type": "element",
                    "tag": "a",
                    "props": {
                      "href": "/fr/dette-technique/legacy-code-evaluer-risque"
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "code legacy fortement couplé"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": ", cette approche progressive est souvent la seule viable sans bloquer les livraisons."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "5. Le DIP s'applique-t-il aux frontends (React, Vue) ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Oui. En React : les composants ne doivent pas appeler directement "
                  },
                  {
                    "type": "element",
                    "tag": "code",
                    "props": {
                      "className": []
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "fetch()"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " ou "
                  },
                  {
                    "type": "element",
                    "tag": "code",
                    "props": {
                      "className": []
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "axios"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " : ils doivent dépendre d'une abstraction (un service, un hook custom, un context) qui peut être mockée dans les tests. "
                  },
                  {
                    "type": "element",
                    "tag": "code",
                    "props": {
                      "className": []
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "useOrderService()"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " hook qui cache l'implémentation HTTP, facilement mockable dans les tests. Le DIP s'applique partout où il y a des effets de bord, frontend inclus."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Faire mon auto-évaluation →",
              "href": "/ema",
              "title": "Ressource gratuite : Engineering Maturity Self-Assessment",
              "type": "resource"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'Engineering Maturity Self-Assessment couvre le domaine Craft & Conception : évaluez votre niveau sur les principes SOLID, le couplage, et la testabilité. Obtenez un score de maturité et des recommandations concrètes en 10 minutes."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "style",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"
              }
            ]
          }
        ],
        "toc": {
          "title": "",
          "searchDepth": 2,
          "depth": 2,
          "links": [
            {
              "id": "le-problème-la-dépendance-directe",
              "depth": 2,
              "text": "Le problème : la dépendance directe"
            },
            {
              "id": "le-principe-inverser-la-direction-des-dépendances",
              "depth": 2,
              "text": "Le principe : inverser la direction des dépendances"
            },
            {
              "id": "exemple-1-python-injection-par-constructeur",
              "depth": 2,
              "text": "Exemple 1 : Python, injection par constructeur"
            },
            {
              "id": "exemple-2-typescript-interfaces-et-injection-par-framework",
              "depth": 2,
              "text": "Exemple 2 : TypeScript, interfaces et injection par framework"
            },
            {
              "id": "exemple-3-java-le-dip-avec-spring",
              "depth": 2,
              "text": "Exemple 3 : Java, le DIP avec Spring"
            },
            {
              "id": "quand-appliquer-le-dip-et-quand-ne-pas-le-faire",
              "depth": 2,
              "text": "Quand appliquer le DIP, et quand ne pas le faire"
            },
            {
              "id": "faq-sur-le-dependency-inversion-principle",
              "depth": 2,
              "text": "FAQ sur le Dependency Inversion Principle"
            }
          ]
        }
      },
      "_type": "markdown",
      "_id": "content:fr:architecture-craft:dependency-inversion-pratique.md",
      "_source": "content",
      "_file": "fr/architecture-craft/dependency-inversion-pratique.md",
      "_stem": "fr/architecture-craft/dependency-inversion-pratique",
      "_extension": "md"
    },
    {
      "_path": "/fr/management/engineering-culture-rituels",
      "_dir": "management",
      "_draft": false,
      "_partial": false,
      "_locale": "",
      "title": "Engineering culture : les 6 rituels qui font la différence",
      "description": "La culture ne se proclame pas, elle se construit par des rituels répétés. Les 6 pratiques concrètes qui construisent une culture d'excellence technique sur 12 mois.",
      "id": 29,
      "date": "2026-03-11",
      "listed": true,
      "nocomments": false,
      "hidden": false,
      "categories": [
        "management"
      ],
      "tags": [
        "Engineering Culture",
        "Rituels",
        "Leadership",
        "Excellence Technique"
      ],
      "--cover": "covers/articles/engineering-culture-rituels.jpg",
      "readingTime": {
        "text": "10 min read",
        "minutes": 9.295,
        "time": 557700,
        "words": 1859
      },
      "body": {
        "type": "root",
        "children": [
          {
            "type": "element",
            "tag": "h1",
            "props": {
              "id": "engineering-culture-les-6-rituels-qui-font-la-différence"
            },
            "children": [
              {
                "type": "text",
                "value": "Engineering culture : les 6 rituels qui font la différence"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Dans un client dans le secteur financier où j'accompagnais l'équipe engineering, les valeurs d'entreprise affichaient \"excellence technique\" et \"partage de connaissance\" sur tous les murs. La réalité : chaque développeur gardait sa connaissance pour lui comme un avantage concurrentiel interne, les post-mortems cherchaient des coupables, et personne ne proposait de sujets pour les tech talks parce que personne n'avait jamais vu de tech talk se tenir."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La culture n'était pas mauvaise parce que les valeurs étaient mauvaises. La culture était mauvaise parce qu'il n'y avait aucun rituel pour les incarner."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Patrick Lencioni dans "
              },
              {
                "type": "element",
                "tag": "em",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "The Five Dysfunctions of a Team"
                  }
                ]
              },
              {
                "type": "text",
                "value": " et les recherches DORA sur l'état du DevOps convergent vers la même conclusion : "
              },
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "la performance d'une équipe engineering est davantage fonction de sa culture que de ses outils ou de ses processus"
                  }
                ]
              },
              {
                "type": "text",
                "value": ". Dans les 100 000 réponses analysées par le programme DORA chaque année, les équipes elite performers ont toutes en commun des pratiques culturelles spécifiques, pas des valeurs affichées. Des actes répétés."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Voici les 6 rituels que j'ai implémentés et observés changer des équipes."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "rituel-1-le-post-mortem-blameless"
            },
            "children": [
              {
                "type": "text",
                "value": "Rituel 1 : Le post-mortem blameless"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce qu'il construit :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " une culture de l'apprentissage collectif et de la sécurité psychologique."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Après chaque incident en production significatif, l'équipe se réunit dans les 48 heures pour une analyse structurée. L'objectif n'est pas de trouver un coupable : c'est de comprendre le système qui a rendu l'incident possible."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Format que j'utilise :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "45 à 60 minutes maximum"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Chronologie des événements (pas des personnes)"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "5 Pourquoi pour remonter à la cause racine"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Actions correctives sur le système (process, monitoring, test), jamais \"être plus vigilant\""
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Document partagé avec toute l'équipe"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce que le \"blameless\" change concrètement :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " quand les incidents sont des opportunités d'apprentissage sans conséquence sur la carrière des personnes, les développeurs signalent les incidents plus tôt, cherchent plus profondément les causes racines, et implémentent des corrections systémiques. La règle absolue : pas de \"c'est la faute de X\". Si quelqu'un a fait une erreur, la question est \"pourquoi le système a-t-il rendu cette erreur possible ?\""
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "rituel-2-la-tech-talk-mensuelle"
            },
            "children": [
              {
                "type": "text",
                "value": "Rituel 2 : La Tech Talk mensuelle"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce qu'il construit :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " une culture du partage de connaissance et de la curiosité intellectuelle."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Une fois par mois, un membre de l'équipe présente pendant 30 minutes un sujet technique, pas nécessairement lié au projet en cours. Une technologie qu'il explore, un problème qu'il a résolu, un livre qu'il a lu, une conférence qu'il a regardée."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Pourquoi ce rituel fonctionne :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Il valorise l'apprentissage continu comme norme culturelle, pas comme hobby personnel"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Il expose l'équipe à des perspectives qu'elle n'aurait pas explorées"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Il développe les compétences de communication technique des présentateurs"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Il crée des conversations qui durent au-delà de la session"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Comment je l'instaure :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " je présente en premier. Cela enlève la pression du \"qui va se lancer\" et montre que c'est un espace sans jugement. Après 2 à 3 sessions, une rotation naturelle s'installe. Je ne force jamais : le volontariat maintient la qualité."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le seuil de qualité que j'impose :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " pas besoin d'être expert pour présenter. \"J'ai exploré X cette semaine, voici ce que j'ai trouvé intéressant, voici les questions que je n'ai pas encore résolues\" est une Tech Talk de qualité. Parfois meilleure que la présentation d'un expert, parce qu'elle montre le processus d'apprentissage."
              }
            ]
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Réserver mon diagnostic gratuit →",
              "href": "https://app.kamanga.fr/forms/discovery-call",
              "title": "Vous voulez construire une culture d'excellence technique mais ne savez pas par quels rituels commencer ?",
              "type": "call"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les rituels qui fonctionnent dépendent de la culture actuelle de l'équipe, de sa taille, et de son contexte. Implanter tous les rituels d'un coup crée de la surcharge et génère du rejet. En 30 minutes, je peux identifier les 2 à 3 rituels les plus impactants pour votre situation et définir un plan d'implémentation réaliste."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "rituel-3-la-session-de-code-review-collective"
            },
            "children": [
              {
                "type": "text",
                "value": "Rituel 3 : La session de code review collective"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce qu'il construit :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " des standards techniques partagés et une culture de feedback constructif."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Toutes les 2 semaines, l'équipe passe 45 minutes à reviewer ensemble une PR récente, soit un changement intéressant sur le plan technique, soit une PR qui a suscité des discussions en review asynchrone."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce que ce rituel apprend concrètement :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Comment les seniors pensent quand ils reviewent du code"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les standards non écrits que les seniors appliquent intuitivement"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Comment donner du feedback constructif (en observant les seniors le faire)"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les patterns à éviter dans cette base de code spécifique"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Format :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'auteur présente le contexte (2 min)"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Review collective en temps réel sur un écran partagé (30 min)"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Discussion des trade-offs et décisions (10 min)"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Synthèse des enseignements (5 min)"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce que j'observe systématiquement :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " les développeurs juniors exposés à des sessions de review collective progressent significativement plus vite sur la qualité du code que ceux qui reçoivent uniquement des reviews asynchrones. La différence n'est pas dans le contenu du feedback : c'est dans la visibilité du raisonnement du reviewer."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "rituel-4-lengineering-retrospective-trimestrielle"
            },
            "children": [
              {
                "type": "text",
                "value": "Rituel 4 : L'Engineering Retrospective trimestrielle"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce qu'il construit :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " une culture d'amélioration continue de l'engineering lui-même, séparée de la rétrospective produit."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Une fois par trimestre, l'équipe consacre 2 heures à évaluer l'état de l'engineering, pas la delivery produit (c'est la rétro Scrum), mais les pratiques techniques elles-mêmes."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Questions que j'utilise :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Quelles pratiques techniques avons-nous améliorées ce trimestre ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Quelle partie de notre codebase nous ralentit le plus ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Quelle compétence technique manque à l'équipe ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Si on refaisait l'architecture de X aujourd'hui, on ferait quoi différemment ?"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Pourquoi la séparation de la rétro produit est essentielle :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " dans une rétro Scrum classique, les préoccupations produit dominent (fonctionnalités en retard, bugs business, pression du sprint). Les sujets techniques sont traités superficiellement ou pas du tout. La rétro engineering dédiée crée l'espace pour des discussions profondes sur la dette technique, les pratiques, et les compétences."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Livrable :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " 3 actions d'amélioration technique priorisées pour le prochain trimestre. Trackées comme des stories dans le backlog, pas des intentions qui disparaissent dans un document Wiki."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "rituel-5-le-pair-programming-de-découverte"
            },
            "children": [
              {
                "type": "text",
                "value": "Rituel 5 : Le Pair Programming de découverte"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce qu'il construit :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " une culture de collaboration et de transfert de connaissance horizontal."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "2 heures par semaine, 2 développeurs travaillent ensemble sur un problème, pas nécessairement pour aller plus vite, mais pour apprendre l'un de l'autre. Le "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/dette-technique/pair-programming-roi-conditions"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "ROI du pair programming"
                  }
                ]
              },
              {
                "type": "text",
                "value": " est documenté : 15% de défauts en moins sur les tâches complexes."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La différence avec le pair programming utilitaire :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " ce pair programming est intentionnellement hétérogène (junior + senior, frontend + backend, nouveau + vieux dans l'équipe) et vise le transfert de connaissance autant que le code produit."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Rotation :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " une nouvelle paire chaque semaine. Sur une équipe de 8, chaque développeur travaille avec un collègue différent toutes les 4 semaines. En 6 mois, chaque développeur a travaillé avec chaque autre membre de l'équipe au moins une fois."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce que ce rituel prévient :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " le knowledge siloing (seul X connaît ce service), l'isolement des développeurs juniors, et les tensions entre les sous-groupes de l'équipe. Dans cette organisation, ce rituel seul a réduit le bus factor sur les services critiques de 1 à 3 en moins de 6 mois."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "rituel-6-le-craft-backlog-visible"
            },
            "children": [
              {
                "type": "text",
                "value": "Rituel 6 : Le Craft Backlog visible"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce qu'il construit :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " une culture de la qualité et de la viabilité à long terme du code."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Un backlog visible dédié aux améliorations techniques : remboursement de dette technique, refactoring, mise à jour des dépendances, amélioration de la couverture de tests. Pas dans le backlog produit. Dans un backlog séparé, visible de tout le monde y compris du management."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Pourquoi la visibilité est clé :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " la dette technique invisible n'est pas prioritarisée. La dette technique visible avec un impact estimé (en temps de développement supplémentaire et en risque business) peut être défendue auprès du leadership."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La règle du 20% :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " 20% de la capacité de chaque sprint est allouée au craft backlog. Pour obtenir ce budget, consultez le guide pour "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/dette-technique/programme-refactoring-approuve-business"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "faire approuver un programme de refactoring par le business"
                  }
                ]
              },
              {
                "type": "text",
                "value": ". Non-négociable, comme l'investissement dans la sécurité ou les tests. Cette règle doit être défendue par le manager et le CTO auprès du business. Will Larson décrit ce principe dans "
              },
              {
                "type": "element",
                "tag": "em",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "An Elegant Puzzle"
                  }
                ]
              },
              {
                "type": "text",
                "value": " : le travail de maintenance du système n'est pas un coût, c'est la condition de la vélocité future."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "comment-implémenter-les-6-rituels-sans-créer-de-surcharge"
            },
            "children": [
              {
                "type": "text",
                "value": "Comment implémenter les 6 rituels sans créer de surcharge"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Démarrer par 2, pas 6."
                  }
                ]
              },
              {
                "type": "text",
                "value": " Implémenter tous les rituels simultanément crée une charge d'organisation excessive et dilue l'attention. Je commence par les 2 rituels les plus adaptés à la situation actuelle de l'équipe."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Mes recommandations par situation :"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "ul",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Équipe avec peu de sécurité psychologique → Post-mortem blameless + Pair programming de découverte"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Équipe avec fort knowledge siloing → Pair programming de découverte + Tech Talk mensuelle"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Équipe avec culture de qualité faible → Code review collective + Craft Backlog visible"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "li",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Équipe en forte croissance → Tech Talk mensuelle + Pair programming de découverte"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le timing réaliste :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " les rituels prennent 3 à 6 mois pour s'ancrer dans la culture. La première session est souvent maladroite. La cinquième est naturelle. La vingtième fait partie de l'identité de l'équipe."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Dans ce client, après 12 mois d'implémentation progressive des 6 rituels, les signaux culturels avaient radicalement changé : les incidents étaient signalés plus tôt, la documentation avait augmenté spontanément, et 3 développeurs avaient présenté à des conférences externes, quelque chose qui n'était jamais arrivé avant. La culture ne s'était pas transformée parce qu'on avait changé les valeurs affichées. Elle s'était transformée parce qu'on avait changé les comportements répétés chaque semaine."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "faq-sur-les-rituels-de-culture-engineering"
            },
            "children": [
              {
                "type": "text",
                "value": "FAQ sur les rituels de culture engineering"
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Comment maintenir les rituels quand l'équipe est sous pression de delivery ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "C'est précisément sous pression que les rituels sont le plus importants, et le plus menacés. Ma règle : certains rituels sont compressibles (la Tech Talk peut passer à 20 min), aucun n'est supprimable. Un post-mortem annulé envoie le message que l'apprentissage n'est pas prioritaire. La solution : prévoir des formats compressés pour les périodes de pression, pas des annulations. Consultez le "
                  },
                  {
                    "type": "element",
                    "tag": "a",
                    "props": {
                      "href": "/fr/pratiques-agiles/retrospective-agile-format-efficace"
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "format de rétrospective en 5 étapes"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " qui génère vraiment du changement. L'habitude survit aux compressions. Elle ne survit pas aux suppressions répétées."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ces rituels fonctionnent-ils en équipe distribuée ou full remote ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Oui, avec adaptation. Le post-mortem et la review collective fonctionnent en visioconférence. La Tech Talk est souvent plus accessible en remote (enregistrement possible). Le pair programming de découverte nécessite des outils adaptés (Live Share dans VSCode, Tuple). La rétro engineering se fait sur Miro ou Mural. Le craft backlog est naturellement digital. Le pair programming est le seul rituel qui perd en efficacité remote : compenser par des sessions plus courtes mais plus fréquentes."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Comment mesurer l'impact des rituels sur la culture ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Les métriques proxy que j'utilise : fréquence de signalement des incidents (hausse → meilleure sécurité psychologique), nombre de PR commentées par les juniors (hausse → moins de peur du feedback), rotation des knowledge owners sur le codebase (hausse → moins de siloing), nombre de sujets proposés pour les Tech Talks (hausse → curiosité intellectuelle). Ces proxy suffisent pour évaluer la direction."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Faut-il impliquer le management dans les rituels ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La présence du management aux post-mortems blameless est importante : elle signale que la direction soutient la culture d'apprentissage sans recherche de coupable. Pour les Tech Talks et les reviews collectives, la présence est optionnelle, mais l'intérêt démontré (regarder l'enregistrement, commenter) est un signal fort. Le management ne devrait jamais animer les rituels : c'est à l'équipe de se les approprier."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Que faire si les rituels ne \"prennent pas\" après 3 mois ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Trois diagnostics possibles. Le rituel n'adresse pas un problème réel de l'équipe : remplacer par un rituel plus adapté. La facilitation est insuffisante : investir dans la formation du facilitateur ou faire appel à un externe pour les premières sessions. Il y a un problème de sécurité psychologique plus profond (peur de s'exprimer, culture punitive) : les rituels ne peuvent pas fonctionner sans un niveau minimal de confiance. Résoudre d'abord le problème structurel."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Faire mon auto-évaluation →",
              "href": "/ema",
              "title": "Ressource gratuite : Engineering Maturity Self-Assessment",
              "type": "resource"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'Engineering Maturity Self-Assessment couvre le domaine Culture Engineering : évaluez la maturité culturelle de votre équipe sur les rituels techniques, les pratiques de collaboration, et l'amélioration continue. Score et recommandations en 10 minutes."
                  }
                ]
              }
            ]
          }
        ],
        "toc": {
          "title": "",
          "searchDepth": 2,
          "depth": 2,
          "links": [
            {
              "id": "rituel-1-le-post-mortem-blameless",
              "depth": 2,
              "text": "Rituel 1 : Le post-mortem blameless"
            },
            {
              "id": "rituel-2-la-tech-talk-mensuelle",
              "depth": 2,
              "text": "Rituel 2 : La Tech Talk mensuelle"
            },
            {
              "id": "rituel-3-la-session-de-code-review-collective",
              "depth": 2,
              "text": "Rituel 3 : La session de code review collective"
            },
            {
              "id": "rituel-4-lengineering-retrospective-trimestrielle",
              "depth": 2,
              "text": "Rituel 4 : L'Engineering Retrospective trimestrielle"
            },
            {
              "id": "rituel-5-le-pair-programming-de-découverte",
              "depth": 2,
              "text": "Rituel 5 : Le Pair Programming de découverte"
            },
            {
              "id": "rituel-6-le-craft-backlog-visible",
              "depth": 2,
              "text": "Rituel 6 : Le Craft Backlog visible"
            },
            {
              "id": "comment-implémenter-les-6-rituels-sans-créer-de-surcharge",
              "depth": 2,
              "text": "Comment implémenter les 6 rituels sans créer de surcharge"
            },
            {
              "id": "faq-sur-les-rituels-de-culture-engineering",
              "depth": 2,
              "text": "FAQ sur les rituels de culture engineering"
            }
          ]
        }
      },
      "_type": "markdown",
      "_id": "content:fr:management:engineering-culture-rituels.md",
      "_source": "content",
      "_file": "fr/management/engineering-culture-rituels.md",
      "_stem": "fr/management/engineering-culture-rituels",
      "_extension": "md"
    },
    {
      "_path": "/fr/intelligence-artificielle/ia-documentation-technique-cas-usage",
      "_dir": "intelligence-artificielle",
      "_draft": false,
      "_partial": false,
      "_locale": "",
      "title": "IA et documentation technique : les cas d'usage qui marchent vraiment",
      "description": "L'IA peut automatiser 60% de la documentation technique — mais pas les 60% auxquels on pense en premier. Les cas d'usage validés et ceux à éviter.",
      "id": 28,
      "date": "2026-03-09",
      "listed": true,
      "nocomments": false,
      "hidden": false,
      "categories": [
        "intelligence-artificielle"
      ],
      "tags": [
        "Documentation",
        "IA",
        "Automatisation",
        "Developer Experience"
      ],
      "--cover": "covers/articles/ia-documentation-technique.jpg",
      "readingTime": {
        "text": "10 min read",
        "minutes": 9.03,
        "time": 541800,
        "words": 1806
      },
      "body": {
        "type": "root",
        "children": [
          {
            "type": "element",
            "tag": "h1",
            "props": {
              "id": "ia-et-documentation-technique-les-cas-dusage-qui-marchent-vraiment"
            },
            "children": [
              {
                "type": "text",
                "value": "IA et documentation technique : les cas d'usage qui marchent vraiment"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "J'accompagnais une équipe de 12 développeurs chez un client dans l'édition logicielle. Leur base de code avait 23 services. Zéro documentation. Les nouvelles recrues passaient 3 semaines à poser des questions aux développeurs seniors, qui, eux, perdaient 30 à 45 minutes par jour à répondre. Un coût invisible mais massif, mesuré quand j'ai fait le calcul avec le CTO."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Nous avons organisé un sprint de documentation de 2 jours avec assistance Claude. Résultat : 18 services avaient des READMEs et des docs d'API générés. Temps de révision humaine : 30 à 45 minutes par service. Le lead time d'onboarding est passé de 3 semaines à 10 jours. 18 services documentés en 2 jours, contre 18 semaines si fait manuellement."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'IA peut automatiser 60% de la documentation technique. Mais pas les 60% auxquels on pense en premier. Les équipes qui espèrent que l'IA va écrire leurs ADR et leur documentation d'architecture sont déçues. Celles qui l'utilisent pour les bons cas d'usage gagnent des heures par semaine."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "ce-que-lia-documente-bien-et-ce-quelle-documente-mal"
            },
            "children": [
              {
                "type": "text",
                "value": "Ce que l'IA documente bien, et ce qu'elle documente mal"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "J'ai testé et observé suffisamment de déploiements pour établir une règle simple :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'IA documente bien le \"quoi\" :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " ce que le code fait, comment appeler une API, quels paramètres une fonction accepte, quelle est la structure d'un objet. Ces informations sont dans le code, l'IA les extrait et les formate."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "L'IA documente mal le \"pourquoi\" :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " pourquoi ce choix d'architecture, pourquoi cette contrainte de performance, pourquoi cette API a été dépréciée. Ces informations ne sont pas dans le code, elles sont dans les cerveaux des développeurs qui ont pris ces décisions."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La règle d'usage : utilisez l'IA pour documenter le \"quoi\" ; investissez le temps humain sur le \"pourquoi\"."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "cas-dusage-1-génération-de-documentation-dapi-roi-élevé"
            },
            "children": [
              {
                "type": "text",
                "value": "Cas d'usage 1 : Génération de documentation d'API (ROI élevé)"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le problème :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " les APIs internes ne sont souvent pas documentées. Chaque développeur qui intègre un nouveau service perd 2 à 4 heures à comprendre les endpoints, les paramètres, et les formats de réponse en lisant le code."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce que l'IA fait :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " à partir du code d'un controller, d'un router Express, ou d'un fichier de routes FastAPI, l'IA génère une documentation structurée (format OpenAPI/Swagger ou Markdown) avec les endpoints, les paramètres, les types, et des exemples."
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "# Prompt pour Claude/GPT-4\n\"\"\"\nVoici le code d'un router FastAPI. Génère une documentation OpenAPI complète\navec description de chaque endpoint, paramètres, types, et exemples de requête/réponse.\n\n[coller le code du router]\n\"\"\"\n",
              "language": "python",
              "meta": "",
              "className": "language-python shiki shiki-themes catppuccin-frappe github-dark",
              "style": ""
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 1
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "# Prompt pour Claude/GPT-4\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 2
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\"\"\"\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 3
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "Voici le code d'un router FastAPI. Génère une documentation OpenAPI complète\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 4
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "avec description de chaque endpoint, paramètres, types, et exemples de requête/réponse.\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 5
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 6
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "[coller le code du router]\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 7
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\"\"\"\n"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Résultat typique : une documentation OpenAPI utilisable en 5 minutes de génération + 15 minutes de révision humaine pour vérifier l'exactitude et ajouter les informations contextuelles (qui appelle cette API, dans quel flux business, quelles sont les contraintes de rate limiting)."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Gain : 3 à 4 heures de documentation manuelle → 20 minutes."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "cas-dusage-2-commentaires-et-docstrings-dans-le-code-roi-moyen"
            },
            "children": [
              {
                "type": "text",
                "value": "Cas d'usage 2 : Commentaires et docstrings dans le code (ROI moyen)"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le problème :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " le code existant n'a pas de commentaires. Les fonctions complexes sont difficiles à comprendre sans connaître le contexte de leur création."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce que l'IA fait :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " elle génère des docstrings JSDoc, Python Docstrings, ou JavaDoc pour les fonctions et classes existantes."
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "// Avant\nfunction calculateEligibility(user, subscription, promoCode) {\n    if (!user.verified) return { eligible: false, reason: 'NOT_VERIFIED' };\n    if (subscription.status !== 'active') return { eligible: false, reason: 'INACTIVE_SUB' };\n    if (promoCode && promoCode.usageCount >= promoCode.maxUsage) {\n        return { eligible: false, reason: 'PROMO_EXHAUSTED' };\n    }\n    return { eligible: true };\n}\n\n// Après génération IA\n/**\n * Détermine l'éligibilité d'un utilisateur à appliquer un code promo.\n *\n * @param {User} user - L'utilisateur demandant l'application du promo\n * @param {Subscription} subscription - L'abonnement actif de l'utilisateur\n * @param {PromoCode|null} promoCode - Le code promo à valider (peut être null)\n * @returns {{ eligible: boolean, reason?: string }} Résultat de l'éligibilité\n */\n",
              "language": "javascript",
              "meta": "",
              "className": "language-javascript shiki shiki-themes catppuccin-frappe github-dark",
              "style": ""
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 1
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "// Avant\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 2
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "function"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " calculateEligibility"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "user"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " subscription"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " promoCode"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ")"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 3
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    if"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " ("
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "!"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "user"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "verified) "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "return"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " eligible"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " false"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " reason"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " 'NOT_VERIFIED'"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " };\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 4
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    if"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " (subscription"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "status "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "!=="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " 'active'"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ") "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "return"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " eligible"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " false"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " reason"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " 'INACTIVE_SUB'"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " };\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 5
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    if"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " (promoCode "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "&&"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " promoCode"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "usageCount "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ">="
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " promoCode"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "."
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "maxUsage) "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "{\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 6
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "        return"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " eligible"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " false"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ","
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " reason"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " 'PROMO_EXHAUSTED'"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " };\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 7
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    }\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 8
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "    return"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " eligible"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": ":"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EF9F76;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " true"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " };\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 9
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "}\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 10
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "emptyLinePlaceholder": true
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 11
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "// Après génération IA\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 12
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "/**\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 13
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " * Détermine l'éligibilité d'un utilisateur à appliquer un code promo.\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 14
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " *\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 15
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " * "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "@"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "param"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#B392F0"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "User"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#B392F0"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "}"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " user"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " - L'utilisateur demandant l'application du promo\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 16
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " * "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "@"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "param"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#B392F0"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "Subscription"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#B392F0"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "}"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " subscription"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " - L'abonnement actif de l'utilisateur\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 17
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " * "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "@"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "param"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#B392F0"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "PromoCode|null"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#B392F0"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "}"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#EA999C;--shiki-dark:#E1E4E8"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " promoCode"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " - Le code promo à valider (peut être null)\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 18
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " * "
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "@"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#CA9EE6;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "returns"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#B392F0"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " {"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "{ eligible: boolean, reason?: string }"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#949CBB;--shiki-dark:#B392F0"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "}"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " Résultat de l'éligibilité\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 19
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " */\n"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Limite importante : l'IA génère des docstrings corrects sur la forme, mais peut se tromper sur la sémantique métier. Toujours réviser pour vérifier que la description correspond au comportement réel. la génération IA réduit le temps d'écriture de 80%, elle ne remplace pas la révision humaine. Voir comment intégrer l'"
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/intelligence-artificielle/ia-code-review-retour-experience"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "IA dans la code review"
                  }
                ]
              },
              {
                "type": "text",
                "value": " pour un workflow cohérent."
              }
            ]
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Réserver mon diagnostic gratuit →",
              "href": "https://app.kamanga.fr/forms/discovery-call",
              "title": "Votre équipe perd du temps sur une base de code non documentée et vous cherchez un plan pragmatique ?",
              "type": "call"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Vous savez que la documentation est en retard et que ça coûte cher en onboarding et en interruptions des seniors. Mais vous ne savez pas par où commencer avec l'IA. En 30 minutes, on identifie les 3 actions à impact immédiat sur la productivité de votre équipe."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "cas-dusage-3-readme-de-service-et-onboarding-roi-élevé"
            },
            "children": [
              {
                "type": "text",
                "value": "Cas d'usage 3 : README de service et onboarding (ROI élevé)"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le problème :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " chaque service d'un système distribué devrait avoir un README qui explique son rôle, comment le démarrer en local, comment le tester, et les variables d'environnement requises. En pratique, ces READMEs sont absents ou obsolètes."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce que l'IA fait :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " à partir du code source (package.json, Dockerfile, docker-compose.yml, code principal), l'IA génère un README structuré."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Prompt type :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "Voici le package.json, le Dockerfile, et le fichier main.ts d'un service Node.js.\nGénère un README.md complet incluant :\n- Description du service et son rôle dans l'architecture\n- Prérequis\n- Installation et démarrage en local\n- Variables d'environnement (liste depuis le code)\n- Endpoints principaux\n- Comment lancer les tests\n"
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "text",
                    "value": "Voici le package.json, le Dockerfile, et le fichier main.ts d'un service Node.js.\nGénère un README.md complet incluant :\n- Description du service et son rôle dans l'architecture\n- Prérequis\n- Installation et démarrage en local\n- Variables d'environnement (liste depuis le code)\n- Endpoints principaux\n- Comment lancer les tests\n"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce que l'humain ajoute :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " le contexte business (quel problème ce service résout), les dépendances avec les autres services, les décisions d'architecture importantes."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Gain pour l'onboarding :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " un nouveau développeur avec des READMEs à jour démarre en autonomie 3 à 5 jours plus tôt qu'avec des READMEs absents. Sur une équipe qui recrute 4 personnes par an, c'est 12 à 20 jours de productivité récupérés chaque année."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "cas-dusage-4-résumés-de-pr-et-commit-messages-roi-élevé"
            },
            "children": [
              {
                "type": "text",
                "value": "Cas d'usage 4 : Résumés de PR et commit messages (ROI élevé)"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le problème :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " les commit messages et descriptions de PR sont soit vides (\"fix bug\", \"update code\"), soit trop détaillés pour être lus. L'historique git devient inutilisable."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce que l'IA fait :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " à partir du diff d'une PR, l'IA génère un résumé structuré (ce qui a changé, pourquoi, les impacts potentiels, le plan de test)."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "GitHub Copilot peut générer des descriptions de PR automatiquement. Alternativement, un script pre-commit qui appelle l'API Claude avec le diff :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "# Script pre-commit simplifié\ngit diff --cached | claude -p \"Génère un commit message conventionnel en anglais\npour ce diff. Format: type(scope): description. Types: feat/fix/refactor/test/docs\"\n",
              "language": "bash",
              "meta": "",
              "className": "language-bash shiki shiki-themes catppuccin-frappe github-dark",
              "style": ""
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 1
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "# Script pre-commit simplifié\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 2
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "git"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " diff"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " --cached"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#81C8BE;--shiki-dark:#F97583"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " |"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " claude"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#79B8FF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " -p"
                          }
                        ]
                      },
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": " \"Génère un commit message conventionnel en anglais\n"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "element",
                    "tag": "span",
                    "props": {
                      "class": "line",
                      "line": 3
                    },
                    "children": [
                      {
                        "type": "element",
                        "tag": "span",
                        "props": {
                          "style": "--shiki-default:#A6D189;--shiki-dark:#9ECBFF"
                        },
                        "children": [
                          {
                            "type": "text",
                            "value": "pour ce diff. Format: type(scope): description. Types: feat/fix/refactor/test/docs\"\n"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Bénéfice secondaire : des descriptions de PR de qualité améliorent le processus de code review, le reviewer comprend rapidement l'intention du changement avant de lire le code. Une étude de "
              },
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "l'équipe DevEx de Google (2023)"
                  }
                ]
              },
              {
                "type": "text",
                "value": " sur la qualité des PRs indique que des descriptions claires réduisent le temps de review de 15 à 25%."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "cas-dusage-5-mise-à-jour-de-documentation-existante-roi-moyen"
            },
            "children": [
              {
                "type": "text",
                "value": "Cas d'usage 5 : Mise à jour de documentation existante (ROI moyen)"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le problème :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " la documentation existante se désynchronise du code. Une API change, la documentation ne change pas. Un développeur suit la doc et se retrouve avec des erreurs incompréhensibles."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Ce que l'IA fait :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " comparer la documentation existante avec le code actuel et identifier les divergences."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Prompt type :"
              }
            ]
          },
          {
            "type": "element",
            "tag": "pre",
            "props": {
              "code": "Voici la documentation actuelle de l'API /users/{id}/subscriptions :\n[documentation]\n\nVoici le code actuel de cet endpoint :\n[code]\n\nIdentifie les divergences entre la documentation et le code, et propose\nune documentation mise à jour.\n"
            },
            "children": [
              {
                "type": "element",
                "tag": "code",
                "props": {
                  "__ignoreMap": ""
                },
                "children": [
                  {
                    "type": "text",
                    "value": "Voici la documentation actuelle de l'API /users/{id}/subscriptions :\n[documentation]\n\nVoici le code actuel de cet endpoint :\n[code]\n\nIdentifie les divergences entre la documentation et le code, et propose\nune documentation mise à jour.\n"
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "Limite : l'IA identifie les divergences techniques (paramètres manquants, types incorrects) mais pas les divergences de logique métier. La révision humaine reste nécessaire."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "ce-que-lia-ne-peut-pas-documenter"
            },
            "children": [
              {
                "type": "text",
                "value": "Ce que l'IA ne peut pas documenter"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "element",
                    "tag": "a",
                    "props": {
                      "href": "/fr/architecture-craft/adr-architecture-decision-record"
                    },
                    "children": [
                      {
                        "type": "text",
                        "value": "Décisions d'architecture"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " pourquoi Event Sourcing plutôt que CRUD, pourquoi PostgreSQL plutôt que MongoDB, pourquoi ce découpage en microservices. Ces décisions ont un contexte (contraintes techniques, état de l'équipe, urgence du moment) que l'IA ne peut pas reconstruire. Les ADR (Architecture Decision Records) restent un exercice humain."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Contraintes non-exprimées dans le code :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " un timeout à 3 secondes dans une config qui existe parce qu'un service tiers SLA garantit 99% de réponses en moins de 2,5 secondes. Sans commentaire humain, l'IA ne peut pas savoir que cette valeur ne doit pas changer."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le \"pourquoi ça ne marche pas\" :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " les runbooks de debugging, les solutions aux problèmes connus, les workarounds pour les bugs connus des dépendances. Ces informations viennent de l'expérience terrain, pas du code."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "comment-intégrer-lia-dans-le-workflow-de-documentation"
            },
            "children": [
              {
                "type": "text",
                "value": "Comment intégrer l'IA dans le workflow de documentation"
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Option A : Documentation as part of PR :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " ajouter à la "
              },
              {
                "type": "element",
                "tag": "a",
                "props": {
                  "href": "/fr/dette-technique/definition-of-done-qualite"
                },
                "children": [
                  {
                    "type": "text",
                    "value": "Definition of Done"
                  }
                ]
              },
              {
                "type": "text",
                "value": " que toute nouvelle API ou service doit avoir sa documentation générée par IA et révisée par l'auteur. Le reviewer vérifie la documentation comme il vérifie le code."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Option B : Sprint de documentation :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " une fois par trimestre, un sprint de 2 jours dédié à la mise à jour de la documentation avec assistance IA. Chaque développeur génère la doc de ses services et la révise."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "strong",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Option C : Automatisation continue :"
                  }
                ]
              },
              {
                "type": "text",
                "value": " un pipeline CI qui génère automatiquement la documentation OpenAPI à partir des annotations de code et la déploie dans un portail de documentation (Stoplight, Backstage). La doc est toujours à jour avec le code."
              }
            ]
          },
          {
            "type": "element",
            "tag": "p",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "La séquence que je recommande : commencer par les READMEs des services critiques (impact onboarding immédiat), puis la documentation des APIs internes (impact developer experience), puis les résumés de PR (impact code review quality)."
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "h2",
            "props": {
              "id": "faq-sur-lia-et-la-documentation-technique"
            },
            "children": [
              {
                "type": "text",
                "value": "FAQ sur l'IA et la documentation technique"
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "1. La documentation générée par IA est-elle fiable ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Pour le \"quoi\" technique (paramètres, types, structure), oui, avec révision. L'IA peut se tromper sur la sémantique d'une valeur de retour ou sur le comportement dans les cas d'erreur. La règle : toute documentation générée est relue par le développeur qui connaît le code avant d'être mergée. La génération IA réduit le temps d'écriture de 80%, elle ne remplace pas la révision humaine."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "2. Quels outils IA utiliser pour la documentation ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "GitHub Copilot intégré dans l'IDE génère des docstrings en temps réel. Claude ou GPT-4 pour la génération de READMEs et docs d'API depuis le code. Mintlify Doc Writer (extension VSCode) pour les docstrings. Pour la documentation OpenAPI automatique, les annotations natives de FastAPI ou Spring Boot font mieux que l'IA, le framework le gère nativement."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "3. Comment éviter que la documentation générée soit obsolète dès le lendemain ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Deux stratégies : (1) Documentation automatique synchronisée avec le code (OpenAPI généré par le framework, Storybook pour les composants frontend), toujours à jour par construction. (2) Documentation révisée par humain + tests de documentation qui vérifient que les exemples de code dans la doc compilent et retournent les bons résultats. L'approche hybride : génération automatique pour les APIs, révision humaine pour les guides."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "4. Les développeurs seniors résistent à documenter même avec l'IA : comment les convaincre ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "En changeant le cadre. La documentation n'est pas un effort pour les autres, c'est une réduction du coût de maintenance pour soi. Le développeur senior qui documente son service aujourd'hui est celui qui ne répondra plus à 3 questions par semaine sur ce service dans 6 mois. Calculez le coût réel des interruptions : 3 questions × 30 min × 52 semaines = 78 heures/an, contre 2 heures de documentation avec IA. L'argument est économique, pas moral."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "details",
            "props": {},
            "children": [
              {
                "type": "element",
                "tag": "summary",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "5. Faut-il documenter en français ou en anglais ?"
                  }
                ]
              },
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "Le code et les commentaires techniques dans la même langue que le reste du codebase (souvent anglais dans les équipes internationales). Les READMEs et guides internes dans la langue de l'équipe. La règle pratique : si un document sera lu par des personnes externes à l'équipe → anglais. Si interne à l'équipe → langue de l'équipe."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "hr",
            "props": {},
            "children": []
          },
          {
            "type": "element",
            "tag": "cta",
            "props": {
              "cta": "Télécharger la checklist gratuite →",
              "href": "/mes-ressources",
              "title": "Ressource gratuite : AI-Ready Engineering Team Checklist",
              "type": "resource"
            },
            "children": [
              {
                "type": "element",
                "tag": "p",
                "props": {},
                "children": [
                  {
                    "type": "text",
                    "value": "La checklist AI-Ready inclut les cas d'usage IA validés par pilier (documentation, code review, tests, architecture) et le framework d'évaluation d'adoption pour votre équipe. Avec les métriques de ROI pour chaque cas d'usage."
                  }
                ]
              }
            ]
          },
          {
            "type": "element",
            "tag": "style",
            "props": {},
            "children": [
              {
                "type": "text",
                "value": "html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"
              }
            ]
          }
        ],
        "toc": {
          "title": "",
          "searchDepth": 2,
          "depth": 2,
          "links": [
            {
              "id": "ce-que-lia-documente-bien-et-ce-quelle-documente-mal",
              "depth": 2,
              "text": "Ce que l'IA documente bien, et ce qu'elle documente mal"
            },
            {
              "id": "cas-dusage-1-génération-de-documentation-dapi-roi-élevé",
              "depth": 2,
              "text": "Cas d'usage 1 : Génération de documentation d'API (ROI élevé)"
            },
            {
              "id": "cas-dusage-2-commentaires-et-docstrings-dans-le-code-roi-moyen",
              "depth": 2,
              "text": "Cas d'usage 2 : Commentaires et docstrings dans le code (ROI moyen)"
            },
            {
              "id": "cas-dusage-3-readme-de-service-et-onboarding-roi-élevé",
              "depth": 2,
              "text": "Cas d'usage 3 : README de service et onboarding (ROI élevé)"
            },
            {
              "id": "cas-dusage-4-résumés-de-pr-et-commit-messages-roi-élevé",
              "depth": 2,
              "text": "Cas d'usage 4 : Résumés de PR et commit messages (ROI élevé)"
            },
            {
              "id": "cas-dusage-5-mise-à-jour-de-documentation-existante-roi-moyen",
              "depth": 2,
              "text": "Cas d'usage 5 : Mise à jour de documentation existante (ROI moyen)"
            },
            {
              "id": "ce-que-lia-ne-peut-pas-documenter",
              "depth": 2,
              "text": "Ce que l'IA ne peut pas documenter"
            },
            {
              "id": "comment-intégrer-lia-dans-le-workflow-de-documentation",
              "depth": 2,
              "text": "Comment intégrer l'IA dans le workflow de documentation"
            },
            {
              "id": "faq-sur-lia-et-la-documentation-technique",
              "depth": 2,
              "text": "FAQ sur l'IA et la documentation technique"
            }
          ]
        }
      },
      "_type": "markdown",
      "_id": "content:fr:intelligence-artificielle:ia-documentation-technique-cas-usage.md",
      "_source": "content",
      "_file": "fr/intelligence-artificielle/ia-documentation-technique-cas-usage.md",
      "_stem": "fr/intelligence-artificielle/ia-documentation-technique-cas-usage",
      "_extension": "md"
    }
  ]
}
Recevez les derniers articles dans votre boîte email