INGEGNERIA DEI SISTEMI DISTRIBUITI E LABORATORIO

Anno accademico 2018/2019 - 1° anno - Curriculum Sistemi di Rete e Sicurezza
Docenti Crediti: 9
Organizzazione didattica: 225 ore d'impegno totale, 153 di studio individuale, 36 di lezione frontale, 24 di esercitazione, 12 di laboratorio
Semestre:

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.

    1. Conoscenza e capacità di comprensione (knowledge and understanding): lo studente conoscerà meccanismi di sviluppo avanzati, inclusi sviluppo collaborativo e distribuito, analisi dei dati relativi al processo di sviluppo, validazione di sistemi concorrenti, 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

  • INGEGNERIA DEI SISTEMI DISTRIBUITI

    Lezioni frontali per concetti e soluzioni, spiegazione di esempi di codice per le tecniche esaminate.

  • LABORATORIO

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


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. Progettazione ed implementazione del software orientato agli aspetti. Design pattern ad aspetti e Refactoring ad aspetti. Java 8 e Map Reduce. Reactive programming con design pattern Circuit Breaker, Bulkheads. Design pattern per la sicurezza e i sistemi distribuiti. Middleware orientato ai messaggi RabbitMQ.

  • LABORATORIO

    Introduzione ai DevOps. Git Workflow e sviluppo distribuito. Mining Software Repository. Testing Combinatoriale. Model Checking per sistemi concorrenti. Infrastructure Automation con OpenStack. Microservizi. Microservizi con Spring Boot.


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

  • LABORATORIO
    1. G. Kim et al.: The DevOps Handbook
    2. S. Chacon and B. Straub: Pro Git
    3. A. Tornhill: Your Code As a Crime Scene
    4. D. R. Kuhn et al.: Practical Combinatorial Testing
    5. M. Young and M. Pezze: Software Testing and Analysis: Process, Principles and Technique
    6. V.C. Bumgardner: OpenStack in action
    7. S. Newman: Building Microservices
    8. M. Macero: Learn Microservices with Spring Boot

Programmazione del corso

INGEGNERIA DEI SISTEMI DISTRIBUITI
 ArgomentiRiferimenti testi
1Presentazione del corso con obiettivi. Modularità per sistemi distribuiti e paralleli[1, 2] 
2Design pattern Proxy e Reference Monitor[1, 3] 
3Design pattern Remote Proxy e Forward-Receiver[1] 
4Design pattern Remote Facade e Data Transfer Object[2] 
5Design pattern Session State (Client, Server, Database), Serialized Large Object[2] 
6Design pattern Broker[1] 
7Progettazione con Map Reduce in Java, Stream, espressioni lambda. Design pattern Builder. Test con JUnit[5] 
8Tipi Java 8: Predicate, Function, IntStream, Supplier[5] 
9Progettazione con callback, Java chiamate asincrone, tipi CompletableFuture[5] 
10Programmazione ad aspetti: costrutti del linguaggio AspectJ. Pointcut e join point. Esempio di aspetto per la protezione degli accessi[4] 
11Programmazione ad aspetti: pointcut per la cattura del contesto di esecuzione, passaggio di parametri agli advice[4] 
12Refactoring ad aspetti. Crosscutting statico e dinamico. Pointcut cflow, declare warning[4] 
13Design pattern ad aspetti: Adapter, Participant e Sincronizzazione. Gestione eccezioni con aspetti[4] 
14Design pattern per la stabilità: Timeout, Circuit Breaker, Bulkheads 
15Middleware orientato ai messaggi: RabbitMQ[6, 7] 
16Design pattern per i messaggi. Produttori e consumatori di messaggi. Code[6, 7] 
LABORATORIO
 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, Travis, Code Coverage [2] 
3Mining Software Repository: Hot Spot Analysis, Change Coupling, RepoDriller, PyDriller[3] 
4Testing Combinatoriale: Test Suite & Scaffolding, Interaction Failures, 2-way interaction, Covering Array, ATGT, esempio su Java Card Verifier[4, 5] 
5Model Checking per sistemi concorrenti: Logica Temporale (LTL, CTL), algoritmo di Model Checking, NuSMV, Oracolo, generazione automatica Test Suite, esempio Java Card Verifier[5] 
6Infrastructure Automation con OpenStack: scalabilità, tassonomia cloud, middleware cloud, architettura OpenStack, servizi principali, DevStack, VM lifecycle, Floating Ip, Role Based Access Control, OpenStack APIs[6] 
7Microservizi: 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] 
8Microservizi con Spring Boot: Spring Boot Initializr e Starters, Maven, Dependency Injection, Architettura Applicazione Web Spring, Vagrant e Provisioning, RESTful APIs, CRUD, Zuul[8] 

Verifica dell'apprendimento

Modalità di verifica dell'apprendimento

  • INGEGNERIA DEI SISTEMI DISTRIBUITI

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

  • 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

    Proporre alcuni esempi di problemi risolvibili con il Mining di repository Git

    Descrivere il concetto di Covering Array

    Mostrare un esempio di macchina a stati finiti per NuSMV

    Spiegare come il pattern Role Based Access Control viene implementato in OpenStack

    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