« Sois paresseux » est une tronçonneuse. Elle coupe la plomberie — et l'organe avec.'Be lazy' is a chainsaw. It cuts the plumbing — and the organ with it.
Ton agent sur-construit : tu demandes un sélecteur de date, il installe une librairie, écrit un wrapper et ouvre un débat sur les fuseaux horaires. Le remède à la mode est une règle « sois paresseux / YAGNI » qui supprime tout ce qu'elle peut. Elle marche sur la plomberie — et mutile le domaine, parce qu'elle ne sait pas distinguer un objet-valeur Money d'une classe EmailValidator de 27 lignes : elle compte les lignes, alors elle coupe les deux. Il manque une chose à la règle paresseuse : le discernement. Classe le code avant de le couper.Your agent over-builds: ask for a date picker and it installs a library, writes a wrapper, and opens a debate about timezones. The fashionable cure is a 'be lazy / YAGNI' rule that deletes whatever it can. It works on plumbing — and maims the domain, because it can't tell a Money value object from a 27-line EmailValidator class: it counts lines, so it cuts both. The lazy rule is missing one thing: discernment. Classify the code before you cut it.
- Cast DTO → modèleDTO → model cast
- Retry, logging, configRetry, logging, config
- Wrapper de librairieLibrary wrapper
- Objet-valeur Money (pas de mélange de devises)Money value object (no mixed-currency math)
- Port PaymentGateway (frontière + couture de test)PaymentGateway port (boundary + test seam)
- Validation au passage du réseauValidation at the network boundary
« Ce code est-il accessoire ou essentiel ? » L'accessoire — la glue, le transport, le formatage — se taille au bistouri sans regret. L'essentiel — un invariant, une frontière, une couture de test — ne se juge pas au nombre de lignes : une abstraction à une seule implémentation peut être exactement à sa place. Coupe la plomberie. Défends le domaine.'Is this code incidental or essential?' The incidental — glue, transport, formatting — is cut with the scalpel, no regret. The essential — an invariant, a boundary, a test seam — isn't judged by line count: a single-implementation abstraction can be doing exactly its job. Cut the plumbing. Defend the domain.
Vol 0 #1 dit où placer la couture, #2 ce qu'une couche coûte, #3 quand trancher. Les trois supposent qu'on sait déjà reconnaître ce qui mérite une couture. C'est la question de ce numéro : avant de couper au nom de YAGNI, distinguer la plomberie qu'on gonfle de l'organe qu'on protège. Sans ce tri, les trois précédents se retournent contre toi.Vol 0 #1 says where to put the seam, #2 what a layer costs, #3 when to decide. All three assume you can already recognize what deserves a seam. That's this issue's question: before cutting in the name of YAGNI, tell the plumbing you bloat from the organ you protect. Without that sorting, the first three turn against you.