81612 - Programming and Development paradigms

Academic Year 2019/2020

  • Docente: Mirko Viroli
  • Credits: 6
  • SSD: ING-INF/05
  • Language: Italian
  • Moduli: Mirko Viroli (Modulo 1) Mirko Viroli (Modulo 2)
  • Teaching Mode: Traditional lectures (Modulo 1) Traditional lectures (Modulo 2)
  • Campus: Cesena
  • Corso: Second cycle degree programme (LM) in Computer Science and Engineering (cod. 8614)

Learning outcomes

At the end of this course, students will acquire advanced knowledge of techniques and methodologies for advanced software development. In particular, students will:-know the basic software engineering methodologies (from waterfall to agile ones), and can apply them to develop complex software systems; - know the main programming techniques of declarative (functional and logical) approaches; - be able to apply advanced programming techniques in the context of modern programming languages, and in particular, those mixing object-oriented and functional paradigms; - be able to apply advanced design patterns in the context of the various programming paradigms.

Course contents

Software quality

  • rules for clean code and effective programming
  • the role of design patterns
  • refactoring
  • agile approaches

Functional programming

  • functions and functional programming
  • elements of Java 8 lambdas and lambda calculus
  • the Scala language (OO layer, functional layer, advanced typing)

Logic programming

  • Prolog
  • Java-Prolog integration

Software engineering

  • software methodologies overview
  • documenting a project
  • the role of SCRUM
  • testing, unit testing, and test-driven development
  • continuous integration and delivery
  • advanced design and architectural patterns


Advanced OO programming techniques:

  • "Effective Java", Second Edition, Joshua Bloch
  • "Design Patterns: Elements of Reusable Object-Oriented Software", Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides
  • "Java 8 Lambdas", Richard Warburton

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

Logic languages:

  • "The Art of Prolog", Second Edition, Leon S. Sterling and Ehud Y. Shapiro

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

Teaching methods

The course will provide lessons in room on technical and methodological aspects, and practical exercises in lab.

In room we ground knowledge of basic software engineering methodologies and declarative (functional, logic) software development techniques. Lessons are given with projected slides, existing and dynamically built code, and critical discussion with students.

In lab, practical experiences are organised that are devoted to learning advanced techniques of software development and application of advanced design patterns. Starting from existing code, incremental development steps are presented that must be carried on during lab and possibly completed at home. Results are discussed using the student forum on the e-learning site.

Assessment methods

Assessment is conducted through a project, which can be of two kinds, freely chosen by the student:

1) individually, the student experiments advanced aspects of the course, based on a theme proposed by the teacher or chosen by the student;

2) with typically 4-persons teams, students will develop a software project, established in agreements with teachers, in which he/she will exercise his understanding and competence on advanced design and development.

In both cases, the project will be discusses through an oral exam, in which there will be analysis of project results, but also with specific questions on the various developments techniques discussed in the course.

This double modality (project and oral discussion) should guarantee to both assess the student's ability to go vertically on technical aspects, but also to stay horizontal and have a broad view of the subject.

Teaching tools

Slides projected during lessons, and "live" usage of the tools studied during the course.

Office hours

See the website of Mirko Viroli