INGEGNERIA DEI SISTEMI DISTRIBUITI E LABORATORIO
Anno accademico 2020/2021 - 1° anno - Curriculum Sistemi di Rete e Sicurezza- INGEGNERIA DEI SISTEMI DISTRIBUITI: Emiliano Alessio TRAMONTANA
- LABORATORIO: Andrea Francesco FORNAIA
Organizzazione didattica: 225 ore d'impegno totale, 153 di studio individuale, 36 di lezione frontale, 24 di esercitazione, 12 di laboratorio
Semestre: 1°
Obiettivi formativi
- INGEGNERIA DEI SISTEMI DISTRIBUITI
Obiettivi formativi generali in termini di risultati di apprendimento attesi.
1. Conoscenza e capacità di comprensione (knowledge and understanding): lo studente conoscerà meccanismi di programmazione avanzata, inclusi programmazione ad aspetti, parallela, asincrona, distribuita.
2. Capacità di applicare conoscenza e comprensione (applying knowledge and understanding): lo studente avrà la capacità di progettare sistemi software distribuiti e complessi.
3. Autonomia di giudizio (making judgements): lo studente acquisirà la capacità di analizzare sistemi distribuiti e complessi.
4. Abilità comunicative (communication skills): lo studente imparerà a descrivere in linguaggio tecnico le caratteristiche fondamentali dei sistemi distribuiti e paralleli.
5. Capacità di apprendimento (learning skills): lo studente potrà affrontare e risolvere problemi di progettazione e implementazione in ambiti realistici, studiando, valutando e utilizzando, nuove tecnologie per i sistemi distribuiti.
- LABORATORIO
Obiettivi formativi generali in termini di risultati di apprendimento attesi.
- 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.
- 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.
- Autonomia di giudizio (making judgements): lo studente acquisirà la capacità di analizzare sistemi di sviluppo, validazione e rilascio per applicazioni distribuite.
- 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.
- 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
- INGEGNERIA DEI SISTEMI DISTRIBUITI
Lezioni frontali per concetti e soluzioni, spiegazione di esempi di codice per le tecniche 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.
- LABORATORIO
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
- INGEGNERIA DEI SISTEMI DISTRIBUITI
Capacità di progettare ed implementare sistemi ad oggetti in C++ o Java.
- LABORATORIO
Capacità di progettare ed implementare sistemi ad oggetti in C++ o Java.
Frequenza lezioni
- INGEGNERIA DEI SISTEMI DISTRIBUITI
La frequenza delle lezioni è fortemente consigliata.
- LABORATORIO
La frequenza delle lezioni è fortemente consigliata.
Contenuti del corso
- INGEGNERIA DEI SISTEMI DISTRIBUITI
Design pattern per sistemi distribuiti: Proxy, Broker, Forward-Receiver, Remote Facade, Data Transfer Object, Session State, Serialized Large Object. Design pattern per la sicurezza: Role-based Access Control, Authenticator. Progettazione ed implementazione del software orientato agli aspetti. Design pattern ad aspetti e Refactoring ad aspetti. Implementazione di chiamate asincrone in Java. Reactive programming con design pattern Circuit Breaker, Bulkheads, Timeout. Middleware orientato ai messaggi RabbitMQ. Tecnologia Blockchain.
- LABORATORIO
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
- INGEGNERIA DEI SISTEMI DISTRIBUITI
1. F. Buschmann, R. Meunier, H. Rohnert, P. Sommerlad, M. Stal. Pattern-Oriented Software Architecture A System of Patterns. John Wiley and Sons, 1996
2. M. Fowler. Patterns of Enterprise Application Architecture. Addison-Wesley, 2003
3. M. Schumacher, E. Fernandez-Buglioni, D. Hybertson, F. Buschmann, P. Sommerlad. Security Patterns: Integrating Security and Systems Engineering. John Wiley and Sons, 2006
4. R. Laddad. AspectJ in Action: Enterpriese AOP with Spring Applications. Manning Publications. 2010.
5. R.-G. Urma, M. Fusco, A. Mycroft. Java 8 in Action: Lambdas, streams, and functional-style programming. Manning, 2015
6. G. Hohpe, B. Woolf. Enterprise Integration Patterns. Addison-Wesley, 2003
7. A. Videla, J.J.W. Williams. RabbitMQ in Action. Manning, 2012
8. A. M. Antonopoulos. Mastering Bitcoin. Programming the open blockchain. O'Reilly, 2017
9. R. Kuhn. Reactive Design Patterns. Manning, 2017
- LABORATORIO
- G. Kim et al.: The DevOps Handbook. It Revolution Press, 2016
- S. Chacon and B. Straub: Pro Git. Apress, 2014
- Sonatype Company: Maven: The Definitive Guide. O'Reilly, 2008
- D. R. Kuhn et al.: Practical Combinatorial Testing. NIST Special Publication, 2010
- M. Young and M. Pezze: Software Testing and Analysis: Process, Principles and Technique. John Wiley and Sons, 2008
- B. Laboon: A Friendly Introduction to Software Testing. CreateSpace Independent Publishing, 2017
- S. Newman: Building Microservices. O'Reilly, 2015
- M. Macero: Learn Microservices with Spring Boot. Apress, 2017
- Yuri Shkuro: Mastering Distributed Tracing: Analyzing performance in microservices and complex systems. Packt Publishing, 2019
Programmazione del corso
INGEGNERIA DEI SISTEMI DISTRIBUITI | |||
Argomenti | Riferimenti testi | ||
---|---|---|---|
1 | Presentazione del corso con obiettivi. Modularità per sistemi distribuiti e paralleli | [2] C. 1 | |
2 | Design pattern Proxy e Reference Monitor | [1] C. 3.4, [3] C. 8 | |
3 | Design pattern Remote Proxy e Forwarder-Receiver | [1] C. 3.4, 3.6 | |
4 | Design pattern Role-based Access Control e Authenticator | [3] C. 8, 10 | |
5 | Design pattern Remote Facade e Data Transfer Object | [2] C. 7, 15 | |
6 | Design pattern Session State (Client, Server, Database), Serialized Large Object | [2] C. 6, 17, 12 | |
7 | Design pattern Broker | [1] C. 2.3 | |
8 | Progettazione con callback, Java chiamate asincrone, tipi CompletableFuture | [5] C. 11 | |
9 | Programmazione ad aspetti: costrutti del linguaggio AspectJ. Pointcut e join point. Esempio di aspetto per la protezione degli accessi | [4] C. 2, 3 | |
10 | Programmazione ad aspetti: pointcut per la cattura del contesto di esecuzione, passaggio di parametri agli advice | [4] C. 3, 4 | |
11 | Refactoring ad aspetti. Crosscutting statico e dinamico. Pointcut cflow, declare warning | [4] C. 5 | |
12 | Design pattern ad aspetti: Adapter, Participant e Sincronizzazione. Gestione eccezioni con aspetti | [4] C. 5, 12, 13 | |
13 | Design pattern per la stabilità: Timeout, Circuit Breaker, Bulkheads | [9] C. 2, 12 | |
14 | Middleware orientato ai messaggi: RabbitMQ | [6] C. 3, [7] C. 2 | |
15 | Design pattern per i messaggi. Produttori e consumatori di messaggi. Code | [6] C. 10, [7] C. 4 | |
16 | Architettura distribuita di Blockchain di bitcoin, proprietà | [8] C. 1, 2, 5, 6, 8, 9, 10 | |
LABORATORIO | |||
Argomenti | Riferimenti testi | ||
1 | Introduzione ai DevOps: DevOps lifecycle, Continuous Integration, Continuous Delivery, SCM e Pipeline | [1] | |
2 | Git Workflow e sviluppo distribuito: commit graph, comandi base, git workflow, concetti avanzati, GitHub, GitLab, Travis, Code Coverage | [2] | |
3 | Maven: gestione dipendenze, compilazione e testing automatico, reportistica, integrazione con sistemi di CI/CD | [3] | |
4 | Unit Testing: Test Suite & Scaffolding, JUnit, JaCoCo, Mockito | [6, note fornite] | |
5 | Generazione automatica di test suite: generazione randomica con Randoop, generazione evolutiva con EvoSuite | [note fornite] | |
6 | Testing Combinatoriale: Interaction Failures, 2-way interaction, Covering Array, ATGT, Coffee4j | [4, 5] | |
7 | Mutation Testing: valutazione qualità di una test suite, PITest | [5, note fornite] | |
8 | Microservizi: Monolite vs Microservizi, Legge di Conway, Monolith First, Bounded Context, Coordinamento, Service Discovery, Load Balancing, API Gateway, Circuit Breaker, ELK, Stateless Microservices, Affinità di Sessione, VM e Container | [7] | |
9 | Microservizi con Spring Boot: Spring Boot Initializr e Starters, Dependency Injection, Architettura Applicazione Web Spring, RESTful APIs, CRUD, Zuul | [8] | |
10 | Distributed Tracing in applicazioni a Microservizi con Open Tracing e Jaeger | [9] |
Verifica dell'apprendimento
Modalità di verifica dell'apprendimento
- INGEGNERIA DEI SISTEMI DISTRIBUITI
L'esame consiste di un elaborato ed una prova orale.
La verifica dell’apprendimento potrà essere effettuata anche per via telematica, qualora le condizioni lo dovessero richiedere
- LABORATORIO
L'esame consiste di un elaborato ed una prova orale.
Esempi di domande e/o esercizi frequenti
- INGEGNERIA DEI SISTEMI DISTRIBUITI
Implementare un aspetto software per il caching dei dati
Implementare in modo parallelo la selezione e la somma di importi da un insieme di dati riguardanti prodotti venduti.
Implementare in modo asincrono una chiamata ad un metodo.
Descrivere la gestione della sessione.
- LABORATORIO
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