INGEGNERIA DEI SISTEMI DISTRIBUITI E LABORATORIO
Modulo LABORATORIO

Anno accademico 2024/2025 - Docente: ALESSANDRO MIDOLO

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, spiegazione di esempi di codice per le tecniche esaminate.

Prerequisiti richiesti

Capacità di progettare ed implementare sistemi ad oggetti in C++ o Java

Frequenza lezioni

La frequenza delle lezioni è fortemente consigliata. 

Contenuti del corso

Introduzione a DevOps: si esplora le pratiche fondamentali di DevOps, confrontando il modello a cascata e il modello AGILE. Si approfondisce la cultura DevOps, i concetti chiave come SCM, pipelines, e le pratiche di continuous integration, continuous delivery e continuous deployment. Viene analizzata l'architettura dei microservices e l'importanza dell'infrastructure automation e infrastructure as code. Infine, si discute il monitoring and logging e la necessità di communication and collaboration per il successo dei progetti.

Git e Maven: introduce al Sistema di Controllo Versione (VCS) e al Sistema di Controllo Versione Distribuito (DCVS), con un focus su Git. Viene trattata la configurazione di Git, i vari git workflows, e i comandi fondamentali, inclusi branching, merging, e la risoluzione di merge conflicts. Si esplora l'uso dei remote repository. Inoltre, si approfondisce Maven, coprendo la configurazione di Maven, il file POM, la gestione delle dipendenze e l'uso dei Maven plugins per semplificare il processo di build.

Microservizi: affronta la progettazione e lo sviluppo di applicazioni basate su microservizi, focalizzandosi su due tecnologie principali: Spring Boot e Python. Viene esplorato come creare e gestire microservizi utilizzando Spring Boot, evidenziando le sue caratteristiche e vantaggi. Inoltre, si analizzano le best practices per sviluppare microservizi in Python, illustrando framework e strumenti utili per implementare architetture scalabili e manutenibili.

Design Pattern per microservizi: esplora le architetture e le pratiche fondamentali per la gestione di microservizi. Si discutono modelli come database per service, che ottimizza la gestione dei dati, e il pattern saga per la gestione delle transazioni distribuite. Viene analizzato anche l'event sourcing per tracciare le modifiche allo stato delle applicazioni. Si approfondisce l'importanza dell'API Gateway per gestire le comunicazioni tra client e microservizi e del service registry per il monitoraggio dei servizi disponibili. Infine, si esamina l'implementazione di health check API per garantire la salute e la disponibilità dei microservizi.

Distributed Tracing: si concentra sulle tecniche di tracciamento nelle applicazioni e nei microservizi. Viene introdotto il concetto di tracing per monitorare e analizzare le interazioni tra i servizi in un'architettura distribuita. Si esplora l'uso di OpenTracing, uno standard per il tracciamento distribuito, e si discutono vari strumenti utili per implementare il tracing in microservizi e sistemi distribuiti, migliorando la visibilità e la diagnosi delle performance delle applicazioni.

Software Testing: approfondisce le tecniche e gli strumenti essenziali per garantire la qualità del software. Si inizia con il unit testing, introducendo i concetti di test suite e scaffolding. Viene analizzato l'uso di JUnit e Mockito per scrivere e gestire test automatizzati. Si esplora anche strumenti come JaCoCo per la misurazione della copertura del codice, e discute mutation testing e regression testing per garantire la stabilità del software dopo modifiche. Infine, si affronta la generazione automatica di test, facilitando l'approccio al testing e migliorando l'efficienza.

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. B. Laboon: A Friendly Introduction to Software Testing. CreateSpace Independent Publishing, 2017
  5. Pezze, M. Software testing and analysis: process, principles, and techniques. John Wiley & Sons, 2008
  6. M. Macero: Learn Microservices with Spring Boot. Apress, 2017
  7. Yuri Shkuro: Mastering Distributed Tracing: Analyzing performance in microservices and complex systems. Packt Publishing, 2019
  8. Newman, Sam. Monolith to microservices: evolutionary patterns to transform your monolith. O'Reilly Media, 2019
  9. S. Newman: Building Microservices. O'Reilly, 2015
  10. Richardson, Chris. Microservices patterns: with examples in Java. Simon and Schuster, 2018

Programmazione del corso

 ArgomentiRiferimenti testi
1Introduzione a DevOps, la cultura DevOps, SCM & pipelines, continous integration, continuous delivery, continuous deployment[1]
2Git, Sistema di Controllo versione distribuito (DCS), git workflow, maven, gestione dipendenze, maven plugins[2, 3]
3Microservizi: Monolite vs Microservizi, Legge di Conway, Monolith First, Coordinamento, Service Discovery, Load Balancing, Affinità di Sessione, VM e Container[8, 9]
4Microservizi con Spring Boot: Spring Boot Initializr e Starters, Dependency Injection, Architettura Applicazione Web Spring, RESTful APIs, CRUD, Zuul[6]
5Design Pattern per microservizi: database per service, saga, event sourcing, api gateway, service registry, health check API[10]
6Distributed Tracing in applicazioni a Microservizi con Open Tracing e Jaeger[7]
7Unit Testing: Test Suite & Scaffolding, JUnit, JaCoCo, Mockito[4,5]
8Mutation Testing: valutazione qualità di una test suite, PITest[5]
9Generazione automatica di test suite: generazione randomica con Randoop, generazione evolutiva con EvoSuite, cenni sul Model CheckingNote fornite

Verifica dell'apprendimento

Modalità di verifica dell'apprendimento

L'esame consiste di un elaborato concordato prima della data d'esame, e che consiste nell'implementazione di un piccolo sistema software, e quindi di una prova orale. L'esame sarà valutato in modo ottimo se si mostrerà di aver acquisito profonda conoscenza dei concetti del corso e precisione nella loro esposizione. Un voto intermedio sarà dato nel caso in cui l'esame mostra una comprensione parziale degli argomenti. Uno voto appena sufficiente sarà dato quando pur conoscendo parzialmente gli argomenti, questi vengono esposti in modo superficiale. La verifica dell’apprendimento potrà essere effettuata anche per via telematica, qualora le condizioni lo dovessero richiedere.

Esempi di domande e/o esercizi frequenti

Caratteristiche principali di un approccio DevOps

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

Descrivere il design pattern database per service

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