Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Lezione 1
Intro
Scrum è un metodo di lavoro agile. Il termine è stato preso dal rugby e fa riferimento a un
modo di riprendere il gioco dopo un'interruzione accidentale o quando la palla esce dal
campo.
Scrum è un approccio "a staffetta" allo sviluppo di prodotti, in cui una squadra cerca di
avanzare insieme, passandosi il "pallone" del lavoro avanti e indietro, il che può essere più
efficace per le esigenze competitive odierne rispetto a un approccio basato sulla massima
velocità e flessibilità.
Scrum inizia con la creazione di un "product backlog", una lista prioritizzata delle funzionalità
necessarie per sviluppare un prodotto di successo. Il lavoro viene eseguito in iterazioni di
breve durata, e alla fine di ogni iterazione, il team rivede le funzionalità completate con gli
stakeholder e può apportare modifiche ai piani futuri.
Scrum è adatto per affrontare domini complessi in cui gran parte delle informazioni è
sconosciuta. È basato su principi come l'esplorazione rapida di nuove idee, il rapido
apprendimento da soluzioni viable e la presentazione di risultati funzionanti ogni poche
settimane per ottenere feedback.
Lo Scrum utilizza iterazioni adattive chiamate "sprint". Tutte le fasi sono eseguite insieme,
lavorando su una caratteristica alla volta. Alla fine di uno sprint si crea un incremento di
prodotto valido che include alcune delle funzionalità del prodotto. Questo incremento deve
essere integrato e testato con le funzionalità sviluppate in precedenza, altrimenti non è
considerato completo. Il feedback costante guida la progettazione del prodotto.
Lo Scrum abbraccia la variabilità e l'incertezza, riconoscendo che sono necessarie per
costruire qualcosa di nuovo. Promuove l'ispezione, l'adattamento e la trasparenza per
gestire la variabilità e ridurre simultaneamente tutte le forme di incertezza.
Gli altri principi chiave dello Scrum includono la validazione delle assunzioni importanti in
modo tempestivo, l'uso di molteplici cicli di apprendimento simultanei e l'organizzazione del
flusso di lavoro per ottenere un feedback rapido.
Inoltre, lo Scrum incoraggia a "andare veloce ma mai affrettarsi", a costruire la qualità in ogni
passaggio e ad adottare una cerimonia minima ma sufficiente per evitare la burocrazia
eccessiva.
Lo Scrum è ideale per progettare nuovi prodotti in un contesto complesso e in evoluzione,
promuovendo il cambiamento, l'adattamento e il feedback costante.
Lezione 3
Sprints
Le "Sprint" rappresentano un componente essenziale del framework Scrum. Si tratta di
iterazioni di lavoro con una durata massima di un mese, definite da un obiettivo che non
dovrebbe essere modificato una volta iniziato. Le Sprint sono caratterizzate da date di inizio
e fine fisse e seguono il principio del "timeboxing", una tecnica di gestione del tempo che
aiuta a organizzare il lavoro e a gestire lo scopo. Le Sprint sono di breve durata per favorire
la pianificazione e l'ispezione continua del lavoro.
È importante evitare cambiamenti significativi dopo la pianificazione della Sprint, poiché ciò
può comportare costi aggiuntivi e una perdita di fiducia nel team. Tuttavia, Scrum è anche
flessibile e consente di affrontare situazioni eccezionali, come la terminazione anticipata di
una Sprint, in modo pragmatico. La Sprint dovrebbe produrre un incremento potenzialmente
consegnabile, conforme a una definizione di "Done" concordata, che dovrebbe evolvere nel
tempo. Done è una sorta di checklist di ciò che dobbiamo realizzare nello spring, secondo il
lato del cliente e non il nostro punto di vista. Se la checklist è finita, abbiamo finito lo spring.
Acceptance test: Determine if the backlog item functions as desired
Le storie degli utenti sono utilizzate per esprimere i requisiti in Scrum. Sono semplici,
comprensibili sia per il business che per i team tecnici e possono essere scritte a diversi
livelli di granularità. Il formato delle storie degli utenti è descritto come "scheda,
conversazione e conferma".
Vengono introdotti i criteri "INVEST" per valutare le storie degli utenti: Indipendente,
Negoziabile, Valutabile, Stimabile, Piccola e Testabile.
Non-functional requirements: Possono essere scritti come card ma non sono ottimali, ma
devono essere inclusi nella definizione di done.
.
The product Backlog
Il Product Backlog è una lista prioritizzata delle funzionalità desiderate per un prodotto.
Serve come base per la pianificazione e lo sviluppo del prodotto.
Gli elementi del Product Backlog, chiamati anche "PBIs" (Product Backlog Items), sono
rappresentati da funzionalità che apportano valore tangibile agli utenti o ai clienti. Possono
anche includere la correzione di difetti, miglioramenti tecnici e altre attività di valore.
Il Grooming è un processo di gestione proattiva degli elementi nel Product Backlog, che
comprende la creazione e il raffinamento degli elementi, la stima dei tempi e la loro priorità.
Lab 1
CI/CD
Nella progettazione tradizionale del software, l'integrazione dei sottosistemi software viene
ritardata fino alla fine del ciclo di sviluppo. Il sistema non è garantito di funzionare tra le
diverse versioni. La distribuzione di una "release" rappresenta l'unità di software rilasciabile.
I problemi emergono nelle release quando gli utenti iniziano a utilizzare il sistema e
scoprono bug, comportamenti non desiderati e funzionalità mancanti.
Pipeline di Consegna
La pipeline di consegna è l'infrastruttura che supporta la pratica della Consegna Continua.
Contiene tutte le fasi necessarie per consegnare il software. Deve essere veloce per fornire
feedback rapido e deve rilevare i problemi in modo tempestivo. Tutto il codice che supera il
pipeline è considerato rilasciabile.
Versionamento Semantico
Il versionamento semantico è un insieme di regole per assegnare automaticamente una
versione unica a ogni release. Ogni aumento di versione ha significati specifici: patch per
correzioni di bug, minor per bug-fix ritenuti più significativi e major per modifiche
incompatibili con le versioni precedenti.
Branch by Abstraction
Questo modello consente di sostituire un sottosistema senza interrompere la pipeline. Si
procede con lo sviluppo del nuovo sottosistema e la sostituzione del vecchio quando si è
pronti.
Github
GitHub actions è una funzionalità di GitHub che permette l'esecuzione di flussi di lavoro. Un
flusso di lavoro è una sequenza di lavori eseguiti dai runner. Un lavoro è composto da steps
che possono essere comandi shell o funzionalità terze dette actions.
Un runner è una macchina virtuale che esegue flussi di lavoro. Uno step è uno script shell o
un'azione. I jobs sono una sequenza di steps da eseguire in ordine.
Lezione 4
Estimation and Velocity
La stima delle PBIs riguarda le stime su quanti elementi verranno completati e quale sarà il
costo associato.
Le stime delle PBIs fanno parte della gestione del backlog del prodotto e possono essere
espresse in punti storia o giorni ideali. Le stime delle attività sono parte della pianificazione
dello sprint e possono essere espresse in ore ideali.
La stima delle PBIs coinvolge il contributo collettivo del team di sviluppo. Il product owner
descrive le PBIs ma non guida o influenza il team, mentre lo ScrumMaster facilita il processo
di stima.
Le unità più comuni per le stime delle PBIs sono i punti storia e i giorni ideali. I punti storia
riflettono la complessità e la dimensione fisica delle PBIs, mentre i giorni ideali
rappresentano il tempo necessario per completare una PBI.
Il Planning Poker è un metodo basato sul consenso per stimare le PBIs, in cui ogni membro
del team usa carte per esprimere le loro stime.
Technical Debt
Il Technical Debt è un concetto che rappresenta il costo futuro associato a scelte di sviluppo
software rapide ma non ottimali. È come un debito che deve essere pagato
successivamente attraverso una revisione del codice.
Lezione 5
Planning
Sprint Planning, principi
Scrum promuove la creazione di artefatti in anticipo, bilanciando previsioni iniziali con
adattamenti "just in time".
Scrum evita sforzi sprecati nella creazione e nell'aggiornamento dei piani.
Scrum cerca di mantenere aperte le opzioni di pianificazione aperte fino all’ultimo momento
disponibile per evitare costi.
Scrum favorisce rilasci più piccoli e più frequenti, per un maggiore ritorno dell’investimento.
In termini di approcci alla pianificazione dello sprint, ci sono due metodi principali:
● Pianificazione a Due Parti: Questo approccio è più flessibile ed è stato introdotto
per consentire una migliore gestione delle incertezze e delle emergenze durante
l'Sprint. Questo approccio consente al team di adattarsi meglio alle mutevoli
esigenze del progetto durante l'Sprint.
● Pianificazione a Una Parte: Durante la pianificazione dell'Sprint, il team si
concentra sulla selezione degli elementi di lavoro (elementi di backlog) che verranno
completati durante l'Sprint. Il team stima la quantità di lavoro che può essere
affrontata nell'Sprint, basandosi sulla sua velocità passata o su altre metriche
rilevanti.
In sintesi, la principale differenza tra i due approcci sta nella flessibilità. La pianificazione a
due stati consente al team di essere più adattabile alle modifiche delle priorità durante
l'Sprint, mentre la pianificazione a uno stato è più vincolante e richiede che il team mantenga
la stessa selezione di lavoro durante l'Sprint.
Per determinare la capacità del team, si considera la capacità del team di lavorare al PBI
rimuovendo il tempo dedicato ad altre attività Scrum, il lavoro al di fuori dello sprint
(grooming) e il tempo personale.
La selezione degli elementi del PBIs può avvenire in vari modi, come allineare gli elementi
con l'obiettivo dello sprint o selezionare gli elementi in cima al backlog. È importante non
iniziare ciò che non si può terminare per evitare sprechi.
La fiducia nell'impegno del team viene acquisita suddividendo gli elementi del Product
Backlog in compiti necessari per completare seguendo la definizione di "done" concordata
dal team. Questo processo aiuta a creare il "Sprint Backlog" che serve a verificare l'impegno
del team.
Lab 2
Test Doubles
Il software testing è il processo utilizzato per acquisire fiducia che il software sviluppato
funzioni come previsto e secondo i requisiti. La profondità del testing può variare in base al
tipo di software e alle esigenze regolamentari ed etiche.
L'Agile Manifesto promuove il valore del software funzionante rispetto alla documentazione
dettagliata e incoraggia la consegna frequente di software funzionante come misura di
progresso.
Il TDD è una pratica di sviluppo che integra lo sviluppo di funzionalità con lo sviluppo di test
automatizzati. Si basa su due regole fondamentali: scrivere nuovo codice solo se un test
automatizzato fallisce ed eliminare la duplicazione.
Benefici del TDD: la garanzia che tutti i requisiti siano testati, una buona copertura di test e il
focus sulla progettazione di interfacce.
Il TDD è importante nella Continuous Integration poiché aiuta a rilevare e correggere errori
precocemente, facilita il refactoring e migliora la qualità del codice.
Test Pattern
Esistono diverse tecniche di test patterns. Queste tecniche migliorano il flusso di lavoro nel
Test-driven development e si suddividono in quattro categorie principali:
● Red Bar Patterns: dove e quando scrivere i test e quando fermarsi. Fasi:
○ Starter test: Il primo test che scrivete dovrebbe essere qualcosa di cui siete
sicuri di poter implementare.
○ Explanation test: Includere discussioni o suggerimenti con i colleghi nei test
nel codice.
○ Regression test: Una volta trovato un bug, aggiungere un test nella suite che
lo copra.
● Green Bar Patterns: come rendere i test eseguibili più velocemente possibile
○ Fake it: È accettabile restituire costanti per far passare un test inizialmente.
○ Triangulate: Ritardare l'introduzione di astrazioni finché non siete certi che
siano necessarie.
○ Obvious Implementation: Se qualcosa è ovvio, implementatelo.
○ One-to-many: Se dovete lavorare con strutture dati, iniziate con uno o due
elementi e generalizzate a n elementi (quando applicabile).
● Refactoring Patterns: tecnica per scrivere i test;
○ Durante il refactoring, cercate di mantenere sempre i test verdi.
○ Factor out duplication: Eliminare la duplicazione di codice.
● Testing Patterns:
○ Child test: Se un test è troppo grande e fallisce costantemente, suddividerlo
in test più piccoli e farli funzionare
○ Mock objects: Simulare le dipendenze costose o ingombranti con "oggetti
finti" che restituiscono costanti.
○ Isolated tests: I test non dovrebbero influenzarsi a vicenda e non dovrebbero
dipendere dall'ordine di esecuzione.
○ Test list: Tenere traccia dei test eseguiti e dei test da eseguire (funzionalità
mancanti).
○ Test Data, Realistic Data: Entrambi hanno il loro valore nei test.
Lezione 6
Sprint Execution
Durante uno sprint della durata di due settimane, l'esecuzione dello sprint rappresenta circa
otto dei dieci giorni totali. I partecipanti e i loro ruoli includono:
● Il team di sviluppo: Si auto-organizza per raggiungere l'obiettivo dello sprint senza
che venga loro assegnato il lavoro o venga detto come farlo.
● Il Master Scrum: Funge da coach, facilitatore e rimuove gli ostacoli. Non assegna il
lavoro al team e non dice loro come farlo.
● Il Product Owner: Deve essere disponibile per rispondere a domande di
chiarimento, revisionare il lavoro intermedio, fornire feedback al team e discutere
eventuali modifiche all'obiettivo dello sprint. Deve anche verificare che i criteri di
accettazione siano stati soddisfatti.
È importante trovare un equilibrio e lavorare sul numero di elementi che il team può gestire
senza sovraccaricarlo, riducendo il tempo necessario per completare ciascun elemento e
massimizzando il valore complessivo consegnato durante lo sprint.
Sprint Review
Dopo abbiamo fatto la pianificazione e l’esecuzione c’è la revisione.
Durante la revisione Sprint, si ispeziona e si adatta l'incremento potenzialmente
consegnabile del prodotto. Questo offre una visione trasparente dello stato attuale del
prodotto, incluso qualsiasi dato scomodo. Gli intervenuti possono porre domande, fare
osservazioni e suggerimenti, nonché discutere su come procedere date le attuali condizioni.
La revisione Sprint si svolge subito dopo l'esecuzione dello Sprint e poco prima della
retrospettiva Sprint.
Di solito la conduzione della revisione Sprint è il master Scrum, mentre i membri del team si
alternano per presentare il lavoro svolto.
Durante la revisione Sprint, il team può fare e rispondere a domande cruciali riguardo al
prodotto e alle preferenze degli stakeholder. Questo feedback è utilizzato per adattare il
backlog del prodotto e i piani di rilascio.
La revisione Sprint non è il luogo per ottenere l'approvazione definitiva del lavoro. Le
questioni di approvazione sono gestite successivamente dal Product Owner. La revisione
mira a raccogliere feedback e adattare il prodotto. La partecipazione sporadica potrebbe
essere un segnale di priorità sbagliate o grandi sforzi di sviluppo potrebbero richiedere più di
una revisione.
In breve, la revisione Sprint è una parte cruciale del processo Scrum in cui il team esamina il
lavoro fatto durante lo Sprint, raccoglie feedback dagli stakeholder e adatta la direzione
futura del prodotto.
Sprint Retrospective
La Sprint Retrospective è un momento in cui il team Scrum esamina il processo utilizzato
per sviluppare il prodotto. È un'opportunità per riflettere sul lavoro svolto, identificare punti di
forza e debolezza e pianificare miglioramenti. Durante questa fase, il team può esaminare
qualsiasi aspetto che influisce sulla creazione del prodotto, inclusi processi, pratiche,
comunicazioni, ambiente, strumenti, ecc.
La preparazione per la Sprint Retrospective coinvolge la revisione di tutti gli aspetti rilevanti
del processo, l'identificazione di esercizi che possono aiutare i partecipanti a esplorare e
decidere insieme, la raccolta di dati oggettivi (non opinioni) sugli eventi e la strutturazione
del tempo, solitamente circa 1,5 ore per uno sprint di due settimane.
Le attività principali includono la creazione di un ambiente sicuro in cui i partecipanti
possano esprimere le proprie opinioni, la condivisione del contesto per allineare le
prospettive individuali, l'identificazione di insight e la definizione di azioni di miglioramento da
intraprendere. È essenziale che le azioni stabilite vengano effettivamente attuate.
è importante assicurarsi che quanto emerso dalla Sprint Retrospective venga effettivamente
implementato. Inoltre, viene menzionato il concetto di un "insight backlog", ovvero una lista
di problemi identificati che non possono essere affrontati immediatamente ma che possono
essere ripresi in una futura Sprint Retrospective.
Lab 3
Test Double
Key terms:
● SUT: System under test;
● DOC: Depended-on component, il componente testato;
● Verifica basata sullo stato: ottenere input, calcolare output, asserzioni sugli input-
output;
● Verifica basata sul comportamento: ottenere input, calcolare output, asserzioni su
come il SUT interagisce con i DOC.
Ci sono diversi casi d'uso dei Test Doubles tra cui la riproducibilità, l'evitare fixture
complesse, la gestione della casualità, la manipolazione di variabili d'ambiente e la rottura
delle dipendenze.
Lab 4
Benefici TDD:
● Impone standard di base per la qualità del software durante lo sviluppo.
● I test completi proteggono dai regressi del software.
● Può rallentare lo sviluppo, ma è utile nello sviluppo basato sul trunk.
● I test agiscono come specifiche.
● I test possono essere automatizzati.
● Fornisce significato formale.
● Richiede conoscenze tecniche per contribuire ai test.
● Solitamente copre molti dettagli a basso livello; i "test di accettazione" (quelli utili
come specifiche) vengono scritti per ultimi.
Pratiche di BDD
BDD assume che si stia già lavorando in un contesto agile. Essa si concentra sull'effort di
sviluppo su incrementi piccoli (user story). Risponde prontamente ai feedback degli utenti,
facendo il minimo necessario per soddisfare le richieste. Si basa su iterazioni di sviluppo
veloci. Si richiede la disponibilità quotidiana di persone con conoscenze di dominio.
Workflow BDD
La sequenza BDD si suddivide in scoperta (discovery), formulazione (formulation) e
automazione (automation). Nella scoperta si creano esempi concreti del comportamento del
sistema desiderato. Nella formulazione si producono documenti che fungono da "specifiche
eseguibili" per le funzionalità da implementare. Si utilizza il linguaggio specifico del dominio
Gherkin per definire specifiche in modo leggibile sia per gli esseri umani che per i computer.
Linguaggio Gherkin
Gherkin è un linguaggio specifico del dominio che consente di definire documentazione
strutturata che si legge quasi come il linguaggio naturale. È uno strumento prezioso poiché
consente alle persone senza formazione in programmazione di contribuire alla definizione
del comportamento (e quindi ai test) del software.
Automazione
Una volta disponibili specifiche eseguibili, queste possono essere tradotte in test per guidare
l'implementazione del sistema. Si crea un ciclo "a doppio loop" in cui i test di accettazione ad
alto livello guidano l'implementazione del comportamento e, all'interno, si seguono le
pratiche standard di sviluppo iterativo. Esistono strumenti, come Cucumber, che mappano
automaticamente il linguaggio Gherkin in "scheletri di test" disponibili in molteplici linguaggi.
Lezione X
TODO
TODO
Lab X
TODO
TODO
ALTRO
Useful Notions
Concetti di base sulle annotazioni Java
Le annotazioni forniscono informazioni aggiuntive sui pacchetti, le classi, i metodi, i campi, le
variabili e altro ancora nel codice Java. Le annotazioni sono utilizzate per aggiungere
informazioni aggiuntive alle classi e per sviluppare strumenti di elaborazione.
Le annotazioni consentono di ispezionare proprietà aggiuntive durante l'esecuzione del
programma.
Le annotazioni sono diverse dai commenti e sono sopravvissute ai compilatori.
Prima di Java 5, i metodi deprecati venivano annotati sfruttando i javadoc e le capacità delle
classi venivano annotate con interfacce speciali.
Soluzioni più pulite:
Scrum Framework
Il framework Scrum è incentrato su pratiche, ruoli, attività e artefatti specifici. Non è un
processo standardizzato con passi sequenziali da seguire, ma piuttosto un framework per
organizzare e gestire il lavoro. Gli elementi chiave di Scrum includono:
Ruoli Scrum: Ci sono tre ruoli principali in Scrum: il Product Owner, lo ScrumMaster e il
Development Team. Questi ruoli sono obbligatori, ma possono esserci anche altri ruoli.
Product Owner: Questa figura è responsabile di cosa verrà sviluppato, in quale ordine e
imposta gli obiettivi. Si assicura che le funzionalità siano sviluppate nell'ordine più
vantaggioso per il successo del prodotto.
ScrumMaster: Il ruolo di ScrumMaster è quello di guidare il team nel seguire Scrum, agire da
coach e facilitatore, proteggere il team dalle interferenze esterne e rimuovere gli ostacoli che
possono ostacolare il progresso.
Pratiche Scrum: Scrum prevede una serie di pratiche tra cui lo sprint planning, lo sprint
backlog, le sprint review e sprint retrospective.
Sprint: Si tratta di iterazioni con una durata fissata, durante le quali si crea qualcosa di valore
tangibile per il cliente o l'utente. Non sono ammesse modifiche di scopo o personale durante
uno sprint, tranne rare eccezioni.
Sprint Planning: Durante questa attività, il Product Owner e il Development Team decidono
quali elementi del Product Backlog verranno sviluppati nello sprint in corso e fissano gli
obiettivi.
Sprint Backlog: È una lista di compiti necessari per completare gli elementi selezionati
durante lo sprint planning.
Daily Scrum: Ogni giorno durante uno sprint, i membri del Development Team conducono
una breve riunione per condividere cosa è stato fatto, cosa verrà fatto e per discutere
eventuali ostacoli.
Definition of Done: Il team definisce uno standard di qualità che deve essere soddisfatto
prima che un'attività sia considerata completata.
Sprint Review: Alla fine dello sprint, si tiene una revisione per esaminare ciò che è stato
realizzato e ottenere feedback dagli stakeholder.
Sprint Retrospective: Dopo la revisione, il team tiene una retrospettiva per discutere ciò che
ha funzionato bene e cosa può essere migliorato nel processo.
Enterprise Applications
Definizione di Enterprise Application: L'articolo inizia discutendo cosa siano le applicazioni
enterprise. Sottolinea che un'idea sbagliata è definirle semplicemente come "software per
aziende", ma le applicazioni enterprise coinvolgono la visualizzazione, la manipolazione e
l'archiviazione di grandi quantità di dati complessi e il supporto o l'automazione dei processi
aziendali.
Esempi di Enterprise Applications: Vengono forniti esempi di applicazioni enterprise, tra cui
sistemi di prenotazione, sistemi finanziari, sistemi di gestione della catena di
approvvigionamento e altri utilizzati nelle moderne imprese. Si sottolinea la differenza tra
queste applicazioni e sistemi embedded, sistemi di controllo, telecomunicazioni o software
desktop.
Persistenza dei Dati: Si spiega il concetto di persistenza dei dati e come sia fondamentale
nelle applicazioni. La discussione si concentra sulla conservazione dei dati in database
relazionali.
Vantaggi dell'ORM: L'articolo menziona i vantaggi dell'ORM, tra cui un aumento della
produttività, una maggiore manutenibilità e una migliore performance.