Seleziona l'Anno Accademico:     2016/2017 2017/2018 2018/2019 2019/2020 2020/2021 2021/2022
Docente
LUCA DIDACI (Tit.)
BATTISTA BIGGIO
Periodo
Primo Semestre 
Modalità d'Erogazione
Convenzionale 
Lingua Insegnamento
INGLESE 



Informazioni aggiuntive

Corso Percorso CFU Durata(h)
[70/90]  COMPUTER ENGINEERING, CYBERSECURITY AND ARTIFICIAL INTELLIGENCE [90/00 - Ord. 2018]  PERCORSO COMUNE 8 80

Obiettivi

Il corso fornirà agli studenti alcuni degli strumenti e delle metodologie utili per lo sviluppo di software a livello industriale su piccola e media scala, utilizzando un approccio moderno, modulare e iterativo, e porre le basi per lo sviluppo di software sicuro. I due aspetti saranno visti in sinergia. Come in altri settori dell'ingegneria, la sicurezza non è una caratteristica accessoria che può essere successivamente aggiunta al progetto. Viceversa, come sostenuto dal paradigma security-by-design nell'ingegneria della sicurezza, i requisiti di sicurezza e protezione del sistema dovrebbero essere gestiti e considerati sin dalle fasi iniziali del processo di progettazione.

Il corso si propone di fornire agli studenti solide conoscenze su:
- l'importanza dell'adozione di un processo e di una metodologia di sviluppo
- le basi delle tecnologie agili in generale e del modello Test Driven Development (TDD) in particolare
- il concetto di design pattern, i suoi vantaggi e limiti a seconda del linguaggio di programmazione e del contesto dell'applicazione
- metodi di verifica del software, in particolare test di unità, anche con applicazioni pratiche in Python.

Il linguaggio di programmazione Python è utilizzato come strumento per mostrare l'applicazione di metodologie agili, design pattern e verifica del software. Verranno fatti cenni ad altri linguaggi di programmazione, per mostrare le peculiarità e le differenze nell'implementazione dei design pattern e nelle scelte progettuali in generale.

UML e GIT sono introdotti come strumenti indispensabili per la descrizione di un'architettura software o di una soluzione di implementazione (UML) e per la gestione di codice e versioning (GIT).

Conoscenza e capacità di comprensione
Alla fine del corso lo studente conoscerà
- i fondamenti dell'ingegneria del software come scienza che studia strumenti e metodologie per pianificare, sviluppare e valutare applicazioni software complesse;
- le basi delle tecnologie agili in generale e del modello Test Driven Development (TDD) in particolare;
- i principali metodi di verifica del software;
- il concetto di design pattern, i suoi vantaggi e limiti a seconda del linguaggio di programmazione e del contesto dell'applicazione.

Capacità di applicare le conoscenze e capacità di comprensione

Alla fine del corso lo studente sarà in grado di
- comprendere i principi e l'organizzazione dei moderni processi di progettazione del software, con particolare riferimento alla modularità, all'occultamento delle informazioni e all'astrazione;
- progettare e implementare software utilizzando l'approccio TDD e i design pattern;
- applicare i concetti appresi nello sviluppo e nella verifica dei programmi.


Autonomia di giudizio
Alla fine del corso lo studente sarà in grado di:
- valutare il grado di modularità e portabilità dei prodotti software;
- progettare un piano di test del software secondo le principali metodologie;
- valutare la correttezza del software progettando ed eseguendo test specifici;
- scegliere i design pattern che meglio si adattano al problema in questione.

Abilità comunicative
Al termine del corso lo studente avrà acquisito adeguate competenze linguistiche in relazione al contenuto del corso, al fine di: (1) essere compreso da un interlocutore con adeguate conoscenze tecniche; e (2) trasmettere i concetti essenziali anche a un interlocutore che non è tecnicamente competente.

Capacità di imparare indipendentemente
Alla fine del corso lo studente avrà la capacità di approfondire le sue conoscenze nel campo della progettazione, sviluppo, verifica e implementazione del software, anche in riferimento alla progettazione sicura.

Prerequisiti

Ci aspettiamo che gli studenti conoscano le basi di OOP e abbiano una sufficiente conoscenza di almeno un linguaggio di programmazione.

Il Docente fornirà indicazioni utili per permettere un riallineamento delle competenze.

Contenuti

Introduzione al corso

Ingegneria del software: panoramica
Qualità del software
Principi di ingegneria del software
Tecniche di modularizzazione
-- La struttura modulare e la sua rappresentazione
-- Interfaccia, implementazione e nascondimento delle informazioni
-- Tecniche di design specifiche per il cambiamento
- I principi SOLID

Metodologie AGILI.
Una particolare metodologia AGILE: il modello di sviluppo Agile guidato dai test (Test Driven Development)
Verifica del software
-- Obiettivi e requisiti di verifica
-- I diversi approcci alla verifica
-- Prova "white box" e "black box"
-- Test di unità

Design pattern
- Cenni sul linguaggio UML
- Il concetto di Design Pattern
- Alcuni design pattern fondamentali – Esempi in Java e Python
- Design pattern e modularità
- Design pattern e progettazione in vista del cambiamento

Altre metodologie software (seminari tenuti da relatori esterni)
Strumenti e ambienti per la progettazione e lo sviluppo: GIT

Metodi Didattici

Il corso si basa su lezioni frontali con una parte significativa di esercizi svolti in aula o assegnati per casa.

Le lezioni si avvalgono di una serie di slides ottenute dal materiale di studio fornito dal docente allo scopo di integrare la spiegazione e la discussione dei concetti illustrati e delle loro possibili applicazioni.


Ove la situazione epidemiologica lo richiedesse, alcune lezioni potrebbero essere trasmesse online e le esercitazioni potrebbero essere svolte mediante forme di interazione a distanza.



Il piano approssimativo del corso è il seguente:
Lezioni frontali: 40 ore
Esercitazioni e seminari tenuti da relatori invitati: 40 ore

Verifica dell'apprendimento

L'esame consiste
- in una prova scritta, comprendente quesiti di teoria ed esercizi di progettazione, implementazione e di test di un sistema software.
- nella realizzazione di un progetto software, utilizzando gli strumenti illustrati nel corso.

La prova scritta si compone solitamente di alcuni esercizi volti a verificare l'effettiva acquisizione dei risultati di apprendimento attesi, toccando la maggior parte del programma a diversi livelli di dettaglio.

La valutazione è oggettiva, definita sulla base della percentuale di correttezza di ogni risposta (alla quale è associato un punteggio fisso, non noto al candidato, sulla base del livello di difficoltà).
La prova è valutata con un punteggio massimo di 33. In caso di punteggio maggiore o uguale a 32, viene data la lode. In caso di punteggio uguale a 31, viene dato 30.

Ove la situazione epidemiologica lo richiedesse, la valutazione potrebbe essere svolta mediante una prova fiduciaria di autovalutazione, online, e successivamente un orale conclusivo.

Lo studente è stimolato ad andare oltre il semplice studio volto a risolvere il singolo esercizio, mediante problemi che richiedono la capacità di passare dal concetto astratto alla sua applicazione pratica. Lo studente è sempre invitato a motivare la risposta fornita. Tale approccio rende possibile valutare le conoscenze e la capacità di applicarle a problemi di differente complessità, e anche di valutare le capacità di comunicazione e l'autonomia del giudizio.

Il numero di sessioni d'esame è definito in base al regolamento di Facoltà.

Testi

Appunti del corso, forniti agli studenti attraverso il sito web del corso e corretti e aggiornati ogni anno.

*UML*
Perdita Stevens,Rob Pooley, " USING UML - SOFTWARE ENGINEERING WITH OBJECTS AND COMPONENTS

*Design Pattern*
Gamma et al., "Design Patterns: Elements of Reusable Object-Oriented Software"
Chetan Giridhar - Learning Python Design Patterns - Second Edition -2016
Bernd Bruegge, Allen H. Dutoit - Object-Oriented Software Engineering Using UML, Patterns, and Java (3rd Edition) 3rd Edition
Devendra Singh- JAVA DESIGN PATTERNS
Tony Bevis - Java Design Pattern Essentials
CodeWiz RDZ, R.M.Z - Design Patterns: The Easy Way 2016

*Development methodologies*
Sommerville - Ingegneria del Software 10 ed. , 2017
SDL Microsoft Security Development Lifecycle https://www.microsoft.com/en-us/sdl
Robert C. Martin Agile Software Development: Principles, Patterns, and Practices
Mike Cohn - Agile Estimating and Planning

*TDD*
Kent Beck - Test-Driven Development: By Example (2002)
Viktor Farcic, Alex Garcia - Java Test-driven Development (2015)
Harry J. W. Percival - Test-Driven Development With Python: Obey the Testing Goat: (2017)

Altre Informazioni

Appunti del corso e altro materiale didattico, fornito agli studenti attraverso il sito web del corso e corretto / aggiornato ogni anno.
Gli esercizi proposti verranno messi a disposizione e verranno corretti in aula.

Questionario e social

Condividi su: