Prompt Engineering

Prompt engineering pour devs : guide pratique

Un prompt vague produit du code vague. Un prompt precis produit du code production-ready. La difference entre les deux, c'est souvent 30 secondes de reflexion supplementaires -- et une methodologie que la plupart des developpeurs n'ont jamais formalisee. En 2026, alors que les LLMs sont integres dans pratiquement tous les workflows de developpement, maitriser le prompt engineering n'est plus un nice-to-have : c'est une competence technique a part entiere, au meme titre que savoir ecrire des test

Jean-Michel Helem

Jean-Michel Helem

31 mars 2026 · 9 min de lecture

Prompt engineering pour devs : guide pratique

Un prompt vague produit du code vague. Un prompt precis produit du code production-ready. La difference entre les deux, c'est souvent 30 secondes de reflexion supplementaires -- et une methodologie que la plupart des developpeurs n'ont jamais formalisee. En 2026, alors que les LLMs sont integres dans pratiquement tous les workflows de developpement, maitriser le prompt engineering n'est plus un nice-to-have : c'est une competence technique a part entiere, au meme titre que savoir ecrire des tests ou configurer un pipeline CI/CD.

Ce guide est votre point d'entree. Il couvre les fondamentaux, les techniques avancees, les exemples concrets et les anti-patterns. Si vous utilisez Claude Code, Cursor, Copilot ou n'importe quel assistant IA au quotidien, vous allez repartir avec des methodes directement applicables.

Pourquoi le prompt engineering est different pour les developpeurs

Ecrire un prompt pour generer un email marketing et ecrire un prompt pour generer du code sont deux exercices fondamentalement differents. Le code a des contraintes que le texte n'a pas.

Le code doit compiler. Un texte approximatif reste lisible. Un code approximatif ne s'execute pas. Quand vous demandez a un LLM de generer une fonction, le resultat doit etre syntaxiquement correct, logiquement coherent et compatible avec votre stack. Cela impose un niveau de precision dans le prompt que la redaction classique n'exige pas.

Le contexte technique est dense. Un prompt pour du code doit souvent inclure le langage, le framework, la version, les conventions du projet, les types existants, les dependances. Un prompt marketing a besoin du ton et de l'audience. L'asymetrie de contexte est enorme.

La validation est objective. Vous pouvez verifier si le code genere passe les tests, respecte les types, et ne casse pas le build. Cette objectivite vous permet d'iterer scientifiquement sur vos prompts -- ce que peu de developpeurs font aujourd'hui.

Selon une etude GitHub de fin 2025, les developpeurs qui structurent systematiquement leurs prompts produisent du code accepte en review 2,3 fois plus souvent que ceux qui utilisent des prompts ad hoc. La difference n'est pas dans l'outil -- c'est dans la methode.

Les fondamentaux : les trois piliers d'un bon prompt

Avant d'aborder les techniques avancees, trois principes doivent devenir des reflexes.

Pilier 1 : Etre specifique

Le prompt le plus courant et le moins efficace ressemble a ceci :

Ecris-moi une fonction de validation

Le LLM ne sait pas quel langage, quel type de validation, quels cas limites gerer, ni quel style de code adopter. Le resultat sera generique et rarement utilisable tel quel.

Comparez avec :

Ecris une fonction TypeScript qui valide une adresse email.
- Input : string
- Output : { valid: boolean, error?: string }
- Regles : format RFC 5322, domaine avec au moins un point, pas d'espaces
- Gere les cas : string vide, null, undefined
- Style : pas de regex complexe, privilegier la lisibilite
- Pas de dependance externe

Le second prompt prend 20 secondes de plus a ecrire. Il economise 10 minutes d'aller-retour.

Pilier 2 : Donner du contexte

Le LLM n'a pas acces a votre codebase (sauf si vous utilisez un outil qui l'injecte automatiquement comme [Claude Code](/claude-code-guide-complet-2026/)). Vous devez expliciter ce que vous considerez comme evident.

Contexte critique a inclure :

  • Le langage et sa version : "TypeScript 5.4 avec strict mode"
  • Le framework : "Next.js 15 App Router"
  • Les conventions : "On utilise des barrel exports, pas de default export"
  • Le code existant pertinent : types, interfaces, fonctions liees
  • Les contraintes : "Pas de dependance supplementaire", "Compatible Node 20+"

Pilier 3 : Iterer

Un prompt n'est pas une incantation magique. C'est un point de depart. Les meilleurs resultats viennent d'une conversation iterative :

1. Premier prompt avec le contexte et les specs
2. Evaluation du resultat : qu'est-ce qui manque ?
3. Prompt de refinement : "Ajoute la gestion des erreurs reseau" ou "Remplace l'approche imperative par du fonctionnel"
4. Validation finale

Les developpeurs qui obtiennent les meilleurs resultats ne cherchent pas le prompt parfait du premier coup. Ils construisent une conversation structuree.

Techniques avancees

Une fois les fondamentaux en place, trois techniques font passer vos resultats au niveau superieur.

Few-shot prompting : montrer au lieu d'expliquer

Le few-shot consiste a donner des exemples de ce que vous attendez. Pour du code, c'est redoutablement efficace.

Convertis ces fonctions callback en async/await.

Exemple :
// Avant
function getUser(id, callback) {
  db.query('SELECT * FROM users WHERE id = ?', [id], (err, rows) => {
    if (err) callback(err);
    else callback(null, rows[0]);
  });
}

// Apres
async function getUser(id: string): Promise<User> {
  const rows = await db.query('SELECT * FROM users WHERE id = ?', [id]);
  return rows[0];
}

Maintenant, convertis cette fonction :
function getOrders(userId, startDate, callback) {
  db.query(
    'SELECT * FROM orders WHERE user_id = ? AND date > ?',
    [userId, startDate],
    (err, rows) => {
      if (err) callback(err);
      else callback(null, rows);
    }
  );
}

En fournissant un exemple, vous definissez implicitement le style, le niveau de typage, la gestion d'erreurs et la convention de nommage. Le LLM reproduira le pattern bien plus fidelement qu'avec une description textuelle.

Chain-of-thought pour le debugging

Quand vous demandez a un LLM de debugger du code, le resultat est souvent superficiel. La technique du chain-of-thought force une analyse methodique :

Ce composant React cause un rendu infini. Analyse le probleme etape par etape :

1. Identifie les causes potentielles de re-render
2. Trace le flux de donnees dans les hooks
3. Verifie les dependances du useEffect
4. Propose un correctif avec explication

[code du composant]

En demandant explicitement une analyse pas-a-pas, vous obtenez un raisonnement structure plutot qu'un "essaie de remplacer useEffect par useCallback" sans explication.

Role prompting : definir l'expertise

Attribuer un role au LLM calibre le niveau de detail et le vocabulaire de la reponse :

Tu es un senior backend engineer specialise Java/Spring Boot
avec 10 ans d'experience en systemes distribues.

Fais une review de ce service. Focus sur :
- Thread safety
- Gestion des transactions
- Patterns de resilience (retry, circuit breaker)
- Performance sous charge (1000 req/s)

Le role ne change pas les connaissances du modele, mais il oriente la reponse vers le niveau d'expertise et les preoccupations pertinentes. Un prompt identique sans le role produira une review plus generique.

Exemples concrets : 4 prompts production-ready

Voici quatre prompts que vous pouvez utiliser (et adapter) immediatement.

Prompt 1 : Refactoring

Refactore cette fonction en respectant ces contraintes :

Objectif : ameliorer la lisibilite et la testabilite
Langage : TypeScript strict
Regles :
- Extrais les effets de bord (appels API, acces DB) en parametres injectes
- Chaque fonction fait une seule chose
- Noms de variables explicites (pas d'abbreviations)
- Ajoute les types de retour explicites
- Conserve le comportement exact (pas d'optimisation fonctionnelle)

[code a refactorer]

Prompt 2 : Generation de tests

Ecris des tests unitaires pour cette fonction.

Framework : Vitest
Style : Arrange-Act-Assert, un assert par test
Couverture :
- Cas nominal (happy path)
- Cas limites (string vide, null, tableau vide, nombres negatifs)
- Cas d'erreur (exception, timeout, donnees invalides)
- Cas de regression (si tu identifies un edge case non evident)

Convention de nommage : "should [comportement attendu] when [condition]"

[code de la fonction]

Pour aller plus loin sur l'integration des tests avec l'IA, consultez notre guide sur le [TDD assiste par IA](/tdd-assiste-ia-workflow/).

Prompt 3 : Code review

Fais une review de cette pull request.

Contexte : API REST Spring Boot 3.4, Java 25, PostgreSQL
Trafic : 500 req/s en pic

Analyse :
1. Bugs potentiels ou comportements inattendus
2. Problemes de performance ou de scalabilite
3. Failles de securite (injection SQL, XSS, IDOR)
4. Violations des principes SOLID
5. Tests manquants

Format : liste priorisee (critique > majeur > mineur)
Pour chaque point : probleme, impact, correctif suggere

[code de la PR]

Prompt 4 : Documentation

Genere la documentation JSDoc pour cette classe.

Regles :
- Description concise de chaque methode (1-2 lignes)
- @param avec type et description
- @returns avec type et description
- @throws pour chaque exception possible
- @example avec un cas d'usage realiste
- Pas de commentaires triviaux ("Gets the name" pour getName)

Les anti-patterns a eviter

Certains reflexes produisent systematiquement de mauvais resultats. En voici cinq.

Anti-pattern 1 : le prompt trop vague. "Fais-moi un backend" n'est pas un prompt, c'est un voeu. Plus votre prompt est vague, plus le LLM comble les blancs avec des hypotheses generiques.

Anti-pattern 2 : l'absence de contraintes. Sans contraintes, le LLM choisit les valeurs par defaut les plus courantes. Il generera du JavaScript au lieu de TypeScript, utilisera var au lieu de const, et ignorera la gestion d'erreurs. Chaque contrainte que vous omettez est une decision que le modele prendra a votre place.

Anti-pattern 3 : le mega-prompt monolithique. Demander en une seule fois "genere un CRUD complet avec authentification, tests, documentation et deploiement Docker" produit un resultat superficiel sur chaque aspect. Decomposez en etapes. Comme dans le [prompt engineering vs fine-tuning](/prompt-engineering-vs-fine-tuning-cas-concrets/), la granularite est votre alliee.

Anti-pattern 4 : ignorer les erreurs. Quand le LLM produit du code incorrect, ne relancez pas le meme prompt. Expliquez ce qui ne va pas : "Ce code compile mais echoue quand l'input est un tableau vide. Voici l'erreur : [stack trace]."

Anti-pattern 5 : ne pas donner le code existant. Le LLM ne peut pas deviner vos types, vos interfaces, vos conventions. Si vous demandez d'ajouter une methode a un service sans fournir la classe existante, le resultat sera incompatible.

Mesurer la qualite de vos prompts

Un prompt n'est bon que si son resultat l'est. Voici comment evaluer objectivement.

Taux d'utilisation directe. Quel pourcentage du code genere utilisez-vous tel quel, sans modification ? Si c'est en dessous de 60%, vos prompts manquent de precision. Les meilleurs prompt engineers atteignent 80-90% sur des taches bien delimitees.

Nombre d'iterations. Combien d'aller-retours avant un resultat satisfaisant ? Un bon prompt produit un resultat exploitable en 1-2 iterations. Au-dela de 3, il faut revoir la structure du prompt initial.

Couverture des edge cases. Le code genere gere-t-il les cas limites sans que vous les ayez explicitement listes ? Si oui, votre contexte est suffisamment riche pour que le LLM infere les bonnes pratiques.

Reproductibilite. Relancez le meme prompt 3 fois. Les resultats sont-ils coherents en qualite ? Si la variance est forte, votre prompt est ambigu et le modele "joue aux des" entre plusieurs interpretations.

Pour les equipes qui veulent aller plus loin, mesurez ces metriques sur une semaine. Les donnees vous montreront exactement ou vos prompts sont faibles.

Integration dans les outils : les rules files

Le prompt engineering ne se limite pas aux conversations interactives. En 2026, les assistants IA de code lisent des fichiers de configuration qui agissent comme des system prompts persistants.

CLAUDE.md pour Claude Code

Le fichier CLAUDE.md a la racine de votre projet definit le comportement de [Claude Code](/claude-code-claude-md-rules-fichier/) pour toute votre codebase :



## Stack
- TypeScript 5.5 strict mode
- Next.js 15 App Router
- Prisma ORM avec PostgreSQL
- Tests : Vitest + Testing Library

## Regles de code
- Pas de default exports
- Pas de any : utiliser unknown + type guards
- Fonctions pures privilegiees
- Gestion erreurs : Result<T, E> pattern, pas de throw

## Conventions de nommage
- Variables/fonctions : camelCase
- Types/Interfaces : PascalCase, prefixe I interdit
- Fichiers : kebab-case
- Tests : [nom].test.ts dans le meme repertoire

Ce fichier transforme chaque interaction avec Claude Code en un prompt contextualise automatiquement. Plus besoin de repeter votre stack a chaque question.

.cursorrules pour Cursor

Meme principe, syntaxe differente. Le fichier .cursorrules configure Cursor avec vos conventions. Le concept est identique : reduire le prompt engineering repetitif en le codifiant une fois.

copilot-instructions.md pour GitHub Copilot

GitHub Copilot supporte desormais un fichier .github/copilot-instructions.md qui joue le meme role. L'ecosysteme converge vers une idee simple : vos conventions de code doivent etre lisibles par les humains ET par les LLMs.

Ce que ces rules files ont en commun : ils appliquent les memes principes de prompt engineering (specificite, contexte, contraintes) mais de maniere automatisee et partagee avec toute l'equipe. C'est du prompt engineering a l'echelle.

Si vous debutez avec les assistants IA de code, notre [guide Claude Code](/claude-code-guide-complet-2026/) et notre article sur le [vibe coding](/vibe-coding-guide-complet-2026/) sont de bons points de depart complementaires.

Le framework CRISP : structurer ses prompts

Pour ceux qui cherchent un cadre formel, le framework CRISP offre une structure memorable :

  • Contexte : stack technique, version, environnement
  • Role : expertise attendue du LLM
  • Instructions : la tache precise a accomplir
  • Specifications : contraintes, format, conventions
  • Preuve : exemples (few-shot) ou cas de test

Applique a un prompt concret :

[Contexte] API Spring Boot 3.4, Java 25, architecture hexagonale.
[Role] Senior backend engineer, expert DDD.
[Instructions] Implemente le use case "creer une commande" dans le domain layer.
[Specifications] Value objects immuables, pas d'annotation framework
dans le domain, validation dans le constructeur, exceptions metier typees.
[Preuve] Voici un exemple de value object existant dans le projet :
[code d'exemple]

CRISP n'est pas une formule magique. C'est une checklist mentale qui vous empeche d'oublier une dimension importante du prompt. Avec le temps, ces reflexes deviennent naturels et vous n'aurez plus besoin de l'acronyme.

Passer a la pratique

Le prompt engineering pour developpeurs n'est pas une discipline abstraite. C'est un ensemble de reflexes concrets qui se perfectionnent a l'usage. Commencez par appliquer les trois piliers (specificite, contexte, iteration) a vos prochaines interactions avec un LLM. Mesurez la difference. Puis explorez les techniques avancees et les rules files pour industrialiser votre approche.

L'investissement est minimal : quelques secondes de reflexion supplementaires par prompt. Le retour est mesurable : moins d'iterations, du code plus propre, des reviews plus rapides. Dans un ecosysteme ou [la securite du code genere par IA](/securiser-code-genere-ia-checklist/) est un enjeu croissant, des prompts precis sont aussi votre premiere ligne de defense contre le code approximatif.

Les articles a venir dans cette serie approfondiront chaque technique : le framework CRISP en detail, la redaction de system prompts efficaces, la configuration avancee des rules files et les methodes de test de prompts. Ce guide est votre fondation -- la suite construira dessus.