Motivation: LâingĂ©nieur face au dĂ©veloppement des IAs gĂ©nĂ©ratives¶
Il y a quelques mois, les IAs gĂ©nĂ©ratives offraient Ă peine plus quâune autocomplĂ©tion basĂ©e sur lâanalyse formelle du code. Aujourdâhui, elles semblent capables de dĂ©velopper des applications complĂštes. On sâattend Ă ce que ces capacitĂ©s se dĂ©veloppent encore exponentiellement.
Face Ă cette croissance, je me pose des questions Ă la fois comme ingĂ©nieur et comme CTO de comment intĂ©grer ces outils dans notre quotidien. Il sâagit tout dâexpĂ©rimenter, pour limiter la part de fantasme dans les discussions, pour apprĂ©cier en direct lâinteraction avec ces outils. Faute de temps, il sâagit dâune expĂ©rimentation partielle dont je nâespĂšre pas tirer une conclusion dĂ©finitive ou scientifiquement rigoureuse, mais jâespĂšre tirer une tendance.
Expérience 1: Script Python et algorithmie¶
LâidĂ©e est dâutiliser lâIA pour rĂ©pondre Ă une question de dĂ©nombrement: calculer la probabilitĂ© de bombes (carrĂ© ou suite de carte de mĂȘme couleur) dans le jeu de Tichu. Pour cela, jâai utilisĂ© Antigravity et Gemini 3 Flash
Mon prompt était le suivant:
create a python script managed by UV that computes the probability of a given card combination. The cards are numbered from 2 to 10, J, D, K, A and there are 4 colours: Spades, Hearts, Diamonds and clover, with 4 jokers. A bomb is combination with 4 cards of the same value (e.g. 3 of hearts, 3 of diamond, 3 of spades, 3 of clover) or 5 or move consecutive cards of the same colour. Given that all cards are dealt randomly, what is the probability of the number of bombs in the game ?
Lâoutil a gĂ©nĂ©rĂ© un plan:
Initialize project with uv
Define the deck and card values
Implement bomb detection logic: Quad detection then Straight flush detection
Implement Monte Carlo simulation
Verify results and format output
LâexĂ©cution du plan a donnĂ© un code fonctionnel et un tableau de probabilitĂ© de bombes dans le jeu de Tichu. La lecture du code Ă©tait claire, sauf pour la partie sur les bombes de suite de cartes oĂč la logique Ă©tait un peu obscure. Jâai donc demandĂ© Ă lâIA de vĂ©rifier cette partie.
A ma grande surprise, lâIA nâa pas fourni dâexplication sur le code mais a dĂ©clarĂ© avoir dĂ©tectĂ© une erreur de logique: le fait que son code comptait comme plusieurs bombes des bombes qui partagaient les mĂȘmes cartes et le fait quâune suite de 10+ cartes Ă©tait considĂ©rĂ©e comme une bombe alors quâelle pouvait constituer plusieurs bombes.
Le code corrigĂ© Ă©tait encore plus obscur, avec notamment une fonction rĂ©cursive pour trouver les ensembles disjoints. Que faire alors pour sâassurer du fonctionnement ? Jâai demandĂ© dâajouter des tests.
AprĂšs une passe de refactoring pour utiliser pytest au lieu de unittest, il sâest avĂ©rĂ© que les tests Ă©taient incorrects. Jâai prĂ©fĂ©rĂ© manuellement les corriger pour mâassurer de la cohĂ©rence. En revanche, je nâai pas investiguĂ© lâimplĂ©mentation de la logique de comptage de bombes.
Jâai lancĂ© un nouveau planning pour ajouter le calcul dans le cas du jeu Ă 6.
Add an option to the script to evaluate a 6 player deck. We add for each value 2 cards. Suits are alternated so that we add hearts and clovers for even cards (2, 4, 6, 8, 10, D, A) and diamonds and spades for odd cards (3, 5, 7, 9, J, K)
A nouveau, surprise, lâIA mâa demandĂ© de clarifier le nombre de cartes donnĂ©es aux joueurs. En effet, ayant oubliĂ© de lui prĂ©ciser quâon ajoutait 2 jokers, on se retrouvait soit Ă donner un nombre inĂ©gal de cartes entre les joueurs soit Ă devoir laisser des cartes non-distribuĂ©es.
Une fois lâinformation donnĂ©e, la gĂ©nĂ©ration du code sâest passĂ©e sans encombre. Jâai rajoutĂ© Ă la main les tests pour tester lâabsence de couleurs rĂ©pĂ©tĂ©es dans les bombes de 4 cartes.
Leçons:
Les capacitĂ©s de rĂ©flexion et de gĂ©nĂ©ration mâont agrĂ©ablement surpris. LâIA a Ă©tĂ© capable de relever des cas limites non triviaux (bien que pas forcĂ©ment compliquĂ©s).
IntĂ©grer lâĂ©criture de tests dans le plan initial et bien relire les tests.
Le code généré peut devenir vite complexe et donc difficile à adapter par un humain.
Un tel code a clairement sa place en tant que prototype, mais câest plus tangeant pour un code en production Ă maintenir et Ă faire Ă©voluer. En effet, pour faire Ă©voluer un tel code, on serait soit contraints de recourir Ă lâIA soit de dĂ©penser un effort consĂ©quent pour comprendre lâimplĂ©mentation. Dans les deux cas, une sĂ©rie de test sur le domaine de validitĂ© des entrĂ©es semble de mise alors que lors dâune Ă©criture manuelle, cette rĂ©flexion est souvent intĂ©grĂ©e dans lâimplĂ©mentation (bien que souvent implicite).
Expérience 2: Application web¶
Cette fois, je mâintĂ©resse Ă la crĂ©ation dâun application web par lâIA. Remarque prĂ©liminaire: je nâai pas de connaissance en dĂ©veloppement web (Ă part quelques notions).
AprĂšs plusieurs essais dâoutils, je me suis Ă nouveau rabattu sur Antigravity:
Zed nâarrivait plus Ă se lancer aprĂšs lâinstallation de lâextension Mistral.
VS Code avec le plugin Continue.dev semblait produire des plans intĂ©ressants mais le mode dâexĂ©cution nâĂ©tait peut-ĂȘtre pas bien compatible avec Devstral.
Mistral Vibe CLI Ă©tait trop lent, rien que pour initialiser un projet. Cela dit, câĂ©tait peut-ĂȘtre dĂ» au faible dĂ©bit de ma connexion au moment des tests.
Mon objectif Ă©tait de crĂ©er une application permettant de noter des scores de Tichu. Mon premier prompt dĂ©crivait les diffĂ©rentes vues que jâimaginais de lâapplication (page de score par parties, leaderoard, etc.). LâIA a proposĂ© un plan dâapplication sur lequel je lâai lancĂ©e sans trop rĂ©flĂ©chir.
Le rĂ©sultat Ă©tait Ă©tonnamment bon: Lâapplication Ă©tait relativement fonctionnelle. Mais lorsque jâai souhaitĂ© faire des changements qui me semblaient relativements mineurs comme ne pas afficher le leaderboard sur la page dâaccueil, lâIA a eu du mal Ă faire les modifications sans casser lâapplication (le debug visuel du rendu du navigateur, bien quâimpressionnant reste assez lent).
Lâapproche qui a fonctionnĂ© aprĂšs plusieurs essais similaires a Ă©tĂ©:
De spécifier les contraintes (comme les rÚgles du jeu) dans un fichier plutÎt que dans le prompt. Cela permettait notamment de ne pas avoir à le réécrire à chaque fois.
De planifier une architecture dâapplication et de demander Ă lâIA de lâimplĂ©menter au fur et Ă mesure: en commençant par exemple par le backend avant de passer au frontend. Sur le frontend, je me suis appuyĂ© sur les explications de lâIA pour essayer de palier mon manque de connaissance avant de lancer une implĂ©mentation.
LâIA a faillit se perdre Ă un moment, une modification qui me semblait simple a dĂ©clenchĂ© lâajout dâun endpoint. Peut-ĂȘtre que passer Ă un modĂšle plus performant aurait pu accĂ©lĂ©rer la reprise en main.
Au final, faute de temps, lâapplication est Ă 80% finie. Il manque quelques fonctionnalitĂ©s et je nâaurai aucune confiance Ă la dĂ©ployer en lâĂ©tat.
Je tire de cette expĂ©rience le sentiment que les pratiques dâingĂ©nierie logicielle sont essentielles pour que lâIA puisse ĂȘtre utile. Il reste (aujourdâhui) un fort besoin de cadrage et de supervision humaine.
Bilan: Productivité et souveraineté¶
A suivre ...
Un large merci Ă Logic Inc. pour leur article Codex is a Slytherin, Claude is a Hufflepuff qui mâa poussĂ© Ă Ă©crire ce billet.