
En bref
|
Une pull request arrive avec une fonction générée par un assistant IA. Elle se lit bien, passe les tests existants et est intégrée. Trois semaines plus tard, elle plante, mais uniquement pour les comptes présentant un historique de facturation spécifique. Personne n’a écrit de test pour cette condition, car personne n’y avait pensé au moment de l’intégration du code. Maintenant, quelqu’un doit déboguer une logique qu’il n’a pas lui-même élaborée, face à une erreur qu’il ne peut pas visualiser sans les données exactes qui l’ont déclenchée.
Le débogage du code de quelqu’un d’autre a toujours fonctionné comme ça. L’IA en fait la norme.
Point clé : le code n’est pas forcément moins bon, mais l’intuition du réviseur quant à l’endroit où il plante est moins bonne.
Quand les développeurs écrivent eux-mêmes du code, ils se construisent au fur et à mesure un modèle mental de ses cas limites, car ils les passent en revue pendant qu’ils écrivent. Le code généré par l’IA peut être tout aussi correct à première vue, mais la personne qui le révise part du résultat plutôt que du raisonnement qui le sous-tend. Elle peut vérifier que le code fait ce qu’il est censé faire. Elle est moins à même de prédire comment il se comporte dans des conditions que personne n’a explicitement envisagées, car ce n’est pas elle qui a pris ces décisions.
Ces effets se reflètent aussi dans les données de livraison. Le rapport « 2024 Accelerate State of DevOps » de DORA a révélé qu’une augmentation de 25 % de l’adoption de l’IA par une équipe était associée à une baisse estimée à 7,2 % de la stabilité des livraisons et à une baisse de 1,5 % du débit, même si la productivité individuelle augmentait. DORA pointe du doigt la taille plus importante des lots et des tests moins rigoureux comme causes probables. Ces deux facteurs font qu’il est plus facile de passer à côté des cas limites. Ce même rapport a révélé que 39 % des personnes interrogées n’ont que peu ou pas confiance dans le code généré par l’IA.
Point clé : déboguer une logique que tu n’as pas analysée, qu’elle ait été écrite par une personne ou par une IA, dépend davantage des conditions réelles que de l’intuition.
Quand la personne qui corrige un bug n’a pas réfléchi au code d’origine, il est plus difficile de deviner la condition d’échec. Elle ne peut pas se rabattre sur « Je parie que c’est ce cas limite ». Il ne reste alors que les données : le compte spécifique et l’état d’entrée qui ont déclenché l’échec. Sans ça, déboguer du code généré par l’IA revient à lire une logique inconnue en espérant tomber par hasard sur le bon cas de test.
La façon dont le code est écrit aggrave encore les choses. L’analyse réalisée en 2025 par GitClear sur 211 millions de lignes modifiées a révélé qu’avec la généralisation des assistants IA, 2024 a été la première année où les lignes copiées/collées ont dépassé en nombre les lignes déplacées (refactorisées), et où les blocs dupliqués de cinq lignes ou plus ont été multipliés par huit environ. Plus il y a de code dupliqué, plus il y a d’endroits où un cas limite peut se cacher.
Point clé : la révision permet de vérifier si le code fait ce qu’il est censé faire. Elle détecte rarement les conditions auxquelles personne n’a pensé à vérifier.
Une révision plus minutieuse, ou une politique plus stricte pour le code généré par l’IA, semble être la solution évidente. Ça aide, mais ça ne comble pas le fossé. Pour repérer un cas limite, il faut d’abord soupçonner son existence, et c’est justement cette intuition qui manque souvent à un réviseur travaillant à partir du travail de quelqu’un d’autre.
Un examen plus minutieux conduit à des hypothèses plus précises. Ça ne donne pas au réviseur d’informations qu’il n’avait pas déjà. Pour combler cette lacune, il faut voir la condition qui fait planter le code.
Point clé : cloner l’environnement de production met la condition défaillante sous les yeux de la personne qui débogue, pour qu’elle n’ait pas à la reconstituer à partir d’une intuition.
Une branche qui clone l’environnement de production, avec les mêmes services, la même configuration et les mêmes données, élimine la plupart des conjectures. Le compte dont l’historique de facturation a déclenché le bug se trouve déjà dans l’environnement de test. Personne n’a besoin de le recréer à la main ni d’attendre que l’erreur se reproduise.
La copie des données de production soulève une question légitime concernant les données personnelles. Un script de nettoyage dans ton hook de déploiement peut anonymiser les données personnelles dans les environnements de test tout en conservant l’historique de facturation sur lequel repose le bug. La documentation sur le nettoyage des bases de données propose des exemples concrets.
À partir de là, c’est le même processus que tu utiliserais pour n’importe quel bug difficile à reproduire. Crée une branche à partir de la production, ouvre un tunnel vers les services clonés, puis reproduis la défaillance à partir des données qui l’ont déclenchée. Notre guide, « Du rapport de bug à la correction vérifiée en un seul processus », couvre chaque étape. Ce qui change ici, c’est à quel point le débogueur s’appuie sur ces données, car il travaille à partir des résultats fournis par quelqu’un d’autre plutôt que de son propre modèle de la logique.
Tu veux avoir sous les yeux les conditions de défaillance quand tu débogues ? Commence un essai gratuit de 15 jours et clone ton premier environnement.
Est-ce que ça veut dire que le code généré par l’IA contient plus de bugs que le code écrit à la main ? Pas forcément. Ce qui fait la différence, c’est le niveau d’intuition de la personne qui le maintient concernant ses cas limites, et c’est ce qui rend les tests en conditions réelles encore plus importants.
Pourquoi les données de production sont-elles plus importantes pour le code écrit par l’IA en particulier ? Parce que le recours habituel, à savoir la mémoire de l’auteur concernant les cas limites qu’il a pris en compte, est plus floue, voire inexistante. Les données réelles remplacent l’intuition dont le relecteur ne dispose pas.
Est-ce que ça s’applique à tout le code assisté par l’IA, ou seulement aux fonctionnalités entièrement générées par l’IA ? Ça s’applique partout où la personne qui débogue n’a pas suivi le raisonnement de la logique d’origine, qu’il s’agisse d’une fonction entièrement générée par l’IA ou d’un code écrit par un humain et dont quelqu’un d’autre assure désormais la maintenance. Le développement assisté par l’IA rend simplement cette situation bien plus courante.
Comment remonter à l’origine du bug ? « git blame » t’affiche le diff, mais pas comment ce diff est apparu. Si la modification est passée par Upsun Dispatch, chaque exécution conserve une trace du reste. Les détails de l’exécution dans la console Dispatch montrent les invites, les appels d’outils et les résultats de cette exécution. Pour les exécutions déclenchées par Jira ou Linear avec l’approbation du plan activée, ça montre aussi qui a approuvé le plan et les éventuelles révisions. Associe ça à une branche en état de production et tu auras les deux éléments : pourquoi le code a été écrit comme ça, et les données qui le font planter.