SlideShare a Scribd company logo
@andreafrancia
Introduzione alle
pratiche ingegneristiche
di eXtreme Programming
Andrea Francia

Agile Day(s) 2018 a Brescia

10 novembre 2018
@andreafrancia
Chi sono
Sono un programmatore da
tanto tempo
@andreafrancia
Faccio cose
Trovo comodo usare i test
automatici per lavorare
Occasionalmente faccio il
coach (di TDD)
Conduco il TDD Milano
Ho un progetto open source
Ho cambiato un sacco di
aziende
@andreafrancia
Mi ero fatto un idea di cosa
fosse l’ingegneria del software
@andreafrancia
Ma poi …
Le pratiche ingegneristiche di eXtreme Programming
@andreafrancia
Test >
Documentazione
@andreafrancia
@andreafrancia
Cos’è XP?
@andreafrancia
@andreafrancia
Quanti ce ne restano?
Survived ?
Survived !
@andreafrancia
Scrum
@andreafrancia
Scrum in breve
(secondo me)
• Team crossfunzionali

• Team che si auto organizzano

• Rilasci incrementali

• Timeboxing (1 settimana o più)

• Pianificazione continua

• Plan-Do-Check-Act
@andreafrancia
XP Scrum
(about programming) (anything)
Iterations Sprints
Planning Game Sprint Planning Meeting
Stories/Cards Product Backlog Items
Not so fixed Fixed Sprint Backlog
Engineering Practices See XP
Engineering Practices: TDD, Pair Prorgramming, Simple Design, Refactoring
@andreafrancia
 XP ❤ Scrum
https://medium.com/agile-outside-the-box/better-together-xp-and-scrum-c69bf9bffcff
@andreafrancia
Scrum + Technical
practices ≈ XP
@andreafrancia
Scrum - Technical
practices = ?
@andreafrancia
@andreafrancia
Come vanno le cose
in un progetto XP?
@andreafrancia
In un progetto XP …
• In ogni momento c’è un sistema funzionante (*) &&

• Periodicamente al sistema vengono aggiunte nuove
feature (*) &&

• Non ci sono regressioni (*) &&

• Il sistema risolve un problema del cliente <— (oggi non ne
parliamo però)

(*) in produzione
@andreafrancia
Per ottenere questi risultati
i programmatori impiegano
le pratiche di XP
@andreafrancia
Quali sono le pratiche
ingegneristiche?
Le pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme Programming
@andreafrancia
Quante sono le 12 pratiche XP?
12!
1999
13! 2002
13! 24!
2004
@andreafrancia
~50
Quante sono le 12 pratiche XP?
@andreafrancia
Le pratiche
ingegneristiche (*)
(*) solo le classiche
@andreafrancia
Pair Programming – tutto il codice di
produzione è scritto da due
programmatori che lavorano sullo
stesso computer.
@andreafrancia
Simple Design – il sistema viene
mantenuto il più semplice possibile
rimuovendo ogni complessità non
appena scoperta.
@andreafrancia
Testing – i programmatori scrivono
continuamente nuovi unit test che devono sempre
passare tutti perché lo sviluppo possa continuare.
Anche i clienti scrivono test. I test dei clienti
devono dimostrare che una feature è conclusa.
@andreafrancia
Refactoring – i programmatori ristrutturano
il sistema senza cambiarne il
comportamento per: rimuovere
duplicazione, migliorarne l’espressività, per
semplificarlo, or per aggiungergli flessibilità.
@andreafrancia
Collective Ownership – Chiunque, in
ogni momento, e dovunque nel sistema
può modificare il codice.
@andreafrancia
Continuous integration – il sistema
viene integrato e ricostruito più volte al
giorno, ogni volta che si finisce un task.
@andreafrancia
Coding standards – i programmatori
scrivono tutto il codice in accordo a
delle regole che supportino la
comunicazione attraverso il codice.
@andreafrancia
La mia esperienza
con le pratiche
@andreafrancia
Pair Programming
@andreafrancia
L’antenato del pair
programming è la
revisione tecnica formale.
@andreafrancia
8 ore di pair
programming sono
troppe (*)
@andreafrancia
Come lo posso introdurre
nel mio team?
• Non chiedete il permesso di fare Pair Programming.

• Quando c’è qualcosa di difficile da fare chiedete aiuto.

• Quando c’è qualcuno in difficoltà offrigli il tuo aiuto.
@andreafrancia
Pair Programming e
produttività
• Uno per minare la produttività di un team è dare obiettivi
diversi ad ogni membro del team.

• Gli obiettivi di team dovrebbero essere ordinati per priorità
e non assegnati alle singole persone. 

• Tutti i membri del team dovrebbero auto-organizzarsi per
chiudere prima i task a più alta priorità
@andreafrancia
Pre-requisiti e aiuto
• Codice Condiviso (tra tutto il team)

• Priorità sui task condivisa

• Credere che far rivedere il codice ad un altra persona
abbia un valore
@andreafrancia
Dove venire a sperimentarlo
• Global Day of Code Retreat (17 novembre 2018)

• https://www.coderetreat.org/

• Incontri del vostro XPUG (o del TDD Milano)
@andreafrancia
Collective Code Ownership
• Tutto il codice codice appartiene al progetto, non al
singolo programmatore.

• Se una coppia incontra un pezzo di codice che può
essere migliorato lo migliora.

• Se una coppia ha bisogno di modificare un pezzo di
codice per implementare una feature lo modifica.
@andreafrancia
Coding Standards
@andreafrancia
La pratica più
fastidiosa, o forse no?
@andreafrancia
Non è solo una questione
di graffa su o graffa giù.
@andreafrancia
@andreafrancia
Coding Standards
• I programmatori si accordano su uno standard di sviluppo
condiviso e accettato volontariamente.
@andreafrancia
Non è necessario
scrivere un documento!
@andreafrancia
Tradizione orale +
“buon” esempio
@andreafrancia
Esempi di regole che
abbiamo usato
• Dividere i commit di Refactor da quelli di cambio del
comportamento

• Committare solo in verde

• Committare spesso in verde

• Mai cambiare la formattazione di un file che alla fine non
andava modificato

• End-of-line alla fine del file

• Tastiera US -vs- International o italiana
@andreafrancia
@andreafrancia
Testing automatico
@andreafrancia
Pratica utile
indipendentemente da
XP
@andreafrancia
È l’alternativa al
debugging disperato
@andreafrancia
È indispensabile per il
refactor
@andreafrancia
“non puoi sempre
metterci un taccone”
@andreafrancia
“hai cambiato un
codice che funzionava!”
@andreafrancia
“se non è rotto non
aggiustarlo!”
@andreafrancia
I framework xUnit ci sono
per qualsiasi linguaggio
@andreafrancia
Se non ci sono si creano
Two kind of tests
• unit test written by the programmers to convince
themselves that their programs work the way they think
the program work.

• functional tests written by (or at least specified by) the
customers to convince themselves that the system as a
whole works the way they think the system as a whole
should work.
eXtreme Programming explained 1st ed - Kent Beck - p. 47
@andreafrancia
Da dove iniziare?
@andreafrancia
Fate 20 minuti di pratica
ogni mattina con jUnit,
fate un kata
@andreafrancia
Andate a (o fondate)
un meetup sul TDD
@andreafrancia
Non chiedete al
management di poter
testare
@andreafrancia
Al posto di fare il debug a
mano fate dei main()
alternativi
@andreafrancia
Quando vi chiedono di
aggiustare un baco scrivete
prima un test che lo verifica
@andreafrancia
Design incrementale
@andreafrancia
Design incrementale
• Si evita il Big Design Up Front

• Nel codice è presente solo quanto design basta per
soddisfare i requisiti correnti.

• Il design del sistema è il più semplice possibile, si toglie il
superfluo. (semplice non vuol dire facile)

• Quando il design a disposizione non è più sufficiente ne
iniettiamo dell’altro.
@andreafrancia
Simple Design
Ad un dato momento il giusto design per un software è
quello che:

1.Fa passare tutti i test.

2.Non contiene logica duplicata

3.Rende chiaro il motivo per è stato scritto

4.Contiene il numero minimo di elementi
@andreafrancia
Usare il simple design
per valutare un refactor
@andreafrancia
Se un refactor non
migliora il design si butta
@andreafrancia
Refactor
@andreafrancia
È l’unico modo che
abbiamo per iniettare
design nel codice
@andreafrancia
Se non hai test te lo
sogni, non hai idea di
dove puoi arrivare
@andreafrancia
Una volta facevo
refactor senza test…
@andreafrancia
Refactor e test lenti
@andreafrancia
Architettura
esagonale
@andreafrancia
Anche i test chiedono
il refactor
@andreafrancia
Quando fare refactor?
@andreafrancia
Refactor prima
• “When implementing a program feature, the programmers
always ask if there is a way of changing the existing
program to make adding the feature simple.”
@andreafrancia
Mikado Method
http://www.methodsandtools.com/archive/mikado.php
@andreafrancia
Refactor dopo
• Dopo aver aggiunto una feature i programmatori si
chiedono se riescono a vedere dei modi per rendere il
programma più semplice (i test intanto devono continuare
a funzionare)
@andreafrancia
Refactor per semplificare (1)
• Si può aumentare l’espressività del codice, esempi: 

• aggiungere nomi

• migliorare nomi

• promuovere simmetria
@andreafrancia
Refactor per semplificare (2)
• Si può rimuovere codice superfluo:

• rimuovendo la duplicazione

• rimuovendo codice non usato

• rimuovendo sovrastrutture che ora non servono più
@andreafrancia
Quando il sistema chiede
Refactor?
• Quando c’è della duplicazione

• Quando è difficile mettere sotto test una classe o un
metodo

• Quando modifichi un comportamento e poi si rompono N
test

• Quando provando a raccontare cosa fa il codice ad un
altro programmatore ti accorgi di usare parole diverse da
quelle nel codice
@andreafrancia
Test-First
@andreafrancia
Test-First ≠ TDD
Why Test First?
• The test gives me a chance to think about what I want
independent of how it will be implemented. 

• Then the test tell me if I implement what I thought I
implemented.
Le pratiche ingegneristiche di eXtreme Programming
@andreafrancia
Test-Driven
Development
@andreafrancia
Gli ingredienti di TDD
• Lo sviluppo è incrementale

• I test scritti prima del codice (Test First)

• Il design applicato in maniera incrementale e continua
(Incremental Design)
@andreafrancia
Pseudo-TDD
• Penso ad una soluzione

• Mi immagino un insieme di classi e funzioni che so che avrò
bisogno di creare

• Scrivo qualche test che ne verifica l’esistenza

• Lancio tutti i test e li vedo fallire

• Implemento un po’ di roba

• Lancio tutti i test e li vedo fallire

• Vado di debug duro

• Lancio tutti i test e passano

• (Opzionale) Da qualche parte mi metto un TODO dicendo di
ritornare a pulire più avanti
@andreafrancia
Il ritmo del TDD
1. aggiungi velocemente un test
2. lancia tutti i test, vedi quello nuovo fallire
3. fai una piccola modifica
4. lancia tutti i test, vedi che tutti passano
5. fai refactor per rimuovere la duplicazione
Test Driven Development: By Example by Beck, Kent
@andreafrancia
La TODO list
http://www.eecs.yorku.ca/course_archive/2003-04/W/3311/sectionM/case_studies/money/
KentBeck_TDD_byexample.pdf
@andreafrancia
Le tre leggi del TDD
1. Non ti è permesso scrivere codice di produzione a meno
che non sia per fare passare un test che sta fallendo.

2. Non ti è permesso aggiungere codice ad un test più di
quello che sia sufficiente a farlo fallire; e gli errori di
compilazione contano come fallimenti.

3. Non ti è permesso aggiungere più codice di produzione
di quello che sia sufficiente per far passare un test che
fallisce.
@andreafrancia
I colori del TDD
1. Parti pulito

2. Aggiungi velocemente un test, lancia tutti i
test e vedi fallire quello nuovo

3. Fai una piccola modifica (al codice di
produzione), lancia tutti i test e vedi che ora
passano tutti

4. Un passo alla volta rimuovi tutta la
duplicazione, ad ogni passo lancia i test e
vedili passare tutti. (Refactor)
FAIL
PASS
PASS
PASS
PASS
PASS
…
@andreafrancia
Il refactor in TDD
all tests
passing
one
failing
test
Aggiungi velocemente un test
Fai una piccola modifica 

al codice di produzione
Refactor
Le pratiche ingegneristiche di eXtreme Programming
When refactor?
Test lenti e test veloci
Le pratiche ingegneristiche di eXtreme Programming
Michael Feathers. 2004. Working Effectively with Legacy Code. Prentice Hall
Michael Feathers. 2004. Working Effectively with Legacy Code. Prentice Hall
What is not unit test?
A test is not a unit test if:
1.It talks to a database.
2.It communicates across a network.
3.It touches the file system.
4.Requires some manual set-up
Working Effectively with Legacy Code - Michael Feathers
Michael Feathers. 2004. Working Effectively with Legacy Code. Prentice Hall
• fast
• reliable
• slow
• fragile
http://www.mountaingoatsoftware.com/blog/the-forgotten-layer-of-the-test-automation-pyramid
@andreafrancia
Continuous
Integration
Le pratiche ingegneristiche di eXtreme Programming
@andreafrancia
Continuous
Integration ≠ Jenkins
@andreafrancia
Continuous
Integration ≠ Git Flow
@andreafrancia
Continuous Integration
≠ merge da master
@andreafrancia
Cosa vuol dire integrare
due linee di sviluppo?
@andreafrancia
I problemi di integrazione
crescono in modo super
lineare con il tempo
@andreafrancia
I problemi di integrazione
crescono con la
dimensione della codebase
@andreafrancia
Integrazione continua
applicata alle dipendenze
@andreafrancia
Daily deployment
(una specie di
integrazione continua)
Il rosso giusto
Le pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme Programming
@andreafrancia
Grazie
Vorresti che lavorassi per te?
Chiamami
+39 3209437233

More Related Content

PDF
TDD patterns and TDD strategies
PDF
Agile requirements - alla ricerca del filo rosso (iad 2013)
PPTX
Effective Code Transformations in C++
ODP
TDD Casi Studio
PDF
Software Testing e TDD
PPTX
Test Driven Development @ Xe.Net
PPTX
Unit Testing
PDF
Le 12 pratiche
TDD patterns and TDD strategies
Agile requirements - alla ricerca del filo rosso (iad 2013)
Effective Code Transformations in C++
TDD Casi Studio
Software Testing e TDD
Test Driven Development @ Xe.Net
Unit Testing
Le 12 pratiche

Similar to Le pratiche ingegneristiche di eXtreme Programming (20)

PDF
Lezione 3: Sviluppo in Extreme Programming
PPT
Introduzione al Test Driven Development
PPT
Detailed Model Capture
PPT
Detailed Model Capture
PDF
Una fugace occhiata al Test Driven Development (2006)
PDF
Intoduzione Alle Metodologie Agili
PDF
AntiPatterns: i vizi del programmatore
PDF
Presentazione eXtreme Programming
PDF
The simplest thing that could possibly work
ODP
PDF
Slide evento Code Refactoring JavaScript
PDF
Java Unit Testing - Introduction
PPTX
Inversion of Control @ CD2008
PDF
Xe One Day - Adaptive Code
PDF
Spaghetti code refactoring
PDF
Come scrivere software SOLID(O)
PDF
Come scrivere software SOLID(O)
PPT
Agile software lifecycle
PPT
Software development nel mondo industriale
PDF
Stop Meeting, Start Coding!
Lezione 3: Sviluppo in Extreme Programming
Introduzione al Test Driven Development
Detailed Model Capture
Detailed Model Capture
Una fugace occhiata al Test Driven Development (2006)
Intoduzione Alle Metodologie Agili
AntiPatterns: i vizi del programmatore
Presentazione eXtreme Programming
The simplest thing that could possibly work
Slide evento Code Refactoring JavaScript
Java Unit Testing - Introduction
Inversion of Control @ CD2008
Xe One Day - Adaptive Code
Spaghetti code refactoring
Come scrivere software SOLID(O)
Come scrivere software SOLID(O)
Agile software lifecycle
Software development nel mondo industriale
Stop Meeting, Start Coding!
Ad

More from Andrea Francia (20)

PDF
Baby Steps TripServiceKata
PDF
TDD on Legacy Code - Voxxed Days Milano 2019
PDF
Lavorare con codice legacy “non testabile” - Incontro DevOps - 8 marzo 2019 -...
PDF
Kata in Bash a DevOpsHeroes 2018 a Parma
PDF
User Stories - Andrea Francia @ WeDev 7 novembre 2018
PDF
Test-Driven Development su Codice Esistente
PDF
Come si applica l'OCP
PDF
Le 12 pratiche - Un introduzione a XP (Mini Italian Agile Day)
PDF
Introduzione a eXtreme Programming
PDF
Test-Driven Development e Sviluppo Incrementale (TDD-Milano 2017-01-10)
PDF
Bash-Only Deployment
PDF
TDD anche su iOS
PDF
Piccolo coding dojo (milano xpug 2013-04-11)
PDF
Tutti i miei sbagli (Errori di un wannabe Open Source Developer)
PDF
Tutti i miei sbagli, versione 7 Marzo 2012 al XPUG mi
PDF
Writing a Crawler with Python and TDD
PPT
Introduzione al TDD
PPT
Google C++ Testing Framework in Visual Studio 2008
PPT
Subversion @ JUG Milano 11 dic 2009
PPT
Working Effectively with Legacy Code (draft)
Baby Steps TripServiceKata
TDD on Legacy Code - Voxxed Days Milano 2019
Lavorare con codice legacy “non testabile” - Incontro DevOps - 8 marzo 2019 -...
Kata in Bash a DevOpsHeroes 2018 a Parma
User Stories - Andrea Francia @ WeDev 7 novembre 2018
Test-Driven Development su Codice Esistente
Come si applica l'OCP
Le 12 pratiche - Un introduzione a XP (Mini Italian Agile Day)
Introduzione a eXtreme Programming
Test-Driven Development e Sviluppo Incrementale (TDD-Milano 2017-01-10)
Bash-Only Deployment
TDD anche su iOS
Piccolo coding dojo (milano xpug 2013-04-11)
Tutti i miei sbagli (Errori di un wannabe Open Source Developer)
Tutti i miei sbagli, versione 7 Marzo 2012 al XPUG mi
Writing a Crawler with Python and TDD
Introduzione al TDD
Google C++ Testing Framework in Visual Studio 2008
Subversion @ JUG Milano 11 dic 2009
Working Effectively with Legacy Code (draft)
Ad

Le pratiche ingegneristiche di eXtreme Programming