Software Quality and Project Development
Anno accademico 2026/2027 - Docente: STEFANO BORZI'Risultati di apprendimento attesi
Obiettivi formativi generali dell'insegnamento in termini di risultati di apprendimento attesi.
Conoscenza e capacità di comprensione (knowledge and understanding): l’obiettivo del corso consiste nel far acquisire allo studente le capacità di realizzare un progetto in completa autonomia mediante l’utilizzo di Git scrivendo codice conforme alle attuali convenzioni.
Capacità di applicare conoscenza e comprensione (applying knowledge and understanding): lo studente sarà in grado di utilizzare le metodologie apprese per operare attivamente su un sistema operativo UNIX-like attraverso la shell di comando, realizzare un progetto con il supporto dello strumento git e delle GitHub Actions.
Autonomia di giudizio (making judgments): mediante esempi concreti lo studente sarà in grado di utilizzare autonomamente gli strumenti forniti a lezione.
Abilità comunicative (communication skills): lo studente acquisirà le necessarie conoscenze ed abilità comunicative relative al sistema di controllo di versione git, al linguaggio di programmazione Python, agli unit test e alla pipeline di un eventuale progetto.
Capacità di apprendimento (learning skills): l’obiettivo del corso consiste nel fornire allo studente strumenti moderni per scrivere codice di qualità e cooperare all’interno di un team al fine di realizzare un eventuale progetto.
Modalità di svolgimento dell'insegnamento
Didattica Frontale Seminari integrativi
Qualora l'insegnamento venisse impartito in modalità mista o a distanza, potranno essere introdotte le variazioni necessarie rispetto a quanto dichiarato in precedenza, al fine di rispettare il programma previsto e riportato nel syllabus.
Prerequisiti richiesti
Conoscenze di base di programmazione.
Frequenza lezioni
La frequenza non è obbligatoria, ma fortemente consigliata.
Contenuti del corso
Il corso è un’introduzione alle seguenti tecnologie e strumenti di sviluppo:
Shell UNIX: Fondamenti del terminale, navigazione nel filesystem, gestione dei permessi, piping, redirezione dell'output e scrittura di script Bash per automatizzare operazioni ripetitive.
Git: Concetti base di versionamento, gestione del ciclo di vita dei file (untracked, modified, staged), branching strategico, merging e adozione di Conventional Commits per uno storico del progetto leggibile.
GitHub, pipeline & GitHub Action: Utilizzo di piattaforme di collaborazione, gestione di Pull Request, Issue tracking e configurazione di pipeline di automazione tramite GitHub Actions.
Python: Approfondimento del linguaggio, tipizzazione statica, gestione di ambienti virtuali (venv/pip), programmazione orientata agli oggetti e best practice moderne.
Unit-test: Scrittura di test automatizzati con pytest, tecniche di mocking, patching e spying per isolare la logica del codice e garantire la regressione zero.
End-to-end test with Playwright: Automazione dei test funzionali nel browser, simulazione dell'interazione utente reale e validazione dei flussi critici dell'applicazione.
SOLID principles & best practices: Applicazione dei principi di progettazione (Single Responsibility, Open-Closed, Liskov, Interface Segregation, Dependency Inversion) per scrivere codice manutenibile, scalabile e "pulito".
CI / CD pipeline & debugging tools: Implementazione di flussi di Continuous Integration e Continuous Deployment, utilizzo di debugger integrati (es. VS Code) e strumenti di analisi statica del codice.
Docker: Containerizzazione delle applicazioni, creazione di Dockerfile e gestione di ambienti di sviluppo isolati per garantire la coerenza tra sviluppo e produzione.
Agent AI Development: Sviluppo di agenti intelligenti e integrazione di sistemi tramite il protocollo MCP (Model Context Protocol).
Ogni tecnologia verrà introdotta e accompagnata da una parte di laboratorio, focalizzata sull'applicazione pratica e sulla risoluzione di problemi reali durante lo sviluppo software.
Testi di riferimento
Programmazione del corso
| Argomenti | Riferimenti testi | |
|---|---|---|
| 1 | Shell UNIX & linguaggio BASH | Dispense docente |
| 2 | Git, un sistema di controllo di versione | Dispense docente |
| 3 | GitHub e il mondo dell’open source | Dispense docente |
| 4 | Opensource | Dispense docente |
| 5 | Approfondiamo comandi Git | Dispense docente |
| 6 | Introduzione a Python | Dispense docente |
| 7 | Software testing, unit test, fuzz test, design pattern | Dispense docente |
| 8 | End-to-end test | Dispense docente |
| 9 | SOLID principles & best practices | Dispense docente |
| 10 | CI / CD pipeline & debugging tools | Dispense docente |
| 11 | Docker container, images & Docker compose | Dispense docente |
| 12 | Agent AI development | Dispense docente |
Verifica dell'apprendimento
Modalità di verifica dell'apprendimento
Per poter accedere all'esame, in accordo con il regolamento, è OBBLIGATORIA la prenotazione sul portale Smart Edu e su qualunque altra piattaforma, come MS Forms, richiesta dal docente per poter ottimizzare la logistica. Per eventuali problemi tecnici relativi alla prenotazione Smart Edu occorre rivolgersi alla Segreteria didattica.
La prova d'esame consisterà in una parte orale e nella valutazione di un progetto assegnato allo studente.
La prova è strutturata in modo che ad ogni studente sia attribuito un voto secondo il seguente schema:
Non approvato: lo studente non ha acquisito i concetti di base e non è in grado di rispondere ad almeno il 60% delle domande né di svolgere gli esercizi.
- 18-23: lo studente dimostra una padronanza minima dei concetti di base, le sue capacità di collegamento dei contenuti sono modeste, riesce a risolvere semplici esercizi.
- 24-27: lo studente dimostra una buona padronanza dei contenuti del corso, le sue capacità di collegamento dei contenuti sono buone, risolve gli esercizi con pochi errori.
- 28-30 e lode: lo studente ha acquisito tutti i contenuti del corso ed è in grado di padroneggiarli compiutamente e di collegarli con spirito critico; risolve gli esercizi in modo completo e senza errori.
Esempi di domande e/o esercizi frequenti
- Cos'è un sistema di controllo di versione?
- Cos'è e come si risolve un merge conflict?
- Cosa significa CI/CD?
- Cos'è Docker?
- Qual è il workflow standard utilizzato durante lo sviluppo di un software?