5 maja 2025 zrobiłem pierwszy commit produktu. Dwa tygodnie później — zamiast pisać dalej funkcje — zatrzymałem go. Na prawie dwa miesiące. W tym czasie zbudowałem coś, czego użytkownik nigdy nie zobaczy: osobną bibliotekę.
Z zewnątrz to wygląda jak klasyczna prokrastynacja founderów: „buduję narzędzia zamiast produktu”. Ale to była świadoma decyzja — i jedna z lepszych, jakie podjąłem.
Co mnie zatrzymało
Pierwsze dwa tygodnie produktu szły szybko. Za szybko. Zauważyłem, że co rusz przepisuję te same rzeczy: jak modelować encje domenowe, jak komunikować się między modułami, jak obsługiwać błędy bez rzucania wyjątków w połowie logiki.
To były wzorce z Domain-Driven Design — i kopiowałem je z głowy, za każdym razem trochę inaczej. Wiedziałem, do czego to prowadzi: po trzech miesiącach miałbym pięć wariantów tego samego pomysłu, a każda zmiana wymagałaby poprawek w pięciu miejscach.
Miałem dwie drogi: brnąć dalej i obiecać sobie „posprzątam później”, albo zatrzymać się i zrobić to raz, porządnie.
Dlaczego osobna biblioteka, a nie folder w produkcie
Mogłem te wzorce trzymać po prostu w produkcie. Ale wydzielenie ich do osobnej biblioteki wymusiło coś cennego: granicę. Biblioteka nie wie nic o produkcie. Nie ma dostępu do jego bazy, jego logiki, jego skrótów. Musi być na tyle ogólna, żeby dało się jej użyć w czymkolwiek.
Ta dyscyplina opłaciła się szybciej, niż myślałem. Dziś tych samych wzorców używam nie tylko w backendzie juz-ide.pl, ale i w kolejnych projektach. Gdyby siedziały w produkcie, byłyby z nim zrośnięte na zawsze.
21 czerwca zrobiłem pierwszy commit biblioteki. 12 lipca wydałem v0.1.0. Cztery
dni później wróciłem do produktu — i pierwsze, co zrobiłem, to przepiąłem go na
bibliotekę.
Kiedy pauza ma sens, a kiedy to wymówka
Nie każda pauza jest mądra. Łatwo wpaść w „wieczne ulepszanie narzędzi” i nigdy nie dowieźć produktu. Dla mnie różnica jest w jednym pytaniu:
Czy to, co buduję w pauzie, odblokuje resztę — czy tylko ją odkłada?
Biblioteka odblokowywała: każdy kolejny moduł produktu powstawał na niej szybciej. Gdyby zamiast tego była to refaktoryzacja dla samej estetyki albo nowy framework „bo fajny” — byłaby wymówką.
Wniosek
Świadoma pauza to nie cofnięcie się. To rozbieg. Pytanie nie brzmi „czy mogę sobie pozwolić na zatrzymanie”, tylko „czy mogę sobie pozwolić na budowanie dalej na kruchym fundamencie”.
Co konkretnie trafiło do biblioteki
Biblioteka to monorepo pakietów (@vytches-ddd/*) z budulcem domenowym:
- Bloki taktyczne DDD — bazowe klasy dla encji, obiektów wartości, agregatów, zdarzeń domenowych. Jeden sposób modelowania zamiast pięciu.
- Obsługa błędów bez wyjątków — wynik operacji jako wartość (
Result), nie rzucany wyjątek w połowie logiki domenowej. Domena pozostaje czysta. - ACL / komunikacja między kontekstami — wzorzec rejestru do rozmów między modułami bez sztywnego sprzęgania ich ze sobą.
Wszystko wersjonowane semantycznie (v0.1.0 w lipcu 2025, potem kolejne wydania)
i instalowane w produkcie jak każda inna zależność — co znaczy, że produkt można
zaktualizować albo cofnąć niezależnie od reszty.