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.
Obiettivi formativi generali in termini di risultati di apprendimento attesi.
Lezioni frontali per concetti e soluzioni, spiegazione di esempi di codice per le tecniche esaminate.
Lezioni frontali per concetti e soluzioni, prove pratiche con esempi di codice per le problematiche esaminate.
Capacità di progettare ed implementare sistemi ad oggetti in C++ o Java.
Capacità di progettare ed implementare sistemi ad oggetti in C++ o Java.
La frequenza delle lezioni è fortemente consigliata.
La frequenza delle lezioni è fortemente consigliata.
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.
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.
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
http://www.dmi.unict.it/~tramonta/sdm/
http://www.cs.unict.it/~fornaia/#lectures
| INGEGNERIA DEI SISTEMI DISTRIBUITI | ||
| Argomenti | Riferimenti testi | |
| 1 | Presentazione del corso con obiettivi. Modularità per sistemi distribuiti e paralleli | [1, 2] |
| 2 | Design pattern Proxy e Reference Monitor | [1, 3] |
| 3 | Design pattern Remote Proxy e Forward-Receiver | [1] |
| 4 | Design pattern Remote Facade e Data Transfer Object | [2] |
| 5 | Design pattern Session State (Client, Server, Database), Serialized Large Object | [2] |
| 6 | Design pattern Broker | [1] |
| 7 | Progettazione con Map Reduce in Java, Stream, espressioni lambda. Design pattern Builder. Test con JUnit | [5] |
| 8 | Tipi Java 8: Predicate, Function, IntStream, Supplier | [5] |
| 9 | Progettazione con callback, Java chiamate asincrone, tipi CompletableFuture | [5] |
| 10 | Programmazione ad aspetti: costrutti del linguaggio AspectJ. Pointcut e join point. Esempio di aspetto per la protezione degli accessi | [4] |
| 11 | Programmazione ad aspetti: pointcut per la cattura del contesto di esecuzione, passaggio di parametri agli advice | [4] |
| 12 | Refactoring ad aspetti. Crosscutting statico e dinamico. Pointcut cflow, declare warning | [4] |
| 13 | Design pattern ad aspetti: Adapter, Participant e Sincronizzazione. Gestione eccezioni con aspetti | [4] |
| 14 | Design pattern per la stabilità: Timeout, Circuit Breaker, Bulkheads | |
| 15 | Middleware orientato ai messaggi: RabbitMQ | [6, 7] |
| 16 | Design pattern per i messaggi. Produttori e consumatori di messaggi. Code | [6, 7] |
| 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 | Mining Software Repository: Hot Spot Analysis, Change Coupling, RepoDriller, PyDriller | [3] |
| 4 | Testing Combinatoriale: Test Suite & Scaffolding, Interaction Failures, 2-way interaction, Covering Array, ATGT, esempio su Java Card Verifier | [4, 5] |
| 5 | Model Checking per sistemi concorrenti: Logica Temporale (LTL, CTL), algoritmo di Model Checking, NuSMV, Oracolo, generazione automatica Test Suite, esempio Java Card Verifier | [5] |
| 6 | Infrastructure Automation con OpenStack: scalabilità, tassonomia cloud, middleware cloud, architettura OpenStack, servizi principali, DevStack, VM lifecycle, Floating Ip, Role Based Access Control, OpenStack APIs | [6] |
| 7 | 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] |
| 8 | Microservizi con Spring Boot: Spring Boot Initializr e Starters, Maven, Dependency Injection, Architettura Applicazione Web Spring, Vagrant e Provisioning, RESTful APIs, CRUD, Zuul | [8] |
L'esame consiste di un elaborato ed una prova orale.
L'esame consiste di un elaborato ed una prova orale.
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.
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