JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

43
www.bnsit.pl Strategiczna refaktoryzacja Michał Bartyzel Mariusz Sieraczkiewicz

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 of JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

Page 1: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Strategiczna refaktoryzacja Michał Bartyzel Mariusz Sieraczkiewicz

Page 2: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 3: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

# refactoring.com, refactoring to the patterns, clean code

Przekształcenia kodu to za mało

Strategiczna refaktoryzacja 3

Page 4: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

MegaSoftwareCraftshmanshipper

Strategiczna refaktoryzacja 4

http://pl.creepypasta.wikia.com/wiki/Plik:Kibole.jpeg

Page 5: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Rodzaje refaktoryzacji

Strategiczna refaktoryzacja 5

Page 6: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 7: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 8: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Ćwiczenie

Strategiczna refaktoryzacja 8

Page 9: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Problemy Korzyści

Mapa problemy/korzyści/rozwiązanie

Strategiczna refaktoryzacja 9

Co mówią programiści, architekci?

Rozwiązanie

Page 10: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 11: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 12: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 13: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 14: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Root Cause Analysis

Strategiczna refaktoryzacja 14

Page 15: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Mantra architektoniczna – bloki budujące

Strategiczna refaktoryzacja 15

Page 16: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Mantra architektoniczna – model i kontekst

Strategiczna refaktoryzacja 16

Page 17: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 18: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Przeanalizuj metryki kodu

Strategiczna refaktoryzacja 18

Page 19: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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ść

Page 20: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 21: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Zatrzymaj degradację kodu

Page 22: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 23: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Strategiczna refaktoryzacja 23

Promień Schwarzschilda

Page 24: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 25: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Zespół ds. Trudnych i Beznadziejnych

Strategiczna refaktoryzacja 25

Page 26: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 27: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

if ( param == 4 ) { //workaround, do not touch!

position.setX( position.getX() + 1 );

}

Refaktoryzacja sposobu myślenia

Strategiczna refaktoryzacja 27

Page 28: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 29: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 30: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Branch by Abstraction

Strategiczna refaktoryzacja 30

Page 31: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Feature Porting

Strategiczna refaktoryzacja 31

Page 32: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

A może nie refaktoryzować?

Strategiczna refaktoryzacja 32

Page 33: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

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

Page 34: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Anticoruption Layer

Strategiczna refaktoryzacja 34

Page 35: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl Strategiczna refaktoryzacja 35

Strategia Bubble Context

Page 36: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Open Host Serivce

Strategiczna refaktoryzacja 36

Page 37: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Zarządzanie ewolucją architektury

Page 38: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Proces ewolucji architektury

Strategiczna refaktoryzacja 38

Proces rozwoju architektury

Page 39: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

Strategiczna refaktoryzacja 39

Page 40: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

Wiki

Strategiczna refaktoryzacja 40

Page 41: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

Bugtracker

Strategiczna refaktoryzacja 41

Page 42: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

Strategiczna refaktoryzacja 42

Everyday refactoring

Strategic refactoring

Page 43: JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel

www.bnsit.pl

Strategiczna refaktoryzacja Michał Bartyzel Mariusz Sieraczkiewicz