Vous utilisez un assistant IA pour coder, mais les résultats sont souvent approximatifs ? Le problème ne vient probablement pas de l'outil, mais de la façon dont vous lui parlez. Le prompt engineering appliqué au code est une compétence qui transforme radicalement la qualité des résultats.
Les trois principes fondamentaux
1. Le contexte est roi
Prompt faible :
Crée un service d'authentification
Prompt avec contexte :
Crée un service d'authentification pour mon API NestJS 11.
Stack : TypeScript strict, Mongoose 8, JWT avec refresh tokens.
Conventions : DTOs avec class-validator, guards NestJS, modules par domaine.
Le user schema existe déjà dans src/modules/user/user.schema.ts
avec les champs email, passwordHash, role.
2. La spécificité des contraintes
Contraintes :
- TypeScript 5.7 strict (no any, no implicit returns)
- Gestion d'erreurs avec classes custom (HttpException)
- Tests unitaires avec Vitest inclus
- Pas de dépendance externe supplémentaire
- Documentation JSDoc sur les méthodes publiques
3. Le format de sortie explicite
Indiquez toujours ce que vous attendez comme livrable : un fichier unique ? Plusieurs fichiers ? Avec ou sans tests ?
Techniques spécifiques par outil
Claude Code : la puissance du CLAUDE.md
# CLAUDE.md optimisé pour le prompting
## Stack
- Frontend: Angular 21 (SSR, standalone, signals)
- Backend: NestJS 11, Mongoose 8.9
- Tests: Vitest (frontend), Jest (backend)
## Règles Importantes
- JAMAIS de `any` en TypeScript
- SSR obligatoire pour les pages publiques
- Les index MongoDB doivent être déclarés dans le schema
Avec un bon CLAUDE.md, les prompts deviennent concis :
Ajoute un endpoint GET /api/articles/search
qui supporte la recherche full-text avec pagination.
GitHub Copilot : le comment-driven development
// Service de cache Redis avec TTL configurable
// - Méthodes : get<T>, set, delete, invalidatePattern
// - Sérialisation JSON automatique
// - Gestion des erreurs de connexion avec fallback gracieux
export class CacheService {
// Récupère une valeur du cache, retourne null si absente
async get<T>(key: string): Promise<T | null> {
// Copilot génère ici
}
}
Patterns avancés
Few-shot : montrer plutôt qu'expliquer
Voici comment je structure mes controllers NestJS.
Crée le controller pour le module "comments" en suivant
exactement le même pattern.
Exemple existant (articles.controller.ts) :
@Controller('api/articles')
export class ArticleController {
@Get()
async findAll(@Query() query: PaginationDto) {
return this.articleService.findAll(query);
}
}
Le module comments a : create, findByArticle, delete (admin only).
Chain-of-thought pour le debugging
Ce code produit "Cannot read property 'map' of undefined" en production.
Avant de proposer un correctif :
1. Analyse le flux de données et identifie TOUS les endroits
où la valeur peut être undefined
2. Explique pourquoi ça fonctionne en dev mais pas en prod
3. Propose un correctif qui traite la cause racine
Anti-patterns courants
// Anti-pattern : trop vague
"Fais-moi une API"
// Corrigé : spécifique et contraint
"Crée un endpoint REST GET /api/stats/dashboard qui retourne :
- nombre total d'articles publiés
- articles publiés aujourd'hui
- top 5 catégories par nombre d'articles
Stack: NestJS, Mongoose, réponse typée avec interface TypeScript"
// Anti-pattern : scope trop large
"Crée un système d'auth complet avec login, register, 2FA, OAuth, rate limiting"
// Corrigé : découpage itératif
"Étape 1 : module auth avec register et login JWT.
Un service, un controller, les DTOs. On ajoutera le reste ensuite."
Le prompt engineering pour le code n'est pas un gadget : c'est la compétence qui sépare les développeurs qui trouvent l'IA "pas fiable" de ceux qui en font un multiplicateur de productivité. Investissez du temps dans votre CLAUDE.md, structurez vos commentaires pour Copilot, et adoptez le réflexe du découpage itératif.




