INGEGNERIA DEI SISTEMI DISTRIBUITI E LABORATORIO
Modulo LABORATORIO

Anno accademico 2023/2024 - Docente: ANDREA FRANCESCO FORNAIA

Risultati di apprendimento attesi

Obiettivi formativi generali in termini di risultati di apprendimento attesi.

  1. Conoscenza e capacità di comprensione (knowledge and understanding): lo studente conoscerà meccanismi di sviluppo avanzati, inclusi sviluppo collaborativo e distribuito, validazione di sistemi complessi, automatizzazione del processo di rilascio, progettazione e implementazione di sistemi distribuiti a microservizi.
  2. Capacità di applicare conoscenza e comprensione (applying knowledge and understanding): lo studente avrà la capacità di adoperare strumenti avanzati di sviluppo, validazione e rilascio per applicazioni distribuite.
  3. Autonomia di giudizio (making judgements): lo studente acquisirà la capacità di analizzare sistemi di sviluppo, validazione e rilascio per applicazioni distribuite.
  4. Abilità comunicative (communication skills): lo studente imparerà a descrivere in linguaggio tecnico le caratteristiche fondamentali dei sistemi sistemi di sviluppo, validazione e rilascio per applicazioni distribuite.
  5. Capacità di apprendimento (learning skills): lo studente potrà affrontare e risolvere problemi di utilizzo e implementazione in ambiti realistici, studiando, valutando e utilizzando, nuove tecnologie per lo sviluppo, la validazione e il rilascio di applicazioni distribuite. 

Modalità di svolgimento dell'insegnamento

Lezioni frontali per concetti e soluzioni, prove pratiche con esempi di codice per le problematiche esaminate. 

Qualora l'insegnamento venisse impartito in modalità mista o a distanza potranno essere introdotte le necessarie variazioni rispetto a quanto dichiarato in precedenza, al fine di rispettare il programma previsto e riportato nel syllabus.

Prerequisiti richiesti

Capacità di progettare ed implementare sistemi ad oggetti.

Frequenza lezioni

La frequenza delle lezioni è fortemente consigliata. 

Contenuti del corso

Introduzione ai DevOps. Git Workflow e sviluppo distribuito. Maven. Unit Testing e generazione automatica di test. Mutation Testing. Testing Combinatoriale. Microservizi. Microservizi con Spring Boot. Distributed Tracing.

Testi di riferimento

  1. G. Kim et al.: The DevOps Handbook. It Revolution Press, 2016
  2. S. Chacon and B. Straub: Pro Git. Apress, 2014
  3. Sonatype Company: Maven: The Definitive Guide. O'Reilly, 2008
  4. D. R. Kuhn et al.: Practical Combinatorial Testing. NIST Special Publication, 2010
  5. M. Young and M. Pezze: Software Testing and Analysis: Process, Principles and Technique. John Wiley and Sons, 2008
  6. B. Laboon: A Friendly Introduction to Software Testing. CreateSpace Independent Publishing, 2017
  7. S. Newman: Building Microservices. O'Reilly, 2015
  8. M. Macero: Learn Microservices with Spring Boot. Apress, 2017
  9. Yuri Shkuro: Mastering Distributed Tracing: Analyzing performance in microservices and complex systems. Packt Publishing, 2019

Programmazione del corso

 ArgomentiRiferimenti testi
1Introduzione ai DevOps: DevOps lifecycle, Continuous Integration, Continuous Delivery, SCM e Pipeline[1]
2Git Workflow e sviluppo distribuito: commit graph, comandi base, git workflow, concetti avanzati, GitHub, GitLab, Code Coverage [2]
3Maven: gestione dipendenze, compilazione e testing automatico, reportistica, integrazione con sistemi di CI/CD[3]
4Unit Testing: Test Suite & Scaffolding, JUnit, JaCoCo, Mockito[6, note fornite]
5Generazione automatica di test suite: generazione randomica con Randoop, generazione evolutiva con EvoSuite, cenni sul Model Checking[note fornite]
6Testing Combinatoriale: Interaction Failures, 2-way interaction, Covering Array, Coffee4j[4, 5]
7Mutation Testing: valutazione qualità di una test suite, PITest[5, note fornite]
8Microservizi: Monolite vs Microservizi, Legge di Conway, Monolith First, Bounded Context, Coordinamento, Service Discovery, Load Balancing, API Gateway, Circuit Breaker, ELK, Affinità di Sessione, VM e Container[7]
9Microservizi con Spring Boot: Spring Boot Initializr e Starters, Dependency Injection, Architettura Applicazione Web Spring, RESTful APIs, CRUD, Zuul[8]
10Distributed Tracing in applicazioni a Microservizi con Open Tracing e Jaeger[9]

Verifica dell'apprendimento

Modalità di verifica dell'apprendimento

L'esame consiste di un progetto ed una prova orale. 

Esempi di domande e/o esercizi frequenti

Caratteristiche principali di un approccio DevOps

Descrivere le operazioni di fetch, pull e push tramite trasformazioni sul Commit Graph

Descrivere il concetto di Covering Array

Descrivere il concetto di Mutation Testing

Che relazione c'è tra Dependence Injection e Unit Testing

Descrivere il concetto di Affinità di Sessione e come evitarlo in un contesto a Microservizi

Mostrare la struttura tipica di un'applicazione a Microservizi implementata tramite Spring Boot

Discutere la differenza tra logging e tracing in un'applicazione distribuita