81614 - Laboratory of Software Systems

Course Unit Page

Academic Year 2020/2021

Learning outcomes

By the end of the course, the student is expected to master advanced techniques for organising the software development process, and in particular:

  • ability to set up, evolve, and maintain an agile development process, including build automation, multi-platform and multi-target testing, continuous integration, and continuous delivery;
  • capacity of performing a domain-first analysis in a technology-independent fashion, leveraging techniques of Domain Driven (DDD) and Model Driven (MDD) development
  • knowledge of supporting tools for supporting DDD/MDD: creation of domain-specific languages (DSLs) and corresponding code generators (Xtext), development of language-internal DSLs in modern programming languages (Kotlin)
  • acquaintance with the design of cyber-physical systems, and in particular the ability to deal with real-time, multi-user, context-aware, distributed, proactive, and highly autonomous software systems.

 

Course contents

  • Quick course of Kotlin for Scala/Java programmers
  • Build automation, with Gradle as reference tool
  • Documentation as code (Markdown, Jekyll/Liquid, Orchid/Pebble)
  • Software versioning and licensing
  • Team work organization (git as reference tool)
  • Continuous integration (Travis CI as reference tool)
  • Software QA along the whole development process (Codacy, Codecov, Jacoco, Detekt, Ktlint as reference tools)
  • Continuous delivery
  • Containerization and deployment on the cloud (Docker, Kubernetes)
  • Patterns for distributed software engineering (Function as a Service, Serverless, Command Query and Responsibility Segregation)
  • Domain Driven Design and Model Driven Design
  • Domain-Specific Language design with Xtext
  • Human in the loop and context awareness
  • DDD/MDD applied to modern case studies (Healthcare 4.0, eXtended Reality)

Readings/Bibliography

Suggested books (not required for the course):

  • Domain-driven design - Eric Evans
  • Implementing Domain-Specific Languages with Xtext and Xtend - Lorenzo Bettini
  • Fundamentals of Software Architecture. An Engineering Approach - Mark Richards, Neal Ford
  • Pattern, Principles and Practices of Domain-Driven Design - Scott Millett, Nick Tune

Additional suggested readings:

  • Mastering Kotlin - Nate Ebel
  • Kotlin in Action - Dmitry Jemerov, Svetlana Isakova
  • Practical Domain-Driven Design in Java - Vijay Nair
  • Model-Driven Software Development. Technology, Engineering, Management - Thomas Stahl, Markus Völter

Teaching methods

Laboratory lectures. Any concept is immediately followed by a hands-on session, so that students rapidly grow confident with the techniques and tools.

All lessons can be followed via Internet, interactively.

Assessment methods

Discussion based on a group-developed project.

The project must be developed with the DDD/MDD philosophy, and may be in the context of the cyber-physical scenarios discussed during the course. The project must witness the acquired ability of organizing a team workflow appropriately using the version control tools; automating the phases of building, testing, maintenance, verification, quality assurance, documentation and deployment of the product.

Groups can ask for the development of a joint project with other optional courses of this master, by applying the aforementioned techniques to a project of another advanced course. This possibility is to be discussed case-to-case, in agreement with the professor of the other course(s).

Teaching tools

The teacher will provide:

  • Notes and slides
  • Code examples
  • Template projects
  • References to the tools' documentation

Office hours

See the website of Danilo Pianini

See the website of Angelo Croatti