81612 - Programming and Development paradigms

Academic Year 2016/2017

  • Docente: Mirko Viroli
  • Credits: 6
  • SSD: ING-INF/05
  • Language: Italian
  • Teaching Mode: Traditional lectures
  • 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 Haskell, Java 8 lambdas
  • the Scala language (OO layer, functional layer, advanced typing, DSL techniques)

Logic programming

  • Prolog
  • relational and logical interpretation

Software engineering

  • advanced design and architectural patterns
  • testing, unit testing, and test-driven development
  • the role of tools for software project management (DVCS and continuous integration)
  • software methodologies overview
  • documenting a project

Readings/Bibliography

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.

Assessment methods

Assignments developed during the course, and sicussion of a final project with oral examination

Teaching tools

Slides projected during lessons

Office hours

See the website of Mirko Viroli