Logo ConstructiCat
CodeBust.
Parcourir la section ▾

Pattern obsolète ou déprécié.

Les assistants IA produisent avec assurance des API, des bibliothèques et des idiomes qui étaient d'actualité il y a plusieurs années mais qui sont aujourd'hui dépréciés, supprimés ou remplacés, parce que leur connaissance paramétrique est figée à une date limite d'entraînement et que l'ancien pattern reste statistiquement le plus courant dans leur corpus.

##Signes et symptômes

Un relecteur reconnaît ce smell lorsque le code généré s'exécute mais correspond au style d'un tutoriel vieux de deux ou trois ans : il appelle des API que le framework signale désormais, épingle d'anciennes versions majeures, ou se rabat sur des idiomes hérités au lieu de la bibliothèque standard/syntaxe moderne. Signes révélateurs :

  • Avertissements de dépréciation à l'installation/build/exécution que le modèle a ignorés (DeprecationWarning, [DEP0005], componentWillMount is deprecated).
  • Idiomes antérieurs à la base actuelle du langage : var au lieu de const/let, des chaînes de callbacks/.then() là où la base de code utilise async/await, require() dans un projet ESM, moment.js au lieu de Intl/Temporal/date-fns.
  • Appels de bibliothèque supprimés ou dépréciés dans la version que vous avez réellement installée : supprimés — pandas df.append(...) (disparu avec pandas 2.0) et .ix[] (disparu avec la 1.0) ; dépréciés mais encore présents — anciens cycles de vie React, datetime.utcnow() (déprécié depuis Python 3.12), Node new Buffer(), url.parse().
  • Réglages de sécurité hérités qui dominent les anciennes données d'entraînement : hachage MD5/SHA1, crypto.createCipher, SQL brut concaténé par chaînes.
  • Réinventer ce que la plateforme fournit désormais (deepClone, groupBy, UUID faits main) au lieu de structuredClone, Object.groupBy, crypto.randomUUID().
// Généré par IA : compile, mais chaque ligne est désormais un pattern déprécié
const crypto = require('crypto');                 // le projet ESM utilise import

const buf = new Buffer(userInput);                // Buffer() déprécié depuis Node 6
const id  = crypto.createHash('md5')              // MD5 déprécié pour tout usage de sécurité
              .update(token).digest('hex');
const cipher = crypto.createCipher('aes-256-cbc', key);  // API supprimée, KDF faible

request(apiUrl, (err, res, body) => { /* ... */ });      // 'request' non maintenu depuis 2020

##Causes du problème

Pourquoi les modèles le produisent

  • Obsolescence liée à la date limite d'entraînement. La connaissance paramétrique d'un LLM est figée à sa date limite, mais les bibliothèques continuent d'évoluer. Les études qui le mesurent constatent un taux d'utilisation d'API dépréciées de 25–38 % sur huit bibliothèques Python dans les complétions de LLM (Wang et al., ICSE 2025), et, sur 328 problèmes conditionnés par version, les modèles commerciaux n'atteignent qu'un taux de réussite de base de 48–51 % (GitChameleon 2.0, ACL 2026). Il n'existe aucune connaissance en temps réel des API/versions au moment de l'inférence.
  • La fréquence du token suivant favorise l'ancienne méthode. Le corpus contient des années de code hérité, donc la complétion statistiquement la plus probable est souvent celle qui est obsolète. OX Security note que « la concaténation de chaînes est ce qui apparaît le plus fréquemment dans les données d'entraînement » et que « MD5 apparaît fréquemment dans les exemples de hachage de tout son corpus d'entraînement » (OX Security), et Veracode a constaté que, face au choix entre une méthode sûre et une méthode non sûre, les modèles ont choisi la seconde 45 % du temps (rapport GenAI Code Security 2025 de Veracode).
  • Aucun contexte du dépôt. Le modèle ignore généralement quelle version majeure vous avez réellement installée, ce que votre fichier de verrouillage épingle, ou que lib/hash.ts existe déjà — il ne peut donc pas viser l'API de vos versions. Eno Reyes (Factory) décrit l'agent comme « un excellent reconnaisseur de patterns » : « du bon code dans le pattern, c'est du bon code en sortie » — sans exemple actuel, il se rabat sur la moyenne de ses données d'entraînement (entretien avec Eno Reyes sur le blog de Stack Overflow).
  • Récompense « faire en sorte que ça marche » + complaisance. Les modèles optimisent pour un code qui compile de manière plausible et satisfait le prompt, pas pour un code qui « emprunte le chemin actuel et pris en charge ». L'appel déprécié fonctionne encore aujourd'hui, il a donc l'air correct.

Pourquoi c'est nuisible

  • Maintenabilité / rupture à retardement. Déprécié aujourd'hui signifie supprimé dans la prochaine version majeure — le code fonctionne jusqu'à ce qu'une mise à niveau le casse silencieusement, et ces patterns sont copiés-collés plutôt que refactorisés. L'analyse 2025 de GitClear, portant sur 211 millions de lignes modifiées (2020–2024), montre que les lignes associées au refactoring (lignes « déplacées ») sont passées de 25 % des lignes modifiées en 2021 à moins de 10 % en 2024, tandis que les lignes copiées-collées passaient de 8,3 % à 12,3 % sur la même période ; 2024 est la première année où les lignes copiées-collées dépassent les lignes déplacées, et les blocs d'au moins cinq lignes dupliquées ont été multipliés par huit environ au cours de 2024 (GitClear 2025). Un seul idiome périmé se propage donc au lieu d'être corrigé une fois pour toutes.
  • Exactitude. Les API remplacées ont souvent une sémantique subtilement différente (utcnow() renvoie un datetime naïf ; les anciens cycles de vie se déclenchent à des moments différents), produisant des bugs qui passent un test de fumée rapide.
  • Sécurité. La cryptographie dépréciée (MD5, createCipher) et les versions de paquets obsolètes portent des CVE connues que le modèle ne vérifie jamais contre une base de données d'avis de sécurité ; dans les tests de Veracode en 2025, le code généré par IA introduisait des vulnérabilités de sécurité dans 45 % des cas (Veracode).
  • Charge de revue & dette technique. Chaque occurrence est une correction manuelle distincte, et parce que le pattern est dupliqué plutôt que centralisé, le coût s'accumule dans toute la base de code.

##Traitement

Tactiques de revue & de prompting

  • Indiquez les versions dans le prompt ou le contexte. « Nous sommes sur React 19, pandas 2.2, Node 22 (ESM) — n'utilise que des API actuelles dans ces versions. » Tirez la documentation actuelle dans le contexte (un MCP de docs / Context7) au lieu de faire confiance à la mémoire paramétrique.
  • Imposez un passage par les outils. Exigez que le modèle exécute le linter, le vérificateur de types et npm outdated / pip list --outdated, puis corrige chaque avertissement de dépréciation avant de se déclarer terminé. Les avertissements de dépréciation sont le détecteur le moins coûteux possible — ne les laissez pas être ignorés.
  • Exigez la réutilisation plutôt que la réinvention. « Utilise le helper existant dans lib/hash.ts ; ne fabrique pas de hachage à la main. » Pointez vers le module canonique pour que le modèle ne régénère pas une version héritée (Code dupliqué).
  • Des codemods plutôt que des modifications manuelles. Pour les mises à niveau systématiques, exécutez les codemods/modernizers officiels au lieu de demander au modèle de réécrire à la main : npx @next/codemod, les codemods React, les règles pyupgrade/Ruff UP. Ils sont déterministes et complets.

Le refactoring — remplacer une API dépréciée par son successeur pris en charge revient essentiellement à Remplacer l’algorithme, et regrouper les appels périmés dupliqués dans un seul helper applique Extraire une méthode contre le Code dupliqué :

// Avant — API dépréciées/sur des chemins supprimés
const buf    = new Buffer(userInput);
const id     = crypto.createHash('md5').update(token).digest('hex');
const cipher = crypto.createCipher('aes-256-cbc', key);

// Après — actuel, pris en charge, sain en matière de sécurité
import crypto from 'node:crypto';

const buf    = Buffer.from(userInput);                 // constructeur sûr
const id     = crypto.createHash('sha256').update(token).digest('hex');
const iv     = crypto.randomBytes(16);                 // IV explicite
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
// (pour les mots de passe, utilisez argon2/bcrypt — pas un hachage brut)

Pour les dépendances, la correction équivalente consiste à relever l'épingle et à laisser le codemod migrer les sites d'appel, puis à verrouiller toute dérive future en CI (règle de lint ci-dessous + une politique Dependabot/Renovate) afin que le modèle ne puisse pas réintroduire silencieusement l'ancien pattern.

##Détecté par

  • ESLint (eslint-plugin-n) n/no-deprecated-api — Interdire les API de base Node.js dépréciées (Buffer(), crypto.createCipher, url.parse, etc.)
  • typescript-eslint @typescript-eslint/no-deprecated — Signaler l'usage de tout symbole marqué @deprecated dans sa déclaration JSDoc/TS
  • ESLint (eslint-plugin-react) react/no-deprecated — Signaler les API et méthodes de cycle de vie React dépréciées (componentWillMount, etc.)
  • SonarQube / SonarSource RSPEC-1874 — Signale l'utilisation de code annoté/marqué comme déprécié
  • Ruff pyupgrade (UP) — Détecte et réécrit les idiomes Python obsolètes/remplacés vers leurs équivalents modernes
  • Dependabot version-updates — Signale les versions de dépendances obsolètes (la facette « paquet périmé » de ce smell)