02Blog

La documentation qui manque

Des notes sur ce que nous apprenons en chemin. Presque tout part d'un problème concret qui nous a coûté plus que prévu.

Toutes
  1. ProductoLa web de un pintor solo tiene que hacer una cosa: que le llamenHice la web y la app de trabajo de Mamu, un pintor de Valencia, en cuatro días sueltos. Lo que más mejoró la web fue borrar las páginas de precios y de por qué elegirnos.
  2. IACómo construimos Zenbu, un buscador de anime que busca por lo que cuentasCatorce mil animes, un vector por serie y un LLM que reordena al final. Lo que más nos costó no fue la búsqueda semántica: fueron las secuelas con sinopsis de una línea.
  3. ArchitectureJ'ai migré de fournisseur d'auth quatre foisQuatre fournisseurs gérés en un an et demi, et la même destination à chaque fois : mon propre middleware. Ce que casse chaque transition et ce que je regarde maintenant avant d'écrire une ligne d'auth.
  4. ExploitationStripe m'a cassé le build cinq fois et je l'ai maintenant mis à l'agendaMonter la version de l'API de Stripe n'est pas un incident. C'est de la maintenance récurrente, avec des dommages collatéraux assez prévisibles, et il vaut mieux la budgéter.
  5. ProduitCrédits, solde, plafonds de dépenseDans cinq produits, j'ai monté la facturation à l'usage de la même façon : je commence avec des crédits, je finis avec un solde en centimes et des plafonds par clé. Je sais désormais à quelle étape commencer.
  6. Bases de donnéesPourquoi j'ai retiré RLS de Postgres les deux fois où je l'ai utiliséRow Level Security a l'air d'être la bonne pratique par défaut. Avec Drizzle, des server actions et une auth maison, la logique de permissions vit déjà ailleurs et maintenir les deux fait mal.
  7. JugementJe ne pars jamais de zéro : ce que j'emporte toujours et ce que je coupe toujoursDix projets sur le même boilerplate. Le premier commit de chacun ressemble plus au dernier du précédent qu'à un projet neuf, et le deuxième commit supprime presque toujours quelque chose.
  8. JugementLa première chose que je retire de n'importe quel template, c'est StripeJe démarre presque tous mes projets en supprimant le checkout, le portail et le webhook. Ce n'est pas de la distraction : c'est séparer l'infrastructure dont j'aurai toujours besoin de celle dont ce n'est pas encore le moment.
  9. ArchitectureLe même bug de concurrence m'est apparu dans trois projets différentsUn compteur qui additionne sous charge perd des incréments, et un qui soustrait peut facturer deux fois la même chose. Quand le compteur, c'est de l'argent, ce n'est pas un détail qu'on répare plus tard.
  10. IAChaque nouveau modèle me casse quelque chose de différentSix migrations de modèle en un an et demi. Aucune n'a consisté à changer une chaîne de texte, même si toutes commençaient par en avoir l'air.
  11. Bases de donnéesJ'ai réécrit le même modèle de contrats plus de dix foisUn modèle de domaine compliqué ne sort pas bien du premier coup. On converge vers lui en le réécrivant avec les vraies données sous les yeux, et ça inclut de revenir sur des décisions qui semblaient correctes.
  12. Bases de donnéesMes premiers schémas de données ne survivent presque jamais au premier moisLe schéma du jour 1 est une hypothèse sur un domaine que vous ne comprenez pas encore. L'admettre change la façon de l'écrire et le coût de le changer.
  13. SécuritéPourquoi je fais les accès invité avec un token de session et non avec des codesUn code à six chiffres a l'air d'être la façon simple de laisser entrer quelqu'un sans compte. Ça l'est jusqu'au moment où il faut le révoquer, et là tu découvres que tu ne sais pas qui tu mets dehors.
  14. ExploitationPourquoi « ça marche en local » ne me dit plus rienLes différences entre votre machine et la production ne sont pas de la malchance : ce sont quatre catégories précises qui échouent toujours et qu'un build au vert ne peut pas voir.
  15. IngénierieLe test qui disait vert et mentaitSix SCRIPT ERROR dans un test qui affichait TOUS LES TESTS OK et sortait avec le code 0. Comment on découvre qu'un vert est faux et ce que je fais maintenant avant de m'y fier.
  16. PerformanceLes listes d'admin sont la première chose qui lâcheLe panneau interne s'écrit sans limites parce qu'au début il y a quatre lignes. C'est précisément là que tout explose quand le produit grandit.
  17. SécuritéCe que j'ai appris en auditant mon propre code comme s'il était d'un autreUne ACL vide qui renvoyait le corpus entier, une injection de CSS sans une ligne de JavaScript et une clé d'API encore valable après la résiliation de son propriétaire. Tout ça en un jour, tout ça dans du code que j'avais écrit.
  18. ArchitecturePourquoi j'exige un login dans des applications qui n'en ont pas besoinSans identité, pas de quota, pas de plafond de dépense, aucun moyen de couper l'accès à qui abuse. La friction de l'inscription est bon marché comparée au coût de s'en passer.
  19. JugementCe qui finit toujours par arriver quand je pars de zéroJ'ai construit des éditeurs à la main quatre fois. Trois ont fini réécrits avec une bibliothèque. Le quatrième n'a pas tenu deux jours.
  20. FrontendQuand un store global mérite sa placeL'état global ne se justifie pas par confort. Il se justifie quand un composant intermédiaire reçoit des props qu'il n'utilise pas, juste pour les passer plus bas.
  21. JugementCinq migrations d'ESLint vers Biome : la décision est déjà priseQuand vous faites la même migration sur cinq projets sans vous arrêter pour réfléchir, ce n'est plus une préférence : c'est un jugement. Ce qui casse en chemin et ce qu'on y perd.
  22. JugementDocumenter avant de programmer : ma règle pour les intégrations que je ne contrôle pasDans une intégration avec une API tierce, les quatre premiers commits ne touchent pas au code. Écrire le document d'abord oblige à mesurer les limites qui te sautent ensuite à la figure en production.