SlideShare a Scribd company logo
1 of 86
Od codziennej
higieny kodu
do strategicznej
refaktoryzacji
@MichalBartyzel
blog.gettingThingsProgrammed.pl
Kod, który czyta się jak książkę
#CodeSpeaks2U
Tell, Don’t Ask
#CodeReadability
Samodokumentujący się kod
Kluczem do #softwareCraftsmanship są
umiejętności lingwistyczne
Nazywanie
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
Programujesz to, co nazywasz
Zwiększamy efektywność zespołów projektowych5
List<Employee> employees...
//...
EmployeeFile employeeFile = findEmployeeFile( personalID );
employeeFile.getEmergencyContactInformation();
A potem powstaje architektura
Zwiększamy efektywność zespołów projektowych6
List<Employee> employees...
//...
EmployeeFile employeeFile = findEmployeeFile( personalID );
employeeFile.getEmergencyContactInformation();
I dzieją się z nią dziwne rzeczy
Zwiększamy efektywność zespołów projektowych7
Co chcemy zacząć zauważać?
Zwiększamy efektywność zespołów projektowych8
Nazwa klasy cLOC
LocationManager 26 752
NetworkItem 10 955
TransferOperations 6 871
CalculatorsManager 4 325
MonitorManager 1 514
VTViewInvoker 48
ContactService 47
Address 34
DataRange 21
LoggedUserDetailsModel 13
Zwiększamy efektywność zespołów projektowych9
Zwiększamy efektywność zespołów projektowych10
Zwiększamy efektywność zespołów projektowych11
Klasy
Zwiększamy efektywność zespołów projektowych12
Konwencje
Zwiększamy efektywność zespołów projektowych13
Metody
Extract
Method?
Zmienne
Zwiększamy efektywność zespołów projektowych14
Zwiększamy efektywność zespołów projektowych15
Axel Fontaine, Architecting for Continuous
Delivery
http://2013.33degree.org/talk/show/51
Pakiety
Biznes ARCH Klasy Metody Zmienne
Smell Zmienna quasi-
globalna
Przykład
Refaktor.
Brak umiejętności nazywania
Zwiększamy efektywność zespołów projektowych16
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
#odpowiedzialność to rola/zadanie
wyrażone nazwą
#dobraNazwa przychodzi z czasem
Kryterium czytelności kodu: #testIvony
Code Speaks 2U
public void add(Object element) {
if (!readOnly) {
int newSize = size + 1;
if (newSize > elements.length) {
Object[] newElements;
newElements = new Object[elements.length + 10];
for (int i = 0; i < size; i++) {
newElements[i] = elements[i];
}
elements = newElements;
}
elements[size++] = element;
}
}
public void add(Object element) {
if (readOnly) {
return;
}
if (atCapacity()) {
grow();
}
addElement(element);
}
#CleanCode
• Umieszczaj intencje w nazwach
• Uwidaczniaj różnice
• Stosuj nazwy, które da się wymówić
• Unikaj dowcipnych nazw
• Dbaj o pojedynczą odpowiedzialność
• Unikaj dużej liczby parametrów
• Stosuj Command-Query Separation
• …
for (int dataType : types) {
if (RowManagerHelper.isRawDataTypeCalculated(
data, type.getType()))
types.add(dataType);
else {
ID id = RowManagerHelper.getID(data, type, enType,
obj.getGroup().useDeprecatedXmlFiles());
if (id != null) {
ids.add(id);
if (id.getValue() != null) {
IDFactory f = IDProviderFactory.getInstance()
.createProvider(pObj, element);
list_id.addAll(idProvider.getAllIDs(id, 0));
}
for (int j = i; j &lt; (list_oid.size()); j++) {
mapDaType.put(j, data);
}
i = list_id.size();
}
}
public long insertDepartment (String CusId,String Employee,
String FullName,String LastName,String FirstName,String PESEL,
String ERProvince,String ERZipCode,String ERCountry,
String ERStreetName,String ERBuildingNumber,String ERNumber,
String ERPostOffice,String EmailAddress,String SMSNo,
String CallNbr,String Status, String IStatus,String SMSStat,
String WEBs, String XMLStatus,String BIStatus, String queue,
String DasFlag, Date DateBirth,boolean bGenerate,String TAddress,
String TCity,String sex,String Nationality,String NIP,
Object Profile, String DefaultAccount, Sring address,
String ADCity, String ADProvince, String ADZipCode,
String ADCountry,String ADStreetName,String Number,
String ADFlatNumber,String ADPostOffice,String ERAddress,
String ERCity, String DProvince,String TZipCode,String TCountry,
String TStreetName, String TBuildingNumber, String DFlatNumber,
String TPostOffice, String PersonalId, String PassportNo)
throws GenericException {
//...
Zwiększamy efektywność zespołów projektowych39
public class LDW_LocationCommonManager extends LDW_BaseService
implements LDW_ILocationCommonManager {
private TStruct oTStruct;
private TypeData oTypeData;
private SolSubject _Subject;
private SolUniqueSubject _UniqueSubject;
private SolUniqueSubjectExcep _UniqueSubjectExcep;
private SolCommunAddress _CommunAddress;
private SolAddress _Address;
private SolTransactions _Transactions;
private SolStatusChanl _StatusChan;
private UserContext uC;
private UserContext_LDW uC_LDW;
private SOLSegmentsUser _SegmentsUser;
private LDWA_ISecurityString _oSecurity;
private String _zoSdTransitionDate;
private String _sSType;
private String _zoInterimPasswordMask="";
private String _zoInterimPassNoMasked="";
private String _zoInterimPassMasked="";
private Date _zoMigrationDate;
private String _zoMigrationStage="";
public int _iMigrationStage;
Zwiększamy efektywność zespołów projektowych40
if (!r.IsDataRangeDoNull() && !r.IsDataRangeOdNull()
&& ((r.DataRangeOd.Day != yearRow.Miesiac.Day
&& r.DataRangeOd.Day != yearRow.Miesiac.AddMonths(1).Day)
|| (r.DataRangeDo.Day != yearRow.Miesiac.Day
&& r.DataRangeDo.Day != yearRow.Miesiac.AddMonths(1).Day)))
//...
Zwiększamy efektywność zespołów projektowych41
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
#testIvony Posłuchaj czytanego
kodu:
1. Zrozumiałe -> czytelny
2. Niezrozumiałe -> nieczytelny
#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
if ("".equals(m_Action) ||
"Cancel".equalsIgnoreCase(m_sAction) {
if ( actionCancelled( m_sAction ) ) {
#uwazneKomentowanie
#scaffoldingRefactoring
1. Dodaj tymczasowe komentarze
2. Nazwij warunki logiczne
3. Pogrupuj zmienne leniwie
4. Popraw wrażenia wizualne
#NCR Natural Course of Refactoring: an intuitive
#refactoringWorkflow #continuousRefactoring
Natural Course
of Refactoring®
#smell Spaghetti Code
`
#book Clean Code,
Code Complete
#smell Long Method
#book Implementation
Patterns
#smell God Class
#book Refactoring
#smell Duplicated Code
#book Design Pattern
#smell Big Bull of Mud
#book POSA, PoEAA,
DDD
#smell Architectural Drift
#res blogi, konferencje, listy
#everydayRefactoring
#strategicRefactoring
Niektóre fragmenty kodu zawsze będą cuchnąć.
Naucz się z tym żyć #codeSmell
Refaktoryzować?
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
Core Domain
1 programista, 6 miesięcy, PHP
Nową funkcjonalność
rozwijaj osobno
w powiązanym
kontekście
Strategiczna refaktoryzacja58
Bubble Context
#refaktoryzacja to przede wszystkim wyzwanie
organizacyjne, a nie techniczne #strategicRefactoring
Zarządzanie
#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
…a o co chodzi?
Nazwij problemy
• Specjalizacja programistów
• Multitasking
• Duża ilość nieużywanego kodu
• Leciwe technologie
• Nadwyrężona odpowiedzialność widoków
• Nieefektywne spotkania
Mierz, co się da
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…
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
#refaktoryzacja sprawia kłopoty, bo robisz zbyt wiele
rzeczy na raz
Małe kroki
Programowanie jest #fajne
//TODO: Wczytaj plik CSV
public String[][] readCSV(String filePath );
Pojawił się błąd w bazie…
To pewnie w
serwisie…
albo w
widoku…
albo w
konfigu…
albo w
konfigu…
Zasada zaangażowania
Przyczyna błędu tkwi w…
• Czyimś kodzie
• Braku dostępu do usługi
• Niejednoznacznych wymaganiach
• Niewłaściwym przetestowaniu
• Bibliotece
• Słabej jakości kodzie oddziedziczonym
• …
DUŻE KROKI to Odczucie ***
Najlepsze strategie skutecznych programistów
77
TechnikaMałychKroków
Krok := zmiana/dodanie instrukcji
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
• ~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
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
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
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.
gettingThingsProgrammed.evenea.pl
Architectural Kata
• Zobacz program warsztatu
– https://biturl.io/VK4j52
• Zobacz fragment warsztatu
– https://biturl.io/VK4Vn8
• Zobacz efekt warsztatu
– https://biturl.io/VK4ai0
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

More Related Content

Viewers also liked

Rock art and IFRAO color card
Rock art and IFRAO color cardRock art and IFRAO color card
Rock art and IFRAO color cardVictor Reijs
 
How to Enable Developers to Deliver Secure Code
How to Enable Developers to Deliver Secure CodeHow to Enable Developers to Deliver Secure Code
How to Enable Developers to Deliver Secure CodeAchim D. Brucker
 
Les actualités de la Roumanie pour le Mois de Mars 2017 de Eastrategies
Les actualités de la Roumanie pour le Mois de Mars 2017 de EastrategiesLes actualités de la Roumanie pour le Mois de Mars 2017 de Eastrategies
Les actualités de la Roumanie pour le Mois de Mars 2017 de EastrategiesEastrategies - Bucarest, Roumanie
 
Opnieuw goed jaar voor firma Staf Coppens
Opnieuw goed jaar voor firma Staf CoppensOpnieuw goed jaar voor firma Staf Coppens
Opnieuw goed jaar voor firma Staf CoppensThierry Debels
 
Introduction to Scrum - Hebrew
Introduction to Scrum - HebrewIntroduction to Scrum - Hebrew
Introduction to Scrum - HebrewDan-Eyal Gazit
 
40 propositions pour moderniser et simplifier le droit de l'environnement
40 propositions pour moderniser et simplifier le droit de l'environnement40 propositions pour moderniser et simplifier le droit de l'environnement
40 propositions pour moderniser et simplifier le droit de l'environnementAdm Medef
 
Como Desvendar Mentiras
Como Desvendar MentirasComo Desvendar Mentiras
Como Desvendar Mentirasandre rossiter
 
Apache Spark and Object Stores —for London Spark User Group
Apache Spark and Object Stores —for London Spark User GroupApache Spark and Object Stores —for London Spark User Group
Apache Spark and Object Stores —for London Spark User GroupSteve Loughran
 
аномалии бинокулярного зрения. Upgraded
аномалии бинокулярного зрения. Upgradedаномалии бинокулярного зрения. Upgraded
аномалии бинокулярного зрения. UpgradedNatalia Kaschenko
 
Brief LoRaWAN Overview
Brief LoRaWAN OverviewBrief LoRaWAN Overview
Brief LoRaWAN OverviewAlper Yegin
 
R. Villano - fotos (DE part 9)
R. Villano - fotos (DE part 9)R. Villano - fotos (DE part 9)
R. Villano - fotos (DE part 9)Raimondo Villano
 
SPARQLでオープンデータ活用!
SPARQLでオープンデータ活用!SPARQLでオープンデータ活用!
SPARQLでオープンデータ活用!uedayou
 
Welcome Givelify Mobile Giving App Places of Worship
Welcome Givelify Mobile Giving App Places of WorshipWelcome Givelify Mobile Giving App Places of Worship
Welcome Givelify Mobile Giving App Places of WorshipGivelify
 

Viewers also liked (18)

Prekat. La Psicologia del Bienestar
Prekat. La Psicologia del BienestarPrekat. La Psicologia del Bienestar
Prekat. La Psicologia del Bienestar
 
C4 Logistics Services
C4 Logistics ServicesC4 Logistics Services
C4 Logistics Services
 
Rock art and IFRAO color card
Rock art and IFRAO color cardRock art and IFRAO color card
Rock art and IFRAO color card
 
How to Enable Developers to Deliver Secure Code
How to Enable Developers to Deliver Secure CodeHow to Enable Developers to Deliver Secure Code
How to Enable Developers to Deliver Secure Code
 
Les actualités de la Roumanie pour le Mois de Mars 2017 de Eastrategies
Les actualités de la Roumanie pour le Mois de Mars 2017 de EastrategiesLes actualités de la Roumanie pour le Mois de Mars 2017 de Eastrategies
Les actualités de la Roumanie pour le Mois de Mars 2017 de Eastrategies
 
Opnieuw goed jaar voor firma Staf Coppens
Opnieuw goed jaar voor firma Staf CoppensOpnieuw goed jaar voor firma Staf Coppens
Opnieuw goed jaar voor firma Staf Coppens
 
Introduction to Scrum - Hebrew
Introduction to Scrum - HebrewIntroduction to Scrum - Hebrew
Introduction to Scrum - Hebrew
 
ASLA Makerspaces in the school library
ASLA Makerspaces in the school libraryASLA Makerspaces in the school library
ASLA Makerspaces in the school library
 
40 propositions pour moderniser et simplifier le droit de l'environnement
40 propositions pour moderniser et simplifier le droit de l'environnement40 propositions pour moderniser et simplifier le droit de l'environnement
40 propositions pour moderniser et simplifier le droit de l'environnement
 
Como Desvendar Mentiras
Como Desvendar MentirasComo Desvendar Mentiras
Como Desvendar Mentiras
 
Apache Spark and Object Stores —for London Spark User Group
Apache Spark and Object Stores —for London Spark User GroupApache Spark and Object Stores —for London Spark User Group
Apache Spark and Object Stores —for London Spark User Group
 
аномалии бинокулярного зрения. Upgraded
аномалии бинокулярного зрения. Upgradedаномалии бинокулярного зрения. Upgraded
аномалии бинокулярного зрения. Upgraded
 
Brief LoRaWAN Overview
Brief LoRaWAN OverviewBrief LoRaWAN Overview
Brief LoRaWAN Overview
 
ABAU 2017
ABAU 2017 ABAU 2017
ABAU 2017
 
...Redes sociales
...Redes sociales...Redes sociales
...Redes sociales
 
R. Villano - fotos (DE part 9)
R. Villano - fotos (DE part 9)R. Villano - fotos (DE part 9)
R. Villano - fotos (DE part 9)
 
SPARQLでオープンデータ活用!
SPARQLでオープンデータ活用!SPARQLでオープンデータ活用!
SPARQLでオープンデータ活用!
 
Welcome Givelify Mobile Giving App Places of Worship
Welcome Givelify Mobile Giving App Places of WorshipWelcome Givelify Mobile Giving App Places of Worship
Welcome Givelify Mobile Giving App Places of Worship
 

Similar to Od codziennej higieny do strategicznej refaktoryzacji

Drupal jako modularny i rozszerzalny CMS [PL]
Drupal jako modularny i rozszerzalny CMS [PL]Drupal jako modularny i rozszerzalny CMS [PL]
Drupal jako modularny i rozszerzalny CMS [PL]Droptica
 
Confitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ AllegroConfitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ Allegroallegro.tech
 
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]Droptica
 
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...Bartłomiej Miś
 
Mitologia DevOps - Łukasz Wielebski @ Agile Management 2014 Poland
Mitologia DevOps - Łukasz Wielebski  @ Agile Management 2014 PolandMitologia DevOps - Łukasz Wielebski  @ Agile Management 2014 Poland
Mitologia DevOps - Łukasz Wielebski @ Agile Management 2014 PolandFundacja Governica
 
[PL] Jak programować aby nie zwariować?
[PL] Jak programować aby nie zwariować?[PL] Jak programować aby nie zwariować?
[PL] Jak programować aby nie zwariować?Jakub Marchwicki
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowychTomasz Borowski
 
Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...
Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...
Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...PMI Szczecin
 
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbaćBartosz Ratajczyk
 
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław SobieckiPodstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław SobieckiGrzegorz Bartman
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyqbeuek
 
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPJak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPPiotr Horzycki
 
Patterns for organic architecture
Patterns for organic architecturePatterns for organic architecture
Patterns for organic architectureJaroslaw Palka
 
CI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecieCI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecieGrzegorz Godlewski
 
Zasady technicznej organizacji projektów programistycznych
Zasady technicznej organizacji projektów programistycznychZasady technicznej organizacji projektów programistycznych
Zasady technicznej organizacji projektów programistycznychsztywny
 
Info meet pomiary wydajności
Info meet pomiary wydajnościInfo meet pomiary wydajności
Info meet pomiary wydajnościmagda3695
 

Similar to Od codziennej higieny do strategicznej refaktoryzacji (20)

Drupal jako modularny i rozszerzalny CMS [PL]
Drupal jako modularny i rozszerzalny CMS [PL]Drupal jako modularny i rozszerzalny CMS [PL]
Drupal jako modularny i rozszerzalny CMS [PL]
 
Confitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ AllegroConfitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ Allegro
 
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
 
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
 
Mitologia DevOps - Łukasz Wielebski @ Agile Management 2014 Poland
Mitologia DevOps - Łukasz Wielebski  @ Agile Management 2014 PolandMitologia DevOps - Łukasz Wielebski  @ Agile Management 2014 Poland
Mitologia DevOps - Łukasz Wielebski @ Agile Management 2014 Poland
 
[PL] Jak programować aby nie zwariować?
[PL] Jak programować aby nie zwariować?[PL] Jak programować aby nie zwariować?
[PL] Jak programować aby nie zwariować?
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowych
 
Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...
Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...
Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...
 
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
 
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław SobieckiPodstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
 
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPJak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
 
Patterns for organic architecture
Patterns for organic architecturePatterns for organic architecture
Patterns for organic architecture
 
Scrum Carrots
Scrum CarrotsScrum Carrots
Scrum Carrots
 
CI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecieCI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecie
 
Refaktoryzacja
RefaktoryzacjaRefaktoryzacja
Refaktoryzacja
 
Outsource
OutsourceOutsource
Outsource
 
Zasady technicznej organizacji projektów programistycznych
Zasady technicznej organizacji projektów programistycznychZasady technicznej organizacji projektów programistycznych
Zasady technicznej organizacji projektów programistycznych
 
Info meet pomiary wydajności
Info meet pomiary wydajnościInfo meet pomiary wydajności
Info meet pomiary wydajności
 
Data Vault w chmurze
Data Vault w chmurzeData Vault w chmurze
Data Vault w chmurze
 

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
 
[chamberconf] Z czym mierzą się zespoły?
[chamberconf] Z czym mierzą się zespoły?[chamberconf] Z czym mierzą się zespoły?
[chamberconf] Z czym mierzą się zespoły?Michał Bartyzel
 
[JUG, PL] Strategiczna refaktoryzacja
[JUG, PL] Strategiczna refaktoryzacja[JUG, PL] Strategiczna refaktoryzacja
[JUG, PL] Strategiczna refaktoryzacjaMichał 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
 
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?
 
[chamberconf] Z czym mierzą się zespoły?
[chamberconf] Z czym mierzą się zespoły?[chamberconf] Z czym mierzą się zespoły?
[chamberconf] Z czym mierzą się zespoły?
 
[JUG, PL] Strategiczna refaktoryzacja
[JUG, PL] Strategiczna refaktoryzacja[JUG, PL] Strategiczna refaktoryzacja
[JUG, PL] Strategiczna refaktoryzacja
 
[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
 
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
 

Od codziennej higieny do strategicznej refaktoryzacji

  • 1. Od codziennej higieny kodu do strategicznej refaktoryzacji @MichalBartyzel blog.gettingThingsProgrammed.pl
  • 2. Kod, który czyta się jak książkę #CodeSpeaks2U Tell, Don’t Ask #CodeReadability Samodokumentujący się kod
  • 3. Kluczem do #softwareCraftsmanship są umiejętności lingwistyczne Nazywanie
  • 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
  • 9. Nazwa klasy cLOC LocationManager 26 752 NetworkItem 10 955 TransferOperations 6 871 CalculatorsManager 4 325 MonitorManager 1 514 VTViewInvoker 48 ContactService 47 Address 34 DataRange 21 LoggedUserDetailsModel 13 Zwiększamy efektywność zespołów projektowych9
  • 11. Zwiększamy efektywność zespołów projektowych11 Klasy
  • 12. Zwiększamy efektywność zespołów projektowych12 Konwencje
  • 13. Zwiększamy efektywność zespołów projektowych13 Metody
  • 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
  • 32. #odpowiedzialność to rola/zadanie wyrażone nazwą #dobraNazwa przychodzi z czasem
  • 33. Kryterium czytelności kodu: #testIvony Code Speaks 2U
  • 34. public void add(Object element) { if (!readOnly) { int newSize = size + 1; if (newSize > elements.length) { Object[] newElements; newElements = new Object[elements.length + 10]; for (int i = 0; i < size; i++) { newElements[i] = elements[i]; } elements = newElements; } elements[size++] = element; } }
  • 35. public void add(Object element) { if (readOnly) { return; } if (atCapacity()) { grow(); } addElement(element); }
  • 36. #CleanCode • Umieszczaj intencje w nazwach • Uwidaczniaj różnice • Stosuj nazwy, które da się wymówić • Unikaj dowcipnych nazw • Dbaj o pojedynczą odpowiedzialność • Unikaj dużej liczby parametrów • Stosuj Command-Query Separation • …
  • 37.
  • 38. for (int dataType : types) { if (RowManagerHelper.isRawDataTypeCalculated( data, type.getType())) types.add(dataType); else { ID id = RowManagerHelper.getID(data, type, enType, obj.getGroup().useDeprecatedXmlFiles()); if (id != null) { ids.add(id); if (id.getValue() != null) { IDFactory f = IDProviderFactory.getInstance() .createProvider(pObj, element); list_id.addAll(idProvider.getAllIDs(id, 0)); } for (int j = i; j &lt; (list_oid.size()); j++) { mapDaType.put(j, data); } i = list_id.size(); } }
  • 39. public long insertDepartment (String CusId,String Employee, String FullName,String LastName,String FirstName,String PESEL, String ERProvince,String ERZipCode,String ERCountry, String ERStreetName,String ERBuildingNumber,String ERNumber, String ERPostOffice,String EmailAddress,String SMSNo, String CallNbr,String Status, String IStatus,String SMSStat, String WEBs, String XMLStatus,String BIStatus, String queue, String DasFlag, Date DateBirth,boolean bGenerate,String TAddress, String TCity,String sex,String Nationality,String NIP, Object Profile, String DefaultAccount, Sring address, String ADCity, String ADProvince, String ADZipCode, String ADCountry,String ADStreetName,String Number, String ADFlatNumber,String ADPostOffice,String ERAddress, String ERCity, String DProvince,String TZipCode,String TCountry, String TStreetName, String TBuildingNumber, String DFlatNumber, String TPostOffice, String PersonalId, String PassportNo) throws GenericException { //... Zwiększamy efektywność zespołów projektowych39
  • 40. public class LDW_LocationCommonManager extends LDW_BaseService implements LDW_ILocationCommonManager { private TStruct oTStruct; private TypeData oTypeData; private SolSubject _Subject; private SolUniqueSubject _UniqueSubject; private SolUniqueSubjectExcep _UniqueSubjectExcep; private SolCommunAddress _CommunAddress; private SolAddress _Address; private SolTransactions _Transactions; private SolStatusChanl _StatusChan; private UserContext uC; private UserContext_LDW uC_LDW; private SOLSegmentsUser _SegmentsUser; private LDWA_ISecurityString _oSecurity; private String _zoSdTransitionDate; private String _sSType; private String _zoInterimPasswordMask=""; private String _zoInterimPassNoMasked=""; private String _zoInterimPassMasked=""; private Date _zoMigrationDate; private String _zoMigrationStage=""; public int _iMigrationStage; Zwiększamy efektywność zespołów projektowych40
  • 41. if (!r.IsDataRangeDoNull() && !r.IsDataRangeOdNull() && ((r.DataRangeOd.Day != yearRow.Miesiac.Day && r.DataRangeOd.Day != yearRow.Miesiac.AddMonths(1).Day) || (r.DataRangeDo.Day != yearRow.Miesiac.Day && r.DataRangeDo.Day != yearRow.Miesiac.AddMonths(1).Day))) //... Zwiększamy efektywność zespołów projektowych41
  • 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
  • 43. #testIvony Posłuchaj czytanego kodu: 1. Zrozumiałe -> czytelny 2. Niezrozumiałe -> nieczytelny
  • 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
  • 45. if ("".equals(m_Action) || "Cancel".equalsIgnoreCase(m_sAction) { if ( actionCancelled( m_sAction ) ) {
  • 46. #uwazneKomentowanie #scaffoldingRefactoring 1. Dodaj tymczasowe komentarze 2. Nazwij warunki logiczne 3. Pogrupuj zmienne leniwie 4. Popraw wrażenia wizualne
  • 47. #NCR Natural Course of Refactoring: an intuitive #refactoringWorkflow #continuousRefactoring Natural Course of Refactoring®
  • 48.
  • 49.
  • 50.
  • 51. #smell Spaghetti Code ` #book Clean Code, Code Complete #smell Long Method #book Implementation Patterns #smell God Class #book Refactoring #smell Duplicated Code #book Design Pattern #smell Big Bull of Mud #book POSA, PoEAA, DDD #smell Architectural Drift #res blogi, konferencje, listy
  • 53. Niektóre fragmenty kodu zawsze będą cuchnąć. Naucz się z tym żyć #codeSmell Refaktoryzować?
  • 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
  • 55.
  • 56.
  • 57. Core Domain 1 programista, 6 miesięcy, PHP
  • 58. Nową funkcjonalność rozwijaj osobno w powiązanym kontekście Strategiczna refaktoryzacja58 Bubble Context
  • 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
  • 61. …a o co chodzi?
  • 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
  • 66. #refaktoryzacja sprawia kłopoty, bo robisz zbyt wiele rzeczy na raz Małe kroki
  • 68. //TODO: Wczytaj plik CSV public String[][] readCSV(String filePath );
  • 69. Pojawił się błąd w bazie…
  • 75. Przyczyna błędu tkwi w… • Czyimś kodzie • Braku dostępu do usługi • Niejednoznacznych wymaganiach • Niewłaściwym przetestowaniu • Bibliotece • Słabej jakości kodzie oddziedziczonym • …
  • 76. DUŻE KROKI to Odczucie ***
  • 77. Najlepsze strategie skutecznych programistów 77 TechnikaMałychKroków Krok := zmiana/dodanie instrukcji
  • 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

  1. 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