Prompt Engineering pour Claude Code

Jour 4 - Techniques pour obtenir exactement ce que vous voulez

Prompt Engineering pour Claude Code
Available in English

Vous maîtrisez maintenant le workflow Explore → Plan → Code → Test. Mais la qualité des résultats dépend énormément de comment vous formulez vos requêtes. Aujourd'hui, nous allons aborder les techniques de prompt engineering spécifiques à Claude Code.

Le Principe Fondamental : La Spécificité

La différence entre un bon et un mauvais prompt :

Mauvais promptBon prompt
"Ajoute des tests""Ajoute des tests unitaires pour la fonction calculateDiscount couvrant : prix négatif, remise > 100%, et cas nominal"
"Corrige le bug""Le bug : TypeError: Cannot read property 'id' of undefined à la ligne 42 de @src/api/users.ts. Corrige en ajoutant une vérification null."
"Améliore le code""Refactorise @src/utils/helpers.ts pour extraire les fonctions de validation dans un module séparé validators.ts"

Structure d'un Prompt Efficace

Le Template CCAR

CONTEXTE: [Situation actuelle]
CONTRAINTES: [Limitations à respecter]
ACTION: [Ce que vous voulez]
RÉSULTAT: [Format attendu]

Exemple Appliqué

> CONTEXTE: J'ai un composant React `UserProfile` qui fait 300 lignes.
  Il gère l'affichage, les appels API, et la validation du formulaire.

  CONTRAINTES:
  - Garder la compatibilité avec les tests existants
  - Ne pas changer les props publiques
  - Utiliser les hooks existants dans @src/hooks/

  ACTION: Diviser ce composant en suivant le pattern Container/Presenter.

  RÉSULTAT: Montre-moi le plan de découpage avant de coder.

Techniques Avancées

1. Fournir des Exemples (Few-shot)

> Je veux que les fonctions utilitaires suivent ce pattern :

  /**
   * Calcule le prix TTC à partir du prix HT
   * @param prixHT - Prix hors taxes
   * @param tauxTVA - Taux de TVA (ex: 0.20 pour 20%)
   * @returns Prix TTC arrondi à 2 décimales
   * @throws {InvalidPriceError} Si le prix est négatif
   */
  export function calculerPrixTTC(prixHT: number, tauxTVA: number): number {
    if (prixHT < 0) throw new InvalidPriceError('Le prix ne peut pas être négatif');
    return Math.round((prixHT * (1 + tauxTVA)) * 100) / 100;
  }

  Crée une fonction `calculerRemise` qui suit exactement ce pattern.

2. Spécifier les Contraintes Négatives

Ce que vous ne voulez pas est aussi important :

> Refactorise ce code avec ces contraintes :

  NE PAS:
  - Ajouter de nouvelles dépendances
  - Modifier les signatures de fonctions publiques
  - Changer le comportement observable
  - Utiliser any ou as unknown

  FAIRE:
  - Extraire les fonctions dupliquées
  - Améliorer le typage
  - Ajouter des early returns

3. Demander Plusieurs Options

> Propose 3 approches différentes pour implémenter le cache des requêtes :

  1. Une approche simple avec Map
  2. Une approche avec TTL et invalidation
  3. Une approche avec Redis

  Pour chaque approche, indique : complexité, avantages, inconvénients.

4. Utiliser le Contexte des Fichiers

> En analysant @src/api/users.ts et @src/api/products.ts,
  identifie le pattern commun et crée une factory générique
  pour les endpoints CRUD.

5. Chaîner les Requêtes

Au lieu d'une grande requête, chaînez-les :

> Étape 1: Liste les problèmes de performance dans @src/components/DataTable.tsx

[Claude liste 5 problèmes]

> Étape 2: Pour le problème #2 (re-renders inutiles), propose une solution

[Claude propose]

> Étape 3: Implémente cette solution avec useMemo

Patterns de Prompts pour Cas Courants

Debugging

> BUG: [Description]
  ERREUR: [Message d'erreur exact]
  FICHIER: @path/to/file.ts:LIGNE
  REPRODUCTION: [Étapes pour reproduire]

  Analyse et propose un fix.

Code Review

> Review @src/features/checkout/payment.ts en vérifiant :

  1. Sécurité (injection, XSS, validation)
  2. Gestion d'erreurs (try/catch, erreurs métier)
  3. Performance (N+1, mémoire)
  4. Maintenabilité (nommage, complexité)

  Format : liste les problèmes par catégorie avec sévérité (critique/moyen/faible)

Refactoring

> Refactorise @src/legacy/oldModule.ts :

  OBJECTIF: Migrer vers le nouveau pattern utilisé dans @src/modules/newModule.ts
  GARDER: Les tests existants doivent passer
  SUPPRIMER: Le code mort identifié par ESLint
  AJOUTER: Types TypeScript stricts

Documentation

> Génère la documentation JSDoc pour @src/lib/auth.ts :

  - Description de chaque fonction publique
  - @param avec types et descriptions
  - @returns avec type et description
  - @throws pour les erreurs possibles
  - @example avec un cas d'usage

  Style : concis, technique, sans blabla

Tests

> Génère les tests pour @src/services/orderService.ts :

  FRAMEWORK: Vitest
  PATTERN: Arrange-Act-Assert
  COUVERTURE:
  - Cas nominal (happy path)
  - Cas d'erreur (validation, DB, réseau)
  - Cas limites (null, undefined, vide)

  MOCKS: Utilise les factories dans @tests/factories/

Mots-Clés qui Changent Tout

Pour la Réflexion

Mot-cléEffet
thinkRéflexion basique
think hardRéflexion approfondie
think harderAnalyse en profondeur
ultrathinkRéflexion maximale
step by stepDécomposition explicite
analyzeFocus sur l'analyse vs l'action

Pour le Format

Mot-cléEffet
conciseRéponses courtes
detailedExplications complètes
listFormat liste à puces
tableFormat tableau markdown
code onlyPas d'explications, juste du code

Pour l'Action

Mot-cléEffet
don't code yetForce le mode plan
show before applyingPrévisualisation des changements
one step at a timeImplémentation incrémentale
suggest alternativesPlusieurs options

Erreurs Courantes à Éviter

1. Le Prompt Vague

Mauvais :

> Améliore ce code

Bon :

> Améliore @src/utils/date.ts en :
  1. Remplaçant moment.js par date-fns
  2. Ajoutant un typage strict
  3. Ajoutant des tests pour les cas limites de timezone

2. Trop de Choses à la Fois

Mauvais :

> Crée un système d'authentification complet avec OAuth, 2FA, sessions,
  rate limiting, logs d'audit, et dashboard admin

Bon :

> Étape 1: Crée le schéma de base de données pour l'authentification
  (users, sessions, oauth_accounts)

3. Pas de Contexte

Mauvais :

> Pourquoi ça ne marche pas ?

Bon :

> Cette fonction retourne undefined au lieu de l'objet user :

  @src/api/users.ts:42-55

  Input attendu: { email: "test@example.com" }
  Output attendu: { id: 1, email: "test@example.com", name: "Test" }
  Output actuel: undefined

  Voici les logs : !`npm run debug:users 2>&1`

4. Ignorer les Contraintes du Projet

Mauvais :

> Utilise Redux pour la gestion d'état

Bon :

> En utilisant Zustand (déjà configuré dans @src/store/),
  ajoute un store pour gérer le panier d'achat

Template CLAUDE.md Optimisé

Voici un template CLAUDE.md qui améliore drastiquement les réponses :

# CLAUDE.md

## Contexte Projet
[Type d'application, stack technique, contraintes métier]

## Conventions de Code
- Nommage : [camelCase, PascalCase, etc.]
- Structure : [Feature-based, Layer-based, etc.]
- Patterns : [Hooks, HOC, Render Props, etc.]

## Commandes Utiles
- `npm run dev`: Développement
- `npm run test`: Tests
- `npm run lint`: Linting
- `npm run typecheck`: TypeScript

## Règles Strictes
- NE JAMAIS modifier les fichiers dans /config/
- NE JAMAIS commiter les fichiers .env
- TOUJOURS utiliser des types stricts (pas de any)
- TOUJOURS ajouter des tests pour le nouveau code

## Stack Technique
- Framework: [Next.js 14, etc.]
- État: [Zustand, etc.]
- BDD: [PostgreSQL + Prisma, etc.]
- Tests: [Vitest + Testing Library, etc.]

## Exemples de Bon Code
Voir @src/features/auth/ pour le pattern à suivre.

Ce qui Arrive Demain

Dans le Jour 5, nous plongerons dans la gestion du contexte et de la mémoire : comment Claude Code se souvient de vos préférences et comment optimiser les sessions longues.


Cet article fait partie de la série "Maîtriser Claude Code en 20 jours". Jour 3 : Le Workflow Explore → Plan → Code → Test