SlideShare a Scribd company logo
1 of 46
Strategiczna refaktoryzacja 
Michał Bartyzel 
Mariusz Sieraczkiewicz 
www.bnsit.pl
www.bnsit.pl 
Strategiczna refaktoryzacja 
To przede wszystkim wyzwanie 
organizacyjne, a w następnej kolejności 
techniczne 
Po pierwsze zatrzymaj dalsze psucie, 
po drugie naprawiaj
# refactoring.com, refactoring to the patterns, clean code 
www.bnsit.pl 
Przekształcenia kodu to za mało 
Strategiczna refaktoryzacja 3
www.bnsit.pl 
MegaSoftwareCraftshmanshipper 
http://pl.creepypasta.wikia.com/wiki/Plik:Kibole.jpeg 
Strategiczna refaktoryzacja 4
www.bnsit.pl 
Rodzaje refaktoryzacji 
Strategiczna refaktoryzacja 5
Techniki 
# Zidentyfikuj obszary refaktoryzacji 
www.bnsit.pl 
• 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 
Strategiczna refaktoryzacja 6
www.bnsit.pl 
Kontekst powstania tego kodu 
Kto to napisał? 
Kiedy to napisał? 
Czym się kierował? 
Jakie miał doświadczenie? 
W jakich warunkach działał? 
Ile miał czasu? 
Kto go rozliczał? 
Strategiczna refaktoryzacja 7
www.bnsit.pl 
Ćwiczenie 
Strategiczna refaktoryzacja 8
www.bnsit.pl 
Mapa problemy/korzyści/rozwiązanie 
Rozwiązanie 
Problemy Korzyści 
Co mówią programiści, 
architekci? 
Strategiczna refaktoryzacja 9
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 
www.bnsit.pl 
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
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 
www.bnsit.pl 
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
Analiza – identyfikacja problemów 
# 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 – 
www.bnsit.pl 
WIELE ŚRODOWISK, DUŻO MERGE’OWANIA 
Strategiczna refaktoryzacja 12
# 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 
www.bnsit.pl 
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
Blok budujący – View controller 
Jak powinno być? Co się 
powinno dziać? 
1. Przyjmuje request 
2. Dokonuje złożonej 
www.bnsit.pl 
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 
Strategiczna refaktoryzacja 17
www.bnsit.pl 
Przeanalizuj metryki kodu 
Strategiczna refaktoryzacja 18
www.bnsit.pl 
Co refaktoryzować? Kwadrant Feathersa 
Wysoka 
złożoność/rzadkie 
zmiany 
Kod którego nie 
ruszamy 
Złożoność 
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 
Dodatkowo: 
• wiedza 
plemienna 
• prognozy 
biznesu 
Częstość zmian 
Strategiczna refaktoryzacja 19
Wiedza plemienna 
Repozytorium i wiedza plemienna 
# Co warto wziąć pod uwagę? 
www.bnsit.pl 
• 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? 
Strategiczna refaktoryzacja 20
www.bnsit.pl 
Zatrzymaj degradację kodu
# 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 
www.bnsit.pl 
Kilka kontrowersyjnych wniosków 
Strategiczna refaktoryzacja 22
Promień Schwarzschilda 
www.bnsit.pl Strategiczna refaktoryzacja 23
# Zespoły deweloperskie 
# Zespoły testerów 
# Zespołu utrzymania 
# Zaangażowanie biznesu 
# Realność terminów 
# Obsługa zmian w wymaganiach 
www.bnsit.pl 
Czemu przyjrzeć się na poziomie organizacyjnym? 
Strategiczna refaktoryzacja 24
www.bnsit.pl 
Zespół ds. Trudnych i Beznadziejnych 
Strategiczna refaktoryzacja 25
if ( param == 4 ) { //workaround, do not touch! 
www.bnsit.pl 
position.setX( position.getX() + 1 ); 
} 
Refaktoryzacja sposobu myślenia 
Strategiczna refaktoryzacja 26
public InvalidCartesianXPatch extends Position { 
www.bnsit.pl 
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
public Position { 
www.bnsit.pl 
// 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
# Segregujemy metody z pomiędzy interfejsy 
# Skupiamy się, na zatrzymaniu powstawania 
nowych zależności 
www.bnsit.pl 
Branch by Abstraction 
Strategiczna refaktoryzacja 30
www.bnsit.pl 
Feature Porting 
Strategiczna refaktoryzacja 31
www.bnsit.pl Strategiczna refaktoryzacja 32
http://mbartyzel.blogspot.com/2014/03/prese 
ntation-layer-under-control.html 
www.bnsit.pl Strategiczna refaktoryzacja 33
www.bnsit.pl 
A może nie refaktoryzować? 
Strategiczna refaktoryzacja 34
# 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 
www.bnsit.pl 
Dziedziny 
Strategiczna refaktoryzacja 35
www.bnsit.pl 
Anticoruption Layer 
Strategiczna refaktoryzacja 36
Strategia Bubble Context 
www.bnsit.pl Strategiczna refaktoryzacja 37
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
http://www.infoq.com/articles/natural-course-refactoring 
Strategiczna refaktoryzacja 44
Everyday refactoring 
Strategic refactoring 
Strategiczna refaktoryzacja 45
Strategiczna refaktoryzacja 
Michał Bartyzel 
Mariusz Sieraczkiewicz 
www.bnsit.pl

More Related Content

Similar to [JUG, PL] Strategiczna refaktoryzacja

Refactoring - Jak pozostać przy zdrowych zmysłach, redukując dług
Refactoring - Jak pozostać przy zdrowych zmysłach, redukując długRefactoring - Jak pozostać przy zdrowych zmysłach, redukując dług
Refactoring - Jak pozostać przy zdrowych zmysłach, redukując długMax Małecki
 
Intro do Domain Driven Design. ( PL )
Intro do Domain Driven Design. ( PL )Intro do Domain Driven Design. ( PL )
Intro do Domain Driven Design. ( PL )GOG.com dev team
 
Bezpieczeństwo i optymalizacja kosztów - virtual Disaster Recovery
Bezpieczeństwo i optymalizacja kosztów - virtual Disaster RecoveryBezpieczeństwo i optymalizacja kosztów - virtual Disaster Recovery
Bezpieczeństwo i optymalizacja kosztów - virtual Disaster RecoveryBeyond.pl
 
Projekty internetowe: książka kucharska czyli... szczypta teorii i kocioł p...
Projekty internetowe: książka kucharska czyli... szczypta teorii i kocioł p...Projekty internetowe: książka kucharska czyli... szczypta teorii i kocioł p...
Projekty internetowe: książka kucharska czyli... szczypta teorii i kocioł p...Michal Bukowski, MBA, P2P
 
20170928 why r_r jako główna platforma do zaawansowanej analityki w enterprise
20170928 why r_r jako główna platforma do zaawansowanej analityki w enterprise20170928 why r_r jako główna platforma do zaawansowanej analityki w enterprise
20170928 why r_r jako główna platforma do zaawansowanej analityki w enterpriseWit Jakuczun
 
infraxstructure: Rafał Stańczak "Postępujący rozwój infrastruktury na potrze...
infraxstructure: Rafał Stańczak  "Postępujący rozwój infrastruktury na potrze...infraxstructure: Rafał Stańczak  "Postępujący rozwój infrastruktury na potrze...
infraxstructure: Rafał Stańczak "Postępujący rozwój infrastruktury na potrze...PROIDEA
 
Więcej niż architektura oprogramowania
Więcej niż architektura oprogramowaniaWięcej niż architektura oprogramowania
Więcej niż architektura oprogramowaniaWydawnictwo Helion
 
Praktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPlPraktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPlSebastian Marek
 
Paulina Rzymska, Marcin Piotrowski "Playmobile pl case study Polish IA Summit"
Paulina Rzymska, Marcin Piotrowski "Playmobile pl case study Polish IA Summit"Paulina Rzymska, Marcin Piotrowski "Playmobile pl case study Polish IA Summit"
Paulina Rzymska, Marcin Piotrowski "Playmobile pl case study Polish IA Summit"UseLab
 
Redesign Playmobile.pl - Polish IA Summit 2011
Redesign Playmobile.pl - Polish IA Summit 2011Redesign Playmobile.pl - Polish IA Summit 2011
Redesign Playmobile.pl - Polish IA Summit 2011Paulina Rzymska
 
PHP i MySQL. Wprowadzenie. Wydanie II
PHP i MySQL. Wprowadzenie. Wydanie IIPHP i MySQL. Wprowadzenie. Wydanie II
PHP i MySQL. Wprowadzenie. Wydanie IIWydawnictwo Helion
 
PHP i MySQL. Tworzenie sklepów internetowych. Wydanie II
PHP i MySQL. Tworzenie sklepów internetowych. Wydanie IIPHP i MySQL. Tworzenie sklepów internetowych. Wydanie II
PHP i MySQL. Tworzenie sklepów internetowych. Wydanie IIWydawnictwo Helion
 
Praca Codibly - Demand Response Management
Praca Codibly - Demand Response ManagementPraca Codibly - Demand Response Management
Praca Codibly - Demand Response ManagementCodibly - Software House
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówWydawnictwo Helion
 
Zasady technicznej organizacji projektów programistycznych
Zasady technicznej organizacji projektów programistycznychZasady technicznej organizacji projektów programistycznych
Zasady technicznej organizacji projektów programistycznychsztywny
 
Visual Basic .NET. Księga eksperta
Visual Basic .NET. Księga ekspertaVisual Basic .NET. Księga eksperta
Visual Basic .NET. Księga ekspertaWydawnictwo Helion
 
Od codziennej higieny do strategicznej refaktoryzacji
Od codziennej higieny do strategicznej refaktoryzacjiOd codziennej higieny do strategicznej refaktoryzacji
Od codziennej higieny do strategicznej refaktoryzacjiMichał Bartyzel
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowychTomasz Borowski
 

Similar to [JUG, PL] Strategiczna refaktoryzacja (20)

Refactoring - Jak pozostać przy zdrowych zmysłach, redukując dług
Refactoring - Jak pozostać przy zdrowych zmysłach, redukując długRefactoring - Jak pozostać przy zdrowych zmysłach, redukując dług
Refactoring - Jak pozostać przy zdrowych zmysłach, redukując dług
 
Intro do Domain Driven Design. ( PL )
Intro do Domain Driven Design. ( PL )Intro do Domain Driven Design. ( PL )
Intro do Domain Driven Design. ( PL )
 
Bezpieczeństwo i optymalizacja kosztów - virtual Disaster Recovery
Bezpieczeństwo i optymalizacja kosztów - virtual Disaster RecoveryBezpieczeństwo i optymalizacja kosztów - virtual Disaster Recovery
Bezpieczeństwo i optymalizacja kosztów - virtual Disaster Recovery
 
Projekty internetowe: książka kucharska czyli... szczypta teorii i kocioł p...
Projekty internetowe: książka kucharska czyli... szczypta teorii i kocioł p...Projekty internetowe: książka kucharska czyli... szczypta teorii i kocioł p...
Projekty internetowe: książka kucharska czyli... szczypta teorii i kocioł p...
 
User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14
User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14
User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14
 
Refaktoryzacja
RefaktoryzacjaRefaktoryzacja
Refaktoryzacja
 
20170928 why r_r jako główna platforma do zaawansowanej analityki w enterprise
20170928 why r_r jako główna platforma do zaawansowanej analityki w enterprise20170928 why r_r jako główna platforma do zaawansowanej analityki w enterprise
20170928 why r_r jako główna platforma do zaawansowanej analityki w enterprise
 
infraxstructure: Rafał Stańczak "Postępujący rozwój infrastruktury na potrze...
infraxstructure: Rafał Stańczak  "Postępujący rozwój infrastruktury na potrze...infraxstructure: Rafał Stańczak  "Postępujący rozwój infrastruktury na potrze...
infraxstructure: Rafał Stańczak "Postępujący rozwój infrastruktury na potrze...
 
Więcej niż architektura oprogramowania
Więcej niż architektura oprogramowaniaWięcej niż architektura oprogramowania
Więcej niż architektura oprogramowania
 
Praktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPlPraktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPl
 
Paulina Rzymska, Marcin Piotrowski "Playmobile pl case study Polish IA Summit"
Paulina Rzymska, Marcin Piotrowski "Playmobile pl case study Polish IA Summit"Paulina Rzymska, Marcin Piotrowski "Playmobile pl case study Polish IA Summit"
Paulina Rzymska, Marcin Piotrowski "Playmobile pl case study Polish IA Summit"
 
Redesign Playmobile.pl - Polish IA Summit 2011
Redesign Playmobile.pl - Polish IA Summit 2011Redesign Playmobile.pl - Polish IA Summit 2011
Redesign Playmobile.pl - Polish IA Summit 2011
 
PHP i MySQL. Wprowadzenie. Wydanie II
PHP i MySQL. Wprowadzenie. Wydanie IIPHP i MySQL. Wprowadzenie. Wydanie II
PHP i MySQL. Wprowadzenie. Wydanie II
 
PHP i MySQL. Tworzenie sklepów internetowych. Wydanie II
PHP i MySQL. Tworzenie sklepów internetowych. Wydanie IIPHP i MySQL. Tworzenie sklepów internetowych. Wydanie II
PHP i MySQL. Tworzenie sklepów internetowych. Wydanie II
 
Praca Codibly - Demand Response Management
Praca Codibly - Demand Response ManagementPraca Codibly - Demand Response Management
Praca Codibly - Demand Response Management
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
 
Zasady technicznej organizacji projektów programistycznych
Zasady technicznej organizacji projektów programistycznychZasady technicznej organizacji projektów programistycznych
Zasady technicznej organizacji projektów programistycznych
 
Visual Basic .NET. Księga eksperta
Visual Basic .NET. Księga ekspertaVisual Basic .NET. Księga eksperta
Visual Basic .NET. Księga eksperta
 
Od codziennej higieny do strategicznej refaktoryzacji
Od codziennej higieny do strategicznej refaktoryzacjiOd codziennej higieny do strategicznej refaktoryzacji
Od codziennej higieny do strategicznej refaktoryzacji
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowych
 

More from Michał Bartyzel

Developer prowadzi szkolenia
Developer prowadzi szkoleniaDeveloper prowadzi szkolenia
Developer prowadzi szkoleniaMichał Bartyzel
 
Jak sprzedać refaktoryzację? Nordea Bank AB Case
Jak sprzedać refaktoryzację? Nordea Bank AB CaseJak sprzedać refaktoryzację? Nordea Bank AB Case
Jak sprzedać refaktoryzację? Nordea Bank AB CaseMichał Bartyzel
 
[PL, 2017] Conversation Patterns for Software Professionals
[PL, 2017] Conversation Patterns for Software Professionals[PL, 2017] Conversation Patterns for Software Professionals
[PL, 2017] Conversation Patterns for Software ProfessionalsMichał Bartyzel
 
[Geek Girls Carrots] Agile being
[Geek Girls Carrots] Agile being[Geek Girls Carrots] Agile being
[Geek Girls Carrots] Agile beingMichał Bartyzel
 
Co jest czym w obszarze miękkim?
Co jest czym w obszarze miękkim?Co jest czym w obszarze miękkim?
Co jest czym w obszarze miękkim?Michał Bartyzel
 
[Agile2014] Conversation Patterns for Software Professionals
[Agile2014] Conversation Patterns for Software Professionals[Agile2014] Conversation Patterns for Software Professionals
[Agile2014] Conversation Patterns for Software ProfessionalsMichał Bartyzel
 
[Pl] conversation patterns for software professionals
[Pl] conversation patterns for software professionals[Pl] conversation patterns for software professionals
[Pl] conversation patterns for software professionalsMichał Bartyzel
 
[Confitura 2013] Nie ma jednej słusznej drogi - różne podejścia do architektu...
[Confitura 2013] Nie ma jednej słusznej drogi - różne podejścia do architektu...[Confitura 2013] Nie ma jednej słusznej drogi - różne podejścia do architektu...
[Confitura 2013] Nie ma jednej słusznej drogi - różne podejścia do architektu...Michał Bartyzel
 
Szybko czy dobrze. jak współpracować z biznesem i nie dać się zwieść pozornym...
Szybko czy dobrze. jak współpracować z biznesem i nie dać się zwieść pozornym...Szybko czy dobrze. jak współpracować z biznesem i nie dać się zwieść pozornym...
Szybko czy dobrze. jak współpracować z biznesem i nie dać się zwieść pozornym...Michał Bartyzel
 
Conversation patters for ubiquitous language
Conversation patters for ubiquitous languageConversation patters for ubiquitous language
Conversation patters for ubiquitous languageMichał Bartyzel
 
[33rd] x driven-y niczego nie zmienią
[33rd] x driven-y niczego nie zmienią[33rd] x driven-y niczego nie zmienią
[33rd] x driven-y niczego nie zmieniąMichał Bartyzel
 
[4 developers] Jak zniszczyć swój kod - podstawy lingwistyki dla programistów
[4 developers] Jak zniszczyć swój kod - podstawy lingwistyki dla programistów[4 developers] Jak zniszczyć swój kod - podstawy lingwistyki dla programistów
[4 developers] Jak zniszczyć swój kod - podstawy lingwistyki dla programistówMichał Bartyzel
 
xUnit - narzędzie do testowania
xUnit - narzędzie do testowaniaxUnit - narzędzie do testowania
xUnit - narzędzie do testowaniaMichał Bartyzel
 

More from Michał Bartyzel (17)

Developer prowadzi szkolenia
Developer prowadzi szkoleniaDeveloper prowadzi szkolenia
Developer prowadzi szkolenia
 
Getting Things Programmed
Getting Things ProgrammedGetting Things Programmed
Getting Things Programmed
 
Jak sprzedać refaktoryzację? Nordea Bank AB Case
Jak sprzedać refaktoryzację? Nordea Bank AB CaseJak sprzedać refaktoryzację? Nordea Bank AB Case
Jak sprzedać refaktoryzację? Nordea Bank AB Case
 
[PL, 2017] Conversation Patterns for Software Professionals
[PL, 2017] Conversation Patterns for Software Professionals[PL, 2017] Conversation Patterns for Software Professionals
[PL, 2017] Conversation Patterns for Software Professionals
 
Kanban na lodówce
Kanban na lodówceKanban na lodówce
Kanban na lodówce
 
[Geek Girls Carrots] Agile being
[Geek Girls Carrots] Agile being[Geek Girls Carrots] Agile being
[Geek Girls Carrots] Agile being
 
Co jest czym w obszarze miękkim?
Co jest czym w obszarze miękkim?Co jest czym w obszarze miękkim?
Co jest czym w obszarze miękkim?
 
[Agile2014] Conversation Patterns for Software Professionals
[Agile2014] Conversation Patterns for Software Professionals[Agile2014] Conversation Patterns for Software Professionals
[Agile2014] Conversation Patterns for Software Professionals
 
[Pl] conversation patterns for software professionals
[Pl] conversation patterns for software professionals[Pl] conversation patterns for software professionals
[Pl] conversation patterns for software professionals
 
[Confitura 2013] Nie ma jednej słusznej drogi - różne podejścia do architektu...
[Confitura 2013] Nie ma jednej słusznej drogi - różne podejścia do architektu...[Confitura 2013] Nie ma jednej słusznej drogi - różne podejścia do architektu...
[Confitura 2013] Nie ma jednej słusznej drogi - różne podejścia do architektu...
 
Szybko czy dobrze. jak współpracować z biznesem i nie dać się zwieść pozornym...
Szybko czy dobrze. jak współpracować z biznesem i nie dać się zwieść pozornym...Szybko czy dobrze. jak współpracować z biznesem i nie dać się zwieść pozornym...
Szybko czy dobrze. jak współpracować z biznesem i nie dać się zwieść pozornym...
 
Conversation patters for ubiquitous language
Conversation patters for ubiquitous languageConversation patters for ubiquitous language
Conversation patters for ubiquitous language
 
[33rd] x driven-y niczego nie zmienią
[33rd] x driven-y niczego nie zmienią[33rd] x driven-y niczego nie zmienią
[33rd] x driven-y niczego nie zmienią
 
[4 developers] Jak zniszczyć swój kod - podstawy lingwistyki dla programistów
[4 developers] Jak zniszczyć swój kod - podstawy lingwistyki dla programistów[4 developers] Jak zniszczyć swój kod - podstawy lingwistyki dla programistów
[4 developers] Jak zniszczyć swój kod - podstawy lingwistyki dla programistów
 
Diagram sekwencji
Diagram sekwencjiDiagram sekwencji
Diagram sekwencji
 
xUnit - narzędzie do testowania
xUnit - narzędzie do testowaniaxUnit - narzędzie do testowania
xUnit - narzędzie do testowania
 
Wzorce kreacyjne GoF
Wzorce kreacyjne GoFWzorce kreacyjne GoF
Wzorce kreacyjne GoF
 

[JUG, PL] Strategiczna refaktoryzacja

  • 1. Strategiczna refaktoryzacja Michał Bartyzel Mariusz Sieraczkiewicz www.bnsit.pl
  • 2. www.bnsit.pl Strategiczna refaktoryzacja To przede wszystkim wyzwanie organizacyjne, a w następnej kolejności techniczne Po pierwsze zatrzymaj dalsze psucie, po drugie naprawiaj
  • 3. # refactoring.com, refactoring to the patterns, clean code www.bnsit.pl Przekształcenia kodu to za mało Strategiczna refaktoryzacja 3
  • 5. www.bnsit.pl Rodzaje refaktoryzacji Strategiczna refaktoryzacja 5
  • 6. Techniki # Zidentyfikuj obszary refaktoryzacji www.bnsit.pl • 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 Strategiczna refaktoryzacja 6
  • 7. www.bnsit.pl Kontekst powstania tego kodu Kto to napisał? Kiedy to napisał? Czym się kierował? Jakie miał doświadczenie? W jakich warunkach działał? Ile miał czasu? Kto go rozliczał? Strategiczna refaktoryzacja 7
  • 9. www.bnsit.pl Mapa problemy/korzyści/rozwiązanie Rozwiązanie Problemy Korzyści Co mówią programiści, architekci? Strategiczna refaktoryzacja 9
  • 10. 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 www.bnsit.pl 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
  • 11. 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 www.bnsit.pl 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
  • 12. Analiza – identyfikacja problemów # 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 – www.bnsit.pl WIELE ŚRODOWISK, DUŻO MERGE’OWANIA Strategiczna refaktoryzacja 12
  • 13. # 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 www.bnsit.pl Analiza – identyfikacja problemów Strategiczna refaktoryzacja 13
  • 14. www.bnsit.pl Root Cause Analysis Strategiczna refaktoryzacja 14
  • 15. www.bnsit.pl Mantra architektoniczna – bloki budujące Strategiczna refaktoryzacja 15
  • 16. www.bnsit.pl Mantra architektoniczna – model i kontekst Strategiczna refaktoryzacja 16
  • 17. Blok budujący – View controller Jak powinno być? Co się powinno dziać? 1. Przyjmuje request 2. Dokonuje złożonej www.bnsit.pl 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 Strategiczna refaktoryzacja 17
  • 18. www.bnsit.pl Przeanalizuj metryki kodu Strategiczna refaktoryzacja 18
  • 19. www.bnsit.pl Co refaktoryzować? Kwadrant Feathersa Wysoka złożoność/rzadkie zmiany Kod którego nie ruszamy Złożoność 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 Dodatkowo: • wiedza plemienna • prognozy biznesu Częstość zmian Strategiczna refaktoryzacja 19
  • 20. Wiedza plemienna Repozytorium i wiedza plemienna # Co warto wziąć pod uwagę? www.bnsit.pl • 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? Strategiczna refaktoryzacja 20
  • 22. # 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 www.bnsit.pl Kilka kontrowersyjnych wniosków Strategiczna refaktoryzacja 22
  • 23. Promień Schwarzschilda www.bnsit.pl Strategiczna refaktoryzacja 23
  • 24. # Zespoły deweloperskie # Zespoły testerów # Zespołu utrzymania # Zaangażowanie biznesu # Realność terminów # Obsługa zmian w wymaganiach www.bnsit.pl Czemu przyjrzeć się na poziomie organizacyjnym? Strategiczna refaktoryzacja 24
  • 25. www.bnsit.pl Zespół ds. Trudnych i Beznadziejnych Strategiczna refaktoryzacja 25
  • 26. if ( param == 4 ) { //workaround, do not touch! www.bnsit.pl position.setX( position.getX() + 1 ); } Refaktoryzacja sposobu myślenia Strategiczna refaktoryzacja 26
  • 27. public InvalidCartesianXPatch extends Position { www.bnsit.pl 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
  • 28. public Position { www.bnsit.pl // 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
  • 29. www.bnsit.pl Branch by Abstraction Strategiczna refaktoryzacja 29
  • 30. # Segregujemy metody z pomiędzy interfejsy # Skupiamy się, na zatrzymaniu powstawania nowych zależności www.bnsit.pl Branch by Abstraction Strategiczna refaktoryzacja 30
  • 31. www.bnsit.pl Feature Porting Strategiczna refaktoryzacja 31
  • 34. www.bnsit.pl A może nie refaktoryzować? Strategiczna refaktoryzacja 34
  • 35. # 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 www.bnsit.pl Dziedziny Strategiczna refaktoryzacja 35
  • 36. www.bnsit.pl Anticoruption Layer Strategiczna refaktoryzacja 36
  • 37. Strategia Bubble Context www.bnsit.pl Strategiczna refaktoryzacja 37
  • 38. www.bnsit.pl Open Host Serivce Strategiczna refaktoryzacja 38
  • 40. www.bnsit.pl Proces ewolucji architektury Strategiczna refaktoryzacja 40 Proces rozwoju architektury
  • 45. Everyday refactoring Strategic refactoring Strategiczna refaktoryzacja 45
  • 46. Strategiczna refaktoryzacja Michał Bartyzel Mariusz Sieraczkiewicz www.bnsit.pl