Tag: python

  • Architektura to polisa na twoją głupotę czy tylko teatrzyk dla klienta?

    Totalna frustracja w Garmisch-Partenkirchen roku 1968 zrodziła pojęcie kryzysu oprogramowania. Zamiast sprytnych pętli, NATO zobaczyło wtedy rozjechane budżety i systemy radarowe, które przy byle teście padały martwe. Mądrzy ludzie pojęli natychmiast, że bez mapy pięćdziesięciu koderów stworzy jedynie tysiące bomb z opóźnionym zapłonem. Inżynierię oprogramowania powołali do życia, bo liczby przestały się zgadać, a Zbyszek – jedyny posiadacz dokumentacji w swojej głowie – akurat wyjechał na zasłużony urlop. Nie o kody źródłowe wtedy chodziło, lecz o niemożność przewidzenia, kiedy ten cały cyrk w ogóle zacznie działać. Projektowanie systemów wojskowych przypominało wówczas wróżenie z fusów, a nie rzetelną pracę naukową. Wierzono naiwnie, że wystarczy dokupić więcej pamięci operacyjnej, by błędy logiczne same wyparowały z asemblera.

    Architektura to proste równanie Perry’ego i Wolfa:

    $$Architektura = {Elementy, Formy, Uzasadnienie}$$

    . To ostatnie, zwane Rationale, odróżnia inżyniera od przedszkolaka, który bezmyślnie klika w Miro i Dockerem się bawi bez sensu. Wybierasz Kafkę dla pięciu użytkowników, bo tak na konferencji gadali? Perry i Wolf w grobach się przewracają, widząc twój projekt, który muli przez nadmiar niepotrzebnych warstw. Logika każdej decyzji waży u nas znacznie więcej niż najładniejszy diagram, więc albo masz twardy powód, albo tylko drogi prąd marnujesz. Elementy to te wszystkie klocki: bazy danych, serwisy, kolejki. Formy określają, jak te graty ze sobą gadają. Tu pojawia się wątpliwość – czy wiesz w ogóle, dlaczego używasz PostgreSQL zamiast MongoDB? Jeśli twoją jedyną odpowiedzią jest „bo wszyscy tak robią”, to architekturę właśnie zamieniłeś w kosztowną dekorację. Nie w każdym przypadku musisz budować bunkier atomowy, ale wiedzieć powinieneś, dlaczego stawiasz akurat płot z siatki.

    Pięć par okularów serwuje model 4+1 Kruchtena, byś nie dostał zeza przy patrzeniu na jeden widok. Użytkownik widzi tylko spinner, ty zaś ogarniasz wątki, encje i fizyczne serwery we Frankfurcie. Często juniorzy warstwy mieszają, wmawiając wszystkim, że nowe pole w tabeli to już wielka funkcja biznesowa. To zalezy od perspektywy, ale reguły walidacji nie naprawisz nigdy, grzebiąc jedynie w parametrach maszyny. Rozdzielenie tych światów to twój najświętszy obowiązek, a nie luźna sugestia. Perspektywa logiczna opisuje, co system robi, a fizyczna – gdzie to właściwie leży i czy spłonie, gdy administrator wyleje kawę na racka.

    Dygresja krótka: widziałem kiedyś diagram, który miał siedemnaście kolorów, ale nikt nie potrafił wskazać, którędy płynie prąd przy autoryzacji. Scenariusze (ten magiczny „+1”) to poligon doświadczalny. Jeśli twój plan nie wyjaśnia, co się stanie, gdy baza danych złapie czkawkę na 300 milisekund, to te diagramy możesz sobie oprawić w ramkę i powiesić w toalecie. Kod jako fizyczne pliki w repozytorium to kolejna soczewka, o której zapominasz, tworząc strukturę katalogów przypominającą wysypisko śmieci po przejściu trąby powietrznej. Piękna logika w głowie nic nie znaczy, jeśli programista musi szukać definicji klasy przez godzinę w trzech różnych modułach.

    Decyzje architektoniczne (ADR) z Confluence do repozytorium kodu przenieś, zanim w muzeum technicznych plotek się zamienią. Leniuchy brak planu pod hasłem „zwinność” chowają, a to zwykły sabotaż logiki i twojej własnej przyszłości. Prawdziwa elastycznosc rusztowania wymaga, a nie pisania na kolanie, bo osiemdziesiąt procent długu w startupach generują asy bez planu B i C. Jeśli ADR-a o strategii cache’owania szukasz w folderach dłużej niż dziesięć sekund, to zwyczajnie czas na srogi rachunek sumienia. Dokumentacja w Markdownie obok kodu leżeć musi, wersjonowana tak samo jak twoje marne funkcje. Unikasz dzięki temu sytuacji, w której nowa osoba w zespole próbuje zaimplementować coś, co wywaliliście trzy miesiące temu po sześciogodzinnej kłótni na Slacku. Przejrzystość to nie luksus, to przetrwanie.

    Weźmy na warsztat Wilda Software, gdzie pracowałem dekadę temu. Zachciało nam się mikroserwisów, bo artykuł w internecie obiecał nam złote góry i wieczną skalowalność. Skończyliśmy z systemem, gdzie jeden błąd w module płatności kładł na łopatki cały interfejs użytkownika, bo zapomnieliśmy o asynchroniczności. Architektura na papierze wyglądała jak arcydzieło, ale w praktyce była to sieć ciasno powiązanych sznurków. Dopiero wdrożenie RabbitMQ i rozbicie tych zależności pozwoliło nam odetchnąć. To nie była innowacja – to było łatanie dziur powstałych z braku myślenia o awariach. 300 ms opóźnienia potrafi zabić konwersję w e-commerce szybciej niż brak promocji. Tutaj pojawia się doprecyzowanie: nie każdy błąd to wina kodu, czasem to wina złych założeń na etapie rysowania prostokątów.

    W głowie się nie mieści, jak bardzo programiści nienawidzą pisać o swoich wyborach. Wolą spędzić noc na debugowaniu niż piętnaście minut na opisie, dlaczego wybrali bibliotekę X zamiast Y. “Kod sam się dokumentuje” to kłamstwo, które powtarzają sobie ludzie bojący się konfrontacji z własną logiką. Jeśli nie umiesz zapisać argumentów za swoim rozwiązaniem, to prawdopodobnie sam go nie rozumiesz. Sytuacja ta prowadzi do powstawania tzw. legacy, czyli kodu, którego wszyscy się boją dotknąć, bo nikt nie wie, co autor miał na myśli przed trzecią kawą. Proporcja czasu spędzonego na myśleniu do czasu klepania w klawiaturę powinna wynosić co najmniej 2:1. W przeciwnym razie produkujesz tylko techniczny hałas.

    Zwinność (Agile) to nie jest darmowa przepustka do robienia bałaganu. To metoda reagowania na zmiany, która bez solidnej bazy kończy się katastrofą przy pierwszej próbie dodania nowego modułu. Elastyczny musisz być w podejściu do klienta, a nie do zasad grawitacji w systemie. Brak planu to nie elastyczność, to zwykłe lenistwo intelektualne maskowane modnymi frazesami. Gdy system zaczyna puchnąć, te wszystkie “szybkie poprawki” wracają jako kosztowne refaktoryzacje trwające całymi kwartałami. Nie w każdym przypadku trzeba projektować od razu system na miliony requestów, ale zawsze trzeba wiedzieć, gdzie kończy się twoja wiedza, a zaczyna zgadywanie.

    Dbałość o strukturę danych to podstawa, o której juniorzy zapominają w pogoni za nowym frameworkiem w wersji beta. Baza danych to nie jest worek na ziemniaki, do którego wrzucasz wszystko jak leci w formacie JSON, bo “schematy są nudne”. Poprawna normalizacja (albo świadoma denormalizacja) to fundament, na którym stoisz. Bez niego twoje API będzie wolniejsze niż wysyłanie listów gołębiami pocztowymi. Zastanów się dwa razy, zanim dodasz kolejną tabelę łączącą wszystko ze wszystkim. Czystość architektury to nie estetyka, to mniejsze rachunki za chmurę i mniej siwych włosów na twojej głowie.

    Autor: programista z 15 letnim doswiadczeniem, expert, redaktor z zacieciem do pisania lekkich i zartobliwych tekstow

  • Architektura oprogramowania, czyli jak nie usmażyć projektu w pierwszym kwartale

    Boli dopiero po czasie. Architektura systemu to nie galeria sztuki nowoczesnej, gdzie stawiasz dziwną rzeźbę z mikroserwisów i liczysz na oklaski; to raczej polisa OC dla kodu. Zaczyna mieć sens dokładnie w momencie, gdy klient rzuca radosne „dodajmy małą funkcję”, a ta drobnostka dotyka siedmiu modułów, trzech baz danych i jednego biednego if-a, który miał żyć wiecznie, a teraz pęka pod presją. Koniec złudzeń. W e-commerce na 120 tysięcy linii kodu, gdzie 6 deweloperów rzeźbiło bez architekta, dodanie prostego rabatu zajmowało po dwóch latach aż 11 dni. Większość tego czasu to debugowanie efektów ubocznych. Kiedy brak separacji odpowiedzialności, wtedy wszystko wie o wszystkim — kontroler zna strukturę tabeli, a walidator wysyła maile. Chaos, tylko że w kodzie.

    ISO/IEC 25010 wygląda poważnie. Ma grube PDF-y i tabelki z „maintainability”, ale spróbuj to wdrożyć w sprincie numer 7, gdy deadline wisi nad zespołem jak topór. Teoria robi się miękka. Standard mówi: „system powinien być łatwy w utrzymaniu”, ale nikt nie podaje, czy mierzymy to liczbą klas, czy czasem na pull requesta. Tu pojawia się wątpliwość. Definicja musi pasować i do banku, i do pralki, więc nie pasuje do niczego idealnie. Nawet model 4+1 Philippe’a Kruchtena — logiczny, procesowy, wdrożeniowy, implementacyjny i scenariusze — w małym startupie bywa armatą na muchę. Junior patrzy na 140 stron dokumentacji i czuje, że to plan zdjęciowy, a nie opis API. Często lepiej sprawdza się model C4 Simona Browna: Context, Container, Component, Code. Od ogółu do szczegółu, bez zbędnej filozofii i bez rysowania każdej prywatnej metody w UML, jakby IntelliJ przestał istnieć.

    Juniorzy często chcą zbawić świat nowym frameworkiem z GitHuba, który ma 300 gwiazdek i jest „lekki jak piórko”. Pamiętam typa — wpadł na daily z oczami jak po trzech Red Bullach, przepisał moduł płatności i tydzień później produkcja mieliła CPU jak betoniarka. Brak cache’owania i synchroniczne requesty zabiły system. Nie w każdym przypadku winne jest narzędzie, częściej zawodzi brak nudnych rozwiązań typu memoizacja czy kolejka asynchroniczna. Jeśli system ma żyć dłużej niż twój obecny laptop, planuj tak, jakbyś to ty miał go utrzymywać za trzy lata. Bo możliwe, że będziesz. Najgorsze refaktoryzacje robi się pod presją sprzedaży, kiedy nikt nie oddziela odpowiedzialności, bo „termin”. Potem architektura przypomina patchwork zszyty z ticketów z Jiry.

    W podręcznikach zobaczysz wykresy czyste jak łza, a w repozytorium — kontroler wywołujący DAO przez statyczny helper z 2009 roku. Legacy kłamie bez mrugnięcia okiem. Dokumentacja twierdzi, że to architektura heksagonalna, a kod odpowiada: „singleton i modlitwa”. Często prawda mieszka w bazie danych, w polach typu isLegacyMode albo clientTier3OverrideFlag, które rządzą logiką od czasu, gdy klient enterprise odszedł dwa lata temu. Jeśli widzisz klasę Utils, to zazwyczaj nie jest żaden util, tylko magazyn wstydu na 1200 linii. Nie poprawiaj każdego zdania do poziomu eseju, po prostu buduj cienki szkielet i pozwól mu się deformować pod realnym obciążeniem. Kod, który przechodzi testy, daje więcej informacji niż najpiękniejszy diagram z 80 prostokątami, którego i tak nikt nie zaktualizuje po pierwszym merge requeście.

    Dobra, zejdźmy na ziemię, bo teoretyzowanie o czystym kodzie przy kawie to sport dla ludzi, którzy nie mają ticketów na „już”. Wyobraź sobie, że piszesz prosty system zamówień. Masz encję Order. Wrzucasz tam wszystko: ID klienta, listę produktów, status płatności, logikę obliczania podatku VAT, a na koniec jeszcze metodę do generowania PDF-a z fakturą. Działa? No pewnie, że działa. Przez pierwsze dwa tygodnie jesteś bohaterem. Potem przychodzi zmiana: VAT w Niemczech jest inny niż w Polsce, a faktury mają być wysyłane przez zewnętrzny system API, a nie generowane lokalnie. I nagle twój Order.java ma 800 linii, a każda próba zmiany podatku wywala wysyłkę maili. Gratulacje, właśnie zbudowałeś Big Ball of Mud.

    Zastosujmy tu inwersję zależności, zanim zginiesz marnie. Zamiast Order prosić o PDF-a, stwórz interfejs InvoiceGenerator. Niech Order nawet nie wie, czy to generuje biblioteka iText, czy hinduski stażysta przepisujący dane do Notatnika. To jest ta słynna abstrakcja, o której juniorzy zapominają, gdy widzą nową wersję Springa. Logikę biznesową — te wszystkie „jeśli klient z Gruzji i kupił wino, to daj rabat 5%” — zamknij w osobnej usłudze. Niech kontroler tylko odbiera request i przekazuje go dalej. Kontroler to recepcjonista, a nie kucharz. On ma tylko sprawdzić, czy gość ma rezerwację (walidacja DTO), a nie smażyć steki.

    Pojawia się wątpliwość: czy warto tracić czas na te wszystkie interfejsy w małym projekcie? Nie zawsze. Jeśli piszesz skrypt do migracji danych, który odpalisz raz i skasujesz, to olej architekturę. Wal to w jednej metodzie main. Ale jeśli to ma być rdzeń biznesu, to oszczędność na architekturze to po prostu branie kredytu w chwilówce na 5000%. Oddasz z odsetkami w postaci nadgodzin w weekendy. Widziałem projekty, gdzie koszt dodania nowej kolumny do tabeli był tak duży, że firma wolała zbankrutować. Serio. Techniczny dług to nie jest metafora literacka, to realne pieniądze uciekające z konta klienta przez dziurawy kod.

    Weźmy teraz na warsztat mikroserwisy, bo to słowo działa na juniorów jak magnes. „Zróbmy mikroserwisy, bo Netflix tak robi”. Netflix ma tysiące inżynierów i problemy, o których ci się nie śniło. Ty masz trzyosobowy zespół i problem z poprawnym skonfigurowaniem Dockera. Zanim rozbijesz monolit na 15 kawałków, upewnij się, że potrafisz zarządzać transakcjami rozproszonymi. Bo co zrobisz, gdy serwis płatności powie „OK”, a serwis magazynu wywali błąd 500? Masz wtedy pieniądze klienta, ale nie masz towaru, a system myśli, że wszystko jest w porządku. Architektura to wybór mniejszego zła. Czasem lepiej mieć jeden, dobrze uporządkowany monolit (modułowy monolit to nie jest obelga!), niż „rozproszone spaghetti”, gdzie debugowanie jednego requesta wymaga przeszukania logów w pięciu różnych kontenerach.

    Dygresja o nazewnictwie: przestań nazywać wszystko Manager, Processor albo Helper. Te słowa nic nie znaczą. OrderManager to śmietnik, do którego wrzucisz wszystko, od walidacji po zapis do bazy. Nazwij to OrderPriceCalculator, OrderRepository albo OrderValidator. Konkret. Im bardziej precyzyjna nazwa, tym trudniej dopisać tam kod, który tam nie pasuje. To taki psychologiczny trik na samego siebie. Jeśli klasa nazywa się EmailSender, to raczej nie dopiszesz tam logiki przeliczania kursu walut, prawda? A w GlobalService dopisałbyś to bez mrugnięcia okiem.

    Na koniec spójrzmy na testy. Architektura, której nie da się przetestować jednostkowo, to po prostu błąd w sztuce. Jeśli twoja logika biznesowa jest tak mocno sklejona z bazą danych, że musisz stawiać całego PostgreSQL-a, żeby sprawdzić prosty warunek if, to przegrałeś życie. Dobra architektura pozwala ci testować zasady gry w izolacji. Infrastruktura — baza, API, system plików — powinna być tylko wymiennym detalem. Dzisiaj masz SQL-a, jutro klient wymyśli NoSQL, a pojutrze wszystko będzie w chmurze AWS S3. Brzmi nierealnie? Przeżyłem takie migracje. Te, które miały warstwy, trwały miesiąc. Te „sklejone” pisaliśmy od zera.

    Pamiętaj, juniorze: Twoim zadaniem nie jest pisanie kodu. Twoim zadaniem jest dostarczanie działających rozwiązań, które da się zmienić bez płaczu. Kod to tylko koszt. Im mniej go napiszesz, by osiągnąć cel, tym lepszym jesteś architektem. Więc zamiast rzucać się na najnowsze wzorce z blogów technologicznych, zacznij od pytania: „co się stanie, gdy klient zmieni zdanie?”. Jeśli odpowiedź brzmi „będę musiał przepisać pół systemu”, to znaczy, że czas wrócić do rysowania prostokątów. Tylko tym razem z głową.

    Autor: programista z 15 letnim doswiadczeniem, expert, redaktor z zacieciem do pisania lekkich i zartobliwych tekstow

  • Skoro mądre głowy od 1968 roku nie wiedzą, czym jest architektura, to dlaczego Twój kod bez niej spłonie?

    Samozagładę projektów powstrzymuje architektura, nie twój sprytny kod. Zapomnij o zakurzonych księgach, które juniorzy omijają w księgarniach szerokim łukiem. Wyobraź sobie czterech typów od backendu. Każdy z nich inaczej klepie format błędu HTTP 400, bo „tak mu się wydaje lepiej”. Szału dostajesz w piątek o 16:47. Slack wyje bez litości. Odkrył właśnie frontendowiec, że errorCode raz przychodzi jako elegancki string, a raz jako surowa liczba od czapy. Zżerają sprinty bez popitki takie cyrki. Jire w wysypisko śmieci zamieniają, do którego nikt bez maski gazowej i litra melisy zaglądać nie chce.

    Komunikacyjny syf w czystej postaci nas zabija, nie problem techniczny. Wspólny język, umowę, wręcz krwawy cyrograf – tak traktuj architekturę. W nagłówku ustalamy licznik, w URL-ach rzeczowniki i jałowej dyskusji koniec. Robisz to, żeby przy każdym commicie nowa osoba w zespole z fusów wróżyć nie musiała. Repozytorium to ktoś otworzy trzy miesiące po Twoim odejściu. Wiedzieć musi, co autor miał na myśli, zanim robotę na taką z darmowymi owocami i lepszym biurkiem zmienił. Tylko koderem jesteś bez tego kontraktu, instrukcjami if sypiącym jak konfetti na bardzo smutnej stypie.


    Baza danych to nie projekt systemu

    Architektura to nie baza danych. Raz a dobrze to zapamiętaj, bo w jedną papkę juniorom te dwa pojęcia często się zlewają. Architektem nie czyni cię narysowanie trzech tabel w MySQL Workbenchu i połączenie ich kreskami. Dla dzieciaków to tylko ciasna piaskownica. Gdy w system walnie 50 tysięcy zapytań na sekundę z prędkością karabinu maszynowego, prawdziwa zabawa się zaczyna. Błędy pluć zacznie baza szybciej, niż ty „rollback” zdążysz powiedzieć, jeśli pulę połączeń olałeś i wszystko jak leci joinujesz. Sposób, w jaki te dane oddychają, to architektura, a nie to, czy 30 czy 60 znaków ma pole username.

    | Cecha | Porządny Monolit | Mikroserwisowy Obłęd |

    | — | — | — |

    | Opóźnienia | Prawie zerowe (wywołania funkcji) | Wysokie (sieć, serializacja JSON) |

    | Debugowanie | Proste (jeden stack trace) | Koszmarne (śledzenie logów w 10 miejscach) |

    | Koszty | Przewidywalne | Zależne od humoru dostawcy chmury |

    Legendy już krążą o tych nieszczęsnych mikroserwisach w budce z kebabem. Wepchnęliśmy tam 12 kontenerów, bo starociem i nudą monolit nam śmierdział. Tragiczny był efekt. Trzy sekundy bite trwało pobranie listy sosów. Autoryzację, serwis stanów i osobną bazę dodatków zaliczyć musiał każdy request o sos czosnkowy. O propagacji kontekstu zapomnieliśmy, więc bardziej niż błąd kompilacji C++ o trzeciej nad ranem bolało debugowanie tego ścieku w logach. Pod ciężarem JSON-ów sieć nam po prostu zdechła. Na samo jałowe gadanie usług między sobą marnowaliśmy 40% zasobów. Bez mrugnięcia okiem te mikro-cuda zaorałem. System nagle jak po reanimacji ożył – jeden prosty monolit, stara baza, dwa JOIN-y. Warunki dyktować musi skala projektu. Zwykły kretynizm projektowy pod płaszczykiem nowoczesności inaczej uprawiasz.


    Finansowe harakiri przez PDF-y

    Częściej, niż myślisz, zdarza się finansowe samobójstwo przez dokumentację. Projekt w fintechu z budżetem 480 000 zł widziałem. Na dokumentację funkcjonalną poszło z tego 110 000 zł, a na „rozszerzoną analizę przypadków brzegowych” 62 000 zł. Development z nudów stał i kwiczał. 147 scenariuszy logowania zdążyli opisać analitycy, zanim backend w Javie pierwsze zadanie dostał. W tym taki, w którym użytkownik zmienia przeglądarkę, dwa VPN-y ma włączone i jazzu słucha w trakcie resetu hasła. Serio, nikt tego nie czytał. Instrukcją obsługi ma być dokumentacja, a nie epopeją narodową.

    Większa iluzja kontroli nad chaosem pojawia się, im grubszy jest PDF. Ryzyko obniża specyfikacja na 220 stron? Dokładnie odwrotnie jest. Na interpretację zapisu o „elastycznych scenariuszach rabatowych” zespół trzy sprinty traci. Co to w ogóle znaczy? Kwotowy czy procentowy rabat? Silnik w Drools czy reguły w bazie? Od humoru architekta to zależy. I najwięcej kosztuje właśnie to „zależy”. Ogromny koszt poznawczy generują za długie dokumenty. 40 minut junior czyta, a potem o kody błędów i tak na Slacku pyta. Sygnał, że za słowa, a nie za realną wartość dla biznesu ktoś fakturuje, to specyfikacja powyżej 80 stron dla średniego projektu.

    Definicja ekspercka: Architektura to moment, w którym Twoje założenia lądują na stole. README, prosty diagram w draw.io, czasem C4 Model. Nie forma ma znaczenie, tylko treść. Redukowanie niejednoznaczności to jej jedyna robota.

    Od dekad kołem historia się toczy. Nad „software crisis” mądrale płakały już w 1968 roku na konferencji NATO. Bo projekty trzy razy szybciej budżet przekraczały, niż kod powstawał, padło to hasło w Garmisch-Partenkirchen. W pył harmonogramy się rozpadały. Własnym życiem żył kod pisany w Fortranie, papierowe analizy totalnie ignorując. Naiwnie myśleli, że wszystko naprawią metody inżynierskie. Reacta, Springa i ORM-y generujące zapytania SQL dłuższe niż twoje całe CV masz dziś. Ale prosto w twój monitor śmieją się duchy z 1968 roku, jeśli nie kumasz, dlaczego wydajność zabija N+1 query. Pobierasz listę 100 autorów, a potem dla każdego z nich osobno pytasz bazę o książki. Gratulacje, 101 zapytań właśnie wysłałeś tam, gdzie wystarczyło jedno porządne połączenie.


    Mapy Google dla koderów

    Żebyś w myślach kolegów czytać nie musiał, wymyślono zasady Kruchtena i model C4. Jeden obrazek w PowerPoincie zrobiony na kolanie to nie jest architektura. O tym samym systemie to kilka różnych opowieści. Inaczej z DevOps-em rozmawiasz, inaczej z backendowcem. Widok logiczny, procesowy, fizyczny i developerski dał nam Kruchten. Skalę jak Google Maps porządkuje C4. Od kontekstu (widok całego miasta) do kodu (numer mieszkania z krzywą wycieraczką). Ale śmiertelną pułapką bywa to ostatnie powiększenie.

    Implementację opisujesz, a nie architekturę, gdy poziom kodu rysować zaczynasz. Klasy z IDE pokazujesz, które jutro skasujesz, zamiast granic odpowiedzialności. Inaczej to i tak za trzy sprinty będzie wyglądać. Z diagramem zostaniesz, który wartość sentymentalną i absolutnie zero operacyjną ma. Gorsze zło niż całkowity brak to dokumentacja przeterminowana. Gdzie jeden moduł się kończy, a zaczyna drugi – to ma mówić architektura. Po jakim protokole i kto z kim gada. Domena repozytorium i rygorystycznego code review to klasy i metody, nie diagram dla 12-osobowego zespołu, który go i tak nie otworzy.

    W poniedziałek rano jak to ugryźć bez bólu głowy? Brzytwą niejednoznaczność architektura wycinać musi. Tyle papieru wystarczy, ile koledze bez dzwonienia do ciebie w trakcie Twojego urlopu w Egipcie funkcję napisać pozwoli. Na granicach modułów się skup. Jeśli jeden klockek na inny wymienisz, co wybuchnie? Pola minowego z „quick fixów” nie buduj. Dymiace pole bitwy masz, nie projekt, jeśli 70% twoich commitów to „poprawka na szybko”. Szybciej niż PowerPoint zmienia się kod. Z tym się pogódź.


    Kontrakt społeczny zamiast magii

    Wątpliwość tu się pojawia: czy kontrolujesz w ogóle to, co piszesz? Tylko ograniczenie jego artystycznej wolności – tak junior często o architekturze myśli. „Zmienić można to później” – naiwni mówią. Można, ale dla budżetu matematyczna rzeźnia to każda zmiana interfejsu przy 50 klientach. Kontrakt społeczny to architektura. Czytelnie ma być, nie literacko. Rozmowę w zespole zabija zbyt precyzyjny opis. Coś prostszego zaproponować junior się boi, bo „inaczej jest w dokumencie”. Ktoś pisał dokument, kto ograniczeń ORM-a na oczy nie widział. Tylko w urzędzie skarbowym papier z rzeczywistością wygrywa.

    Po co to wszystko robimy? Żebyś szefa w myślach czytać nie musiał. Tłumaczyć trzy razy tej samej prostej funkcji żeby Product Owner nie musiał. Sakramentalne: „Inaczej myślałem, że to działa” żeby na daily nie padało. Jednoznaczna umowa to architektura. W zbiór lokalnych interpretacji bez niej projekt się zamienia, a szybciej niż liczba Twoich commitów dług techniczny rośnie. I tylko cudze domysły będziesz wtedy odkręcać zamiast nowe funkcje pisać.

    O twarde zasady zadbaj, zamiast gonić za kolejnym frameworkiem. Z przekombinowaniem w 9 na 10 przypadków prostota wygrywa. Redukowanie niepewności to architektura, nie rysowanie strzałek dla zabawy. Jedna strona README z jasno określonymi zasadami gry czasem wystarczy. Święte muszą być te zasady. Inaczej spłonie Twój kod, a Ty razem z nim, deadline’y goniąc, których nawet w alternatywnej rzeczywistości dotrzymać się nie da.

    Autor: programista z 15 letnim doswiadczeniem, expert, redaktor z zacieciem do pisania lekkich i zartobliwych tekstow


    Chciałbyś, abym zaprojektował dla Ciebie prosty kontrakt komunikacyjny dla Twojego obecnego projektu?