• W jaki sposób już teraz możesz upiększyć swój kod?
• Jak refaktoryzować bez konieczności ukrywania tego w szacowaniach?
• Jak w ciągu 30 minut wyprostować najbardziej zagmatwany algorytm?
• W jaki sposób planować duże strategiczne refaktoryzacje?
• Jak w uporządkowany sposób przeprowadzać długotrwałe refaktoryzacje?
• Jak uniknąć niespójnej architektury w trakcie długotrwałej refaktoryzacji?
• Jak negocjować czas na refaktoryzację z Twoim managerem, PO czy klientem?
4. Co można zrobić z…
Zwiększamy efektywność zespołów projektowych4
Listą pracowników Ewidencją pracowników
• Dodać pracownika
• Usunąć pracownika
• Usunąć wszystkich
pracowników
• Wciągnąć pracownika do
ewidencji
• Wyciągnąć kartotekę pracownika
• Oznaczyć urlop
• Oznaczyć zwolnienie chorobowe
• Wyciągnąć świadectwo pracy
5. Programujesz to, co nazywasz
Zwiększamy efektywność zespołów projektowych5
List<Employee> employees...
//...
EmployeeFile employeeFile = findEmployeeFile( personalID );
employeeFile.getEmergencyContactInformation();
6. A potem powstaje architektura
Zwiększamy efektywność zespołów projektowych6
List<Employee> employees...
//...
EmployeeFile employeeFile = findEmployeeFile( personalID );
employeeFile.getEmergencyContactInformation();
7. I dzieją się z nią dziwne rzeczy
Zwiększamy efektywność zespołów projektowych7
8. Co chcemy zacząć zauważać?
Zwiększamy efektywność zespołów projektowych8
15. Zwiększamy efektywność zespołów projektowych15
Axel Fontaine, Architecting for Continuous
Delivery
http://2013.33degree.org/talk/show/51
Pakiety
16. Biznes ARCH Klasy Metody Zmienne
Smell Zmienna quasi-
globalna
Przykład
Refaktor.
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych16
17. Biznes ARCH Klasy Metody Zmienne
Smell Zmienna quasi-
globalna
Przykład tmp1, tmp2,
tmp3
Refaktor.
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych17
18. Biznes ARCH Klasy Metody Zmienne
Smell Zmienna quasi-
globalna
Przykład tmp1, tmp2,
tmp3
Refaktor. Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych18
19. Biznes ARCH Klasy Metody Zmienne
Smell Long Method Zmienna quasi-
globalna
Przykład tmp1, tmp2,
tmp3
Refaktor. Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych19
20. Biznes ARCH Klasy Metody Zmienne
Smell Long Method Zmienna quasi-
globalna
Przykład process,
performOperation
tmp1, tmp2,
tmp3
Refaktor. Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych20
21. Biznes ARCH Klasy Metody Zmienne
Smell Long Method Zmienna quasi-
globalna
Przykład process,
performOperation
tmp1, tmp2,
tmp3
Refaktor. Extract Method
http://refactoring.com
Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych21
22. Biznes ARCH Klasy Metody Zmienne
Smell God Class Long Method Zmienna quasi-
globalna
Przykład process,
performOperation
tmp1, tmp2,
tmp3
Refaktor. Extract Method
http://refactoring.com
Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych22
23. Biznes ARCH Klasy Metody Zmienne
Smell God Class Long Method Zmienna quasi-
globalna
Przykład Location
Manager,
NetworkItem
process,
performOperation
tmp1, tmp2,
tmp3
Refaktor. Extract Method
http://refactoring.com
Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych23
24. Biznes ARCH Klasy Metody Zmienne
Smell God Class Long Method Zmienna quasi-
globalna
Przykład Location
Manager,
NetworkItem
process,
performOperation
tmp1, tmp2,
tmp3
Refaktor. Extract Class
http://refactoring.com
Extract Method
http://refactoring.com
Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych24
25. Biznes ARCH Klasy Metody Zmienne
Smell Big Ball of Mud
http://laputan.org/mud/
God Class Long Method Zmienna quasi-
globalna
Przykład Location
Manager,
NetworkItem
process,
performOperation
tmp1, tmp2,
tmp3
Refaktor. Extract Class
http://refactoring.com
Extract Method
http://refactoring.com
Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych25
26. Biznes ARCH Klasy Metody Zmienne
Smell Big Ball of Mud
http://laputan.org/mud/
God Class Long Method Zmienna quasi-
globalna
Przykład Genreic Plugin
Framework,
Multi-Device
Platform
Location
Manager,
NetworkItem
process,
performOperation
tmp1, tmp2,
tmp3
Refaktor. Extract Class
http://refactoring.com
Extract Method
http://refactoring.com
Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych26
27. Biznes ARCH Klasy Metody Zmienne
Smell Big Ball of Mud
http://laputan.org/mud/
God Class Long Method Zmienna quasi-
globalna
Przykład Genreic Plugin
Framework,
Multi-Device
Platform
Location
Manager,
NetworkItem
process,
performOperation
tmp1, tmp2,
tmp3
Refaktor. Wprowadź
wzorzec
architektoniczny
Extract Class
http://refactoring.com
Extract Method
http://refactoring.com
Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych27
28. Biznes ARCH Klasy Metody Zmienne
Smell Sexy Vision Big Ball of Mud
http://laputan.org/mud/
God Class Long Method Zmienna quasi-
globalna
Przykład Genreic Plugin
Framework,
Multi-Device
Platform
Location
Manager,
NetworkItem
process,
performOperation
tmp1, tmp2,
tmp3
Refaktor. Wprowadź
wzorzec
architektoniczny
Extract Class
http://refactoring.com
Extract Method
http://refactoring.com
Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych28
29. Biznes ARCH Klasy Metody Zmienne
Smell Sexy Vision Big Ball of Mud
http://laputan.org/mud/
God Class Long Method Zmienna quasi-
globalna
Przykład ZSI, BI, DW Genreic Plugin
Framework,
Multi-Device
Platform
Location
Manager,
NetworkItem
process,
performOperation
tmp1, tmp2,
tmp3
Refaktor. Wprowadź
wzorzec
architektoniczny
Extract Class
http://refactoring.com
Extract Method
http://refactoring.com
Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych29
30. Biznes ARCH Klasy Metody Zmienne
Smell Sexy Vision Big Ball of Mud
http://laputan.org/mud/
God Class Long Method Zmienna quasi-
globalna
Przykład ZSI, BI, DW Genreic Plugin
Framework,
Multi-Device
Platform
Location
Manager,
NetworkItem
process,
performOperation
tmp1, tmp2,
tmp3
Refaktor. Zdefiniuj,
podziel,
zmień proces
Wprowadź
wzorzec
architektoniczny
Extract Class
http://refactoring.com
Extract Method
http://refactoring.com
Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych30
31. Biznes ARCH Klasy Metody Zmienne
Smell Sexy Vision Big Ball of Mud
http://laputan.org/mud/
God Class Long Method Zmienna quasi-
globalna
Przykład ZSI, BI, DW Genreic Plugin
Framework,
Multi-Device
Platform
Location
Manager,
NetworkItem
process,
performOperation
tmp1, tmp2,
tmp3
Refaktor. Zdefiniuj,
podziel,
zmień proces
Wprowadź
wzorzec
architektoniczny
Extract Class
http://refactoring.com
Extract Method
http://refactoring.com
Split Temporary
Variable
http://refactoring.com
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych31
42. if (cardId == null)
throw new NullPointerException(
"cardId is null");
if (cardId.getCardNo() == null)
throw new NullPointerException(
"card in cardNo is null");
if (cardId.getCardNo().getCardNoId() == null)
throw new NullPointerException(
"cardNoId is null");
Zwiększamy efektywność zespołów projektowych42
44. #nieczytelny
• Próbujesz rozwiązać
zagadkę logiczną
• Powtarzasz kod w
myślach
• Zaczynasz mówić na
głos
#czytelny
• Wyobrażasz sobie
historię, która się
dzieje
• Zupełnie jak w
książce!
Zwiększamy efektywność zespołów projektowych44
54. High
complexity/
Seldom
changes
Don’t touch it.
High complexity/
Frequent changes
Apply strategic
refactoring
Low complexity/
Seldom changes
Utils, good for
experiments
Low
complexity/Frequent
changes
Heaven
Strategiczna refaktoryzacja54
Confront with:
• team opinions
• business
strategy
Frequency of changes
Complexity
59. #refaktoryzacja to przede wszystkim wyzwanie
organizacyjne, a nie techniczne #strategicRefactoring
Zarządzanie
60. #Action30
• Nordea Bank AB rozwija eBankowość w
krajach bałtyckich
• Biznes długo czeka na zlecone
funkcjonalności (do kilku miesięcy)
#cel Skrócić czas stworzenia nowej
funkcjonalności do 30 dni
62. Nazwij problemy
• Specjalizacja programistów
• Multitasking
• Duża ilość nieużywanego kodu
• Leciwe technologie
• Nadwyrężona odpowiedzialność widoków
• Nieefektywne spotkania
64. Pisz raporty
• Redukcja wierszy kodu o 3%
• Redukcja CC o 15%
Dla tej próbki kodu można by wykonać 29
testów mniej
– aproksymując po całym kodzie…
• przeliczając wykonane testy na dni robocze…
65. Włączaj ludzi
• Kierownicy projektów proszą o więcej
• Management zainteresowany Action-30
• Programiści z innych zespołów przyłączają
się do inicjatywy
• Wsparcie od całego managementu i top
managementu
78. Najlepsze strategie skutecznych programistów
78
TechnikaMałychKroków
Małe Kroki w refaktoryzacji
• Uważne komentowanie
• Zmiany nazw
• Leniwe przestawianie zmiennych
• Przyrostowe odtwarzanie testów
79.
80. • ~500 dni szkoleniowych
• 80+ klientów:Agora, Grupa Allegro, ING Usługi Finansowe, Lufthansa Systems
Polska, Nokia Siemens Networks, Opera Software, Samsung R&D Institute Poland, Nordea
Bank AB (…)
• 8 projektów związanych ze zwinną transformacją
• 40+ artykułów w prasie branżowej
• 3 książki
@MichalBartyzel
Szkoła Agile - Planowanie by Michał Bartyzel80
81. enxoo bootcamp
https://goo.gl/9yZnY8
Skuteczna komunikacja to taka
sama umiejętność jak jazda
samochodem czy programowanie.
Michał Bartyzel doskonale to
pokazuje, rozkładając cały proces
rozmowy na proste elementy.
Dzięki temu czytelnik może nauczyć
się rozpoznawać wzorce i
dopasowywać odpowiednie techniki
do kontekstu rozmowy. Autor
posługuje się prostym i zrozumiałym
językiem, uważnie wybiera
najważniejsze aspekty tematów z
pogranicza psychologii i coachingu.
Narzędzia, które czytelnik dostaje do
ręki, można od razu wykorzystać w
pracy.
Krystian Kaczor, Agile Coach
82. enxoo bootcamp
https://goo.gl/XfSLPQ
Sprawne sterowanie swoją uwagą,
planowanie zadań czy umiejętność ich
oszacowania to wiedza, której brakuje
większości programistów. Często nie
zdajemy sobie nawet sprawy z istnienia
problemów spowalniających naszą
pracę.
W niniejszej książce Autor przedstawia
bogaty wachlarz wyzwań stojących
przed świadomym programistą. Nie
poprzestaje na tym: wysuwa propozycje
samodoskonalenia. Opisuje
sprawdzone recepty pomagające
zrozumieć codzienne problemy, rozbija
je na czynniki pierwsze i przygotowuje
do walki o lepszą organizację czasu.
Maciej Aniserowicz, twórca bloga
devstyle.pl
83. enxoo bootcamp
https://goo.gl/dXkfLS
This book includes a set of
out-and-dried techniques for
improving your cooperation
with the business. The main
goal of this publication is to
give you two key skills:
discovering the business
needs, and managing the
conversation in a way that will
enable you to collect precise
and useful information. First
and foremost, I promote the
first point of the Agile
Manifesto: “Individuals and
interactions over processes
and tools.” Thus, if you tend to
think that your clients do not
know what they want, this
book is exactly for you.
85. Architectural Kata
• Zobacz program warsztatu
– https://biturl.io/VK4j52
• Zobacz fragment warsztatu
– https://biturl.io/VK4Vn8
• Zobacz efekt warsztatu
– https://biturl.io/VK4ai0
86. enxoo bootcamp
Sprawdź najbliższe szkolenia otwarte
# Nowoczesne architektury aplikacji
# Getting Things Programmed
# Architektura aplikacji biznesowych
# Zbieranie wymagań i współpraca z klientem
# Techniki pracy z kodem
# Technical Leadership™
więcej na bnsit.pl/szkolenia-otwarte
Editor's Notes
Czy zwróciłeś uwagę, że gdy wypełniasz czas pracy, to jeśli nie jesteś pewny, do której pozycji przypisać daną aktywność, to zazwyczaj ląduje ona w Ogólne albo Prace koncepcyjne?
Podobnie jest z kodem, jeśli masz poprawić błąd „na szybko” to:
Nowy kodu wrzucasz tam, gdzie nazwa jest najogólniejsza (@see helper, manager)
Tworzysz nowy byt o bardzo małej odpowiedzialności