Réduire l'écart des intentions : pourquoi le code IA a besoin de specs formelles
Les promesses et les pièges du développement assisté par l'IA
L'ingénierie logicielle vit une révolution. Les grands modèles de langage crachent du code syntaxiquement parfait en quelques secondes. GitHub Copilot ou Claude font partie du quotidien de millions de devs. Mais derrière ce gain de productivité, un risque guette : le code marche, mais fait-il vraiment ce qu'on attendait ?
Ce souci n'est pas neuf. Les équipes peinent depuis toujours à coller aux besoins réels des clients. L'IA l'amplifie à une échelle folle. Un humain corrige ses erreurs grâce à son expertise et des itérations. L'IA génère à la vitesse de la machine, et les dérapages se multiplient aussi vite.
L'écart d'intention à l'ère de l'IA
Le problème de fond ? Le langage naturel reste flou. Demandez à une IA de "valider les emails des users". Vous visez quoi exactement :
- Un simple check de format selon RFC 5322 ?
- Une vérif DNS pour confirmer que le domain existe ?
- Un lien de confirmation à cliquer ?
- Le tout, avec gestion d'erreurs pointue ?
L'IA devine. Parfois bien, souvent à côté. Et sans review humaine, ces erreurs s'accumulent sur des centaines de fonctions générées.
L'écart entre une idée vague et un comportement précis existe depuis longtemps. Mais il n'a jamais été aussi béant ni aussi rapide.
Formaliser l'intention : une approche par niveaux
Oubliez le tout ou rien. L'intention se gère sur un spectre, adapté au risque de votre projet.
Léger : clarifier via des tests
Pour la plupart des apps, pas besoin de maths lourdes. Des tests simples suffisent à débusquer les gros malentendus :
# L'IA a pondu ce validateur d'email
# Mais quel niveau voulait le dev ?
def validate_email(email):
# Test pour préciser l'intention
assert validate_email("user@example.com") == True
assert validate_email("user@localhost") == False # Domain réel obligatoire
assert validate_email("invalid.email") == False
Écrivez vos tests en premier, montrez-les à l'IA. L'alignement humain-machine explose. C'est du TDD light : rapide, et efficace contre les quiproquos.
Moyen : spécifications de postconditions
Un cran au-dessus, on ajoute des postconditions formelles. Des garanties précises sur l'état après exécution :
# Postcondition explicite
def transfer_funds(from_account, to_account, amount):
"""
Garanties :
- from_account.balance diminue de amount pile poil
- to_account.balance augmente de amount pile poil
- total_balance inchangé
- Transaction atomique (tout ou rien)
"""
Les IA formées sur ça repèrent des bugs que les tests classiques loupent. Elles gèrent invariants et cas limites comme personne.
Lourd : synthèse vérifiée
Au sommet, les langages spécifiques et la vérification formelle. Le code se prouve correct, pas juste testé.
Pas pour tous les projets. Mais en crypto, finance, aéronautique ou santé – où un bug coûte cher –, c'est vital.
Le goulot d'étranglement de la validation
La vérité qui dérange : seul l'utilisateur valide la spec elle-même.
On prouve que le code suit la spec. Mais la spec est-elle juste ? Une implé parfaite d'une mauvaise spec = échec total.
D'où l'importance de la collab humain-IA. Le vrai défi : valider que la spec capture l'essentiel. Avec :
- Boucles de feedback interactives pour affiner
- Exemples et tests proxies qui révèlent les trous
- Métriques de qualité sans exécuter le code
- Interactions simples sans devenir mathématicien
Impacts sur votre stack
Ça touche direct votre infra de prod.
Au niveau génération de code
Choisissez des outils IA qui posent des questions ou génèrent d'abord des tests. Ceux qui balancent du code "fonctionnel" sans check produisent des bugs sournois.
Dans votre CI/CD
Scrutinez le code généré. Ajoutez property-based testing et checks de postconditions. Pour les services critiques, exigez une validation formelle avant merge.
Dans vos pratiques d'équipe
Les devs avec IA doivent muscler leur rédaction de specs. Une compétence oubliée, à réveiller. Les code reviews valident specs + code.
Les frontières de la recherche
Sujet brûlant : IA, méthodes formelles, interaction homme-machine. Les premiers résultats cartonnent :
- Formalisation par tests booste la correction quand l'utilisateur guide
- Postconditions générées par IA piègent des bugs réels
- Pipelines de synthèse vérifiée transforment du naturel en code prouvé
Défis ouverts : scaler hors labo, gérer les changements composés, interactions fluides sans theorem prover, logiques riches pour la vraie complexité.
Vers l'avenir
L'IA ne triomphera pas en codant plus vite. Mais en codant correctement, là où ça compte.
La formalisation d'intention est la clé. Pas pour virer le langage naturel au profit des maths. Mais pour valider systématiquement que nos idées – en prose, tests ou exemples – sont bien comprises et implémentées.
Pour les devs, startups et équipes infra sur des plateformes comme NameOcean, c'est concret : specs de déploiement validées, garanties de config DNS, workflows de gestion SSL formellement prouvés, pas juste testés.
Le code qui survit en prod n'est pas le plus malin. C'est le plus intentionnel.