81612 - Programming and Development paradigms

Course Unit Page

  • Teacher Mirko Viroli

  • Credits 6

  • SSD ING-INF/05

  • Teaching Mode Traditional lectures

  • Language Italian

  • Campus of Cesena

  • Degree Programme Second cycle degree programme (LM) in Computer Science and Engineering (cod. 8614)

  • Teaching resources on Virtuale

Academic Year 2017/2018

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 in two stages:

1) during the course few assignments are given (typically 3), consisting in ad-hoc activities (6-7 hours each, spread in about 10 days) with the goal of exercising software development skills; such assignments are optional, and will be used as additional assessment means for the final evaluation, and to guide discussion as of stage 2;

2) with 4-persons teams, students will develop a software project, established in agreements with teachers and pertaining the whole Integrated Course (along with Concurrent and Distributed Programming); in the final discussion at the exam with the whole team, the result of the project will be analysed (considering methodologies/tecnnologies, and used patterns), possibly considering the outcome of assignments, and with specific questions on the various developments techniques discussed in the course.

Teaching tools

Slides projected during lessons

Office hours

See the website of Mirko Viroli