<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Między kodem, a kulturą</title>
  <subtitle>Myśli o architekturze, kulturze i ewolucji oprogramowania. Blog Jakuba Ciszaka.</subtitle>
  <link href="https://miedzykodem.dev/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://miedzykodem.dev" rel="alternate" type="text/html"/>
  <id>https://miedzykodem.dev/</id>
  <updated>2026-03-21T00:00:00.000Z</updated>
  <author><name>Jakub Ciszak</name></author>
  <entry>
    <title>Archetyp CRM Activity — wzorzec, który znajdziesz (prawie) wszędzie</title>
    <link href="https://miedzykodem.dev/blog/archetyp-crm-activity" rel="alternate" type="text/html"/>
    <id>https://miedzykodem.dev/blog/archetyp-crm-activity</id>
    <published>2026-03-21T00:00:00.000Z</published>
    <updated>2026-03-21T00:00:00.000Z</updated>
    <author><name>Jakub Ciszak</name></author>
    <summary>Niezależnie od branży, w której budujesz oprogramowanie, pewne schematy wracają jak bumerang. Nowy projekt, nowa domena, nowy zespół — a na tablicy po dwóch dniach analizy znowu rysuje się ten sam ksz...</summary>
    <content type="html">&lt;p&gt;Niezależnie od branży, w której budujesz oprogramowanie, pewne schematy wracają jak bumerang. Nowy projekt, nowa domena, nowy zespół — a na tablicy po dwóch dniach analizy znowu rysuje się ten sam kształt.&lt;/p&gt;
&lt;p&gt;Weźmy cztery zupełnie różne projekty.&lt;/p&gt;
&lt;p&gt;Pierwszy — platforma fintechowa. Klient zakłada konto, przechodzi weryfikację tożsamości, podpisuje umowę, aktywuje kartę. Na każdym etapie system zapisuje: kto, co zrobił, kiedy i jaki był efekt. Dział compliance potrzebuje pełnej historii, żeby w razie audytu odtworzyć ścieżkę klienta co do minuty.&lt;/p&gt;
&lt;p&gt;Drugi — system lojalnościowy dużej sieci handlowej. Klient zbiera punkty za zakupy, wymienia je na nagrody, dostaje spersonalizowane kampanie. Za każdą z tych interakcji stoi wpis: jaki typ aktywności, kto był uczestnikiem, co było przedmiotem, jaki wynik.&lt;/p&gt;
&lt;p&gt;Trzeci — CRM w firmie ubezpieczeniowej. Konsultant dzwoni do klienta, wysyła ofertę, umawia spotkanie, odnotowuje reklamację. Każdy kontakt to rekord z datą, typem, uczestnikami i rezultatem.&lt;/p&gt;
&lt;p&gt;Czwarty — system helpdesku. Klient zgłasza problem, agent odpowiada, eskaluje do drugiej linii, zamyka zgłoszenie. Historia interakcji jest kluczowa dla jakości obsługi.&lt;/p&gt;
&lt;p&gt;Cztery różne branże, cztery różne zespoły, cztery różne zestawy wymagań. A pod spodem — ten sam schemat. Te same pytania: &lt;em&gt;kto&lt;/em&gt;, &lt;em&gt;co zrobił&lt;/em&gt;, &lt;em&gt;z kim lub czym&lt;/em&gt;, &lt;em&gt;kiedy&lt;/em&gt; i &lt;em&gt;jaki był efekt&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;To nie przypadek. To &lt;strong&gt;archetyp&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Czym jest archetyp (i dlaczego to nie design pattern)&lt;/h2&gt;
&lt;p&gt;Jeśli pracujesz w IT dłużej niż kilka lat, prawdopodobnie znasz wzorce projektowe — klasyczne Gang of Four, może wzorce taktyczne z DDD jak Aggregate, Repository czy Value Object. Archetyp to coś zupełnie innego. Działa na wyższym poziomie abstrakcji.&lt;/p&gt;
&lt;p&gt;Koncepcję archetypów biznesowych opisali Jim Arlow i Ilan Neustadt w książce &lt;em&gt;„Enterprise Patterns and MDA&amp;quot;&lt;/em&gt; &lt;a href=&quot;https://www.oreilly.com/library/view/enterprise-patterns-and/032111230X/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[1]&lt;/a&gt;. Ich teza jest prosta: w każdej domenie biznesowej powtarzają się te same fundamentalne schematy; nie na poziomie kodu — na poziomie &lt;strong&gt;pojęć biznesowych&lt;/strong&gt;. Nieważne czy budujesz system bankowy, sklep internetowy czy platformę medyczną — natrafisz na te same struktury: Party (kto uczestniczy w systemie), Product (co oferujesz), Order (co klient zamawia) — i właśnie Activity (co się wydarzyło). Te wzorce nie powstały wczoraj — były wielokrotnie testowane i dopracowywane w różnych kontekstach, zanim ktokolwiek z nas napisał swój pierwszy CRUD.&lt;/p&gt;
&lt;p&gt;Szukając analogii poza IT — Joseph Campbell opisał „podróż bohatera&amp;quot;, schemat fabularny obecny w starożytnych mitach, filmach Lucasa i grach indie. Za każdym razem wygląda inaczej, ale struktura jest ta sama. Archetyp biznesowy działa dokładnie tak samo: konkretna implementacja różni się między domenami, ale szkielet jest uniwersalny.&lt;/p&gt;
&lt;p&gt;I tu tkwi kluczowa różnica wobec design patternów. Wzorzec Strategy mówi &lt;em&gt;jak zorganizować kod&lt;/em&gt;, archetyp Activity mówi &lt;em&gt;jak zorganizować myślenie o domenie&lt;/em&gt;. Jeden żyje w warstwie implementacji, drugi — w warstwie modelu biznesowego. Rozpoznanie archetypu następuje podczas rozmów z biznesem, a nie podczas code review.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Activity pod lupą — anatomia wzorca&lt;/h2&gt;
&lt;p&gt;Archetyp Activity składa się z kilku elementów, które powtarzają się niezależnie od domeny:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Case&lt;/strong&gt; – Konkretny proces biznesowy np Onboarding klienta, zgłoszenie serwisowe. Zawiera wiele aktywności.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Activity&lt;/strong&gt; — samo zdarzenie, fakt że coś się wydarzyło. Ma swój moment w czasie (lub przedział czasowy), status i wynik.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Activity Type&lt;/strong&gt; — klasyfikacja tego, co się stało. „Telefon wychodzący&amp;quot;, „weryfikacja tożsamości&amp;quot;, „naliczenie punktów&amp;quot; — to różne typy tej samej struktury.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Party (uczestnik)&lt;/strong&gt; — kto był zaangażowany. Klient, konsultant, system automatyczny. Często wielu uczestników w jednej aktywności, każdy w innej roli.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subject (przedmiot)&lt;/strong&gt; — czego dotyczyła aktywność. Zamówienie, konto, zgłoszenie, kampania.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outcome (rezultat)&lt;/strong&gt; — jaki był efekt. Sukces, odmowa, eskalacja, brak odpowiedzi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/blog/archetyp-crm-activity.svg&quot; alt=&quot;Archetyp CRM Activity — fragment wzorca&quot;&gt;&lt;/p&gt;
&lt;p&gt;Ważna myśl, którą łatwo przegapić: &lt;strong&gt;Activity to nie log techniczny&lt;/strong&gt;. To główny element w domenie — byt, na podstawie którego biznes podejmuje decyzje. Menedżer sprzedaży analizuje historię kontaktów, żeby ocenić skuteczność kampanii. Dział compliance przegląda ścieżkę onboardingu, żeby spełnić wymogi regulatora. Program lojalnościowy nalicza punkty na podstawie zarejestrowanych aktywności zakupowych.&lt;/p&gt;
&lt;p&gt;Jest jeszcze jedna subtelność, która często umyka: Activity jest &lt;strong&gt;niemutowalne&lt;/strong&gt;. Coś, co się wydarzyło, nie może się „od-wydarzyć&amp;quot;. Możesz zarejestrować nową aktywność korygującą (np. anulowanie poprzedniej), ale sam fakt pierwotnej aktywności pozostaje w historii. Jeśli kiedykolwiek pracowałeś z event sourcingiem, poczujesz tu znajomy schemat. Activity to w pewnym sensie domenowy odpowiednik domain event, tyle że żyjący na poziomie modelu biznesowego, nie technicznej infrastruktury.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Gdzie go spotkasz w praktyce&lt;/h2&gt;
&lt;p&gt;Teoria jest fajna, ale archetypy pokazują swoją wartość dopiero wtedy, gdy rozpoznasz je w żywym projekcie.&lt;/p&gt;
&lt;h3&gt;Onboarding w fintechu&lt;/h3&gt;
&lt;p&gt;Wyobraź sobie platformę finansową, gdzie nowy klient musi przejść kilkanaście kroków: rejestracja, weryfikacja dokumentów, scoring kredytowy, podpisanie umowy, aktywacja produktu. Każdy krok to osobna aktywność z uczestnikami (klient, system OCR, analityk ryzyka), przedmiotem (wniosek, dokument, umowa) i wynikiem (zatwierdzony, odrzucony, wymaga uzupełnienia).&lt;/p&gt;
&lt;p&gt;Intuicyjnie, można by to zaimplementować jako sekwencję stanów wniosku — klasyczny state machine. Wniosek przechodzi ze stanu „nowy&amp;quot; przez „w weryfikacji&amp;quot; do „zatwierdzony&amp;quot;. Na pierwszy rzut oka eleganckie rozwiązanie.&lt;/p&gt;
&lt;p&gt;Problem pojawia się, kiedy biznes zaczyna pytać o rzeczy, których state machine nie umie wyrazić:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;„Ile średnio trwa krok weryfikacji dokumentów?&amp;quot;&lt;/li&gt;
&lt;li&gt;„Który analityk obsłużył najwięcej wniosków w tym miesiącu?&amp;quot;&lt;/li&gt;
&lt;li&gt;„Na którym etapie najczęściej klienci rezygnują?&amp;quot;&lt;/li&gt;
&lt;li&gt;„Pokaż mi pełną historię tego konkretnego wniosku ze wszystkimi interwencjami.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;State machine przechowuje &lt;em&gt;gdzie jest wniosek teraz&lt;/em&gt;. Activity przechowuje &lt;em&gt;co się z nim działo&lt;/em&gt;. To fundamentalna różnica. Wniosek w stanie „odrzucony&amp;quot; nie mówi Ci, że był dwukrotnie cofany do uzupełnienia, raz eskalowany do managera i finalnie odrzucony po trzeciej próbie — Activity tak.&lt;/p&gt;
&lt;p&gt;Co ciekawe, state machine nie musi znikać — może nadal pełnić rolę orkiestratora procesu. Ale sam stan przestaje być jedynym źródłem prawdy. Ogólny stan wniosku mówi „gdzie jesteśmy teraz&amp;quot;, Activity mówi „jak tu dotarliśmy&amp;quot;.&lt;/p&gt;
&lt;h3&gt;Program lojalnościowy w retail&lt;/h3&gt;
&lt;p&gt;Weźmy duży system lojalnościowy w sieci handlowej z wieloma markami. Klient zbiera punkty, ale „zbieranie punktów&amp;quot; to tak naprawdę cały wachlarz aktywności: zakup w sklepie stacjonarnym, zakup online, udział w kampanii, polecenie znajomego, urodzinowy bonus.&lt;/p&gt;
&lt;p&gt;Klasyczne podejście — osobny serwis per typ interakcji. Zakupy obsługuje moduł transakcyjny, kampanie — moduł marketingowy, polecenia — moduł referralowy. Każdy trzyma dane w swoim formacie, każdy po swojemu rozumie „historię klienta&amp;quot;.&lt;/p&gt;
&lt;p&gt;I wszystko działa, dopóki biznes nie poprosi o zunifikowany widok aktywności klienta — „pokaż mi wszystko, co ten klient zrobił w ostatnim roku&amp;quot;. Wtedy okazuje się, że dane są rozproszone, niespójne w strukturze, trudne do zagregowania.&lt;/p&gt;
&lt;p&gt;Rozpoznanie archetypu Activity pozwala zaproponować wspólny model: każda interakcja klienta z programem to Activity o określonym typie, z uczestnikiem (klient + opcjonalnie marka/sklep), przedmiotem (transakcja, kampania, kod polecenia) i wynikiem (naliczone punkty, status realizacji). Poszczególne bounded contexty nadal żyją własnym życiem — ale eksponują swoje zdarzenia w zunifikowanej strukturze Activity, którą widok historii klienta może konsumować.&lt;/p&gt;
&lt;p&gt;Ważne zastrzeżenie: zunifikowanie struktury Activity nie musi oznaczać centralizacji danych w jednej bazie. Każdy bounded context nadal może być właścicielem swoich aktywności. Wspólny jest &lt;strong&gt;kontrakt&lt;/strong&gt; — format, w jakim konteksty publikują informacje na zewnątrz. Centralizacja modelu i centralizacja danych to dwie zupełnie różne decyzje architektoniczne.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Konfiguracja zamiast kodu — serce wzorca&lt;/h2&gt;
&lt;p&gt;Rozpoznanie archetypu daje jeszcze jedną, bardzo praktyczną korzyść: możliwość budowania systemów opartych na konfiguracji zamiast na hardkodowaniu każdego przypadku.&lt;/p&gt;
&lt;p&gt;Jeśli nie widzisz wspólnego schematu, każdy nowy typ interakcji to nowy feature: osobna tabela, osobne endpointy, osobna logika walidacji. Backlog rośnie, a każdy nowy pomysł biznesu to sprint pracy deweloperskiej.&lt;/p&gt;
&lt;p&gt;Jeśli widzisz archetyp, budujesz raz mechanizm obsługujący Activity — i nowy typ interakcji dodajesz jako konfigurację:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bez archetypu&lt;/strong&gt; — dodanie nowego typu kontaktu w CRM:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;hljs language-auto&quot;&gt;→ nowa tabela w bazie
→ nowe DTO / encja
→ nowe endpointy API
→ nowe walidatory
→ nowe testy
→ &lt;span class=&quot;hljs-meta&quot;&gt;code&lt;/span&gt; review, deploy
→ &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;-&lt;span class=&quot;hljs-number&quot;&gt;2&lt;/span&gt; tygodnie pracy&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Z archetypem&lt;/strong&gt; — dodanie nowego typu kontaktu:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;hljs language-auto&quot;&gt;→ nowy wpis w rejestrze Activity &lt;span class=&quot;hljs-keyword&quot;&gt;Type&lt;/span&gt;
&lt;span class=&quot;hljs-type&quot;&gt;→ &lt;/span&gt;definicja wymaganych pól (metadata schema)
→ konfiguracja reguł walidacji
→ gotowe
→ godziny, nie tygodnie&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Jak to może wyglądać w praktyce? Wyobraź sobie prosty rejestr typów aktywności w programie lojalnościowym:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;code-lang-label&quot;&gt;yaml&lt;/span&gt;&lt;code class=&quot;hljs language-yaml&quot;&gt;&lt;span class=&quot;hljs-attr&quot;&gt;activity_types:&lt;/span&gt;
  &lt;span class=&quot;hljs-attr&quot;&gt;purchase_in_store:&lt;/span&gt;
    &lt;span class=&quot;hljs-attr&quot;&gt;participants:&lt;/span&gt; [&lt;span class=&quot;hljs-string&quot;&gt;customer&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;store&lt;/span&gt;]
    &lt;span class=&quot;hljs-attr&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;transaction&lt;/span&gt;
    &lt;span class=&quot;hljs-attr&quot;&gt;outcomes:&lt;/span&gt; [&lt;span class=&quot;hljs-string&quot;&gt;points_earned&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;points_rejected&lt;/span&gt;]
    &lt;span class=&quot;hljs-attr&quot;&gt;metadata_schema:&lt;/span&gt;
      &lt;span class=&quot;hljs-attr&quot;&gt;required:&lt;/span&gt; [&lt;span class=&quot;hljs-string&quot;&gt;transaction_id&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;amount&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;currency&lt;/span&gt;]
      &lt;span class=&quot;hljs-attr&quot;&gt;optional:&lt;/span&gt; [&lt;span class=&quot;hljs-string&quot;&gt;product_categories&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;payment_method&lt;/span&gt;]
    &lt;span class=&quot;hljs-attr&quot;&gt;rules:&lt;/span&gt;
      &lt;span class=&quot;hljs-bullet&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;quot;points = amount * 1.0&amp;quot;&lt;/span&gt;
      &lt;span class=&quot;hljs-bullet&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;quot;min_amount: 10 PLN&amp;quot;&lt;/span&gt;

  &lt;span class=&quot;hljs-attr&quot;&gt;referral_signup:&lt;/span&gt;
    &lt;span class=&quot;hljs-attr&quot;&gt;participants:&lt;/span&gt; [&lt;span class=&quot;hljs-string&quot;&gt;referrer&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;referee&lt;/span&gt;]
    &lt;span class=&quot;hljs-attr&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;referral_code&lt;/span&gt;
    &lt;span class=&quot;hljs-attr&quot;&gt;outcomes:&lt;/span&gt; [&lt;span class=&quot;hljs-string&quot;&gt;bonus_granted&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;bonus_rejected&lt;/span&gt;]
    &lt;span class=&quot;hljs-attr&quot;&gt;metadata_schema:&lt;/span&gt;
      &lt;span class=&quot;hljs-attr&quot;&gt;required:&lt;/span&gt; [&lt;span class=&quot;hljs-string&quot;&gt;referral_code&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;referee_email&lt;/span&gt;]
    &lt;span class=&quot;hljs-attr&quot;&gt;rules:&lt;/span&gt;
      &lt;span class=&quot;hljs-bullet&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;quot;bonus = 500 points&amp;quot;&lt;/span&gt;
      &lt;span class=&quot;hljs-bullet&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;quot;max_referrals_per_month: 5&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Kiedy biznes powie „chcemy dodać punkty za zostawienie opinii o produkcie&amp;quot;, deweloper nie pisze nowego serwisu — definiuje nowy typ aktywności z odpowiednimi uczestnikami, przedmiotem, wynikami i regułami. Silnik Activity obsłuży resztę.&lt;/p&gt;
&lt;p&gt;To nie znaczy oczywiście, że system staje się magicznym „no-code&amp;quot;. Złożone typy aktywności nadal mogą wymagać dedykowanej logiki. Ale 80% nowych typów to warianty istniejącego schematu — i te 80% obsłużysz konfiguracją, jeśli masz dobrze rozpoznany archetyp. Diabeł oczywiście tkwi w szczegółach — schemat metadanych musi być wystarczająco elastyczny, a jednocześnie nie możesz skończyć z własnym językiem programowania ukrytym w YAML-u.&lt;/p&gt;
&lt;p&gt;Kluczowe pytanie: &lt;strong&gt;co się zmienia między typami aktywności, a co zostaje takie samo?&lt;/strong&gt; To, co zostaje takie samo — to Twój archetyp. To, co się zmienia — to parametry konfiguracji.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Kiedy to NIE jest Activity&lt;/h2&gt;
&lt;p&gt;Trzeba powiedzieć uczciwie: nie wszystko co ma timestamp to Activity. Czasem warto się zatrzymać i pomyśleć, czy tego archetypu faktycznie potrzebujemy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Logi techniczne&lt;/strong&gt; — wpis „serwer odpowiedział w 230ms&amp;quot; to metryka infrastrukturalna, nie aktywność biznesowa. Nikt z biznesu nie podejmuje decyzji na podstawie czasu odpowiedzi serwera (a jeśli podejmuje — to prawdopodobnie masz inny problem).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Surowe eventy systemowe&lt;/strong&gt; — „użytkownik kliknął przycisk X&amp;quot; to zdarzenie UI, nie Activity w sensie archetypu. Activity pojawia się wtedy, kiedy zdarzenie ma &lt;strong&gt;znaczenie biznesowe&lt;/strong&gt;: nie „kliknął wyślij&amp;quot;, ale „złożył wniosek&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dane z sensorów i IoT&lt;/strong&gt; — odczyt temperatury co sekundę to strumień danych, nie seria aktywności. Ale uwaga: &lt;em&gt;alarm temperaturowy, który wywołał interwencję technika&lt;/em&gt; — to już Activity.&lt;/p&gt;
&lt;p&gt;Dobra reguła kciuka: &lt;strong&gt;jeśli biznes nie potrzebuje historii tego zdarzenia do podejmowania decyzji, to nie jest Activity&lt;/strong&gt;. Jeśli nikt nigdy nie zapyta „pokaż mi wszystkie X tego klienta z ostatniego kwartału&amp;quot; — prawdopodobnie nie potrzebujesz tu archetypu.&lt;/p&gt;
&lt;p&gt;I jeszcze jedna pułapka — &lt;strong&gt;over-engineering przez nadmierne uogólnianie&lt;/strong&gt;. Fakt, że dwa byty mają datę, typ i uczestnika, nie oznacza automatycznie, że to ten sam archetyp. Zamówienie w sklepie i sesja logowania do systemu technicznie pasują do schematu Activity — ale ich semantyka biznesowa jest zupełnie inna. Próba wciśnięcia obu w jeden model to droga do generycznego potworka, który nie służy dobrze nikomu.&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;Linki do źródeł:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.oreilly.com/library/view/enterprise-patterns-and/032111230X/&quot;&gt;[1] Jim Arlow, Ilan Neustadt — „Enterprise Patterns and MDA: Building Better Software with Archetype Patterns and UML&amp;quot; (2004)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Dopasuj rozwiązania do fazy rozwoju zespołu</title>
    <link href="https://miedzykodem.dev/blog/dopasuj-rozwiazania-do-fazy-zespolu" rel="alternate" type="text/html"/>
    <id>https://miedzykodem.dev/blog/dopasuj-rozwiazania-do-fazy-zespolu</id>
    <published>2026-03-10T00:00:00.000Z</published>
    <updated>2026-03-10T00:00:00.000Z</updated>
    <author><name>Jakub Ciszak</name></author>
    <summary>Czasem trudno zidentyfikować problem w projekcie. Na pierwszy rzut oka winowajcą jest kod i zaciągnięty dług — przegląd kodu przestał działać, komentarze są albo zbyt ostre, albo zbyt grzeczne, decyzj...</summary>
    <content type="html">&lt;p&gt;Czasem trudno zidentyfikować problem w projekcie. Na pierwszy rzut oka winowajcą jest kod i zaciągnięty dług — przegląd kodu przestał działać, komentarze są albo zbyt ostre, albo zbyt grzeczne, decyzje architektoniczne zapadają w kuluarach zamiast na tablicy, ktoś przepisuje moduł, który ktoś inny właśnie skończył. Dokładasz procesy, narzędzia, ceremonie; nic nie pomaga.&lt;/p&gt;
&lt;p&gt;Problem może być gdzie indziej.&lt;/p&gt;
&lt;h2&gt;Developmental Sequence in Small Groups&lt;/h2&gt;
&lt;p&gt;Bruce Tuckman opisał to w 1965 roku w artykule &lt;a href=&quot;https://web.mit.edu/curhan/www/docs/Articles/15341_Readings/Group_Dynamics/Tuckman_1965_Developmental_sequence_in_small_groups.pdf&quot;&gt;&lt;em&gt;&amp;quot;Developmental Sequence in Small Groups&amp;quot;&lt;/em&gt;&lt;/a&gt; — fazy rozwoju zespołów – forming, storming, norming, performing. Model powstał na podstawie pięćdziesięciu badań nad małymi grupami, głównie terapeutycznych i laboratoryjnych, nie zespołów scrumowych, nie zespołów produktowych, nie jednostek w skalowanym Agile. Jest opisowy, nie przepisujący — Tuckman nie mówił jak przez te fazy przejść, mówił że grupy przez nie przechodzą.&lt;/p&gt;
&lt;p&gt;Czytając te badania, zacząłem zastanawiać się, jak znajomość tych faz może zmienić sposób, w jaki diagnozujemy problemy w kodzie i dobieramy do nich narzędzia.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Storming wygląda jak problem techniczny&lt;/h2&gt;
&lt;p&gt;Drugie, poważniejsze odkrycie z badań Tuckmana: tylko połowa grup wykazała wyraźną fazę storming. Reszta albo ją pomijała, albo zamiatała pod dywan — co nie oznaczało, że konfliktu nie było, oznaczało, że nie był na tyle bezpieczny, żeby się ujawnić.&lt;/p&gt;
&lt;p&gt;W IT storming rzadko wygląda jak otwarty konflikt. Wygląda jak nieskończone dyskusje o wyborze biblioteki. Jak pull requesty, które wiszą tygodniami bez recenzji. Jak &amp;quot;tymczasowe&amp;quot; rozwiązania, które nikt nie chce ruszać, bo nie wiadomo czyje są. Jak decyzje architektoniczne, które zapadają nie na podstawie argumentów, ale na podstawie tego kto ma więcej autorytetu w pokoju.&lt;/p&gt;
&lt;p&gt;Jeśli widzisz te symptomy w kodzie — zanim zaczniesz szukać rozwiązania technicznego, zastanów się, w której fazie jest Twój zespół.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Każda zmiana personalna resetuje zegar!&lt;/h2&gt;
&lt;p&gt;Model Tuckmana nie jest liniowy. Każda znacząca zmiana — nowy członek, odejście kluczowej osoby, scalenie dwóch zespołów, zmiana tech leada — resetuje dynamikę grupy z powrotem do forming. Nie o jedną fazę wstecz. Do początku.&lt;/p&gt;
&lt;p&gt;Brooks poniekąd wyjaśnił mechanikę tego zjawiska w 1975 roku w &lt;a href=&quot;https://www.oreilly.com/library/view/mythical-man-month-the/0201835959/&quot;&gt;&lt;em&gt;The Mythical Man-Month&lt;/em&gt;&lt;/a&gt;: przy pięciu osobach masz dziesięć par komunikacyjnych, przy dziesięciu — czterdzieści pięć. Każdy nowy człowiek to nowe kanały do zbudowania, nowy kontekst do przekazania, nowa dynamika do wypracowania.&lt;/p&gt;
&lt;p&gt;To ma bezpośrednie przełożenie na to, co widzisz w kodzie po dołączeniu nowej osoby do zespołu. Nagle pojawiają się pull requesty, które łamią ustalone konwencje — nie ze złej woli, ale dlatego że nowa osoba nie zna kontekstu, który reszta ma w głowie. Nagle wracają dyskusje, które zespół miał już rozstrzygnięte. Nagle ADR-y, które leżały spokojnie w repozytorium, okazują się niewystarczające, bo opisują &lt;em&gt;co&lt;/em&gt; zdecydowano, ale nie &lt;em&gt;dlaczego&lt;/em&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Team Topologies daje strukturę, Tuckman daje kontekst&lt;/h2&gt;
&lt;p&gt;Skelton i Pais w &lt;a href=&quot;https://itrevolution.com/product/team-topologies/&quot;&gt;&lt;em&gt;Team Topologies&lt;/em&gt;&lt;/a&gt; traktują obciążenie kognitywne jako pierwsze ograniczenie projektowania organizacji. Cztery typy zespołów i trzy tryby interakcji dają precyzyjny język do opisywania granic — kto jest stream-aligned team, kto jest zespołem platformowym, kiedy zespoły powinny współpracować, a kiedy działać przez interfejs usługowy.&lt;/p&gt;
&lt;p&gt;To bardzo użyteczny język. Ale &lt;em&gt;Team Topologies&lt;/em&gt; nie powie ci, co robić, gdy Twój stream-aligned team jest w burzliwej faxie storming i doświadczony programista blokuje każdą decyzję, bo czuje, że traci wpływ po reorganizacji. Model jest mocny na projektowaniu struktury, milczy na temat dynamiki ludzi wewnątrz tej struktury.&lt;/p&gt;
&lt;p&gt;Tuckman z kolei opisuje dynamikę — ale nie mówi nic o tym, jak strategia pracy z kodem powinna się zmieniać w zależności od fazy.&lt;/p&gt;
&lt;p&gt;Pozwoliłem sobie na zbiorczą reinterpretację obu tych narzędzi i doszedłem do wniosku, że dopiero ich połączenie może dać coś naprawdę użytecznego: język do diagnozowania tego, co widzisz w projekcie, i praktyki dopasowane do etapu, na którym zespół faktycznie jest — nie do tego, na którym chciałbyś żeby był.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Co faza zespołu mówi o tym, jak pracować z kodem&lt;/h2&gt;
&lt;h3&gt;Moja analiza wyciągniętą z doświadczenia, w zderzeniu z teorią o zespołach.&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Forming&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nowy kontekst, brak wspólnych konwencji, każdy ma inne przyzwyczajenia z poprzednich miejsc. Przegląd kodu w tej fazie jest drogi — bo każdy komentarz wymaga wyjaśnienia założeń, które w dojrzałym zespole są oczywiste.&lt;/p&gt;
&lt;p&gt;Praktyki, które tutaj pomagają: zasady przeglądu kodu zapisane jawnie, nie przekazywane ustnie — bo ustna tradycja nie istnieje, gdy zespół ma dwa tygodnie. ADR-y dokumentujące nie tylko decyzje, ale ich uzasadnienie — bo &amp;quot;dlaczego&amp;quot; jest ważniejsze niż &amp;quot;co&amp;quot;, gdy ktoś właśnie dołączył. Programowanie w parach jako najszybszy mechanizm przekazywania kontekstu: godzina wspólnego kodowania zastępuje tygodnie dokumentacji, której nikt nie czyta. Linting i formatowanie zautomatyzowane — żeby przegląd kodu nie zużywał energii na spacje i przecinki zamiast na architekturę.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Storming&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Najniebezpieczniejsza faza z perspektywy jakości kodu. Konflikty personalne i techniczne nakładają się i trudno je rozdzielić — &amp;quot;nie zgadzam się z tym podejściem do walidacji&amp;quot; może być uzasadnionym sporem technicznym, może też być przykrywką dla &amp;quot;nie akceptuję tego, że nowy tech lead ma więcej autorytetu ode mnie.&amp;quot;&lt;/p&gt;
&lt;p&gt;Przegląd kodu w tej fazie staje się polem bitwy albo odwrotnie — zamienia się w grzeczne klepanie po plecach, bo nikt nie chce zaogniać atmosfery. W obu przypadkach traci kod.&lt;/p&gt;
&lt;p&gt;Co pomaga: ADR z numerowanymi opcjami i jawnymi kryteriami wyboru — decyzja przestaje być zdaniem Marka kontra zdaniem Ani, staje się oceną opcji A kontra opcja B według ustalonych kryteriów. Spike&amp;#39;i zamiast debat: dwa dni prototypu dają dane, których nie ma żaden argument teoretyczny. Definition of Done uzgodniona przed startem sprintu, nie negocjowana przy każdym pull requeście.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Norming&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pojawia się wspólne poczucie własności kodu i zaufanie. To moment, w którym dług techniczny przestaje być tematem tabu — jest dość bezpieczeństwa, żeby powiedzieć głośno &amp;quot;ten kawałek jest zepsuty i powinniśmy to naprawić,&amp;quot; bez obawy, że zostanie to odebrane jako atak na autora.&lt;/p&gt;
&lt;p&gt;Testy przestają być walką, stają się normą. Właściciele modułów dla krytycznych obszarów kodu — nie po to, żeby zablokować dostęp innym, ale żeby mieć kogoś odpowiedzialnego za jakość. ADR-y pisane prospektywnie, przed decyzją, nie post factum. I właśnie tutaj prawo Conwaya zaczyna działać w drugą stronę — granice kodu i granice odpowiedzialności zespołu zaczynają się pokrywać w sposób, który można świadomie kształtować.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rzadkie, cenne, kruche. Wspólny model mentalny sprawia, że decyzje są szybkie, a refaktoryzacja jest możliwa, bo jest zaufanie. Architektoniczne testy fitness — automatyczne sprawdzenia, czy architektura nie dryfuje od założeń — mają sens dopiero tutaj, bo jest dojrzałość, żeby reagować na alarmy zamiast je wyciszać albo ignorować.&lt;/p&gt;
&lt;p&gt;I właśnie dlatego każda niepotrzebna rotacja na tym etapie boli nieproporcjonalnie do tego, co widać na powierzchni. Nie tracisz człowieka. Tracisz performing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/blog/diagram_tuckman.svg&quot; alt=&quot;Fazy zespołu a strategia pracy z kodem&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Prawo Conwaya domyka pętlę&lt;/h2&gt;
&lt;p&gt;Conway &lt;a href=&quot;https://www.melconway.com/Home/Committees_Paper.html&quot;&gt;napisał w 1968 roku&lt;/a&gt;: &lt;em&gt;&amp;quot;organizacje produkują projekty będące kopiami ich struktur komunikacyjnych.&amp;quot;&lt;/em&gt; Brzmiało to jak obserwacja. &lt;a href=&quot;https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-2008-11.pdf&quot;&gt;Badania Microsoftu z 2008 roku&lt;/a&gt; pokazały, że metryki organizacyjne — kto z kim rozmawia, jak wyglądają granice zespołów — przewidywały moduły kodu podatne na błędy lepiej niż metryki samego kodu.&lt;/p&gt;
&lt;p&gt;Jeśli zespół, w którym jesteś, jest w storming i ma rozmyte granice odpowiedzialności, Twój kod będzie miał rozmyte granice modułów. Jeśli masz trzy podsystemy i dwa i pół zespołu, które &amp;quot;jakoś to ogarniają,&amp;quot; Twój kod będzie miał dwa i pół naturalnej granicy — a przy próbie wydzielenia mikroserwisów wyjdzie to boleśnie.&lt;/p&gt;
&lt;p&gt;Odwrócony manewr Conwaya — świadome projektowanie struktury zespołów pod architekturę, którą chcesz osiągnąć — działa. Ale działa tylko wtedy, gdy zespół jest dość unormowany, żeby tę strukturę utrzymać. W storming każda granica jest negocjowana na nowo przy każdej zmianie, bo nie ma jeszcze wspólnego rozumienia tego, co do kogo należy.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Jedno pytanie diagnostyczne&lt;/h2&gt;
&lt;p&gt;Zanim zaczniesz wdrażać DDD, Event Storming inne ceremonię lub narzędzia — sprawdź, czy masz dość bezpieczeństwa psychologicznego w zespole, żeby te praktyki w ogóle zadziałały. Narzędzia działają tylko w rękach ludzi, którzy mogą się mylić bez strachu.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Źródła:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tuckman, B.W. (1965). &lt;a href=&quot;https://web.mit.edu/curhan/www/docs/Articles/15341_Readings/Group_Dynamics/Tuckman_1965_Developmental_sequence_in_small_groups.pdf&quot;&gt;&lt;em&gt;Developmental Sequence in Small Groups&lt;/em&gt;&lt;/a&gt;. Psychological Bulletin, 63(6), 384–399.&lt;/li&gt;
&lt;li&gt;Skelton, M., Pais, M. (2019). &lt;a href=&quot;https://itrevolution.com/product/team-topologies/&quot;&gt;&lt;em&gt;Team Topologies: Organizing Business and Technology Teams for Fast Flow&lt;/em&gt;&lt;/a&gt;. IT Revolution Press. ISBN: 978-1942788812&lt;/li&gt;
&lt;li&gt;Brooks, F.P. (1975/1995). &lt;a href=&quot;https://www.oreilly.com/library/view/mythical-man-month-the/0201835959/&quot;&gt;&lt;em&gt;The Mythical Man-Month: Essays on Software Engineering&lt;/em&gt;&lt;/a&gt;. Addison-Wesley. ISBN: 978-0201835953&lt;/li&gt;
&lt;li&gt;Conway, M.E. (1968). &lt;a href=&quot;https://www.melconway.com/Home/Committees_Paper.html&quot;&gt;&lt;em&gt;How Do Committees Invent?&lt;/em&gt;&lt;/a&gt; Datamation, 14(4), 28–31.&lt;/li&gt;
&lt;li&gt;Nagappan, N., Murphy, B., Basili, V. (2008). &lt;a href=&quot;https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-2008-11.pdf&quot;&gt;&lt;em&gt;The Influence of Organizational Structure on Software Quality&lt;/em&gt;&lt;/a&gt;. ICSE 2008.&lt;/li&gt;
&lt;/ol&gt;
</content>
  </entry>
  <entry>
    <title>Extreme Programming jest potrzebny bardziej niż kiedykolwiek wcześniej</title>
    <link href="https://miedzykodem.dev/blog/extreme-programming-kent-beck" rel="alternate" type="text/html"/>
    <id>https://miedzykodem.dev/blog/extreme-programming-kent-beck</id>
    <published>2026-03-05T00:00:00.000Z</published>
    <updated>2026-03-05T00:00:00.000Z</updated>
    <author><name>Jakub Ciszak</name></author>
    <summary>Przywitajmy się dzisiaj z Kentem Beckiem. W 1999 roku opublikował Extreme Programming Explained 1 z dwunastoma praktykami, które miały jedno wspólne DNA: skracanie pętli zwrotnej.</summary>
    <content type="html">&lt;p&gt;Przywitajmy się dzisiaj z Kentem Beckiem. W 1999 roku opublikował &lt;strong&gt;Extreme Programming Explained&lt;/strong&gt; &lt;a href=&quot;https://www.goodreads.com/book/show/67833.Extreme_Programming_Explained&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[1]&lt;/a&gt; z dwunastoma praktykami, które miały jedno wspólne DNA: &lt;strong&gt;skracanie pętli zwrotnej&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ten sam człowiek wraz z siedemnastoma sygnatariuszami podpisali, genialny w swojej prostocie, Manifest Agile &lt;a href=&quot;https://agilemanifesto.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[2]&lt;/a&gt;. Warto wspomnieć, że w sumie trzech z tych siedemnastu &amp;quot;ojców&amp;quot; manifestu było także twórcami XP – Kent Beck, Ward Cunningham i Ron Jeffries.&lt;/p&gt;
&lt;h2&gt;XP a Agile&lt;/h2&gt;
&lt;p&gt;Manifest Agile nie powstał obok XP. Powstał z XP.
Chronologia jest taka: &lt;code&gt;XP (1999) → Manifest Agile (2001) → Scrum Guide (formalizacja 2010+)&lt;/code&gt;. Agile miał być parasolem nad praktykami inżynieryjnymi. Scrum &lt;a href=&quot;https://scrumguides.org/scrum-guide.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[3]&lt;/a&gt; natomiast celowo nie definiuje praktyk technicznych — i to jest jednocześnie jego siła (elastyczność) i jego słabość (łatwo pominąć inżynierię).&lt;/p&gt;
&lt;p&gt;Problem zaczął się, kiedy organizacje potrzebowały czegoś &amp;quot;wdrażalnego.&amp;quot; Scrum dał im ramy procesowe — role, eventy, artefakty, ale celowo nie zdefiniował praktyk technicznych; tu się otworzyła luka: łatwiej jest &amp;quot;wdrożyć Agile&amp;quot;, robiąc standupy i planningi, niż ucząc zespół TDD i pair programmingu. Jedno wymaga zmiany kalendarza. Drugie wymaga zmiany kultury.
Efekt? Organizacje robią Scruma bez XP. Mają ceremonie, ale nie mają dyscypliny. Mają velocity, ale nie mają testów. Dave Thomas wprost mówi, że Agile zostało &amp;quot;wywrócone do punktu, w którym jest praktycznie pozbawione znaczenia&amp;quot; &lt;a href=&quot;https://pragdave.me/thoughts/active/2014-03-04-time-to-kill-agile.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[4]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Prawda jest taka, że porzucamy podstawowe narzędzia, skupiając się tylko na powierzchownej warstwie problemu. Agile/Scrum bez zasad Extreme Programmingu jest bezużyteczny, XP bez podstaw myślenia, jakie definiuje Agile, jest dłubaniem dłutem bez planu.&lt;/p&gt;
&lt;h2&gt;Dwanaście praktyk XP vs AI&lt;/h2&gt;
&lt;p&gt;Same zasady extreme programmingu są w mojej opinii jeszcze bardziej potrzebne w czasach agentów AI. Już tłumaczę, spójrzmy na kilka zasad XP pod kątem agent codingu/vibe codingu.&lt;/p&gt;
&lt;h3&gt;Test Driven Development&lt;/h3&gt;
&lt;p&gt;TDD jest praktyką, którą agent naprawdę jest w stanie wznieść na wyższy poziom, a jednocześnie praktyką bardzo często pomijaną przy programowaniu z agentami.
Test first opiera się na pętli dwóch faz – Red/Green. Tylko tyle i aż tyle. Agenci są fenomenalni w Green, ale ma to sens kiedy test w fazie Red jest przemyślany i zrozumiany, ale w &amp;quot;red&amp;quot; — zdefiniuj, czego oczekujesz — agenci są bezradni bez kontekstu biznesowego.&lt;/p&gt;
&lt;p&gt;Oczywiście, możemy przygotowywać opisy agentów, korzystać z narzędzi takich jak AutoGen od Microsoft &lt;a href=&quot;https://github.com/microsoft/autogen&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[5]&lt;/a&gt;, ale długofalowo TDD jest potęgą kiedy Ty definiujesz testy, zgłębiając przy tym domenę, a agent implementuje fazę Green. Odwrócenie tego procesu, lub pozostawienie AI pisania testów kodu, bez porządnego setupu pod pracę w trybie &amp;quot;AutoGen&amp;quot;, to jakby student sam wystawiał sobie ocenę z egzaminu.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/blog/diagram-1-tdd.svg&quot; alt=&quot;TDD z agentem AI — kto odpowiada za którą fazę?&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Pair Programming&lt;/h3&gt;
&lt;p&gt;W pewnym sensie Agent to idealny &amp;quot;nawigator&amp;quot; – nie nudzi się, nie ocenia, jest dostępny o trzeciej w nocy, ale nie powie Ci, że Twój pomysł architektoniczny jest głupi, nie zada pytania &amp;quot;a po co to w ogóle robimy?&amp;quot; — bo nie ma kontekstu organizacyjnego, który ludzie budują latami. Można minimalizować ten problem budując bazę wiedzy dla agentów, nagrywając refinementy, dając dostęp do dokumentacji. Jednak z podstaw LLM, będzie się zgadzał, nie ma tej ludzkiej przenikliwości i ciekawości.&lt;/p&gt;
&lt;p&gt;Myślę, że skuteczne jest podejście hybrydowe – rutynowe zadania z agentem, bardziej złożone, wymagające decyzji architektonicznych z człowiekiem.&lt;/p&gt;
&lt;h3&gt;Simple design&lt;/h3&gt;
&lt;p&gt;Beck: &amp;quot;zrób najprostszą rzecz, która może zadziałać.&amp;quot; Agent nie dąży do prostoty, dąży do tego, żeby kod się skompilował.
Arlow i Neustadt w Enterprise Patterns [6] zauważyli, że simple design ma dwa wymiary: prostota kodu i prostota semantyki biznesowej, którą ten kod realizuje. Można mieć pięknie czysty kod, który implementuje błędne reguły biznesowe — bo sam kod jest kiepskim narzędziem do walidowania domeny, a refaktoryzacja pokręconej logiki biznesowej to zupełnie inna kategoria trudności niż refaktoryzacja kodu.&lt;/p&gt;
&lt;h3&gt;Refactoring&lt;/h3&gt;
&lt;p&gt;Istnieją dwa rodzaje refactoringu – malutkie optymalizacje, zmiana zagnieżdżeń pętli na podejście funkcyjne, wyniesienie czegoś do stałej, albo enuma i takie tam. Tego typu zmiany bez sensu klepać ręcznie; agent jest w stanie zlokalizować i zmienić taki kod w mgnieniu oka.&lt;/p&gt;
&lt;p&gt;Problem w tym, że AI sam w sobie nie wie kiedy refaktoryzować, nie rozumie, że refactor to decyzja przede wszystkim ekonomiczna, nie estetyczna. Koszt zmiany rośnie wykładniczo (krzywa Boehma &lt;a href=&quot;https://doi.org/10.1109/2.59&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[7]&lt;/a&gt;!). Refactoring w złym momencie, będzie drogi. Dla agenta nie ma to znaczenia, ale długoterminowo może okazać się strzałem w kolano.&lt;/p&gt;
&lt;h3&gt;Coding standards&lt;/h3&gt;
&lt;p&gt;Agent pisze spójny kod, ale spójny z czym? Z danymi treningowymi. Nie z konwencjami Twojego zespołu. Nie z ADR-ami, które spisaliście pół roku temu. Chyba, że jesteś do tego dobrze przygotowany. Utrzymywanie ADRów w repozytorium, dbanie o instrukcje AGENTS, SKILLS itp. są w stanie znacząco poprawić ten element XP w pracy z AI.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/blog/diagram-2-praktyki.svg&quot; alt=&quot;5 praktyk XP w erze agentów AI&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Feedback cycle — serce XP, które agenci mogą złamać&lt;/h2&gt;
&lt;h4&gt;Cały sekret XP: skracaj pętlę zwrotną.&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;hljs language-auto&quot;&gt;TDD → minuty. &lt;span class=&quot;hljs-built_in&quot;&gt;Pair&lt;/span&gt; programming → sekundy. CI → godziny. Small releases → dni. &lt;span class=&quot;hljs-keyword&quot;&gt;On&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;-site&lt;/span&gt; customer → tygodnie&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Każda praktyka XP to inny mechanizm zmniejszania odległości między &amp;quot;napisałem kod&amp;quot; a &amp;quot;wiem, czy ten kod jest dobry.&amp;quot;
Boehm w 1981 pokazał wykładniczy wzrost kosztu naprawy &lt;a href=&quot;https://doi.org/10.1109/2.59&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[7]&lt;/a&gt;; Beck argumentował, że XP spłaszcza tę krzywą &lt;a href=&quot;https://www.goodreads.com/book/show/67833.Extreme_Programming_Explained&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[1]&lt;/a&gt;; Ambler zniuansował: łagodzi się, ale nigdy nie jest płaska &lt;a href=&quot;http://agilemodeling.com/essays/costOfChange.htm&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[8]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I tu jest sedno problemu z agentami. Agent przyspiesza pisanie – nie przyspiesza feedbacku, a w wielu przypadkach feedback się wydłuża, bo ilość kodu do zrozumienia rośnie szybciej niż zdolność zespołu do review.&lt;/p&gt;
&lt;h2&gt;XP, a ewolucja systemów&lt;/h2&gt;
&lt;p&gt;Zaprośmy do tej dyskusji jeszcze jedną osobę — Simona Wardleya &lt;a href=&quot;https://learnwardleymapping.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[9]&lt;/a&gt;.
Jego prace są istotne w kontekście Extreme Programming. Zdecydowanie za rzadko zwracamy uwagę na to, że różne praktyki nie mają jednakowej wartości na każdym etapie ewolucji, tak samo jest z praktykami XP:&lt;/p&gt;
&lt;h3&gt;Genesis (startup, MVP):&lt;/h3&gt;
&lt;p&gt;Agent + small releases + CI = idealny sojusz. Szybko prototypujesz, szybko walidujesz. TDD mniej krytyczne — kod jest tymczasowy.&lt;/p&gt;
&lt;h3&gt;Custom-Built (wzrost):&lt;/h3&gt;
&lt;p&gt;Prawdziwe TDD i pair programming stają się kluczowe. Bez testów i review kod staje się długiem, a Collective ownership nabiera sensu.&lt;/p&gt;
&lt;h3&gt;Product (dojrzałość):&lt;/h3&gt;
&lt;p&gt;Refactoring i coding standards dominują. Agent pomaga, ale jest niebezpieczny bez kontekstu historii decyzji. ADR-y i dokumentacja stają się kluczowe.&lt;/p&gt;
&lt;h3&gt;Commodity (legacy):&lt;/h3&gt;
&lt;p&gt;Agent najbardziej ograniczony. Problem to nie kod — to wyparowana wiedza. Tu wraca on-site customer i metaphor — trzeba odkryć domenę na nowo.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/blog/diagram-3-wardley.svg&quot; alt=&quot;Praktyki XP w cyklu ewolucji Wardleya&quot;&gt;&lt;/p&gt;
&lt;h1&gt;Praktyka nr 13: rozumiej to, co akceptujesz&lt;/h1&gt;
&lt;p&gt;Beck dał nam 12 praktyk. Era agentów wymaga trzynastej:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rozumiej to, co akceptujesz.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kiedy kolega pisał kod, mieliśmy code review. Ktoś czytał, pytał, sugerował. Kiedy agent pisze, pokusa jest inna: &amp;quot;działa? merge.&amp;quot; I wtedy wracamy do kwadrantu Fowlera &lt;a href=&quot;https://martinfowler.com/bliki/TechnicalDebtQuadrant.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[10]&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;→ Agent pisze, Ty rozumiesz i akceptujesz kompromisy → rozważny-świadomy. OK.&lt;/p&gt;
&lt;p&gt;→ Agent pisze, Ty klikasz &amp;quot;accept all&amp;quot; → lekkomyślny-świadomy.&lt;/p&gt;
&lt;p&gt;→ Agent pisze, nikt nie rozumie decyzji architektonicznych → lekkomyślny-nieświadomy – skali, jakiej Fowler nie przewidział.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/blog/diagram-4-fowler.svg&quot; alt=&quot;Kwadrant Fowlera w erze agentów AI&quot;&gt;&lt;/p&gt;
&lt;h1&gt;Konkluzja&lt;/h1&gt;
&lt;h3&gt;XP nie jest przestarzałe. Jest bardziej potrzebne niż kiedykolwiek.&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pair programming&lt;/strong&gt; to nie &amp;quot;dwie osoby przy monitorze&amp;quot; — to zasada, że kod nigdy nie powinien powstawać bez drugiej pary oczu. Agent nie liczy się jako ta para, bo nie pyta &amp;quot;dlaczego.&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TDD&lt;/strong&gt; to nie &amp;quot;pisz testy przed kodem&amp;quot; — to zasada, że zanim napiszesz linijkę, musisz wiedzieć, czego oczekujesz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Simple design&lt;/strong&gt; to nie &amp;quot;mało kodu&amp;quot; — to minimalny kod, który poprawnie modeluje domenę.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Manifest Agile&lt;/strong&gt; &lt;a href=&quot;https://agilemanifesto.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[2]&lt;/a&gt; miał być parasolem nad tymi praktykami. Scrum dał nam ramy procesowe, ale gdzieś po drodze porzuciliśmy substancję na rzecz ceremonii. I teraz, w 2026, kiedy agenci AI generują kod szybciej niż ktokolwiek jest w stanie go przeczytać — desperacko potrzebujemy dokładnie tych praktyk, które 25 lat temu uznaliśmy za &amp;quot;zbyt extreme.&amp;quot;&lt;/p&gt;
&lt;p&gt;Beck miał rację. Tylko partner się zmienił.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Źródła&lt;/h2&gt;
&lt;p&gt;[1] Beck, K. (1999). &lt;em&gt;Extreme Programming Explained: Embrace Change&lt;/em&gt;. Addison-Wesley. Drugie wydanie: 2004. — &lt;a href=&quot;https://www.goodreads.com/book/show/67833.Extreme_Programming_Explained&quot;&gt;goodreads.com/book/show/67833&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] Beck, K. et al. (2001). &lt;em&gt;Manifesto for Agile Software Development&lt;/em&gt;. — &lt;a href=&quot;https://agilemanifesto.org/&quot;&gt;agilemanifesto.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[3] Schwaber, K., Sutherland, J. (2020). &lt;em&gt;The Scrum Guide&lt;/em&gt;. — &lt;a href=&quot;https://scrumguides.org/scrum-guide.html&quot;&gt;scrumguides.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[4] Thomas, D. (2014). &lt;em&gt;Agile Is Dead (Long Live Agility)&lt;/em&gt;. — &lt;a href=&quot;https://pragdave.me/thoughts/active/2014-03-04-time-to-kill-agile.html&quot;&gt;pragdave.me/thoughts/active/2014-03-04-time-to-kill-agile.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[5] Wu, Q. et al. (2023). &lt;em&gt;AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation&lt;/em&gt;. Microsoft Research. — &lt;a href=&quot;https://github.com/microsoft/autogen&quot;&gt;github.com/microsoft/autogen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[6] Arlow, J., Neustadt, I. (2003). &lt;em&gt;Enterprise Patterns and MDA: Building Better Software with Archetype Patterns and UML&lt;/em&gt;. Addison-Wesley. ISBN: 978-0321112309&lt;/p&gt;
&lt;p&gt;[7] Boehm, B.W. (1981). &lt;em&gt;Software Engineering Economics&lt;/em&gt;. Prentice Hall. Patrz też: Boehm, B.W. (1988). &amp;quot;A Spiral Model of Software Development and Enhancement.&amp;quot; &lt;em&gt;IEEE Computer&lt;/em&gt;, 21(5). — &lt;a href=&quot;https://doi.org/10.1109/2.59&quot;&gt;doi.org/10.1109/2.59&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[8] Ambler, S.W. &lt;em&gt;Examining the Agile Cost of Change Curve&lt;/em&gt;. Ambysoft / Agile Modeling. — &lt;a href=&quot;http://agilemodeling.com/essays/costOfChange.htm&quot;&gt;agilemodeling.com/essays/costOfChange.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[9] Wardley, S. (2016). &lt;em&gt;Wardley Maps: The use of topographical intelligence in business strategy&lt;/em&gt;. — &lt;a href=&quot;https://learnwardleymapping.com/&quot;&gt;learnwardleymapping.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[10] Fowler, M. (2009). &lt;em&gt;Technical Debt Quadrant&lt;/em&gt;. — &lt;a href=&quot;https://martinfowler.com/bliki/TechnicalDebtQuadrant.html&quot;&gt;martinfowler.com/bliki/TechnicalDebtQuadrant.html&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Dług techniczny — metafora, której prawie nikt nie rozumie poprawnie</title>
    <link href="https://miedzykodem.dev/blog/kolekcja-klasyki-dlug-techniczny" rel="alternate" type="text/html"/>
    <id>https://miedzykodem.dev/blog/kolekcja-klasyki-dlug-techniczny</id>
    <published>2026-03-02T00:00:00.000Z</published>
    <updated>2026-03-02T00:00:00.000Z</updated>
    <author><name>Jakub Ciszak</name></author>
    <summary>Ciąg dalszy wpisów z serii &quot;Kolekcja klasyki&quot; Czy tylko ja nie umiem tego przeczytać inaczej niż głosem Piotra Fronczewskiego? :. Dzisiejsi bohaterowie — Martin Fowler oraz Ward Cunningham — i metafor...</summary>
    <content type="html">&lt;p&gt;Ciąg dalszy wpisów z serii &amp;quot;Kolekcja klasyki&amp;quot; (Czy tylko ja nie umiem tego przeczytać inaczej niż głosem Piotra Fronczewskiego? :)). Dzisiejsi bohaterowie — Martin Fowler oraz Ward Cunningham — i metafora, która zdominowała nasze branżowe dyskusje, mimo że większość z nas rozumie ją błędnie.&lt;/p&gt;
&lt;p&gt;&amp;quot;Mamy za dużo długu technicznego.&amp;quot; To zdanie pada na każdym retro. Wszyscy kiwają głowami. Ale zapytaj pięć osób w pokoju, co dokładnie przez to rozumieją — i dostaniesz pięć różnych odpowiedzi. Brzydki kod. Brak testów. Stary framework. Obejścia na szybko. Wszystko, co powinniśmy byli zrobić inaczej. Każdy używa tej samej metafory, ale każdy mówi o czymś innym.&lt;/p&gt;
&lt;p&gt;I tu jest problem — bo ta metafora ma bardzo konkretne znaczenie.&lt;/p&gt;
&lt;h2&gt;Cunningham nie mówił o złym kodzie&lt;/h2&gt;
&lt;p&gt;Ward Cunningham wprowadził pojęcie długu technicznego w 1992 roku, opisując system WyCash &lt;a href=&quot;http://c2.com/doc/oopsla92.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[1]&lt;/a&gt;. I to jest moment, w którym większość branży skręca w złą stronę — bo Cunningham &lt;strong&gt;nie mówił o bałaganie w kodzie&lt;/strong&gt;. Mówił o czymś znacznie subtelniejszym.&lt;/p&gt;
&lt;p&gt;Zespół napisał kod najlepiej, jak potrafił, na podstawie tego, co w danym momencie wiedział o domenie biznesowej. Potem nauczył się więcej — i ten sam kod, wcześniej dobry, stał się niedopasowany do aktualnego rozumienia problemu. Ta różnica — między kodem a obecną wiedzą o domenie — to jest dług techniczny w sensie Cunninghama.&lt;/p&gt;
&lt;p&gt;Metafora finansowa jest celowa. Dług to nie zło samo w sobie. Firmy zaciągają kredyty, bo pozwalają im szybciej rosnąć — pod warunkiem, że mają plan spłaty. W wywiadzie z 2009 roku Cunningham powiedział to wprost: chodziło o świadomy kompromis, nie o pisanie byle jakiego kodu i nazywanie tego &amp;quot;długiem&amp;quot; &lt;a href=&quot;https://www.youtube.com/watch?v=pqeJFYwnkjE&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[2]&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Kwadrant Fowlera, czyli nie każdy &amp;quot;dług&amp;quot; jest długiem&lt;/h2&gt;
&lt;p&gt;Fowler w 2009 roku wziął tę rozjechaną terminologię i nałożył na nią porządek &lt;a href=&quot;https://martinfowler.com/bliki/TechnicalDebtQuadrant.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[3]&lt;/a&gt;. Dwie osie — rozważny/lekkomyślny i świadomy/nieświadomy — dają cztery zupełnie różne sytuacje. I dopiero kiedy się je rozróżni, rozmowa o &amp;quot;długu technicznym&amp;quot; zaczyna mieć sens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/blog/kwadrant-fowlera.svg&quot; alt=&quot;Kwadrant Długu Technicznego Fowlera&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rozważny-świadomy:&lt;/strong&gt; &amp;quot;Musimy wypuścić teraz i poradzić sobie z konsekwencjami.&amp;quot; Zespół wie, co upraszcza, i ma plan spłaty. To jest dług w sensie Cunninghama — i to jest jedyny dług, który warto świadomie zaciągać.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lekkomyślny-świadomy:&lt;/strong&gt; &amp;quot;Nie mamy czasu na projektowanie.&amp;quot; Zespół wie, że robi źle, ale i tak to robi. Planu spłaty brak. To nie jest dług — to niechlujstwo z premedytacją. Używanie słowa &amp;quot;dług&amp;quot; to tu eufemizm, który ułatwia życie z tym faktem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rozważny-nieświadomy:&lt;/strong&gt; &amp;quot;Teraz wiemy, jak powinniśmy byli to zrobić.&amp;quot; Zespół nauczył się czegoś nowego — o domenie, o wzorcach, o architekturze — i widzi, że wcześniejszy kod, choć pisany w dobrej wierze, nie pasuje do aktualnego rozumienia. Nieunikniony koszt uczenia się. Każdy system to ma.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lekkomyślny-nieświadomy:&lt;/strong&gt; &amp;quot;Co to jest warstwowanie?&amp;quot; Zespół nie wie, że robi źle, bo nie zna dobrych praktyk. To nie jest dług — to brak kompetencji. Leczy się edukacją i mentoringiem, nie &amp;quot;spłatą.&amp;quot;&lt;/p&gt;
&lt;h2&gt;A potem przyszło AI&lt;/h2&gt;
&lt;p&gt;Odnoszę wrażenie, że era agentów AI komplikuje każdy z tych kwadrantów na nowe sposoby.&lt;/p&gt;
&lt;p&gt;Agent generujący kod nie przechodzi przez fazę uczenia się domeny, nie buduje stopniowo intuicji o tym, dlaczego klient robi coś w określony sposób. Produkuje kod, który formalnie spełnia wymagania — ale nie niesie w sobie pełnego zrozumienia domeny, które Cunningham uważał za sedno świadomego kompromisu. Dług rozważny-nieświadomy pojawia się natychmiast, bo kod od pierwszego dnia odzwierciedla powierzchowne zrozumienie problemu.&lt;/p&gt;
&lt;p&gt;Dług lekkomyślny-świadomy — &amp;quot;nie mamy czasu na projektowanie&amp;quot; — nabiera nowego wymiaru, gdy generowanie kodu jest natychmiastowe. Skoro &amp;quot;wystarczy poprosić agenta,&amp;quot; pokus żeby nie inwestować w architekturę jest więcej niż kiedykolwiek. Mam wrażenie, że właśnie to obserwujemy — nikt nie planuje architektonicznych kompromisów, bo kompromis implikuje, że w ogóle myślisz o architekturze.&lt;/p&gt;
&lt;p&gt;A dług lekkomyślny-nieświadomy? Tutaj AI tworzy dynamikę, której wcześniej nie było. Osoba, która nie rozumie wzorców projektowych, dostaje narzędzie generujące kod wyglądający profesjonalnie — ale nie potrafi ocenić, czy ten kod jest dobry. Agent reprodukuje wzorce z repozytorium ze stuprocentową konsekwencją, bez momentu refleksji. Jeśli repozytorium jest pełne rozbitych okien, agent uzna to za normę i dołoży kolejne.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/blog/kwadrant-ai.svg&quot; alt=&quot;Jak AI zmienia każdy kwadrant długu&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Dlaczego warto o tym mówić precyzyjnie&lt;/h2&gt;
&lt;p&gt;McKinsey szacuje, że dług techniczny stanowi ok. 40% bilansów IT &lt;a href=&quot;https://www.mckinsey.com/capabilities/mckinsey-digital/our-insights/tech-debt-reclaiming-tech-equity&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[4]&lt;/a&gt;. Besker, Martini i Bosch policzyli, że 25% wysiłku deweloperskiego jest marnowane na problemy wynikające z długu technicznego &lt;a href=&quot;https://www.researchgate.net/publication/325790190&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[5]&lt;/a&gt;. Jedna czwarta czasu zespołu — nie na budowanie nowych rzeczy, ale na poruszanie się po labiryncie złożoności, którą sami stworzyliśmy.&lt;/p&gt;
&lt;p&gt;W erze, w której kod powstaje szybciej niż kiedykolwiek, te liczby mogą tylko rosnąć. Chyba że zaczniemy używać języka, który Cunningham i Fowler nam dali — nie jako akademickiej ciekawostki, ale jako codziennego narzędzia. Kiedy w dyskusji padnie &amp;quot;mamy za dużo długu technicznego,&amp;quot; prawidłowa odpowiedź to nie &amp;quot;zaplanujmy sprint na refaktoring.&amp;quot;; prawidłowa odpowiedź to: &amp;quot;Co to za dług? Czy go planowaliśmy? Czy mamy po prostu bałagan?&amp;quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;Linki do źródeł:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://c2.com/doc/oopsla92.html&quot;&gt;[1] Ward Cunningham, &amp;quot;The WyCash Portfolio Management System&amp;quot;, OOPSLA 1992&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=pqeJFYwnkjE&quot;&gt;[2] Ward Cunningham, &amp;quot;Debt Metaphor&amp;quot; (video, 2009)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://martinfowler.com/bliki/TechnicalDebtQuadrant.html&quot;&gt;[3] Martin Fowler, &amp;quot;Technical Debt Quadrant&amp;quot; (2009)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mckinsey.com/capabilities/mckinsey-digital/our-insights/tech-debt-reclaiming-tech-equity&quot;&gt;[4] McKinsey, &amp;quot;Tech Debt: Reclaiming Tech Equity&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.researchgate.net/publication/325790190&quot;&gt;[5] Besker, Martini, Bosch, &amp;quot;Technical Debt Cripples Software Developer Productivity&amp;quot; (2018)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Co jeśli AI nie zmienił zasad gry, tylko po prostu ją przyspieszył?</title>
    <link href="https://miedzykodem.dev/blog/ai-nie-zmienil-zasad" rel="alternate" type="text/html"/>
    <id>https://miedzykodem.dev/blog/ai-nie-zmienil-zasad</id>
    <published>2026-02-26T00:00:00.000Z</published>
    <updated>2026-02-26T00:00:00.000Z</updated>
    <author><name>Jakub Ciszak</name></author>
    <summary>Boehm pokazał dekady temu, że koszt zmiany rośnie wykładniczo wraz z fazą projektu 1. Fowler dokumentował, jak architektura rozpada się wtedy, kiedy nie patrzysz — powoli, niezauważalnie, jak rzeka po...</summary>
    <content type="html">&lt;p&gt;Boehm pokazał dekady temu, że koszt zmiany rośnie wykładniczo wraz z fazą projektu &lt;a href=&quot;https://www.academia.edu/108567971/B_W_Boehm_software_engineering_economi&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[1]&lt;/a&gt;. Fowler dokumentował, jak architektura rozpada się wtedy, kiedy nie patrzysz — powoli, niezauważalnie, jak rzeka podmywająca brzeg &lt;a href=&quot;https://martinfowler.com/articles/is-quality-worth-cost.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[2]&lt;/a&gt;. Wardley rysował mapy ewolucji komponentów od eksperymentu Pioniera przez dojrzały Produkt do Commodity &lt;a href=&quot;https://learnwardleymapping.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;footnote-ref&quot;&gt;[3]&lt;/a&gt;. Każdy z nich mówił coś innego, ale wszyscy wskazywali na jedno: ewolucja jest nieuchronna. Pytanie tylko, czy będziesz ją prowadzić świadomie.&lt;/p&gt;
&lt;p&gt;Dziś obserwujemy coś niepokojącego. Większość deweloperów korzystających z AI staje się, mimowolnie, Pionierami w rozumieniu Wardleya — budujemy custom rozwiązania do problemów, które mają już produktowe odpowiedzi, bo AI generuje kod szybciej, niż zdążymy zapytać: &amp;quot;czy to już gdzieś istnieje?&amp;quot;&lt;/p&gt;
&lt;p&gt;Na mapie Wardleya powinniśmy operować w strefie Product albo Commodity, a zachowujemy się jak startup w trybie permanentnego Genesis.&lt;/p&gt;
&lt;p&gt;Mam też nieodparte wrażenie, że systemy przestają przechodzić przez fazę ewolucji. Normalny cykl życia to intensywny rozwój, potem refaktoring i dojrzewanie, potem stabilne utrzymanie. Projekty pisane przez agentów dojrzewają inaczej: intensywny rozwój, a zaraz po nim utrzymanie. Faza ewolucji znika — nie dlatego, że rozwiązaliśmy problem długu technicznego, ale dlatego, że kod narasta tak szybko, że nie ma kiedy go pielęgnować. System trafia na OIOM zanim skończy pierwsze urodziny.&lt;/p&gt;
&lt;p&gt;Pytanie nie brzmi &amp;quot;czy używać AI&amp;quot;. Brzmi: czy budujemy odpowiednią kulturę i procesy, które pomogą nam chronić się przed zagrożeniami, przed którymi, już dawno, przestrzegali nas mądrzy ludzie? Tempo w jakim powstają nowe funkcjonalności jest imponujące, ale tempo w jakim systemy erodują jest przerażające.&lt;/p&gt;
&lt;p&gt;(Tak, używam długich pauz &amp;quot;—&amp;quot;, bo robiłem to jeszcze przed LLMami)&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;Linki do źródeł:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.academia.edu/108567971/B_W_Boehm_software_engineering_economi&quot;&gt;[1] Barry Boehm, &amp;quot;Software Engineering Economics&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://martinfowler.com/articles/is-quality-worth-cost.html&quot;&gt;[2] Martin Fowler, &amp;quot;Is High Quality Software Worth the Cost?&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learnwardleymapping.com&quot;&gt;[3] Simon Wardley, &amp;quot;Wardley Maps&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
</feed>
