Distributed systems engineering and Lab
Module LAB

Academic Year 2023/2024 - Teacher: ANDREA FRANCESCO FORNAIA

Expected Learning Outcomes

General goals described according to the expected learning results.

  1. Knowledge and understanding: the student will be able to use advanced development mechanisms, i.e. on collabrative and distributed development, validation of complex systems, automation of the release process, design and implementation of distributed systems with microservices. 
  2. Applying knowledge and understanding: the student will be able to design, and implement advanced development, validation and release tools for distributed applications.
  3. Making judgements: the student will be able to analyse advanced development, validation and release solutions for distributed applications.
  4. Communication skills: the student will be able to describe advanced development, validation and release solutions using a proper technical language.
  5. Learning skills: the student will be able to solve typical problems, by studying, analysing and using novel development, validation and release technologies. 

Course Structure

Frontal lessons for concepts, techniques and code; practical tutorials with examples of code for the covered topics.

Should remote teaching be needed, then some adjustements to the above might be introduced, while honouring the programme outlined in the syllabus.

Required Prerequisites

Ability to design and implement object-oriented systems.

Attendance of Lessons

Attending lessons is strongly recommended.

Detailed Course Content

Introduction to DevOps. Git Workflow and distributed development. Maven. Unit Testing. Automatic test generation. Mutation Testing. Combinatorial Testing. Microservices. Microservices with Spring Boot. Distributed Tracing.

Textbook Information

  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

Course Planning

 SubjectsText References
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]

Learning Assessment

Learning Assessment Procedures

The exam consists of a project and an oral test. 

Examples of frequently asked questions and / or exercises

Main characteristics of a DevOps approach

Describe fetch, pull, and push operations via transformations on the Commit Graph

Describe the concept of Covering Array

Describe the concept of Mutation Testing

What is the relationship between Dependence Injection and Unit Testing

Describe the concept of Session Affinity and how to avoid it in a Microservices context

Show the typical structure of a Microservices application implemented via Spring Boot

Discuss the difference between logging and tracing in a distributed application