[jug, pl] strategiczna refaktoryzacja
DESCRIPTION
Techniki, czyli przekształcenia refaktoryzacyjne pomagają transformować fragmenty kodu z jednej postaci w inną. Jednak duże refaktoryzacje to przede wszystkim przedsięwzięcie organizacyjne. Co warto refaktoryzować? Jak zidentyfikować kluczowe problemy? Kiedy nie podejmować działań? Czy w ogóle warto? Jakie heurystyki i strategie wysokopoziomowe możesz wykorzystać? Odpowiedzi na te pytania poznasz podczas prelekcji Strategiczna refaktoryzacja.TRANSCRIPT
www.bnsit.pl
Strategiczna refaktoryzacjaMichał BartyzelMariusz Sieraczkiewicz
www.bnsit.pl
To przede wszystkim wyzwanie
organizacyjne, a w następnej kolejności techniczne
Po pierwsze zatrzymaj dalsze psucie,
po drugie naprawiaj
Strategiczna refaktoryzacja
www.bnsit.pl
# refactoring.com, refactoring to the patterns, clean code
Przekształcenia kodu to za mało
Strategiczna refaktoryzacja 3
www.bnsit.pl
MegaSoftwareCraftshmanshipper
Strategiczna refaktoryzacja 4
http://pl.creepypasta.wikia.com/wiki/Plik:Kibole.jpeg
www.bnsit.pl
Rodzaje refaktoryzacji
Strategiczna refaktoryzacja 5
www.bnsit.pl
# Zidentyfikuj obszary refaktoryzacji• ARCHITECTURE ORIGIN• PROBLEM/BENEFITS/SOLUTIONS• ROOT CAUSE ANALYSIS• ARCHITECTURAL MANTRA• COMPLEXITY ANALYSIS• FEATHER’S QUADRANT• TRIBE KNOWLEDGE
# Zatrzymaj degradację kodu• ORDERING• REFACTORYOUR ORGANIZATION• EXTRACT RESPONSIBILITY OBJECT• WORKAROUNDS• BRANCH BY ABSTRACTION• FEATURE PORTING• ANTICORRUPTION LAYER• BUBBLES
# Utrzymuj architekturę przy życiu• ARCHITECTURE EVOLUTION• NATURAL COURSE OF REFACTORING
Techniki
Strategiczna refaktoryzacja 6
www.bnsit.pl
Kto to napisał?
Kiedy to napisał?
Czym się kierował?
Jakie miał doświadczenie?
W jakich warunkach działał?
Ile miał czasu?
Kto go rozliczał?
Kontekst powstania tego kodu
Strategiczna refaktoryzacja 7
www.bnsit.pl
Ćwiczenie
Strategiczna refaktoryzacja 8
www.bnsit.pl
Problemy Korzyści
Mapa problemy/korzyści/rozwiązanie
Strategiczna refaktoryzacja 9
Co mówią programiści, architekci?
Rozwiązanie
www.bnsit.pl
Nie możemy zmieniać GUINie możemy wyjść z hosta serwującego aplikacjęNie jesteśmy w stanie pracować w stylu klient-serwerMonolityczny kod, wielki modelBrak możliwości selektywnego wyciągania danych. Zawsze trzeba to robić programistycznie
Logika niezależna od GUIRóżne kanały dostępu do logiki: web, iPad, client-severLogika niezależna od GUIRóżne kanały dostępu do logiki: web, iPad, client-sever
Chcemy budować złożone, przekrojowe zapytania o dane
Strategiczna refaktoryzacja 10
www.bnsit.pl
Nie możemy zmieniać GUINie możemy wyjść z hosta serwującego aplikacjęNie jesteśmy w stanie pracować w stylu klient-serwerMonolityczny kod, wielki modelBrak możliwości selektywnego wyciągania danych. Zawsze trzeba to robić programistycznie
Logika niezależna od GUIRóżne kanały dostępu do logiki: web, telefon, client-severRóżne kanały dostępu do logiki: web, telefon, client-sever
Chcemy budować złożone, przekrojowe zapytania o dane
Strategiczna refaktoryzacja 11
www.bnsit.pl
# BRAK WSPÓLNYCH ZASAD ODNOŚNIE ARCHITEKTURY
# BRAK WSPÓLNYCH ZASAD ODNOŚNIE MECHANIZMÓW
W SYSTEMIE:
• jak/gdzie walidować;
• jak/gdzie autoryzować;
• utilsy;
# SKOMPLIKOWANY PROCES PRACY Z REPOZYTORIUM –WIELE ŚRODOWISK, DUŻO MERGE’OWANIA
Analiza – identyfikacja problemów
Strategiczna refaktoryzacja 12
www.bnsit.pl
# BRAK WSPÓLNYCH ZASAD CZYTELNOŚCI KODU ORAZ
BRAK ICH KODYFIKACJI;
# BRAK PODZIAŁU NA MODUŁY NA POZIOMIE
REPOZYTORIUM – podział techniczny a nie dziedzinowy
# BRAK PROCESU WYMIANY WIEDZY O ARCHITEKTURZE
Analiza – identyfikacja problemów
Strategiczna refaktoryzacja 13
www.bnsit.pl
Root Cause Analysis
Strategiczna refaktoryzacja 14
www.bnsit.pl
Mantra architektoniczna – bloki budujące
Strategiczna refaktoryzacja 15
www.bnsit.pl
Mantra architektoniczna – model i kontekst
Strategiczna refaktoryzacja 16
www.bnsit.pl
Jak powinno być? Co się powinno dziać?
1. Przyjmuje request
2. Dokonuje złożonej walidacji
3. Składa dane do wywołania serwisu
4. Wywołuje serwis
5. Wynik pakuje w JSONa
6. Określa kolejny widok
Czego nie powinno być?# Prostej walidacji (gdyż do tego
celu wykorzystujemy frameworkwebowy)
# Złożonego przetwarzania JSONa(z serwisu nie powinien przychodzić JSON)
# Logiki dziedzinowej np. decydowanie na podstawie danych czy zlecenie ma być wykonane
Blok budujący – View controller
Strategiczna refaktoryzacja 17
www.bnsit.pl
Przeanalizuj metryki kodu
Strategiczna refaktoryzacja 18
www.bnsit.pl
Wysoka złożoność/rzadkie
zmianyKod którego nie
ruszamy
Wysoka złożoność/częste
zmianyTu
refaktoryzujemy
Niska złożoność/rzadkie
zmianyUtilsy, dobre do eksperymentów
Niska złożoność/częste
zmianyHeaven
Co refaktoryzować? Kwadrant Feathersa
Strategiczna refaktoryzacja 19
Dodatkowo:• wiedza
plemienna• prognozy
biznesu
Częstość zmian
Złożoność
www.bnsit.pl
Repozytorium i wiedza plemienna
# Co warto wziąć pod uwagę?• najczęściej zmieniające się fragmenty
• fragmenty, na które raportowanych jest najwięcej błędów
• fragmenty, z którymi programiści mają najwięcej problemów
• fragmenty najmniej/najbardziej pokryte testami
# Czy więcej pracujemy w infrastrukturze czy w dziedzinie?
# Gdzie są duże pliki?
Wiedza plemienna
Strategiczna refaktoryzacja 20
www.bnsit.pl
Zatrzymaj degradację kodu
www.bnsit.pl
# Koncepcje wysokiego poziomu są trudne
# Do kiepskiego kodu ludzie się przyzwyczajają
# Kłopot sprawia brak wiedzy biznesowej
Uporządkowanie wystarcza# Nie za dużo kodu w jednym miejscu
# Nie za dużo powiązań między klasami
# Brak cyklicznych powiązań na wyższym poziomie
Kilka kontrowersyjnych wniosków
Strategiczna refaktoryzacja 22
www.bnsit.pl Strategiczna refaktoryzacja 23
Promień Schwarzschilda
www.bnsit.pl
# Zespoły deweloperskie
# Zespoły testerów
# Zespołu utrzymania
# Zaangażowanie biznesu
# Realność terminów
# Obsługa zmian w wymaganiach
Czemu przyjrzeć się na poziomie organizacyjnym?
Strategiczna refaktoryzacja 24
www.bnsit.pl
Zespół ds. Trudnych i Beznadziejnych
Strategiczna refaktoryzacja 25
www.bnsit.pl
if ( param == 4 ) { //workaround, do not touch!
position.setX( position.getX() + 1 );
}
Refaktoryzacja sposobu myślenia
Strategiczna refaktoryzacja 26
www.bnsit.pl
public InvalidCartesianXPatch extends Position {
private Position patchedPosition ;
public InvalidCartesianXPatch( Position patchedPosition ) {
this.patchedPosition = patchedPosition;
}
@Override
public int getX() {
return param == 4 ? patchedPosition.getX() + 1 : patchedPosition.getX();
}
}
Nazwij problem inaczej - Patch
Strategiczna refaktoryzacja 27
www.bnsit.pl
public Position {
// nowi klienci
public static Position createPosition(int x, int y) {
return new InvalidCartesianXPatch( new Position(x, y) );
}
@Deprecated
public Position(int x, int y) {
//...
}
@Deprecated
public Position( ... ) { }
}
Dostosuj oryginał
Strategiczna refaktoryzacja 28
www.bnsit.pl
Branch by Abstraction
Strategiczna refaktoryzacja 29
www.bnsit.pl
# Segregujemy metody z pomiędzy interfejsy
# Skupiamy się, na zatrzymaniu powstawania nowych zależności
Branch by Abstraction
Strategiczna refaktoryzacja 30
www.bnsit.pl
Feature Porting
Strategiczna refaktoryzacja 31
www.bnsit.pl Strategiczna refaktoryzacja 32
www.bnsit.pl Strategiczna refaktoryzacja 33
http://mbartyzel.blogspot.com/2014/03/presentation-layer-under-control.html
www.bnsit.pl
A może nie refaktoryzować?
Strategiczna refaktoryzacja 34
www.bnsit.pl
# Core domain – to co jest ściśle związane ze strategią firmy
# Support domain – wspiera główną dziedzinę, ale bezpośrednio nie należy do niej
# Generic domain – powszechnie występujące dziedziny
Dziedziny
Strategiczna refaktoryzacja 35
www.bnsit.pl
Anticoruption Layer
Strategiczna refaktoryzacja 36
www.bnsit.pl Strategiczna refaktoryzacja 37
Strategia Bubble Context
www.bnsit.pl
Open Host Serivce
Strategiczna refaktoryzacja 38
www.bnsit.pl
Zarządzanie ewolucją architektury
www.bnsit.pl
Proces ewolucji architektury
Strategiczna refaktoryzacja 40
Proces rozwoju architektury
Strategiczna refaktoryzacja 41
Wiki
Strategiczna refaktoryzacja 42
Bugtracker
Strategiczna refaktoryzacja 43
Strategiczna refaktoryzacja 44
http://www.infoq.com/articles/natural-course-refactoring
Strategiczna refaktoryzacja 45
Everyday refactoring
Strategic refactoring
www.bnsit.pl
Strategiczna refaktoryzacjaMichał BartyzelMariusz Sieraczkiewicz