INGEGNERIA DEL SOFTWARE
cod. 06015

Anno accademico 2023/24
3° anno di corso - Primo semestre
Docente
- Federico BERGENTI
Settore scientifico disciplinare
Informatica (INF/01)
Field
Discipline informatiche
Tipologia attività formativa
Caratterizzante
72 ore
di attività frontali
9 crediti
sede:
insegnamento
in ITALIANO

Obiettivi formativi

Proporre un percorso che, partendo dall'analisi della Software Crisis e passando per lo studio dei tradizionali modelli di sviluppo, arrivi a definire i fondamentali aspetti architetturali dei moderni sistemi software.
Il corso prevede, oltre a lezioni teoriche, una serie di esercitazioni in aula sulla parte relativa al linguaggio Java.

Con riferimento agli Indicatori di Dublino:

Conoscenza e capacità di comprensione
Il corso introduce i primi concetti relativi all'ingegneria del software. Particolare enfasi è data alla comprensione delle metodologie classiche. Il testo di riferimento è in italiano, ma viene altresì utilizzata durante le lezioni la terminologia in lingua inglese come avviamento alla consultazione di letteratura scientifica internazionale.

Capacità di applicare conoscenza e comprensione
Le conoscenze teoriche presentate vengono sempre applicate alla risoluzione di problemi specifici. Le esercitazioni che affiancano il corso sono incentrate sulla risoluzione di esercizi e problemi, con particolare riferimento alla realizzazione di applicazioni Web in Java. Spesso i metodi risolutivi vengono presentati sotto forma algoritmica, sviluppando negli studenti la capacità di strutturare procedure utili in numerose parti dell'informatica e non solo nello studio dell'ingegneria del software.

Autonomia di giudizio
Gli esercizi, che vengono proposti relativamente alla parte teorica svolta a lezione, possono venire risolti individualmente o in gruppo. Il confronto con i compagni di corso, nel lavoro a casa o durante gli svolgimenti in aula, favorisce lo sviluppo di capacità specifiche per poter a chiarire ai compagni o ai docenti le proprie argomentazioni. Spesso gli esercizi proposti possono venire risolti in modi molto diversi e l'ascolto delle soluzioni proposte da altri permette di sviluppare la capacità di individuare strutture comuni, al di là delle apparenti differenze superficiali.

Abilità comunicative
Le numerose discussioni sui diversi metodi per risolvere i problemi proposti consentono di migliorare le capacità di comunicazione. Vengono inoltre abitualmente utilizzate durante le spiegazioni (ed esplicitamente evidenziate in classe) alcune modalità di comunicazione specifiche della tecnologia informatica.

Capacità di apprendimento
Lo studio delle origini delle soluzioni tecnologiche e la loro introduzione motivata da considerazioni qualitative e quantitative contribuisce a realizzare negli studenti la capacità di apprendere in modo profondo e non soltanto superficiale e ripetitivo. Le conoscenze così acquisite non sono mai rigide e definitive, ma sono perfettamente adattabili ad ogni evoluzione e cambiamento di prospettiva e di contesto.

Prerequisiti

Esperienze di programmazione in Java, C++ o C#.

Contenuti dell'insegnamento

Parte 1 - Introduzione ai sistemi software complessi e all'ingegneria del software
Parte 2 - Gestione delle configurazioni dei sistemi software
Parte 3 - Sistemi software concorrenti in Java
Parte 4 - Strumenti e tecniche per il riuso del software in Java
Parte 5 - Processi di sviluppo software strutturati e agili
Parte 6 - Progettazione per il riuso e design pattern

Programma esteso

Lezione 1. Introduzione al corso, all'esame e cenni alla storia dell'ingegneria del software
Lezione 2. Sintassi e semantica della logica delle proposizioni ed esercizi svolti
Lezione 3. Sintassi e semantica della logica temporale lineare ed esercizi svolti
Lezione 4. Ragionamento su logica temporale lineare ed esercizi svolti
Lezione 5. Ragionamento su logica temporale lineare 1
Lezione 6. Ragionamento su logica temporale lineare 2 ed esercizi svolti
Lezione 7. Gestione delle configurazioni del software 1
Lezione 8. Laboratorio su gestione delle configurazioni del software 1
Lezione 9. Gestione delle configurazioni del software 2
Lezione 10. Laboratorio su gestione delle configurazioni del software 2
Lezione 11. Laboratorio su gestione delle configurazioni del software 3
Lezione 12. Processi e thread in Java 1
Lezione 13. Processi e thread in Java 2
Lezione 14. Mutua esclusione in Java e modello della memoria 1
Lezione 15. Mutua esclusione in Java e modello della memoria 2
Lezione 16. Code sincronizzate ed esercizi svolti
Lezione 17. Lock, condizioni 1
Lezione 18. Lock, condizioni 2 ed esercizi svolti
Lezione 19. Pool di thread ed esempi
Lezione 20. Oggetti attivi e invocazioni asincrone 1
Lezione 21. Oggetti attivi e invocazioni asincrone 2
Lezione 22. Java reflection 1
Lezione 23. Java reflection 2 ed esercizi svolti
Lezione 24. Esercizi svolti su Java reflection e dynamic proxy
Lezione 25. Aspect-oriented programming 1
Lezione 26. Aspect-oriented programming 2
Lezione 27. Aspect-oriented programming 3 ed esercizi svolti
Lezione 28. Evoluzione, manutenzione e testing 1
Lezione 29. Evoluzione, manutenzione e testing 2
Lezione 30. Cenni a UML
Lezione 31. Design pattern 1 (pattern GoF creazionali)
Lezione 32. Design pattern 2 (pattern GoF strutturali)
Lezione 33. Design pattern 3 (pattern GoF comportamentali)
Lezione 34. Design pattern 4 ed esercizi svolti
Lezione 35. Esercizi svolti in preparazione agli esami 1
Lezione 36. Esercizi svolti in preparazione agli esami 2

Bibliografia

C. Ghezzi, A. Fuggetta, S. Morasca, A. Morzenti, M. Pezze, Ingegneria del Software, Mondadori Informatica, II edizione
Simon Bennett, John Skelton, Ken Lunn, UML, McGraw-Hill
Bruce Eckel, Thinking in Java, disponibile presso http://www.mindview.net, II edizione
Bruce Eckel, Thinking in Patterns, disponibile presso http://www.mindview.net
E. Gamma, R. Helm, R. Johnson, J. Vlissides, Design Patterns, Addison-Wesley

Metodi didattici

Lezioni frontali ed esercitazioni

Modalità verifica apprendimento

Risultati dell'apprendimento e modalità di verifica
Saper comprendere e utilizzare in modo appropriato le tecniche relative all'analisi, progettazione, realizzazione, testing e validazione del software. Saper lavorare in Java per la realizzazione di semplici architetture software. Conoscere le basi del project management. Conoscere e saper utilizzare le principali tecniche per la realizzazione di applicazioni in Java.

Modalità di verifica/esame
L'esame consiste in una prova scritta e una prova di laboratorio a cui si accede solo al superamento della prova scritta. Una volta superata la prova di laboratorio è possibile sostenere una prova orale (su richiesta del docente o dello studente)

Altre informazioni

- - -