Od codziennej higieny do strategicznej refaktoryzacji

86
Od codziennej higieny kodu do strategicznej refaktoryzacji @MichalBartyzel blog.gettingThingsProgrammed.pl

Transcript of Od codziennej higieny do strategicznej refaktoryzacji

Page 1: Od codziennej higieny do strategicznej refaktoryzacji

Od codziennej higieny kodu

do strategicznejrefaktoryzacji

@MichalBartyzelblog.gettingThingsProgrammed.pl

Page 2: Od codziennej higieny do strategicznej refaktoryzacji

Kod, który czyta się jak książkę

#CodeSpeaks2U

Tell, Don’t Ask

#CodeReadability

Samodokumentujący się kod

Page 3: Od codziennej higieny do strategicznej refaktoryzacji

Kluczem do #softwareCraftsmanship są umiejętności lingwistyczne

Nazywanie

Page 4: Od codziennej higieny do strategicznej refaktoryzacji

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

Page 5: Od codziennej higieny do strategicznej refaktoryzacji

Programujesz to, co nazywaszZwiększamy efektywność zespołów projektowych5

List<Employee> employees...

//...

EmployeeFile employeeFile = findEmployeeFile( personalID );

employeeFile.getEmergencyContactInformation();

Page 6: Od codziennej higieny do strategicznej refaktoryzacji

A potem powstaje architektura Zwiększamy efektywność zespołów projektowych6

List<Employee> employees...

//...

EmployeeFile employeeFile = findEmployeeFile( personalID );

employeeFile.getEmergencyContactInformation();

Page 7: Od codziennej higieny do strategicznej refaktoryzacji

I dzieją się z nią dziwne rzeczyZwiększamy efektywność zespołów projektowych7

Page 8: Od codziennej higieny do strategicznej refaktoryzacji

Co chcemy zacząć zauważać?

Zwiększamy efektywność zespołów projektowych8

Page 9: Od codziennej higieny do strategicznej refaktoryzacji

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

Page 10: Od codziennej higieny do strategicznej refaktoryzacji

Zwiększamy efektywność zespołów projektowych10

Page 11: Od codziennej higieny do strategicznej refaktoryzacji

Zwiększamy efektywność zespołów projektowych11

Klasy

Page 12: Od codziennej higieny do strategicznej refaktoryzacji

Zwiększamy efektywność zespołów projektowych12

Konwencje

Page 13: Od codziennej higieny do strategicznej refaktoryzacji

Zwiększamy efektywność zespołów projektowych13

Metody

Page 14: Od codziennej higieny do strategicznej refaktoryzacji

Extract Method?

ZmienneZwiększamy efektywność zespołów projektowych14

Page 15: Od codziennej higieny do strategicznej refaktoryzacji

Zwiększamy efektywność zespołów projektowych15

Axel Fontaine, Architecting for Continuous Deliveryhttp://2013.33degree.org/talk/show/51

Pakiety

Page 16: Od codziennej higieny do strategicznej refaktoryzacji

Biznes ARCH Klasy Metody Zmienne

Smell Zmienna quasi-globalna

Przykład

Refaktor.

Brak umiejętności nazywaniaZwiększamy efektywność zespołów projektowych16

Page 17: Od codziennej higieny do strategicznej refaktoryzacji

Biznes ARCH Klasy Metody Zmienne

Smell Zmienna quasi-globalna

Przykład tmp1, tmp2, tmp3

Refaktor.

Brak umiejętności nazywaniaZwiększamy efektywność zespołów projektowych17

Page 18: Od codziennej higieny do strategicznej refaktoryzacji

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 nazywaniaZwiększamy efektywność zespołów projektowych18

Page 19: Od codziennej higieny do strategicznej refaktoryzacji

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 nazywaniaZwiększamy efektywność zespołów projektowych19

Page 20: Od codziennej higieny do strategicznej refaktoryzacji

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 nazywaniaZwiększamy efektywność zespołów projektowych20

Page 21: Od codziennej higieny do strategicznej refaktoryzacji

Biznes ARCH Klasy Metody Zmienne

Smell Long Method Zmienna quasi-globalna

Przykład process, performOperation

tmp1, tmp2, tmp3

Refaktor. Extract Methodhttp://refactoring.com

Split Temporary Variable http://refactoring.com

Brak umiejętności nazywaniaZwiększamy efektywność zespołów projektowych21

Page 22: Od codziennej higieny do strategicznej refaktoryzacji

Biznes ARCH Klasy Metody Zmienne

Smell God Class Long Method Zmienna quasi-globalna

Przykład process, performOperation

tmp1, tmp2, tmp3

Refaktor. Extract Methodhttp://refactoring.com

Split Temporary Variable http://refactoring.com

Brak umiejętności nazywaniaZwiększamy efektywność zespołów projektowych22

Page 23: Od codziennej higieny do strategicznej refaktoryzacji

Biznes ARCH Klasy Metody Zmienne

Smell God Class Long Method Zmienna quasi-globalna

Przykład LocationManager, NetworkItem

process, performOperation

tmp1, tmp2, tmp3

Refaktor. Extract Methodhttp://refactoring.com

Split Temporary Variable http://refactoring.com

Brak umiejętności nazywaniaZwiększamy efektywność zespołów projektowych23

Page 24: Od codziennej higieny do strategicznej refaktoryzacji

Biznes ARCH Klasy Metody Zmienne

Smell God Class Long Method Zmienna quasi-globalna

Przykład LocationManager, NetworkItem

process, performOperation

tmp1, tmp2, tmp3

Refaktor. Extract Classhttp://refactoring.com

Extract Methodhttp://refactoring.com

Split Temporary Variable http://refactoring.com

Brak umiejętności nazywaniaZwiększamy efektywność zespołów projektowych24

Page 25: Od codziennej higieny do strategicznej refaktoryzacji

Biznes ARCH Klasy Metody Zmienne

Smell Big Ball of Mudhttp://laputan.org/mud/

God Class Long Method Zmienna quasi-globalna

Przykład LocationManager, NetworkItem

process, performOperation

tmp1, tmp2, tmp3

Refaktor. Extract Classhttp://refactoring.com

Extract Methodhttp://refactoring.com

Split Temporary Variable http://refactoring.com

Brak umiejętności nazywaniaZwiększamy efektywność zespołów projektowych25

Page 26: Od codziennej higieny do strategicznej refaktoryzacji

Biznes ARCH Klasy Metody Zmienne

Smell Big Ball of Mudhttp://laputan.org/mud/

God Class Long Method Zmienna quasi-globalna

Przykład Genreic Plugin Framework,Multi-Device Platform

LocationManager, NetworkItem

process, performOperation

tmp1, tmp2, tmp3

Refaktor. Extract Classhttp://refactoring.com

Extract Methodhttp://refactoring.com

Split Temporary Variable http://refactoring.com

Brak umiejętności nazywaniaZwiększamy efektywność zespołów projektowych26

Page 27: Od codziennej higieny do strategicznej refaktoryzacji

Biznes ARCH Klasy Metody Zmienne

Smell Big Ball of Mudhttp://laputan.org/mud/

God Class Long Method Zmienna quasi-globalna

Przykład Genreic Plugin Framework,Multi-Device Platform

LocationManager, NetworkItem

process, performOperation

tmp1, tmp2, tmp3

Refaktor. Wprowadź wzorzec architektoniczny

Extract Classhttp://refactoring.com

Extract Methodhttp://refactoring.com

Split Temporary Variable http://refactoring.com

Brak umiejętności nazywaniaZwiększamy efektywność zespołów projektowych27

Page 28: Od codziennej higieny do strategicznej refaktoryzacji

Biznes ARCH Klasy Metody Zmienne

Smell Sexy Vision Big Ball of Mudhttp://laputan.org/mud/

God Class Long Method Zmienna quasi-globalna

Przykład Genreic Plugin Framework,Multi-Device Platform

LocationManager, NetworkItem

process, performOperation

tmp1, tmp2, tmp3

Refaktor. Wprowadź wzorzec architektoniczny

Extract Classhttp://refactoring.com

Extract Methodhttp://refactoring.com

Split Temporary Variable http://refactoring.com

Brak umiejętności nazywaniaZwiększamy efektywność zespołów projektowych28

Page 29: Od codziennej higieny do strategicznej refaktoryzacji

Biznes ARCH Klasy Metody Zmienne

Smell Sexy Vision Big Ball of Mudhttp://laputan.org/mud/

God Class Long Method Zmienna quasi-globalna

Przykład ZSI, BI, DW Genreic Plugin Framework,Multi-Device Platform

LocationManager, NetworkItem

process, performOperation

tmp1, tmp2, tmp3

Refaktor. Wprowadź wzorzec architektoniczny

Extract Classhttp://refactoring.com

Extract Methodhttp://refactoring.com

Split Temporary Variable http://refactoring.com

Brak umiejętności nazywaniaZwiększamy efektywność zespołów projektowych29

Page 30: Od codziennej higieny do strategicznej refaktoryzacji

Biznes ARCH Klasy Metody Zmienne

Smell Sexy Vision Big Ball of Mudhttp://laputan.org/mud/

God Class Long Method Zmienna quasi-globalna

Przykład ZSI, BI, DW Genreic Plugin Framework,Multi-Device Platform

LocationManager, NetworkItem

process, performOperation

tmp1, tmp2, tmp3

Refaktor. Zdefiniuj, podziel, zmień proces

Wprowadź wzorzec architektoniczny

Extract Classhttp://refactoring.com

Extract Methodhttp://refactoring.com

Split Temporary Variable http://refactoring.com

Brak umiejętności nazywaniaZwiększamy efektywność zespołów projektowych30

Page 31: Od codziennej higieny do strategicznej refaktoryzacji

Biznes ARCH Klasy Metody Zmienne

Smell Sexy Vision Big Ball of Mudhttp://laputan.org/mud/

God Class Long Method Zmienna quasi-globalna

Przykład ZSI, BI, DW Genreic Plugin Framework,Multi-Device Platform

LocationManager, NetworkItem

process, performOperation

tmp1, tmp2, tmp3

Refaktor. Zdefiniuj, podziel, zmień proces

Wprowadź wzorzec architektoniczny

Extract Classhttp://refactoring.com

Extract Methodhttp://refactoring.com

Split Temporary Variable http://refactoring.com

Brak umiejętności nazywaniaZwiększamy efektywność zespołów projektowych31

Page 32: Od codziennej higieny do strategicznej refaktoryzacji

#odpowiedzialność to rola/zadanie wyrażone nazwą

#dobraNazwa przychodzi z czasem

Page 33: Od codziennej higieny do strategicznej refaktoryzacji

Kryterium czytelności kodu: #testIvony

Code Speaks 2U

Page 34: Od codziennej higieny do strategicznej refaktoryzacji

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; }}

Page 35: Od codziennej higieny do strategicznej refaktoryzacji

public void add(Object element) {

if (readOnly) { return; } if (atCapacity()) { grow(); } addElement(element);}

Page 36: Od codziennej higieny do strategicznej refaktoryzacji

#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• …

Page 37: Od codziennej higieny do strategicznej refaktoryzacji
Page 38: Od codziennej higieny do strategicznej refaktoryzacji

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();        }    }

Page 39: Od codziennej higieny do strategicznej refaktoryzacji

Zwiększamy efektywność zespołów projektowych39

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 {

//...

Page 40: Od codziennej higieny do strategicznej refaktoryzacji

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

Page 41: Od codziennej higieny do strategicznej refaktoryzacji

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

Page 42: Od codziennej higieny do strategicznej refaktoryzacji

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

Page 43: Od codziennej higieny do strategicznej refaktoryzacji

#testIvony Posłuchaj czytanego kodu:

1. Zrozumiałe -> czytelny2. Niezrozumiałe -> nieczytelny

Page 44: Od codziennej higieny do strategicznej refaktoryzacji

#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

Page 45: Od codziennej higieny do strategicznej refaktoryzacji

if ("".equals(m_Action) || "Cancel".equalsIgnoreCase(m_sAction) {

if ( actionCancelled( m_sAction ) ) {

Page 46: Od codziennej higieny do strategicznej refaktoryzacji

#uwazneKomentowanie

#scaffoldingRefactoring

1. Dodaj tymczasowe komentarze2. Nazwij warunki logiczne3. Pogrupuj zmienne leniwie4. Popraw wrażenia wizualne

Page 47: Od codziennej higieny do strategicznej refaktoryzacji

#NCR Natural Course of Refactoring: an intuitive #refactoringWorkflow #continuousRefactoring

Natural Course of Refactoring®

Page 48: Od codziennej higieny do strategicznej refaktoryzacji
Page 49: Od codziennej higieny do strategicznej refaktoryzacji
Page 50: Od codziennej higieny do strategicznej refaktoryzacji
Page 51: Od codziennej higieny do strategicznej refaktoryzacji

#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

Page 52: Od codziennej higieny do strategicznej refaktoryzacji

#everydayRefactoring

#strategicRefactoring

Page 53: Od codziennej higieny do strategicznej refaktoryzacji

Niektóre fragmenty kodu zawsze będą cuchnąć. Naucz się z tym żyć #codeSmell

Refaktoryzować?

Page 54: Od codziennej higieny do strategicznej refaktoryzacji

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/Frequen

t changes

Heaven

Strategiczna refaktoryzacja54

Confront with:• team opinions

• business strategy

Frequency of changes

Complexity

Page 55: Od codziennej higieny do strategicznej refaktoryzacji

Core Domain?

Page 56: Od codziennej higieny do strategicznej refaktoryzacji
Page 57: Od codziennej higieny do strategicznej refaktoryzacji

Core Domain

1 programista, 6 miesięcy, PHP

Page 58: Od codziennej higieny do strategicznej refaktoryzacji

Nową funkcjonalność rozwijaj osobno w powiązanym kontekście

Strategiczna refaktoryzacja58

Bubble Context

Page 59: Od codziennej higieny do strategicznej refaktoryzacji

#refaktoryzacja to przede wszystkim wyzwanie organizacyjne, a nie techniczne #strategicRefactoring

Zarządzanie

Page 60: Od codziennej higieny do strategicznej refaktoryzacji

#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

Page 61: Od codziennej higieny do strategicznej refaktoryzacji

…a o co chodzi?

Page 62: Od codziennej higieny do strategicznej refaktoryzacji

Nazwij problemy• Specjalizacja programistów• Multitasking• Duża ilość nieużywanego kodu• Leciwe technologie• Nadwyrężona odpowiedzialność widoków• Nieefektywne spotkania

Page 63: Od codziennej higieny do strategicznej refaktoryzacji

Mierz, co się da

Page 64: Od codziennej higieny do strategicznej refaktoryzacji

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…

Page 65: Od codziennej higieny do strategicznej refaktoryzacji

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

Page 66: Od codziennej higieny do strategicznej refaktoryzacji

#refaktoryzacja sprawia kłopoty, bo robisz zbyt wiele rzeczy na raz

Małe kroki

Page 67: Od codziennej higieny do strategicznej refaktoryzacji

Programowanie jest #fajne

Page 68: Od codziennej higieny do strategicznej refaktoryzacji

//TODO: Wczytaj plik CSV

public String[][] readCSV(String filePath );

Page 69: Od codziennej higieny do strategicznej refaktoryzacji

Pojawił się błąd w bazie…

Page 70: Od codziennej higieny do strategicznej refaktoryzacji

To pewnie w serwisie…

Page 71: Od codziennej higieny do strategicznej refaktoryzacji

albo w widoku…

Page 72: Od codziennej higieny do strategicznej refaktoryzacji

albo w konfigu…

Page 73: Od codziennej higieny do strategicznej refaktoryzacji

albo w konfigu…

Page 74: Od codziennej higieny do strategicznej refaktoryzacji

Zasada zaangażowania

Page 75: Od codziennej higieny do strategicznej refaktoryzacji

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 • …

Page 76: Od codziennej higieny do strategicznej refaktoryzacji

DUŻE KROKI to Odczucie ***

Page 77: Od codziennej higieny do strategicznej refaktoryzacji

Najlepsze strategie skutecznych programistów

77Technika Małych Kroków

Krok := zmiana/dodanie instrukcji

Page 78: Od codziennej higieny do strategicznej refaktoryzacji

Najlepsze strategie skutecznych programistów

78Technika Małych Kroków

Małe Kroki w refaktoryzacji

Uważne komentowanieZmiany nazwLeniwe przestawianie zmiennychPrzyrostowe odtwarzanie testów

Page 79: Od codziennej higieny do strategicznej refaktoryzacji

?

Page 80: Od codziennej higieny do strategicznej refaktoryzacji

• ~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

@MichalBartyzelSzkoła Agile - Planowanie by Michał Bartyzel80

Page 81: Od codziennej higieny do strategicznej refaktoryzacji

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

Page 82: Od codziennej higieny do strategicznej refaktoryzacji

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

Page 83: Od codziennej higieny do strategicznej refaktoryzacji

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.

Page 84: Od codziennej higieny do strategicznej refaktoryzacji

gettingThingsProgrammed.evenea.pl

Page 85: Od codziennej higieny do strategicznej refaktoryzacji

Architectural Kata• Zobacz program warsztatu

– https://biturl.io/VK4j52

• Zobacz fragment warsztatu– https://biturl.io/VK4Vn8

• Zobacz efekt warsztatu– https://biturl.io/VK4ai0

Page 86: Od codziennej higieny do strategicznej refaktoryzacji

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