02Blog

Dokumentacja, której brakuje

Notatki z tego, czego się uczymy. Prawie wszystko bierze się z konkretnego problemu, który kosztował nas więcej, niż się spodziewaliśmy.

Wszystkie
  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. ArchitekturaCztery razy migrowałem dostawcę uwierzytelnianiaCzterech zarządzanych dostawców w półtora roku i to samo miejsce docelowe za każdym razem: własny middleware. Co pęka przy każdym przejściu i na co patrzę teraz, zanim napiszę linijkę kodu auth.
  4. UtrzymanieStripe zepsuł mi build pięć razy i mam to już w kalendarzuPodbicie wersji API Stripe'a to nie incydent. To cykliczne utrzymanie, z dość przewidywalnymi szkodami ubocznymi, i warto je zaplanować w budżecie.
  5. ProduktKredyty, saldo, limity wydatkówW pięciu produktach rozliczanie za użycie zbudowałem tak samo: zaczynam od kredytów, kończę na saldzie w centach i limitach na klucz. Już wiem, od którego etapu zaczynać.
  6. Bazy danychDlaczego wyrzuciłem RLS z Postgresa oba razy, kiedy go użyłemRow Level Security wygląda na domyślnie słuszną praktykę. Przy Drizzle, server actions i własnym auth logika uprawnień mieszka już gdzie indziej, a utrzymywanie obu boli.
  7. Ocena sytuacjiNigdy nie zaczynam od zera: co zawsze zabieram i co zawsze przycinamDziesięć projektów na tym samym boilerplate. Pierwszy commit każdego z nich bardziej przypomina ostatni commit poprzedniego niż nowy projekt, a drugi commit prawie zawsze coś kasuje.
  8. Ocena sytuacjiPierwsze, co wyrzucam z każdego szablonu, to StripePrawie każdy projekt zaczynam od skasowania checkoutu, portalu i webhooka. To nie roztargnienie: to oddzielanie infrastruktury, której zawsze będę potrzebował, od tej, na którą jeszcze nie pora.
  9. ArchitekturaTen sam błąd współbieżności pojawił mi się w trzech różnych projektachLicznik, który dodaje pod obciążeniem, gubi inkrementy, a taki, który odejmuje, potrafi policzyć to samo dwa razy. Kiedy licznikiem są pieniądze, to nie jest szczegół do naprawienia później.
  10. AIKażdy nowy model psuje mi coś innegoSześć migracji modelu w półtora roku. Żadna nie polegała na zmianie jednego napisu, choć każda tak się zaczynała.
  11. Bazy danychTen sam model kontraktów przepisałem ponad dziesięć razySkomplikowany model dziedziny nie wychodzi za pierwszym razem. Dochodzi się do niego, przepisując go z prawdziwymi danymi przed oczami, a to obejmuje cofanie decyzji, które wydawały się słuszne.
  12. Bazy danychMoje pierwsze schematy danych prawie nigdy nie przeżywają pierwszego miesiącaSchemat z dnia 1 to hipoteza na temat domeny, której jeszcze nie rozumiesz. Przyjęcie tego zmienia sposób, w jaki go piszesz, i to, jak bardzo boli jego zmiana.
  13. BezpieczeństwoDlaczego dostęp dla gościa robię tokenem sesji, a nie kodamiSześciocyfrowy kod wygląda na prosty sposób, żeby wpuścić kogoś bez konta. Jest prosty, dopóki nie musisz go odebrać — wtedy odkrywasz, że nie wiesz, kogo właściwie wyrzucasz.
  14. UtrzymanieDlaczego "u mnie działa" nic mi już nie mówiRóżnice między twoją maszyną a produkcją to nie pech: to cztery konkretne kategorie, które zawodzą zawsze i których zielony build nie jest w stanie zobaczyć.
  15. InżynieriaTest, który świecił na zielono i kłamałSześć SCRIPT ERROR wewnątrz testu, który wypisywał WSZYSTKIE TESTY OK i kończył z kodem 0. Jak rozpoznać fałszywą zieleń i co robię teraz, zanim jakiejś zaufam.
  16. WydajnośćListy w panelu admina padają jako pierwszePanel wewnętrzny pisze się bez limitów, bo na początku są tam cztery wiersze. I to dokładnie w tym miejscu wszystko wybucha, kiedy produkt rośnie.
  17. BezpieczeństwoCzego nauczyłem się, audytując własny kod tak, jakby był cudzyPusta lista ACL zwracająca cały korpus, wstrzyknięcie CSS bez jednej linii JavaScriptu i klucz API, który działał dalej po wyrejestrowaniu właściciela. Wszystko w jeden dzień, wszystko w kodzie, który sam napisałem.
  18. ArchitekturaDlaczego wymagam logowania w aplikacjach, które go nie potrzebująBez tożsamości nie ma limitu, nie ma pułapu wydatków, nie ma jak odciąć tego, kto nadużywa. Tarcie rejestracji jest tanie w porównaniu z tym, ile kosztuje jej brak.
  19. Ocena sytuacjiTo, co zawsze kończy się tak samo, kiedy zaczynam pisać coś ręcznieCztery razy budowałem edytory ręcznie. Trzy z nich skończyły przepisane z użyciem biblioteki. Czwarty nie dotrwał nawet dwóch dni.
  20. FrontendKiedy globalny store zasługuje na swoje miejsceStanu globalnego nie usprawiedliwia wygoda. Usprawiedliwia go moment, w którym pośredni komponent dostaje propsy, których nie używa, tylko po to, by przekazać je niżej.
  21. Ocena sytuacjiPięć migracji z ESLint na Biome: decyzja jest już podjętaKiedy robisz tę samą migrację w pięciu projektach bez zastanowienia, przestaje to być preferencją i staje się kryterium. Co się po drodze psuje i co tracisz.
  22. Ocena sytuacjiDokumentować przed programowaniem: moja zasada dla integracji, których nie kontrolujęW integracji z cudzym API cztery pierwsze commity nie dotykają kodu. Napisanie dokumentu wcześniej zmusza do zmierzenia limitów, które potem rozwalają ci produkcję.