Zacznij tutaj
Cześć! Jest nam niezmiernie miło, że dołączyłeś do programu Legacy Fighter, a to gdzie się teraz znajdujesz to baza wiedzy z całego szkolenia. Dzięki niej będziesz w stanie w łatwy sposób znaleźć informacje, które Cię interesują. Zarówno tutaj w formie pisanej, jak i linki do konkretnych lekcji video, czy innych dodatkowych materiałów.
Zacznijmy od kilku najważniejszych informacji na temat samego programu.
Informacje ogólne na temat programu
Kod
Drugą ważną informacją jest to, że specjalnie na potrzeby programu Legacy Fighter przygotowaliśmy bardzo dużo kodu. Jest to system, który napisaliśmy, na podstawie naszych doświadczeń, z różnymi projektami doradczymi. Właściwie jest to zbiór problemów, z jakimi przyszło nam się mierzyć, a które chcieliśmy Ci przedstawić. Dlatego też system może nie być gotowy do wdrożenia, bo jest to materiał dydaktyczny, który zawiera te błędy. Niektóre z nich powstały celowo, niektóre zapewne przypadkowo ;)
Obecnie wspieramy trzy języki, a poniżej znajdują się linki do odpowiednich repozytoriów:
Naszą aplikację naprawiamy problem, po problemie — nie wszystko na raz. Dlatego często będziesz widzieć kod, który prawdopodobnie będzie Cię bolał, a mimo to nie naprawimy go, natomiast wytłumaczymy, dlaczego w tym momencie jeszcze go zostawiamy.
Poziomy trudności
Pracując z legacy mamy do czynienia z problemami o różnym poziomie trudności: łatwe, średnie, trudne. Dlatego też postanowiliśmy w naszym szkoleniu zastosować ten podział do materiałów. Na planszy tytułowej każdej z lekcji, znajduje się informacja, jakiego poziomu trudności można się spodziewać:

Dzięki temu przez szkolenie można przechodzić kilka razy wraz z nabieraniem doświadczenia w systemach o trudniejszej problematyce. Szkolenie może być Twoim towarzyszem na ścieżce ulepszania kolejnych spotkanych systemów, a wiedza ta procentuje też przy modelowaniu i implementacji zupełnie nowych projektów.
Lekcje
W celach dydaktycznych postawiliśmy na ich zróżnicowanie. Możesz spodziewać się dyskusji, slajdów, rysunków, czy live codingów. W kwestii tych ostatnich są to tak zwane live codingi komentowane, w których z racji na rozmiar naszego problemu, skupiamy się na esencji danego zagadnienia. Często więc zobaczysz pierwsze działania refaktoryzacyjne i instrukcje co należałoby wykonać w dalszej kolejności. Natomiast wszystkie zmiany (commity) można zobaczyć w poszczególnych repozytoriach, zarówno w Javie, w PHP, jak i w C#.
Pod koniec poszczególnych odcinków znajdują się plansze, gdzie możesz zobaczyć Git tagi, aby trafić we właściwe miejsca w poszczególnych repozytoriach:

Ponadto tutaj w dokumentacji, przy każdym z livecodingów również będzie znajdowała się komenda, która pozwoli Ci na ściągnięcie opisywanych zmian, dzięki czemu łatwe będzie wykonanie diffa.
Materiały dodatkowe
Oprócz transkrypcji, czy wersji mp3 odcinka, często dostępne są dodatkowe linki na przykład do PDFów, w których
znajdziesz wizualizację mapy, różnego rodzaju diagramy uzupełniające narrację szkoleniową, przez co stanowią doskonałe
tło do materiałów, które omawiamy w czasie danej lekcji:

Ponadto, w większości modułów znajduje się dedykowana lekcja ze wszystkimi materiałami dodatkowymi danego modułu:

Czym jest system klasy legacy?
Istnieje wiele definicji:
- odziedziczony kawałek kodu
- system, który posiadający wiele niezrozumiałych miejsc i powiązań. Zmiana powoduje kaskadowe problemy w innych odległych elementach systemu.
- system, który nie ma dobrze zbudowanych testów automatycznych (Michael C. Feathers)
Według nas druga definicja implikuje trzecią, ponieważ system z wieloma powiązaniami jest ciężki do zrozumienia, a tym samym ciężki do przetestowania. Dlatego na potrzeby tego szkolenia ustalmy, że: system legacy to system o długim cyklu życia, z wieloma powiązaniami, które powodują jego kruchość i niską testowalność.
Systemy określane mianem "legacy" to chleb powszedni w branży IT. Skoro tu jesteś, to jest wielce prawdopodobne, że taki system obecnie utrzymujesz albo zdarzyło Ci się to w przeszłości. Jeśli nie, to jest spora szansa, że spotkasz się z nim w przyszłości. Systemy legacy utrzymują ogromne przedsiębiorstwa i zarabiają na nasze pensje, ale — owiane są też złą sławą. Polega ona na rzekomej frustracji wynikającej z pracy w takim systemie — albo — na niemożności rozwijania swojego programistycznego rzemiosła. To nie do końca jest prawdą, a szkolenie Legacy Fighter powstało właśnie po to, żeby Ci to udowodnić. Dzielimy się z Tobą naszymi technikami pracy z systemami klasy legacy. Techniki te powstały jako destylat kilkunastu lat doświadczeń z systemami z różnych domen i w różnych krajach. Wierzymy, że sprawdzą się także w Twoim systemie.
Spotkaliśmy się również z wieloma projektami, które z założenia miały trwać trzy miesiące, obsłużyć kampanię reklamową i zostać wyrzucone. Nie wszystkie z nich miały testy. Co więcej, część, ich w ogóle nie potrzebowała. Systemów takich nie będziemy tu nazywać systemami legacy, ponieważ nikt ich nie odziedziczył, zostały wyrzucone.
Domena projektu szkoleniowego
Projekt jest przykładem prawdziwego systemu legacy, stworzonym na podstawie naszych doświadczeń. Posiada bogatą historię i często niezrozumiałą strukturę kodu — taką, jak pewnie widzisz w systemie w swojej pracy. Projekt nazywa się Cabs (linki do repozytoriów w sekcji "Kod") i jest to realizacja domeny taksówkarskiej z funkcjami typu:
- zamawianie auta,
- szukanie odpowiedniego kierowcy,
- rejestracja kierowców,
- obliczanie cen przejazdów,
- składanie skarg,
- wiele innych.
System ten zapewne nie mógłby z dnia na dzień zastąpić rozwiązania przodującego dostawcy usług na rynku. Brakuje w nim kilku funkcji, ale z pewnością może posłużyć jako doskonały materiał dydaktyczny.
"Metaproblemy"
System, nad którym aktualnie pracujesz, może wspierać zupełnie inny biznes. Nie ma to jednak znaczenia, ponieważ dokonując refaktoryzacji i audytów dziesiątek systemów w różnych technologiach, w różnych krajach i w różnych domenach, dokonaliśmy analizy i zauważyliśmy pewne prawidłowości. Niektóre problemy powtarzają się w każdym systemie. Mogą być przykryte narracją unikalną dla specyficznego biznesu, ale na metapoziomie są bardzo podobne. Niezależne od domeny i technologii. Zapewne Twój system nie jest dotknięty nimi wszystkimi oraz nie odkryjemy jego wszystkich bolączek, jednak śmiało możemy powiedzieć, że część wspólna problemów Twojego systemu i systemu Cabs jest całkiem spora. Pracując na szkoleniowym problemie, można nauczyć się zauważać metaproblemy, szacować ich konsekwencję i proponować rozwiązania. Taka wiedza jest w pełni transferowalna do dowolnego systemu klasy legacy.
Zakres problemów
Zakres problemów w systemie legacy może być dość szeroki. Naprawienie, niektórych z nich nie wymaga zmiany setek plików źródłowych. Nieraz, cały system posiada tylko tego typu, stosunkowo łatwo rozwiązywalne, problemy. Można je znaleźć w katalogu "brzydkich zapachów" kodu, czyli tzw. code smells. Refaktoryzacją tego typu bolączek też się tutaj zajmujemy.
Z naszego doświadczenia wynika jednak, że to nie brak stosowania wzorców w postaci Extract Method, czy rzadkie upraszczanie instrukcji warunkowych zabija projekty w naszej branży i powoduje, że zespół chce się ewakuować. Są to nadal rzeczy ważne, które warto, a wręcz powinno się stosować. Niemniej jednak nie naprawiają one tych systemów, których bazowy model biznesowy jest niedopasowany do rzeczywistości, albo był dopasowany, ale nie nadążył za szybkimi zmianami biznesowymi dyktowanymi rynkiem.
Modelem nazywamy uproszczoną konstrukcję, która reprezentuje nam faktyczne działanie biznesu. Zły model, złe granice obiektów, zła modularyzacja, czy naiwna reprezentacja biznesu w kodzie — to są szersze problemy, które, powodują degradację projektu i nadanie mu etykiety legacy. To właśnie na tego typu problemy kładziemy mocny nacisk w Legacy Fighter. Są to problemy wykraczające poza mechaniczne transformaty poprawiające wspomniane zapachy kodu.
Refactoring mechaniczny i strategiczny
Struktura tego szkolenia kategoryzuje powtarzające się problemy pod względem nakładu pracy, jaki zwykle poświęca się na ich rozwiązanie (patrz też: poziomy trudności):
- niski nakład pracy: długie metody, czy kaskady instrukcji warunkowych. Tego typu zmiany nazywamy tu refaktoryzacją mechaniczną, gdzie naprawiamy kod. Często to samo środowisko programistyczne podpowiada nam konkretne rozwiązania.
- średni nakład pracy: złe granice obiektów, które powodują problemy ze spójnością, czytelnością lub wydajnością.
- duży nakład pracy, czyli refaktoryzacja strategiczna. Zmienia ona reguły gry naszego systemu, co często wiąże się ze zmianą modelu oprogramowania o 180 stopni. To jak wymiana silnika w lecącym samolocie — naprawia granice architektoniczne lub bazowy model, na którym oparta jest lwia część oprogramowania.

Aspekty miękkie
Na koniec jeszcze jedna bardzo ważna informacja, otóż oprócz problemów technicznych, w Legacy Fighter poruszamy aspekty miękkie. Przykładowo: jak rozmawiać z biznesem o refaktoryzacji, czy jak dokonywać marketingu swoich pomysłów. Opowiada o tym Sławek Sobótka w dedykowanym bloku szkoleniowym, a podsumowanie w formie pisemnej znajdziesz tutaj.
O prowadzących
Szkolenie prowadzimy, korzystając z naszych doświadczeń i przepracowanych problemów w odmiennych technologiach.
Mariusz Gil

Związany z branżą IT od ponad dwóch dekad. Pracował m.in. dla Naszej-Klasy, Gadu-Gadu, Adv.pl i jako konsultant w zakresie tematyki skalowalności i wydajności aplikacji internetowych. Interesuje się m.in. zagadnieniami związanymi z budową skalowalnych i wydajnych rozwiązań webowych, zarówno od strony architektury aplikacji, jak i infrastruktury serwerowej.
Prowadzi podcast Better Software Design o architekturze oprogramowania.
Jakub Pilimon

Jeden z Mentorów w bestsellerowym Programie Droga Nowoczesnego Architekta. Principal Technologist w Pivotalu i trener w Bottega IT Minds. Entuzjasta Domain Driven Design, fanatyk testów jednostkowych oraz ewolucyjnej architektury oraz Event Stormingu. Wygłaszał przemówienia na licznych konferencjach programistycznych, prowadzi też własne szkolenia. Wyciąga na prostą projekty pozornie skazane na rewrite (lub tragiczną śmierć).
Po pracy oddaje się swoim dwóm pasom: kitesurfingowi oraz motocyklom.
Sławomir Sobótka

Właściciel firmy szkoleniowo-doradczej Bottega IT Minds, zrzeszającej 60 ekspertów technicznych.
Równolegle: inwestor i CTO kilku startupów: Cortivision (obrazowanie pracy mózgu i sceny VR dla dzieci z deficytami uwagi), Augmented Neural Systems (sceny VR wspomagające system hormonalno-odpornościowy w walce z rakiem), Augmented Reality Training Systems (rzeczywistość dopełniona w treningach jednostek specjalnych) oraz Devskiller (automatyzacja rekrutacji i zarządzanie kompetencjami w organizacjach IT).
Hobbystycznie interesuje się psychologią pozytywną i kognitywistyką.
Maciej Aniserowicz

Wydawca i koordynator projektu Legacy Fighter.
Autor bloga devstyle.pl, książki "Zawód: Programista" i podcastu DevTalk. Wydaje premium programy edukacyjne dla polskiej branży IT (Droga Nowoczesnego Architekta, Architektura na Froncie, SmartTesting, DBMaster, Co Ten Frontend, Kurs Gita).
Jest wielkim zwolennikiem podejścia Continuous Refactoringu. Wierzy, że dzięki włączaniu refactoringu do codziennej pracy programistów, może ona stać się łatwiejsza.