Code Quality — Garde-fou permanent
Ce skill s'active automatiquement quand du code est écrit ou modifié, pour maintenir la qualité même sans commande explicite.
Avant d'écrire du code
Checklist mentale
- •Code réutilisable existant ? — Cherche dans le projet avant de créer
- •Minimum de fichiers touchés ? — Ne modifie que ce qui est nécessaire
- •CLAUDE.md lu ? — Conventions, patterns, architecture du projet
- •DESIGN_SYSTEM.md lu ? — Si le changement touche à l'UI
Principes Karpathy (toujours actifs)
| Principe | En pratique |
|---|---|
| Ne pas deviner | Ambigu → demande. Deux approches possibles → montre les tradeoffs |
| Code minimal | Minimum viable. Pas d'abstractions prématurées. 10 lignes > 100 lignes si même résultat |
| Chirurgical | Ne touche que les fichiers concernés. Pas de refactoring opportuniste |
| Vérifier | Build/test après chaque changement significatif |
Pendant l'écriture
Ce qu'il faut faire
- •Respecter les conventions de nommage du projet
- •Suivre les patterns existants (imports, exports, structure)
- •Garder la langue des commentaires cohérente avec le projet
- •Écrire du code lisible — noms explicites, fonctions courtes
Ce qu'il faut éviter
- •Ajouter du code "au cas où" ou "pour plus tard"
- •Créer des abstractions pour un seul usage
- •Ajouter des dépendances sans évaluation
- •Laisser des
console.log,TODOou code commenté - •Modifier du code hors du périmètre demandé
- •Ajouter des types, docstrings ou commentaires au code non modifié
Après l'écriture
- •Le code compile/build sans erreur ?
- •Les tests existants passent toujours ?
- •Le comportement est conforme à ce qui a été demandé ?
- •Aucun fichier touché en dehors du périmètre ?
Anti-patterns courants par langage
JavaScript / TypeScript
| Anti-pattern | Mieux |
|---|---|
any partout | Types explicites ou unknown + narrowing |
== null vs === null | Toujours === (sauf check null/undefined intentionnel) |
| Callback hell | async/await |
var | const par défaut, let si réassignation |
for (let i = 0; ...) sur un array | .map(), .filter(), .reduce() |
| Import de la lib entière | Import destructuré (import { get } from 'lodash') |
console.log pour debug | Supprimer avant commit |
Python
| Anti-pattern | Mieux |
|---|---|
except: (bare except) | except SpecificError: |
Mutable default args (def f(x=[])) | def f(x=None): x = x or [] |
import * | Imports explicites |
| String concatenation en boucle | f-strings ou join() |
| Pas de type hints | Type hints sur les signatures publiques |
PHP
| Anti-pattern | Mieux |
|---|---|
@ (error suppression) | Gestion explicite |
extract() | Accès explicite aux clés |
$$var (variables dynamiques) | Array associatif |
echo dans les classes | Return + template |
| Pas de strict types | declare(strict_types=1) |
Règle d'or
Trois lignes similaires valent mieux qu'une abstraction prématurée. Le bon niveau de complexité, c'est le minimum nécessaire pour la tâche en cours.