81612 - PARADIGMI DI PROGRAMMAZIONE E SVILUPPO

Anno Accademico 2017/2018

  • Docente: Mirko Viroli
  • Crediti formativi: 6
  • SSD: ING-INF/05
  • Lingua di insegnamento: Italiano
  • Modalità didattica: Convenzionale - Lezioni in presenza
  • Campus: Cesena
  • Corso: Laurea Magistrale in Ingegneria e scienze informatiche (cod. 8614)

Conoscenze e abilità da conseguire

Al termine del corso lo studente possiede conoscenze specialistiche su tecniche e metodologie di sviluppo software avanzate. In particolare: - conosce le principali metodologie di software engineering, dagli approcci a cascata a quelli agili, e le sa applicare allo sviluppo di sistemi software complessi; - conosce le principali tecniche di programmazione dichiarativa, funzionale e logica; - sa applicare tecniche di programmazione e sviluppo avanzate nel contesto di linguaggi di programmazione e sistemi moderni, con particolare riferimento alla combinazione di programmazione ad oggetti e funzionale; - sa applicare pattern di progettazione avanzata nel contesto dei vari paradigmi di programmazione.

Contenuti

Qualità del Software

  • regole di "clean coding" e "effective programming"
  • il ruolo dei pattern di progettazione
  • refactoring
  • approcci agili

Programmazione funzionale

  • funzioni e programmazione funzionale
  • elementi di Java 8 lambdas e lambda calcolo
  • il linguaggio Scala (layer OO, layer funzionale, typing avanzato)

Programmazione Logica

  • Prolog
  • Integrazione Java-Prolog

Software engineering

  • rassegna delle methodologie di sviluppo del software
  • documentazione di un progetto software
  • il caso di SCRUM
  • testing, unit testing, e test-driven development
  • continuous integration e delivery
  • pattern di progettazione avanzati

Testi/Bibliografia

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

Metodi didattici

Il corso si svolge con lezioni in aula sugli aspetti tecnici e metodologici, ed esercitazioni pratiche in laboratorio. 

Nella parte in aula si pongono le basi per la conoscenza delle principali metodologie di software engineering e delle tecniche di programmazione dichiarativa, funzionale e logica. Le lezioni sono impartite a partire da slide proiettate, codice pre-esistente e/o costruito durante la lezione, e discussione critica assieme agli studenti.

Nella parte in laboratorio, si organizzano delle sessioni pratiche volte all'apprendimento di tecniche di programmazione e sviluppo avanzate e della applicazione di pattern di progettazione avanzata. Partendo da software esistente, si presentano passi incrementali di sviluppo da eseguire in laboratorio ed eventualmente completare a casa. I risultati sono discussi sul forum studenti del sito e-learning.

 

Modalità di verifica e valutazione dell'apprendimento

La verifica dell'apprendimento avviene in 2 fasi:

1) durante l'anno vengono erogati alcuni assignment (tipicamente 3), che consistono in attività mirate (6-7 ore di lavoro, sparse nel periodo di una decina di giorni), che hanno l'obiettivo di esercitare le capacità di sviluppo software; tali assignment sono del tutto opzionali, e verranno utilizzati come elemento aggiuntivo per la valutazione, e per guidare parte della discussione nella fase 2;

2) a gruppi di 4 persone circa, gli studenti svilupperanno un progetto software, concordato coi docenti e a valere su tutto il corso integrato (con Programmazione Concorrente e Distribuita); in una discussione di gruppo si analizzerà il risultato del progetto (metodologie/tecnologie e pattern utilizzati), eventualmente gli assignment svolti, e si faranno domande mirate sulle varie tecniche di sviluppo studiate.

Strumenti a supporto della didattica

Slides proiettate a lezione

Orario di ricevimento

Consulta il sito web di Mirko Viroli