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.
- 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.6 min
- 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.7 min
- 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.5 min
- 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 min
- 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ć.5 min
- 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.5 min
- 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.5 min
- 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.5 min
- 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.5 min
- 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.5 min
- 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.5 min
- 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.5 min
- 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.5 min
- 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ć.5 min
- 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.5 min
- 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.5 min
- 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.5 min
- 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.5 min
- 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.5 min
- 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.5 min
- 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.5 min
- 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ę.5 min