La prossima edizione del corso si terrà in inglese.
Abstract
La maggior parte delle persone che lavorano nello sviluppo software sono fortemente motivate a migliorare le proprie competenze ingegneristiche e creare software di alta qualità.
Imparare i principi di eccellenza tecnica che sorreggono lo sviluppo software crea soddisfazione, e la voglia di continuare a fare sempre meglio.
Per tutte quelle persone che sono mosse da questa grande passione e sono alla ricerca di strumenti che aiutino a lavorare meglio, a ridurre l’ansia, a essere più consapevoli ed efficaci, abbiamo creato Software Crafting Programme, insieme ad Alessandro Di Gioia e Marco Consolaro di Alcor Academy.
Con questo corso vogliamo contribuire a far entrare TDD, Refactoring, Code Smell… a tutti gli effetti nel tuo flusso di lavoro quotidiano.
Programma
Il corso si articola in 10 sessioni da 3.5 ore ed è strutturato in un’alternanza di discussioni, teoria e lavori di gruppo.
Il programma di formazione ha un taglio estremamente pratico e partecipativo.
Ogni singola lezione è costruita sulla pratica del Software Teaming (Mob Programming) con lo scopo di massimizzare l’apprendimento e allenare le capacità collaborative nello sviluppo del software attraverso una comunicazione tecnica più avanzata.
Il corso è frutto dell’esperienza sul campo dei due docenti nello sviluppo e design del software con pratiche XP e Domain-Driven Design.
Esperienza ampiamente raccontata anche nel libro Agile Technical Practices Distilled, scritto da Marco Consolaro, Alessandro Di Gioia e Pedro M. Santos, e nel libro Cronache di Domain-Driven Design, edito da Avanscoperta.
È consigliato dedicare almeno un’ora di tempo tra un modulo e l’altro per lo svolgimento di compiti a casa e per approfondimenti.
Target Audience
Il programma è progettato per accelerare le competenze tecniche in ambito sviluppo software e per aiutare i team tecnici ad applicare le pratiche ingegneristiche più efficaci.
Si rivolge in particolare a:
- tutte quelle persone che sviluppano software per professione e vogliono migliorare le proprie competenze ingegneristiche per diventare Tech Lead;
- Scale-up o aziende che stanno assumendo tech people rapidamente e vogliono creare una cultura ingegneristica volta alla qualità;
- team che stanno lavorando a un nuovo progetto e vogliono modernizzare i sistemi esistenti evitando le insidie che hanno danneggiato quelli precedenti;
- Software Developer, QA, Software Engineer e Freelance Software Developer che vogliono fare il passo successivo nella propria carriera.
Argomenti
- Test-Driven Development Classico
- Test-Driven Development della scuola di Londra
- Object-Oriented Design
- Object Calisthenics
- Refactoring
- Code Smells
- SOLID Principles
- Coesione e Accoppiamento
- I 4 elementi del Design Semplice
- Test Doubles
- Architettura Esagonale
- Behaviour-Driven Development
- Acceptance Test-Driven Development
- Outside-in Mindset
- Software Teaming (Mob Programming).
Agenda
Un buon 70% del tempo del corso è basato sulla scrittura di codice in Software Teaming (Mob Programming) e sulla condivisione delle soluzioni con gli altri partecipanti.
È consigliato dedicare almeno un’ora di tempo tra un modulo e l’altro per lo svolgimento di compiti a casa e per approfondimenti.
Di seguito il dettaglio di ogni singola sessione.
Session 1: Buone abitudini del TDD Classico
- Cos’è il TDD: origine della tecnica e possibili benefici
- Il ciclo del TDD: red/green/refactor, capiamo quali sono i passi da seguire e in cosa si distinguono fra di loro
- Le tecniche di avanzamento: Triangolazione, Implementazione finta, Implementazione ovvia
- La lista dei test: strumento fondamentale per chiarire gli obiettivi e mantenere alta l’attenzione durante lo sviluppo
- Le proprietà di un buon test: quali sono le proprietà che un test deve dimostrare per essere considerato buono
- Gli anti-pattern: quali sono i problemi riscontrati più comunemente nei test e come risolverli
- Esercizio in Mob Programming: Calcolatore di stringhe usando il TDD classico.
Sessione 2: Object Calisthenics
- Object Calisthenics: 10 semplici regole per migliorare da subito il tuo Object-Oriented Design
- Codice a oggetti dichiarativo e incapsulato
- Uso del Type System per rendere lo stato invalido non rappresentabile
- Esercizio in Mob Programming: sviluppo di un’applicazione per giocare a Tris usando il TDD classico e le regole di Object Calisthenics.
Sessione 3: Code smells
- Gli anti-pattern più comuni che rendono il codice più difficile da mantenere
- Come usare i code smells come feedback per migliorare il tuo design
- Come migliorare le code review attraverso un’analisi sistemica dei code smells
- Esercizio in gruppi: analizzare il codice di un’applicazione per giocare a Tris piena di code smells e individuarli.
Sessione 4: Refactoring
- Principali tecniche di refactoring automatico usando l’IDE
- Come sfruttare al meglio il ciclo di refactoring del Test Driven-Development classico
- Come applicare il principio di Pareto nel refactoring
- Sequenza di priorità nel refactoring
- Esercizio in Mob Programming: fare il refactoring dell’applicazione della lezione precedente, procedendo nella sequenza di priorità corretta.
Sessione 5: Principi SOLID++
- Single Responsibility
- Open/Closed principle
- Liskov substitution
- Interface Segregation
- Dependency Inversion
- Balanced Abstraction
- Least Astonishment
- Esercizio in Mob Programming: implementare il Mars Rover kata usando TDD classico e applicando Open/Closed principle.
Sessione 6: Coupling & Cohesion
- Categorie di Coesione: Coesione di classe e Coesione di metodo
- Categorie di Accoppiamento: Accoppiamento di interazione e Accoppiamento ereditario
- Coesione e Accoppiamento sistemici
- Come minimizzare l’accoppiamento attraverso il disegno dei metodi pubblici
- Esercizio in Mob Programming: finire l’implementazione del Mars Rover kata della lezione precedente usando TDD classico ed applicando Open/Closed principle.
Sessione 7: Test Doubles
- Tassonomia dei Test Doubles: distinzione concettuale tra Mock, Stub, Fake, Spy and Dummy objects
- Command-Query Separation principle
- Euristiche per la scelta dei Test Doubles corretti
- Come utilizzare i Test Doubles per verificare la correttezza della collaborazione fra oggetti
- Quando non utilizzare i Test Doubles preferendo il TDD classico
- Anti-patterns più comuni nell’utilizzo dei Test Doubles
- Esercizio in Mob Programming: copiatore di caratteri utilizzando TDD classico e test di collaborazione. Implementeremo la soluzione sia usando Mock and Stub, che usando Fake and Spy.
Sessione 8: Le 4 Regole del Design Semplice
- Simple design: cosa si intende per design semplice e come possiamo ottenerlo
- Come applicare le 4 regole del Simple Design
- Introduzione ad architettura esagonale con Ports and Adapters
- Identifica dove e quali Test Doubles utilizzare all’interno di un’architettura esagonale
- Esercizio di Little Design Upfront: dato uno scenario e un criterio di accettazione, faremo un esercizio di “idealized design” per avere una base di partenza per l’implementazione della storia.
Sessioni 9 e 10: Mentalità Outside-In, TDD scuola di Londra, Sviluppo Outside-In applicato
- Impara il doppio ciclo di Acceptance Tests Driven Development
- Applica Behaviour-Driven Development attraverso la definizione di un criterio di accettazione automatico
- Utilizza la mentalità outside-in per implementare una storia con lo stile della scuola di Londra usando correttamente mock e stub nei tuoi test
- Esercizio finale in Mob Programming: implementeremo lo scenario e il criterio di accettazione utilizzando il design concordato nella lezione precedente, partendo da un Acceptance test come un vero team della scuola di Londra.
Cosa impareremo
Al termine di questo percorso, sarai in grado di:
- scrivere test che funzionano come documentazione vivente
- sfruttare il sistema di tipizzazione per rendere uno stato errato non rappresentabile
- collaborare con altri sviluppatori utilizzando un dizionario tecnico professionale
- effettuare revisioni del codice di alto valore che incoraggino il miglioramento del design
- identificare i difetti che aumentano il costo della manutenzione
- utilizzare i principi di buon design per semplificare il codice e ottenere un’architettura modulare
- comunicare con il business per fornire software di valore e in tempi brevi
- ridurre i feedback loop per sviluppare il software incrementalmente e promuovere la sperimentazione continua
- utilizzare la mentalità Outside-In per scrivere codice che si concentra sulle esigenze degli utenti.
Come si svolge
Il programma di formazione ha un taglio estremamente pratico, collaborativo e partecipativo. Ogni lezione dura circa tre ore e mezza e si compone di una breve parte teorica seguita da una sessione di programmazione collaborativa.
L’idea è di poter applicare i concetti in modo pratico in un contesto safe, dove poter sperimentare senza paure e lavorare sullo spirito di gruppo.
L’intero programma è progettato applicando i princinpi di Training From the Back of The Room, Micro Learning e Project Based Learning, per dare la possibilità di imparare e mettere in pratica il prima possibile.
Il corso si svolgerà online e in diretta per un massimo di 16 persone: i docenti e tutti i partecipanti saranno in video conferenza e avranno a disposizione una serie di strumenti digitali per interagire tra di loro e lavorare hands-on.
Per questo motivo, è richiesto che tutti i partecipanti abbiano una propria postazione e la telecamera accesa per tutta la durata del workshop per una migliore fruizione e comunicazione.
Perché partecipare
Al termine di questo corso avrai acquisito un livello di seniority superiore.
Sarai in grado di scrivere software mantenibile e di alta qualità, senza cadere nelle comuni trappole di over engineering.
Ti aiuteremo a sviluppare capacità di interazione e comunicazione in gruppo, aspetti fondamentali per la crescita professionale in ruoli di leadership.