Paradigmi di Programmazione e Sviluppo 2018/2019
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.
- 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 metodologie 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
- 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
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.
La verifica dell'apprendimento avviene in 2 fasi:
1) durante il corso vengono erogati alcuni assignment (tipicamente 3), che consistono in attività mirate (6-7 ore di lavoro), 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 col docente; 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.
Questa doppia modalità è realizzata per guidare lo studio dello studente durante il corso, e infine per esercitare la sua capacità di organizzare un progetto software in team, applicando i metodi di produzione di software di qualità discussi durante il corso.
Slides proiettate a lezione