Toutes les publications
Intelligence ArtificielleRetour d'expérience

Apprendre à l'ère de l'IA : entre illusion de progrès et vrai levier

Depuis que j'utilise des outils comme Claude, Codex ou Antigravity dans mon travail de développement, quelque chose a changé. Pas seulement ma façon de coder, mais aussi ma façon de mesurer mon propre apprentissage. Retour d'expérience d'un développeur en formation chez VOID, entre un bug Docker résolu trop vite et du code legacy J2EE où il a fallu corriger l'IA.

ApprentissageDéveloppeur juniorAssistants de codeCode legacyMéthode socratiqueLearn by doing
Hamza Lazaar
Hamza Lazaar
Ingénieur en formation
2 juillet 2026 · 13 min de lecture

Pendant ma formation de développeur chez VOID, je suis souvent dans une position particulière : je dois avancer vite, comprendre du code existant, corriger des bugs, poser les bonnes questions, tout en continuant à construire mes bases.

L'IA m'aide énormément dans ce quotidien. Mais elle peut aussi me donner une impression trompeuse : celle d'avoir progressé simplement parce que le problème est résolu.

Et c'est là que le sujet devient intéressant.

1

Mon « learn by doing » n'est plus le même

Avant, apprendre en faisant voulait dire : prendre un problème, chercher dans la documentation, tester, échouer, recommencer. C'était parfois lent, parfois frustrant, mais cette friction laissait des traces. Elle construisait des réflexes.

Aujourd'hui, à la moindre difficulté, j'ai une issue de secours. Je peux décrire mon problème à ChatGPT, demander à des harness d'agents comme Codex ou Antigravity de m'expliquer une erreur, ou d'explorer une codebase legacy à ma place.

Le projet avance. Les tâches se cochent. Le code finit par fonctionner.

Mais il y a une différence entre produire du code et savoir le produire. Et cette différence, l'IA peut facilement la masquer.

2

Un bug Docker que j'ai résolu trop vite

Un exemple concret : chez VOID, je travaillais sur un pipeline CI/CD local avec Docker pour une application React. Une étape d'analyse de code plantait systématiquement avec une erreur assez obscure :

Sortie du conteneur
Dynamic loader not found: /lib64/ld-linux-x86-64.so.2

Seul, je pense que j'aurais perdu beaucoup de temps. L'erreur venait d'une couche assez basse : mon Mac utilise une puce Apple Silicon en ARM64, mais le conteneur essayait d'exécuter un outil compilé pour x86_64.

L'IA m'a orienté très vite vers la solution : forcer Docker à utiliser la bonne plateforme.

Le flag qui débloque tout
--platform linux/amd64

En une minute, le problème était débloqué.

Sur le moment, c'est très satisfaisant. Tu as l'impression d'être efficace, presque meilleur que la veille. Mais si je m'étais contenté de copier-coller ce flag sans comprendre ARM, x86, l'émulation et le rôle de Docker, je n'aurais pas vraiment appris. J'aurais juste ajouté une ligne magique à ma configuration.

Le piège, exactement. L'IA peut résoudre ton problème avant que tu aies eu le temps de comprendre ce que ce problème devait t'apprendre.

3

Le moment où j'ai dû corriger l'IA

J'ai aussi vécu l'inverse : un moment où l'IA s'est trompée, et où j'ai dû reprendre la main.

Je travaillais sur l'analyse d'un ancien workflow J2EE. L'objectif était de comprendre comment certains statuts étaient filtrés dans du code legacy, et quel rôle jouaient certaines procédures stockées.

Au départ, Antigravity proposait des modifications sur plusieurs fichiers Java, notamment RegDetRepository.java, AuthenticationService.java et StoredProcedureRepository.java. Mais une partie de ses changements sortait du périmètre que je voulais traiter. J'ai donc commencé par poser une limite claire : l'appel à la procédure stockée PL/SQL GEN_MATR ne faisait pas partie du périmètre à modifier. Hors scope.

Ensuite, j'ai voulu comprendre pourquoi l'IA affirmait que cette procédure insérait des données dans la table HS_INTRANET. Sa réponse était plausible, mais elle restait basée sur une déduction. Et c'est là que j'ai senti le risque : une IA peut formuler une hypothèse avec beaucoup d'assurance, même quand elle n'a pas encore de preuve directe.

Je l'ai donc coupée avec une consigne simple :

Prompt envoyé à l'IA
Stop guessing.
Je force l'IA à arrêter les suppositions et à revenir à des preuves concrètes dans le code source.

Ce moment est important. Je ne lui ai pas demandé d'aller plus vite, ni de générer une solution. Je lui ai demandé de ralentir. Je voulais qu'elle quitte le raisonnement probable pour revenir au code réel.

À ce stade, l'IA affirmait aussi que le code J2EE ne filtrait pas certains statuts. Mais en lisant Model_Espace_Managers.java, quelque chose me semblait incohérent, notamment dans la méthode updateHSIntranet(). Je l'ai donc challengée directement :

Prompt envoyé à l'IA
Are you sure that the J2EE code doesn't filter the statuses 98 and 99?
Hint: method updateHSIntranet() in Model_Espace_Managers.java
Je corrige l'analyse initiale de l'IA en la redirigeant vers une méthode précise du code legacy.

Là, l'IA a reconnu que mon intuition était bonne. Elle avait manqué un détail dans son analyse initiale, et le simple fait de lui donner le bon point d'entrée dans le code a changé sa réponse.

Ce moment m'a marqué parce qu'il inverse le rapport habituel. Je n'étais plus seulement en train de demander à l'IA de m'expliquer le système. J'étais en train de vérifier son raisonnement avec mes propres indices.

Et c'est probablement là que j'ai le plus appris : quand tu es capable de contester l'outil, c'est que tu commences vraiment à comprendre le sujet.

4

Deux méthodes presque identiques, deux réalités différentes

Un autre détail m'a marqué dans cette analyse : la présence de deux méthodes très proches dans le code J2EE que j'investiguais. D'un côté, updateHSIntranet(). De l'autre, updateIhsIntranet().

À première vue, la différence semble minime. Juste une variation de casse dans le nom de la méthode. Mais dans un projet legacy, ce genre de détail peut complètement changer l'analyse.

La méthode updateHSIntranet() contenait bien une partie de la logique liée aux statuts. C'est celle que j'avais repérée en lisant le code, et c'est elle qui m'a permis de corriger l'IA lorsqu'elle affirmait que le code J2EE ne filtrait pas les statuts 98 et 99.

Mais l'autre méthode, updateIhsIntranet(), semblait être du code mort : une méthode encore présente dans le code, mais qu'une analyse approfondie a montrée absente du flux réel. J'ai donc posé la question directement :

Prompt envoyé à l'IA
Isn't the updateIhsIntranet() method dead code?
En lisant le code, je repère une différence subtile entre deux méthodes presque identiques et je demande à l'IA de vérifier laquelle est réellement utilisée.

Là encore, l'IA a reconnu que mon intuition était bonne. La différence de nommage confirmait qu'il ne fallait pas tout interpréter comme une seule et même logique.

Ce passage m'a appris quelque chose de très concret : avec du code legacy et les revues ou audits de code, comprendre ne veut pas seulement dire lire ce que fait une méthode. Il faut aussi vérifier si elle est réellement appelée, dans quel flux, et si une autre méthode presque identique ne porte pas la vraie logique.

Si j'avais demandé à l'IA de « moderniser » directement le code, j'aurais peut-être migré une méthode inutile. En la challengeant, j'ai évité de traiter du code mort comme s'il faisait encore partie du système actif.

5

L'illusion de progrès

Le vrai danger, ce n'est pas que l'IA donne de mauvaises réponses. Le vrai danger, c'est qu'elle donne assez souvent de bonnes réponses pour que tu ne voies plus tes propres lacunes.

Tu livres une fonctionnalité. Tu corriges un bug. Tu gagnes du temps. D'un point de vue extérieur, tu progresses. Mais intérieurement, la question reste ouverte : est-ce que tu as compris, ou est-ce que tu as simplement accompagné une solution produite par l'outil ?

Cette illusion existait déjà avec Stack Overflow, les snippets copiés-collés ou les templates trouvés en ligne. Mais l'IA change l'échelle. La réponse arrive plus vite, elle est contextualisée, elle ressemble à une explication, et elle donne parfois l'impression qu'il n'y a plus besoin de traverser la difficulté.

Sauf que pour un développeur junior, cette difficulté fait partie de la formation.

6

Utiliser l'IA comme mentor, pas comme raccourci

Je ne pense pas que le problème soit l'outil. Le problème, c'est la posture. La même question, posée à Cursor ou ChatGPT de deux façons différentes, ne produit pas du tout le même apprentissage :

Je délègue

« Écris-moi une fonction qui fait X. »

Sortie rapide. Le problème est résolu, mais rien ne garantit que j'aurais su le résoudre seul demain.

J'apprends

« Voici ma fonction. Qu'est-ce qui ne va pas dans mon raisonnement ? »

Même outil, autre posture : je confronte mon raisonnement au sien, et c'est là que je progresse.

La différence est subtile, mais elle change tout. Dans le premier cas, je cherche une sortie rapide. Dans le second, je cherche à comprendre ce qui se passe.

C'est comme ça que j'essaie de l'utiliser aujourd'hui : moins comme un générateur de code, plus comme un partenaire d'analyse. Je veux qu'elle m'aide à formuler mes hypothèses, à les tester, à les contredire, et parfois à les abandonner.

Quand je lui demande « fais-moi ça », je gagne du temps. Quand je lui demande « voici ce que je pense, où est-ce que je me trompe ? », je progresse.

7

L'angle mort du junior : on ne sait pas ce qu'on ne sait pas

Le point le plus difficile, c'est que je ne sais pas toujours ce que je ne sais pas.

Pour utiliser l'IA comme outil d'apprentissage, il faut savoir quelles questions poser. Et pour poser les bonnes questions, il faut avoir une idée de ce qu'on ne maîtrise pas. Or c'est précisément ce qui manque quand on est junior : la carte mentale du domaine est incomplète, on ne sait pas où sont les trous, et seule la friction nous les montre.

Un développeur senior voit plus vite quand une suggestion de l'IA est fragile. Il repère les problèmes de sécurité, les cas limites, les abstractions inutiles, les mauvaises hypothèses. Il peut auditer, corriger, contester l'outil. Moi, je construis encore ce radar.

Sans ce radar, on peut livrer dix features en s'appuyant largement sur l'IA, accumuler de la confiance, et ne jamais réaliser qu'on a des angles morts entiers : des edge cases qu'on n'a jamais rencontrés, des patterns qu'on n'a jamais eu à questionner, des erreurs qu'on n'a jamais eu à diagnostiquer seul.

L'IA ne comblera pas ces trous d'elle-même. Elle répond à ce qu'on lui demande. Si tu ne sais pas qu'une zone d'ombre existe, tu ne poseras jamais la question qui t'en sortirait. C'est précisément pour ça que je dois garder une part de friction volontaire dans mon apprentissage.

8

Ce que j'ai décidé de faire

Je ne vais pas arrêter d'utiliser l'IA, ce serait absurde. Dans mon quotidien, elle me fait gagner du temps, elle m'aide à débloquer des situations complexes, et elle m'oblige souvent à formuler mes problèmes plus clairement.

À ce titre, elle joue parfois le rôle d'un canard en plastique augmenté. Les développeurs connaissent le rubber duck debugging : expliquer son code à voix haute à un canard en plastique posé sur le bureau, parce que le simple fait de verbaliser son raisonnement suffit souvent à faire apparaître l'erreur. Formuler un prompt clair et descriptif produit exactement cet effet : j'explique mon problème étape par étape, je verbalise mes hypothèses, et cette clarification révèle déjà des erreurs ou des angles morts. La différence, c'est que ce canard-là répond : il peut me relancer, me demander de préciser une hypothèse, ou pointer une incohérence.

Mais j'ai décidé de ne plus l'utiliser uniquement comme un outil qui produit des réponses. Je veux l'utiliser comme un interlocuteur qui m'aide à construire mon raisonnement. Concrètement, j'essaie d'adopter une méthode plus socratique :

Comprendre pourquoi ça marche : quand l'IA propose une solution, je ne vérifie plus seulement si « ça marche ». Je veux savoir dans quel contexte ça peut casser, et quelles hypothèses techniques se cachent derrière.

La ramener aux faits : quand elle part trop vite vers une réponse : le code source, les logs, la structure de la base, les appels réels, les cas limites.

Investiguer en parallèle : pendant qu'elle exécute ou analyse, je continue moi aussi à lire, tester, comparer, chercher les incohérences. L'objectif : confronter son raisonnement au mien, pas la laisser réfléchir à ma place.

M'orienter dans mon apprentissage : lui demander une roadmap structurée (cloud, DevOps…), mais la valeur n'est pas dans la roadmap. Elle est dans ce que j'en fais : lire la doc, manipuler, déployer, casser, corriger, recommencer.

C'est cette posture que je veux garder : utiliser l'IA comme un partenaire d'investigation et d'orientation, pas comme une sortie de secours permanente.

Pour moi, le vrai levier est là : ne pas utiliser l'IA pour éviter la difficulté, mais pour mieux la questionner, mieux la comprendre, et finir par être capable de la traverser moi-même, tout en gagnant en productivité.

9

Questions fréquentes

L'IA fait-elle vraiment progresser un développeur junior ?
Oui, à condition de ne pas confondre « problème résolu » et « compétence acquise ». Utilisée comme raccourci, l'IA masque les lacunes ; utilisée comme partenaire d'analyse (expliquer, justifier, contester), elle accélère réellement l'apprentissage.
Comment utiliser Claude ou ChatGPT pour apprendre sans se reposer dessus ?
En changeant de posture : au lieu de demander « écris-moi une fonction qui fait X », soumettre son propre raisonnement (« voici ma fonction, qu'est-ce qui ne va pas ? »), exiger des preuves tirées du code réel, et vérifier soi-même les hypothèses de l'outil.
Qu'est-ce que la méthode socratique appliquée à l'IA ?
Résoudre les problèmes en posant des questions plutôt qu'en demandant des solutions : faire justifier chaque déduction de l'IA, la ramener aux faits (code source, logs, structure de la base), et confronter son raisonnement au sien pendant qu'elle analyse.
Pourquoi l'IA peut-elle créer une illusion de progrès ?
Parce qu'elle donne assez souvent de bonnes réponses pour masquer les lacunes : les tâches se cochent, le code fonctionne, mais la friction qui construit les réflexes (chercher, échouer, recommencer) n'a pas eu lieu. On livre plus en comprenant moins qu'on ne le croit.

Envie de rejoindre l'aventure VOID ?

Formation continue, projets IA en production, code legacy à dompter et mentorat exigeant : chez VOID, les juniors apprennent en faisant, avec l'IA comme partenaire d'investigation, pas comme béquille.

À propos de l’auteur

Hamza Lazaar

Hamza Lazaar

Ingénieur en formation

Ingénieur en formation chez VOID et fraîchement diplômé de l'ENSA Agadir, Hamza travaille sur un projet de refonte de bout en bout d'un système informatique J2EE monolithique vers une architecture découplée basée sur Spring Boot et React.

Encadré par

Mehdi Najeddine
Mehdi Najeddine
Fondateur & Directeur de VOID

Cet article vous a été utile ?

Partagez-le à votre réseau, en particulier aux développeurs juniors qui construisent leurs bases à l'ère des assistants IA.

🌱Site éco-conçu