{"id":10,"date":"2026-03-01T12:11:55","date_gmt":"2026-03-01T11:11:55","guid":{"rendered":"https:\/\/test.high-five.cc\/?p=10"},"modified":"2026-03-01T12:12:31","modified_gmt":"2026-03-01T11:12:31","slug":"art1","status":"publish","type":"post","link":"https:\/\/test.high-five.cc\/?p=10","title":{"rendered":"Architektura to polisa na twoj\u0105 g\u0142upot\u0119 czy tylko teatrzyk dla klienta?"},"content":{"rendered":"<p>Totalna frustracja w Garmisch-Partenkirchen roku 1968 zrodzi\u0142a poj\u0119cie kryzysu oprogramowania. Zamiast sprytnych p\u0119tli, NATO zobaczy\u0142o wtedy rozjechane bud\u017cety i systemy radarowe, kt\u00f3re przy byle te\u015bcie pada\u0142y martwe. M\u0105drzy ludzie poj\u0119li natychmiast, \u017ce bez mapy pi\u0119\u0107dziesi\u0119ciu koder\u00f3w stworzy jedynie tysi\u0105ce bomb z op\u00f3\u017anionym zap\u0142onem. In\u017cynieri\u0119 oprogramowania powo\u0142ali do \u017cycia, bo liczby przesta\u0142y si\u0119 zgada\u0107, a Zbyszek \u2013 jedyny posiadacz dokumentacji w swojej g\u0142owie \u2013 akurat wyjecha\u0142 na zas\u0142u\u017cony urlop. Nie o kody \u017ar\u00f3d\u0142owe wtedy chodzi\u0142o, lecz o niemo\u017cno\u015b\u0107 przewidzenia, kiedy ten ca\u0142y cyrk w og\u00f3le zacznie dzia\u0142a\u0107. Projektowanie system\u00f3w wojskowych przypomina\u0142o w\u00f3wczas wr\u00f3\u017cenie z fus\u00f3w, a nie rzeteln\u0105 prac\u0119 naukow\u0105. Wierzono naiwnie, \u017ce wystarczy dokupi\u0107 wi\u0119cej pami\u0119ci operacyjnej, by b\u0142\u0119dy logiczne same wyparowa\u0142y z asemblera.<\/p>\n<p>Architektura to proste r\u00f3wnanie Perry\u2019ego i Wolfa:<\/p>\n<p>$$Architektura = {Elementy, Formy, Uzasadnienie}$$<\/p>\n<p>. To ostatnie, zwane <em>Rationale<\/em>, odr\u00f3\u017cnia in\u017cyniera od przedszkolaka, kt\u00f3ry bezmy\u015blnie klika w Miro i Dockerem si\u0119 bawi bez sensu. Wybierasz Kafk\u0119 dla pi\u0119ciu u\u017cytkownik\u00f3w, bo tak na konferencji gadali? Perry i Wolf w grobach si\u0119 przewracaj\u0105, widz\u0105c tw\u00f3j projekt, kt\u00f3ry muli przez nadmiar niepotrzebnych warstw. Logika ka\u017cdej decyzji wa\u017cy u nas znacznie wi\u0119cej ni\u017c naj\u0142adniejszy diagram, wi\u0119c albo masz twardy pow\u00f3d, albo tylko drogi pr\u0105d marnujesz. Elementy to te wszystkie klocki: bazy danych, serwisy, kolejki. Formy okre\u015blaj\u0105, jak te graty ze sob\u0105 gadaj\u0105. Tu pojawia si\u0119 w\u0105tpliwo\u015b\u0107 \u2013 czy wiesz w og\u00f3le, dlaczego u\u017cywasz PostgreSQL zamiast MongoDB? Je\u015bli twoj\u0105 jedyn\u0105 odpowiedzi\u0105 jest \u201ebo wszyscy tak robi\u0105\u201d, to architektur\u0119 w\u0142a\u015bnie zamieni\u0142e\u015b w kosztown\u0105 dekoracj\u0119. Nie w ka\u017cdym przypadku musisz budowa\u0107 bunkier atomowy, ale wiedzie\u0107 powiniene\u015b, dlaczego stawiasz akurat p\u0142ot z siatki.<\/p>\n<p>Pi\u0119\u0107 par okular\u00f3w serwuje model 4+1 Kruchtena, by\u015b nie dosta\u0142 zeza przy patrzeniu na jeden widok. U\u017cytkownik widzi tylko spinner, ty za\u015b ogarniasz w\u0105tki, encje i fizyczne serwery we Frankfurcie. Cz\u0119sto juniorzy warstwy mieszaj\u0105, wmawiaj\u0105c wszystkim, \u017ce nowe pole w tabeli to ju\u017c wielka funkcja biznesowa. To zalezy od perspektywy, ale regu\u0142y walidacji nie naprawisz nigdy, grzebi\u0105c jedynie w parametrach maszyny. Rozdzielenie tych \u015bwiat\u00f3w to tw\u00f3j naj\u015bwi\u0119tszy obowi\u0105zek, a nie lu\u017ana sugestia. Perspektywa logiczna opisuje, co system robi, a fizyczna \u2013 gdzie to w\u0142a\u015bciwie le\u017cy i czy sp\u0142onie, gdy administrator wyleje kaw\u0119 na racka.<\/p>\n<p>Dygresja kr\u00f3tka: widzia\u0142em kiedy\u015b diagram, kt\u00f3ry mia\u0142 siedemna\u015bcie kolor\u00f3w, ale nikt nie potrafi\u0142 wskaza\u0107, kt\u00f3r\u0119dy p\u0142ynie pr\u0105d przy autoryzacji. Scenariusze (ten magiczny \u201e+1\u201d) to poligon do\u015bwiadczalny. Je\u015bli tw\u00f3j plan nie wyja\u015bnia, co si\u0119 stanie, gdy baza danych z\u0142apie czkawk\u0119 na 300 milisekund, to te diagramy mo\u017cesz sobie oprawi\u0107 w ramk\u0119 i powiesi\u0107 w toalecie. Kod jako fizyczne pliki w repozytorium to kolejna soczewka, o kt\u00f3rej zapominasz, tworz\u0105c struktur\u0119 katalog\u00f3w przypominaj\u0105c\u0105 wysypisko \u015bmieci po przej\u015bciu tr\u0105by powietrznej. Pi\u0119kna logika w g\u0142owie nic nie znaczy, je\u015bli programista musi szuka\u0107 definicji klasy przez godzin\u0119 w trzech r\u00f3\u017cnych modu\u0142ach.<\/p>\n<p>Decyzje architektoniczne (ADR) z Confluence do repozytorium kodu przenie\u015b, zanim w muzeum technicznych plotek si\u0119 zamieni\u0105. Leniuchy brak planu pod has\u0142em \u201ezwinno\u015b\u0107\u201d chowaj\u0105, a to zwyk\u0142y sabota\u017c logiki i twojej w\u0142asnej przysz\u0142o\u015bci. Prawdziwa elastycznosc rusztowania wymaga, a nie pisania na kolanie, bo osiemdziesi\u0105t procent d\u0142ugu w startupach generuj\u0105 asy bez planu B i C. Je\u015bli ADR-a o strategii cache\u2019owania szukasz w folderach d\u0142u\u017cej ni\u017c dziesi\u0119\u0107 sekund, to zwyczajnie czas na srogi rachunek sumienia. Dokumentacja w Markdownie obok kodu le\u017ce\u0107 musi, wersjonowana tak samo jak twoje marne funkcje. Unikasz dzi\u0119ki temu sytuacji, w kt\u00f3rej nowa osoba w zespole pr\u00f3buje zaimplementowa\u0107 co\u015b, co wywalili\u015bcie trzy miesi\u0105ce temu po sze\u015bciogodzinnej k\u0142\u00f3tni na Slacku. Przejrzysto\u015b\u0107 to nie luksus, to przetrwanie.<\/p>\n<p>We\u017amy na warsztat Wilda Software, gdzie pracowa\u0142em dekad\u0119 temu. Zachcia\u0142o nam si\u0119 mikroserwis\u00f3w, bo artyku\u0142 w internecie obieca\u0142 nam z\u0142ote g\u00f3ry i wieczn\u0105 skalowalno\u015b\u0107. Sko\u0144czyli\u015bmy z systemem, gdzie jeden b\u0142\u0105d w module p\u0142atno\u015bci k\u0142ad\u0142 na \u0142opatki ca\u0142y interfejs u\u017cytkownika, bo zapomnieli\u015bmy o asynchroniczno\u015bci. Architektura na papierze wygl\u0105da\u0142a jak arcydzie\u0142o, ale w praktyce by\u0142a to sie\u0107 ciasno powi\u0105zanych sznurk\u00f3w. Dopiero wdro\u017cenie RabbitMQ i rozbicie tych zale\u017cno\u015bci pozwoli\u0142o nam odetchn\u0105\u0107. To nie by\u0142a innowacja \u2013 to by\u0142o \u0142atanie dziur powsta\u0142ych z braku my\u015blenia o awariach. 300 ms op\u00f3\u017anienia potrafi zabi\u0107 konwersj\u0119 w e-commerce szybciej ni\u017c brak promocji. Tutaj pojawia si\u0119 doprecyzowanie: nie ka\u017cdy b\u0142\u0105d to wina kodu, czasem to wina z\u0142ych za\u0142o\u017ce\u0144 na etapie rysowania prostok\u0105t\u00f3w.<\/p>\n<p>W g\u0142owie si\u0119 nie mie\u015bci, jak bardzo programi\u015bci nienawidz\u0105 pisa\u0107 o swoich wyborach. Wol\u0105 sp\u0119dzi\u0107 noc na debugowaniu ni\u017c pi\u0119tna\u015bcie minut na opisie, dlaczego wybrali bibliotek\u0119 X zamiast Y. &#8220;Kod sam si\u0119 dokumentuje&#8221; to k\u0142amstwo, kt\u00f3re powtarzaj\u0105 sobie ludzie boj\u0105cy si\u0119 konfrontacji z w\u0142asn\u0105 logik\u0105. Je\u015bli nie umiesz zapisa\u0107 argument\u00f3w za swoim rozwi\u0105zaniem, to prawdopodobnie sam go nie rozumiesz. Sytuacja ta prowadzi do powstawania tzw. <em>legacy<\/em>, czyli kodu, kt\u00f3rego wszyscy si\u0119 boj\u0105 dotkn\u0105\u0107, bo nikt nie wie, co autor mia\u0142 na my\u015bli przed trzeci\u0105 kaw\u0105. Proporcja czasu sp\u0119dzonego na my\u015bleniu do czasu klepania w klawiatur\u0119 powinna wynosi\u0107 co najmniej 2:1. W przeciwnym razie produkujesz tylko techniczny ha\u0142as.<\/p>\n<p>Zwinno\u015b\u0107 (Agile) to nie jest darmowa przepustka do robienia ba\u0142aganu. To metoda reagowania na zmiany, kt\u00f3ra bez solidnej bazy ko\u0144czy si\u0119 katastrof\u0105 przy pierwszej pr\u00f3bie dodania nowego modu\u0142u. Elastyczny musisz by\u0107 w podej\u015bciu do klienta, a nie do zasad grawitacji w systemie. Brak planu to nie elastyczno\u015b\u0107, to zwyk\u0142e lenistwo intelektualne maskowane modnymi frazesami. Gdy system zaczyna puchn\u0105\u0107, te wszystkie &#8220;szybkie poprawki&#8221; wracaj\u0105 jako kosztowne refaktoryzacje trwaj\u0105ce ca\u0142ymi kwarta\u0142ami. Nie w ka\u017cdym przypadku trzeba projektowa\u0107 od razu system na miliony request\u00f3w, ale zawsze trzeba wiedzie\u0107, gdzie ko\u0144czy si\u0119 twoja wiedza, a zaczyna zgadywanie.<\/p>\n<p>Dba\u0142o\u015b\u0107 o struktur\u0119 danych to podstawa, o kt\u00f3rej juniorzy zapominaj\u0105 w pogoni za nowym frameworkiem w wersji beta. Baza danych to nie jest worek na ziemniaki, do kt\u00f3rego wrzucasz wszystko jak leci w formacie JSON, bo &#8220;schematy s\u0105 nudne&#8221;. Poprawna normalizacja (albo \u015bwiadoma denormalizacja) to fundament, na kt\u00f3rym stoisz. Bez niego twoje API b\u0119dzie wolniejsze ni\u017c wysy\u0142anie list\u00f3w go\u0142\u0119biami pocztowymi. Zastan\u00f3w si\u0119 dwa razy, zanim dodasz kolejn\u0105 tabel\u0119 \u0142\u0105cz\u0105c\u0105 wszystko ze wszystkim. Czysto\u015b\u0107 architektury to nie estetyka, to mniejsze rachunki za chmur\u0119 i mniej siwych w\u0142os\u00f3w na twojej g\u0142owie.<\/p>\n<p>Autor: programista z 15 letnim doswiadczeniem, expert, redaktor z zacieciem do pisania lekkich i zartobliwych tekstow<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kr\u00f3tki opis artyku\u0142u widoczny w wynikach wyszukiwania.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[7,6],"class_list":["post-10","post","type-post","status-publish","format-standard","hentry","category-technologia","tag-automatyzacja","tag-python"],"_links":{"self":[{"href":"https:\/\/test.high-five.cc\/index.php?rest_route=\/wp\/v2\/posts\/10","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.high-five.cc\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/test.high-five.cc\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/test.high-five.cc\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/test.high-five.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10"}],"version-history":[{"count":2,"href":"https:\/\/test.high-five.cc\/index.php?rest_route=\/wp\/v2\/posts\/10\/revisions"}],"predecessor-version":[{"id":20,"href":"https:\/\/test.high-five.cc\/index.php?rest_route=\/wp\/v2\/posts\/10\/revisions\/20"}],"wp:attachment":[{"href":"https:\/\/test.high-five.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/test.high-five.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/test.high-five.cc\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}