JDD2014: Co Twój kod mówi do Ciebie - Mariusz Sieraczkiewicz
JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel
description
Transcript of JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel
www.bnsit.pl
Strategiczna refaktoryzacja Michał Bartyzel Mariusz 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ć GUI Nie możemy wyjść z hosta serwującego aplikację Nie jesteśmy w stanie pracować w stylu klient-serwer Monolityczny kod, wielki model Brak możliwości selektywnego wyciągania danych. Zawsze trzeba to robić programistycznie
Logika niezależna od GUI Różne kanały dostępu do logiki: web, iPad, client-sever Logika niezależna od GUI Róż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ć GUI Nie możemy wyjść z hosta serwującego aplikację Nie jesteśmy w stanie pracować w stylu klient-serwer Monolityczny kod, wielki model Brak możliwości selektywnego wyciągania danych. Zawsze trzeba to robić programistycznie
Logika niezależna od GUI Różne kanały dostępu do logiki: web, telefon, client-sever Róż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 framework webowy)
# 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
zmiany Kod którego nie
ruszamy
Wysoka złożoność/częste
zmiany Tu
refaktoryzujemy
Niska złożoność/rzadkie
zmiany Utilsy, dobre do eksperymentów
Niska złożoność/częste
zmiany Heaven
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?
# Czy pliki z commitów są rozsiane po całym repozytorium?
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
# Segregujemy metody z pomiędzy interfejsy
# Skupiamy się, na zatrzymaniu powstawania nowych zależności
Extract Responsibility Interface/Object
Strategiczna refaktoryzacja 26
www.bnsit.pl
if ( param == 4 ) { //workaround, do not touch!
position.setX( position.getX() + 1 );
}
Refaktoryzacja sposobu myślenia
Strategiczna refaktoryzacja 27
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 28
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 29
www.bnsit.pl
Branch by Abstraction
Strategiczna refaktoryzacja 30
www.bnsit.pl
Feature Porting
Strategiczna refaktoryzacja 31
www.bnsit.pl
A może nie refaktoryzować?
Strategiczna refaktoryzacja 32
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 33
www.bnsit.pl
Anticoruption Layer
Strategiczna refaktoryzacja 34
www.bnsit.pl Strategiczna refaktoryzacja 35
Strategia Bubble Context
www.bnsit.pl
Open Host Serivce
Strategiczna refaktoryzacja 36
www.bnsit.pl
Zarządzanie ewolucją architektury
www.bnsit.pl
Proces ewolucji architektury
Strategiczna refaktoryzacja 38
Proces rozwoju architektury
Strategiczna refaktoryzacja 39
Wiki
Strategiczna refaktoryzacja 40
Bugtracker
Strategiczna refaktoryzacja 41
Strategiczna refaktoryzacja 42
Everyday refactoring
Strategic refactoring
www.bnsit.pl
Strategiczna refaktoryzacja Michał Bartyzel Mariusz Sieraczkiewicz