🇬🇧 English

Prompt Engineering pour Claude Code

Jour 4 - Techniques pour obtenir exactement ce que vous voulez

Par Angelo Lima

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 prompt Bon 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
think Réflexion basique
think hard Réflexion approfondie
think harder Analyse en profondeur
ultrathink Réflexion maximale
step by step Décomposition explicite
analyze Focus sur l’analyse vs l’action

Pour le Format

Mot-clé Effet
concise Réponses courtes
detailed Explications complètes
list Format liste à puces
table Format tableau markdown
code only Pas d’explications, juste du code

Pour l’Action

Mot-clé Effet
don't code yet Force le mode plan
show before applying Prévisualisation des changements
one step at a time Implémentation incrémentale
suggest alternatives Plusieurs 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

Share: