02Blog

La documentazione che manca

Appunti su quello che impariamo. Quasi tutto nasce da un problema concreto che ci è costato più del previsto.

Tutte
  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. ArchitetturaHo migrato provider di auth quattro volteQuattro provider gestiti in un anno e mezzo, e la stessa destinazione in tutti: middleware mio. Cosa rompe ogni transizione e cosa guardo adesso prima di scrivere una riga di auth.
  4. OperativitàStripe mi ha rotto la build cinque volte e ormai me lo sono messo in agendaAlzare la versione dell'API di Stripe non è un incidente. È manutenzione ricorrente, con danni collaterali abbastanza prevedibili, ed è meglio metterla a budget.
  5. ProdottoCrediti, saldo, limiti di spesaIn cinque prodotti ho montato il pagamento a consumo allo stesso modo: comincio con i crediti, finisco con un saldo in centesimi e limiti per chiave. Ormai so da quale tappa partire.
  6. DatabasePerché ho tolto RLS da Postgres entrambe le volte che l'ho usatoRow Level Security sembra la pratica corretta di default. Con Drizzle, server action e auth propria, la logica dei permessi vive già altrove e mantenere entrambe fa male.
  7. CriterioNon parto mai da zero: cosa mi porto sempre e cosa taglio sempreDieci progetti sullo stesso boilerplate. Il primo commit di ognuno somiglia più all'ultimo del precedente che a un progetto nuovo, e il secondo commit quasi sempre cancella qualcosa.
  8. CriterioLa prima cosa che tolgo da qualunque template è StripeInizio quasi tutti i progetti cancellando il checkout, il portale e il webhook. Non è distrazione: è separare l'infrastruttura che mi servirà sempre da quella che non tocca ancora.
  9. ArchitetturaLo stesso bug di concorrenza mi è comparso in tre progetti diversiUn contatore che somma sotto carico perde incrementi, e uno che sottrae può addebitare due volte la stessa cosa. Quando il contatore è denaro, non è un dettaglio da sistemare dopo.
  10. IAOgni modello nuovo mi rompe qualcosa di diversoSei migrazioni di modello in un anno e mezzo. Nessuna è stata cambiare una stringa di testo, anche se tutte sembravano esserlo all'inizio.
  11. DatabaseHo riscritto lo stesso modello di contratti più di dieci volteUn modello di dominio complicato non viene bene al primo colpo. Ci si converge riscrivendolo con i dati veri davanti, e questo include tornare indietro su decisioni che sembravano giuste.
  12. DatabaseI miei primi schemi di dati non sopravvivono quasi mai al primo meseLo schema del giorno 1 è un'ipotesi su un dominio che ancora non capisci. Accettarlo cambia come lo scrivi e quanto fa male cambiarlo.
  13. SicurezzaPerché gli accessi ospite li faccio con token di sessione e non con codiciUn codice di sei cifre sembra il modo semplice di far entrare qualcuno senza account. Lo è finché non devi revocarlo, e allora scopri che non sai chi stai buttando fuori.
  14. OperativitàPerché "funziona in locale" non mi dice più nienteLe differenze tra la tua macchina e la produzione non sono sfortuna: sono quattro categorie precise che falliscono sempre e che una build verde non può vedere.
  15. IngegneriaIl test che diceva verde e mentivaSei SCRIPT ERROR dentro un test che stampava TUTTI I TEST OK e usciva con codice 0. Come si scopre che un verde è falso e cosa faccio ora prima di fidarmene.
  16. PrestazioniLe liste dell'admin sono la prima cosa che cedeIl pannello interno si scrive senza limiti perché all'inizio ci sono quattro righe. Ed è proprio il posto dove salta tutto quando il prodotto cresce.
  17. SicurezzaQuello che ho imparato auditando il mio codice come se fosse di un altroUn ACL vuoto che restituiva l'intero corpus, un'iniezione di CSS senza una riga di JavaScript e una API key che valeva ancora dopo aver disattivato il proprietario. Tutto in un giorno, tutto in codice che avevo scritto io.
  18. ArchitetturaPerché pretendo il login in app che non ne hanno bisognoSenza identità non c'è quota, né limite di spesa, né modo di tagliare fuori chi abusa. L'attrito della registrazione costa poco rispetto a quanto costa non averla.
  19. CriterioQuello che finisce sempre per succedere quando comincio qualcosa a manoHo costruito editor a mano quattro volte. Tre sono finiti riscritti con una libreria. La quarta non è arrivata a due giorni.
  20. FrontendQuando uno store globale si guadagna il suo postoLo stato globale non si giustifica per comodità. Si giustifica quando un componente intermedio riceve prop che non usa, solo per passarle più in basso.
  21. CriterioCinque migrazioni da ESLint a Biome: la decisione è già presaQuando fai la stessa migrazione in cinque progetti senza fermarti a pensarci, smette di essere una preferenza e diventa un criterio. Cosa si rompe per strada e cosa si perde.
  22. CriterioDocumentare prima di programmare: la mia regola per le integrazioni che non controlloIn un'integrazione con una API altrui, i primi quattro commit non toccano codice. Scrivere il documento prima obbliga a misurare i limiti che poi ti esplodono in produzione.