- Docente: Mirko Viroli
- Credits: 6
- SSD: IINF-05/A
- Language: Italian
- Moduli: Mirko Viroli (Modulo 1) Danilo Pianini (Modulo 2) Gianluca Aguzzi (Modulo 3)
- Teaching Mode: In-person learning (entirely or partially) (Modulo 1); In-person learning (entirely or partially) (Modulo 2); In-person learning (entirely or partially) (Modulo 3)
- Campus: Cesena
- Corso: Second cycle degree programme (LM) in Computer Science and Engineering (cod. 6699)
Learning outcomes
At the end of the course, the student will have advanced knowledge of software development techniques and methodologies. In particular: - knows and can apply the main software engineering methodologies, from waterfall to agile approaches, and testing-oriented approaches. - knows and can apply the main techniques for project management and Development Operations. - knows and can apply the main modern programming techniques, with particular reference to the combination of object-oriented and functional programming, and their corresponding design patterns. - knows the main tools and methodologies of generative AI for software development.
Course contents
Software Quality
- "clean coding" and "effective programming" rules
- the role of design patterns
- refactoring
- test-driven development
- unit testing vs integration testing
Functional Programming and OO
- functions and functional programming
- lambda calculus and declarative programming
- the Scala language (OO layer, functional layer, advanced typing)
- advanced design patterns
Methodologies
- overview of software development methodologies
- documentation of a software project
- the SCRUM case
DevOps
- DevOps philosophy and automation
- branching models in version control and their relationship with the development methodology
- build systems and dependency management
- Continuous Integration
AI-assisted coding
- LLMs, prompting, and AI agents: concepts relevant to AI-assisted coding
- vibe coding and development agents: taxonomy, autonomy, tools
- personalization and context engineering (roles and skills)
- use cases in software development
- antipatterns and risks of AI-assisted coding
Readings/Bibliography
Advanced OO programming techniques:
- "Effective Java", Third Edition, Joshua Bloch
- "Design Patterns: Elements of Reusable Object-Oriented Software", Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides
Functional languages:
- "Functional Programming in Scala", Paul Chiusano and Runar Bjarnason
- "Programming in Scala", Bill Venners, Lex Spoon, and Martin Odersky
- "Functional Programming Patterns in Scala and Clojure", Michael Bevilacqua-Linn
- "Programming Scala: Scalability = Functional Programming + Objects", Alex Payne and Dean Wampler
Software Engineering:
- "Fundamentals of Software Engineering", Giorgio Ghezzi, Dino Mandrioli and Mehdi Jazayeri
- "Clean Code", Robert Cecil Martin
- "The Art of Agile Development", James Shore
- "Scrum and XP from the Trenches: How We Do Scrum", by Henrik Kniberg
- "Test Driven Development: By Example", Kent Beck
- "JUnit in Action", Second Edition, Petar Tahchiev, Felipe Leme, Vincent Massol and Gary Gregory
- "Testing in Scala", Daniel Hinojosa
- "Managing Technical Debt: Reducing Friction in Software Development", Philippe Kruchten, Robert Nord, Ipek Ozkaya
Teaching methods
The course consists of classroom lectures on technical and methodological aspects, as well as practical laboratory sessions.
The classroom component provides the foundations for understanding the main software engineering methodologies and advanced, declarative, and functional programming and testing techniques. The lectures are based on projected slides, existing code and/or code developed during the lesson, and critical discussion with the students.
The laboratory component includes practical sessions aimed at learning advanced programming and development techniques and applying advanced design patterns. Starting from existing software, incremental development steps are presented to be carried out in the laboratory and, where necessary, completed at home. The results are discussed on the student forum of the virtuale website.
Assessment methods
Assessment is based on a project, which may be of one of the following two types, at the student’s choice:
1) individually, the student carries out an experiment on advanced topics covered in the course, on a subject proposed by the instructor or chosen by the student
2 ) in groups of approximately three, students develop a software project agreed upon with the instructor, aimed at practising programming and software design skills.
In both cases, the project is discussed during an oral examination, in which the project results are analysed and targeted questions are asked about the various development techniques studied during the course.
This two-part assessment method, combining a project and an oral discussion, makes it possible to evaluate both the student’s ability to explore advanced technical topics in depth and their broad understanding of the wide-ranging themes covered in the course.
Teaching tools
Slides presented during lectures and live use of the development tools studied in the course.
Office hours
See the website of Mirko Viroli
See the website of Danilo Pianini
See the website of Gianluca Aguzzi