TE-A3-M3-L01 - Ciclo di Vita del Software: Metodologie, UML e Pattern | Prof. Giagnotti
Tecnologia • Anno 3 • Modulo 1 • Lezione 03
a cura di Prof. Giagnotti • Informatica e Sistemi

Ciclo di Vita del Software: Metodologie, UML e Pattern

Dalla crisi del software del '68 ai team Scrum moderni: come si organizza un progetto reale, come si modella con UML prima di scrivere codice e come si misura la qualità con ISO 25010, SOLID e design pattern. Caso di studio: la biblioteca scolastica.

🎯 Obiettivi di apprendimento
✓Conoscere le fasi del ciclo di vita del software e le principali metodologie di sviluppo: modello a cascata, modelli iterativi e a spirale, metodologie agili (Scrum)
✓Comprendere la sintassi e l'uso dei principali diagrammi UML — casi d'uso, classi e sequenza — per modellare graficamente un sistema software
✓Distinguere i concetti di qualità del software secondo il modello ISO/IEC 25010 e riconoscere i design pattern (GoF) più comuni
✓Applicare le metodologie apprese a un caso di studio reale, dall'analisi dei requisiti alla progettazione UML e alla scelta dei pattern

Ogni volta che apri un'app sul telefono, prenoti un biglietto online o usi il registro elettronico, stai usando il risultato finale di un processo: qualcuno ha analizzato un problema, progettato una soluzione, scritto codice, verificato che funzionasse e continua a mantenerlo nel tempo. Quel processo ha un nome — ciclo di vita del software — e un insieme di strumenti e regole che lo rendono gestibile anche quando il progetto coinvolge decine di persone e centinaia di migliaia di righe di codice.

1. Ingegneria del software e metodologie di sviluppo

📌 Definizione da ricordare

L'ingegneria del software è la disciplina che applica principi tecnici, metodi sistematici e strumenti di gestione allo sviluppo, manutenzione e dismissione del software, per produrre sistemi affidabili ed efficienti entro vincoli di tempo e costo. Il termine nasce nel 1968 alla NATO Conference, come risposta alla "software crisis".

1.1 Il ciclo di vita del software (SDLC)

Il Software Development Life Cycle è l'insieme delle fasi che un prodotto attraversa. Ciò che distingue le metodologie non è la presenza delle fasi — servono quasi sempre tutte — ma come sono organizzate nel tempo.

FaseObiettivoOutput tipico
Analisi requisitiCapire cosa deve fare il sistema e per chiDocumento requisiti funzionali / non funzionali
ProgettazioneDefinire architettura, moduli, dati, interfacceDiagrammi UML, schema dati, design doc
ImplementazioneScrivere il codice sorgenteCodice versionato su Git
Test / verificaTrovare difetti prima del rilascioPiano test, report bug
RilascioRendere disponibile agli utentiVersione in produzione
ManutenzioneCorreggere, adattare, migliorarePatch, nuove versioni

1.2 Il modello a cascata (Waterfall - Royce 1970)

Sequenza rigida: si passa alla fase successiva solo quando la precedente è completata e "congelata". È intuitivo ma fragile: se un requisito era interpretato male, l'errore emerge in fase di test, quando correggerlo costa 10x.

Analisi Progettazione Implementazione Test Rilascio Manutenzione Flusso sequenziale → nessun ritorno previsto → adatto a requisiti stabili e normati
💬 Tip del docente — Prof. Giagnotti

In classe vi dico sempre: Io ho pensato di fare così quando spiego Waterfall — lo disegno come una cascata vera. Se all'interrogazione vi chiedono "quando ha senso?", dite "quando i requisiti sono congelati, esempio software per dispositivi medicali certificati". Io lo farei così per ricordarlo: Waterfall = ghiaccio, Agile = acqua che si adatta. In Tecnologia questa metafora vale oro perché vi fa distinguere subito rigidità vs adattività.

⚠️ Errore comune

Confondere "metodologia" con "linguaggio". Waterfall e Scrum dicono quando e come organizzarsi, non in che linguaggio programmate. Potete fare Scrum in Python, Java o anche solo su carta.

1.3 Modelli iterativi, incrementali e a spirale (Boehm 1986)

01 · Iterativo

Ripetizione

Stesso ciclo analisi→test ripetuto, ogni volta raffini la soluzione precedente.

02 · Incrementale

Consegne

Dividi il sistema in incrementi funzionali, ciascuno rilasciato separatamente.

03 · Spirale

Rischio

Ogni giro: obiettivi, analisi rischi, prototipo, pianificazione giro successivo.

1.4 Le metodologie agili e Scrum

Manifesto Agile (2001): privilegia persone e interazioni, software funzionante, collaborazione col cliente, risposta al cambiamento. Scrum organizza tutto in sprint di 1-4 settimane con un incremento potenzialmente rilasciabile.

Elemento ScrumCos'è in pratica
Product OwnerRappresenta il cliente, decide cosa ha priorità
Scrum MasterFacilita, rimuove ostacoli, protegge il team
Development TeamProgetta, codifica, testa
Product BacklogLista prioritaria di tutte le funzionalità
Sprint BacklogSottoinsieme scelto per lo sprint
Daily Scrum15 min al giorno per sincronizzarsi
IncrementProdotto funzionante a fine sprint
🎯 Esempio in classe — Sprint per la biblioteca

Sprint 1: solo ricerca libri. Sprint 2: aggiungiamo prestito. Sprint 3: notifiche scadenza. In Tecnologia questo approccio vi insegna a non voler fare tutto subito: prima funzionante, poi completo. È la stessa logica con cui a scuola facciamo i progetti di laboratorio.

1.5 Cascata o agile? Confronto

CriterioWaterfallAgile / Scrum
RequisitiDefiniti e congelati all'inizioEvolvono nel tempo
ConsegnaUna sola, a fine progettoIncrementale ogni sprint
CambiamentoCostoso, rilavorazionePrevisto e incentivato
DocumentazioneEstesa e formaleJust enough
Adatto aRequisiti stabili, normatiProdotti digitali, incertezza

2. Il linguaggio di modellizzazione UML

📌 Definizione da ricordare

UML (Unified Modeling Language) è il linguaggio grafico standard OMG / ISO 19505 per visualizzare, specificare e documentare sistemi OO. Nasce nel 1997 dall'unione di Booch, Jacobson, Rumbaugh — i "tre amigos". Non è un metodo, è un linguaggio comune per evitare ambiguità.

UML 2.5 ha 14 diagrammi divisi in strutturali (classi, oggetti, componenti, deployment) e comportamentali (casi d'uso, sequenza, attività, stati). A scuola vi bastano 3: casi d'uso, classi, sequenza.

2.1 Diagramma dei casi d'uso (Use Case)

Rappresenta le funzionalità dal punto di vista di chi usa il sistema. Attore = persona o sistema esterno. Caso d'uso = ovale con valore per l'attore. Sistema = rettangolo che racchiude tutto.

Attore

Chi usa?

Studente, Bibliotecario, ma anche sistema esterno come email gateway.

Caso d'uso

Cosa fa?

Cerca libro, Prenota libro, Gestisce catalogo — sempre verbo + oggetto.

Relazioni

Come si legano?

Include = sempre richiamato, Extend = solo in condizioni particolari.

💬 Tip del docente

Io ho pensato di fare così per farvi ricordare i casi d'uso: vi faccio disegnare prima gli omini stilizzati (attori) e poi chiedo "cosa vuole fare questo omino?". Io lo farei così anche alla verifica: se finite con 15 ovali, avete sbagliato — per la biblioteca bastano 4-5 casi d'uso principali. In Tecnologia l'eccesso è errore quanto la mancanza.

🎯 Esempio concreto — Biblioteca

Studente → Cerca libro, Prenota libro, Restituisce libro. Bibliotecario → Gestisce catalogo, Cerca libro (anche lui). Prenota libro «include» Invia promemoria (scadenza). Se il libro è in ritardo, parte «extend» Applica sanzione.

2.2 Diagramma delle classi

È il diagramma strutturale più usato: ogni classe = rettangolo con nome, attributi, operazioni. Fondamentale per Tecnologia perché collega direttamente OOP e progettazione.

RelazioneSimboloSignificato
AssociazioneLinea sempliceCollaborano, si conoscono
AggregazioneRombo vuoto"Ha un" debole — parti esistono senza tutto
ComposizioneRombo pieno"Ha un" forte — parti non esistono senza tutto
GeneralizzazioneTriangolo vuotoEreditarietà "è un"
Molteplicità1..*, 0..1Quante istanze coinvolte
⚠️ Errore comune

Mettere la dataScadenza dentro Libro o dentro Studente. No: la scadenza appartiene alla relazione tra i due in un momento preciso. Serve una classe associativa Prestito. Se all'interrogazione vi chiedo "dove metto la data?", la risposta è sempre: nella classe che rappresenta l'associazione.

🎯 Esempio — Biblioteca

Utente (abstract) id, nome —→ Studente (classe) e Docente (materia) ereditano. Utente 1 — 0..* Prestito (dataInizio, dataScadenza, estendi()). Prestito 1 — 1 Libro (ISBN, titolo, autore). Questa estrutura rende il codice leggibile e manutenibile.

2.3 Diagramma di sequenza

Mostra come gli oggetti si scambiano messaggi nel tempo. Lifeline verticale, messaggi orizzontali dall'alto al basso.

UML · Scenario Prenota Libro
Studente -> Interfaccia : 1: cercaLibro(titolo) Interfaccia -> Catalogo : 2: verificaDisponibilita() Catalogo --> Interfaccia : 3: disponibile = true Interfaccia --> Studente : 4: mostraRisultato() Studente -> Interfaccia : 5: prenota() Interfaccia -> Prestito : 6: crea(studente, libro) Prestito --> Studente : 7: confermaPrenotazione()

2.4 Altri diagrammi quando servono

Attività = flusso con decisioni e parallelismi (utile per sanzioni ritardo). Stati = come Prestito passa da "attivo" a "in ritardo" a "restituito". Componenti / Deployment = moduli e loro distribuzione su server. In un progetto scolastico, i tre visti bastano.

3. Qualità del software e pattern

📌 Definizione da ricordare

Qualità ≠ "mi piace". È misurabile tramite ISO/IEC 25010 — 8 caratteristiche scomponibili in sotto-caratteristiche con metriche interne (sul codice) ed esterne (in esecuzione).

3.1 ISO/IEC 25010 — le 8 caratteristiche

01

Idoneità funzionale

Fa ciò che deve fare? Completezza, correttezza, appropriatezza.

02

Efficienza prestazionale

Tempo risposta, uso risorse, capacità.

03

Compatibilità

Coesiste, interoperabile con altri sistemi.

04

Usabilità

Imparabilità, operabilità, estetica UI — cruciale in Tecnologia didattica.

05

Affidabilità

Maturità, disponibilità, tolleranza guasti, recuperabilità.

06

Sicurezza

Confidenzialità, integrità, non ripudio — dati studenti.

07

Manutenibilità

Modularità, riusabilità, modificabilità, testabilità — dove SOLID aiuta.

08

Portabilità

Adattabilità, installabilità, sostituibilità.

3.2 Principi SOLID (Robert C. Martin)

PrincipioIn brevePerché conta in Tecnologia
S - Single ResponsibilityUna classe = un motivo per cambiarePrestito non deve anche inviare email
O - Open/ClosedEstendibile senza modificare esistenteNuovo canale notifica senza toccare Prestito
L - LiskovSottoclasse sostituisce superclasseStudente ovunque c'è Utente
I - Interface SegregationMolte interfacce specifiche meglio di una giganteNon costringere Docente a metodi da Studente
D - Dependency InversionDipendi da astrazioni, non concrezioniPrestito dipende da interfaccia Notifica, non da Email

3.3 Design pattern GoF (Gamma, Helm, Johnson, Vlissides 1994)

23 pattern in 3 categorie: soluzioni consolidate a problemi ricorrenti. Non regole, ma vocabolario condiviso.

CategoriaProblemaPattern noti
CreazionaliCome creare oggetti flessibilmenteSingleton, Factory Method, Abstract Factory, Builder
StrutturaliCome comporre classi in strutture grandiAdapter, Decorator, Facade, Composite
ComportamentaliComunicazione e responsabilità tra oggettiObserver, Strategy, Template Method, Command
💬 Tip del docente — Come studio i pattern

Io ho pensato di fare così per i miei corsi di Tecnologia: non vi chiedo di memorizzare 23 pattern, ma di riconoscerne 2 a fondo. Io lo farei così: per ogni pattern chiedetevi "che problema risolve?" non "come è fatto il diagramma?". Observer = "devo avvisare molti quando uno cambia". Singleton = "deve esistere una sola connessione DB". Se li raccontate così all'interrogazione, dimostrate che pensate da progettisti, non da pappagalli.

Singleton (creazionale): una sola istanza globale — utile per connessione DB catalogo.

Python · Singleton
class ConnessioneDatabase: _istanza = None def __new__(cls): if cls._istanza is None: cls._istanza = super().__new__(cls) # inizializza qui la connessione reale return cls._istanza # Sempre stesso oggetto: db1 = ConnessioneDatabase() db2 = ConnessioneDatabase() assert db1 is db2

Observer (comportamentale): soggetto 1-a-molti, notifica automatica — perfetto per promemoria scadenza.

Python · Observer — Promemoria biblioteca
class Prestito: # soggetto osservato def __init__(self): self._osservatori = [] def aggiungi_osservatore(self, osservatore): self._osservatori.append(osservatore) def scadenza_imminente(self): for oss in self._osservatori: oss.notifica("Il tuo prestito scade domani!") class NotificaEmail: # osservatore def notifica(self, msg): print(f"Email inviata: {msg}") class NotificaApp: # nuovo canale, zero modifiche a Prestito -> Open/Closed def notifica(self, msg): print(f"Push app: {msg}")
⚠️ Pericolo — Over-engineering

Un pattern non è obbligatorio. Usarlo dove non serve rende il codice più complesso del necessario, più difficile da leggere e mantenere. In Tecnologia vi insegno a valutare: prima soluzione semplice, poi pattern se risolve davvero meglio. Un buon progettista riconosce il problema, non applica pattern a caso.

4. Studio di un caso: sistema prenotazione biblioteca scolastica

Mettiamo insieme tutto: requisiti → metodologia → modellazione UML → pattern e qualità. È lo stesso schema di qualunque progetto reale, cambia la scala, non la logica.

4.1 Fase 1 — Raccolta requisiti

TipoRequisito
FunzionaleStudente cerca libro per titolo, autore o ISBN
FunzionaleStudente prenota libro disponibile
FunzionaleSistema invia promemoria 1 giorno prima scadenza
FunzionaleBibliotecario CRUD su catalogo
Non funzionaleRicerca < 1s (efficienza)
Non funzionaleUsabile senza formazione (usabilità)
Non funzionaleDati personali protetti (sicurezza)
🎯 Perché distinguere funzionali / non funzionali?

Perché in verifica vi chiedo di classificare. "Cerca per titolo" = funzionale (cosa fa). "Tempo <1s" = non funzionale (come lo fa). In Tecnologia questa distinzione vi allena a pensare come Product Owner: prima cosa deve fare, poi quanto bene.

4.2 Fase 2 — Scelta metodologia

Per biblioteca scolastica, requisiti semplici ma soggetti a piccoli aggiustamenti quando utenti provano il sistema → agile leggero a sprint di 2 settimane, non Waterfall rigido che congela tutto prima di mostrare nulla.

SprintObiettivoBacklog
Sprint 1Catalogo e ricerca baseModello Libro, ricerca titolo/autore/ISBN
Sprint 2Prenotazione e gestione prestitiClasse Prestito, associazione Studente-Libro
Sprint 3Notifiche e ruolo bibliotecarioObserver per promemoria, CRUD catalogo

4.3 Fase 3 — Modellazione UML

I diagrammi della sezione 2 sono esattamente quelli prodotti qui prima di scrivere codice: casi d'uso (Studente/Bibliotecario), classi (Utente/Studente/Docente/Prestito/Libro), sequenza (scenario prenotazione). Condivisi con Product Owner per validare interpretazione.

💬 Tip del docente — Ordine di lavoro

Io ho pensato di fare così nei progetti di lab: prima casi d'uso su foglio, poi classi, poi sequenza. Io lo farei così perché ogni diagramma risponde a una domanda diversa: cosa vuole l'utente? con quali oggetti lo realizzo? chi parla con chi nel tempo? Se li fate in quest'ordine in Tecnologia, evitate di disegnare classi che poi non usate mai.

4.4 Fase 4 — Pattern e qualità

Sprint 3: "invia promemoria" = problema canonico di Observer. Prestito non deve sapere come notifica (email, push, SMS), notifica solo i suoi osservatori quando scadenza vicina. Estendibile → rispetta Open/Closed.

ISO 25010: per biblioteca interna prioritizziamo usabilità (interfaccia semplice), affidabilità (non perdere prenotazioni), sicurezza (dati scolastici). Portabilità e compatibilità meno critiche.

✅ Collegamento Tecnologia-Agile-Qualità

Avete visto come tutto torna: metodologia agile vi permette di rimandare la scelta del canale di notifica a Sprint 3, UML vi fa capire chi è il soggetto e chi l'osservatore, SOLID vi dice che Prestito deve dipendere da astrazione Notifica, Observer vi dà la soluzione pronta. Non sono capitoli separati — è un unico flusso di progettazione.

✓Ciclo di vita: analisi, progettazione, implementazione, test, rilascio, manutenzione sono sempre presenti; cambia come si organizzano nel tempo.
✓Waterfall vs Agile: cascata sequenziale rigida per requisiti stabili; iterativo/spirale e Scrum (sprint, backlog, increment) per requisiti che evolvono.
✓UML: casi d'uso = funzionalità/attori, classi = struttura statica con associazione/aggregazione/composizione/generalizzazione, sequenza = interazioni nel tempo.
✓Qualità: ISO 25010 (8 caratteristiche) + SOLID + pattern GoF (creazionali, strutturali, comportamentali) = strumenti per misurare e costruire qualità, evitando over-engineering.
✓Caso studio: biblioteca scolastica ripercorre requisiti → scelta agile → UML → Observer per notifiche: scala piccola, logica professionale.
💬 Chiusura docente

Ragazzi, se dovessi sintetizzare in due frasi per Tecnologia: Io ho pensato di fare così questo percorso perché voglio che usciti da qui sappiate distinguere "cosa serve pianificare" da "cosa serve disegnare" da "cosa serve programmare bene". Io lo farei così al vostro posto: prendete il diagramma delle classi della biblioteca e provate a codificarlo in un linguaggio che conoscete, aggiungendo un secondo osservatore SMS senza toccare Prestito — se ci riuscite, avete capito SOLID e Observer in un colpo solo.

6. Verifica e autovalutazione

🔬 Attività pratica

Sulla base del caso biblioteca:

  1. Elenca requisiti funzionali e non funzionali aggiuntivi che mancano (es. limite prestiti simultanei) e giustifica perché sarebbero non funzionali o funzionali.
  2. Disegna il diagramma delle classi aggiungendo una classe Sanzione collegata a Prestito con composizione: quando Prestito viene eliminato, cosa succede a Sanzione?
  3. Scrivi lo pseudocodice del diagramma di sequenza per il caso "Restituzione libro con ritardo" includendo Observer per notifica al bibliotecario.
  4. Quale caratteristica ISO 25010 diventa critica se la biblioteca passa da sistema interno a servizio online per tutte le scuole della provincia? Argomenta.
✅ Soluzione ragionata — spunto
  • 1) Limite 3 prestiti simultanei = funzionale (regola di business). Disponibilità 99.5% = non funzionale (affidabilità).
  • 2) Composizione Prestito ◆— Sanzione significa ciclo vita legato: se cancello Prestito restituito con sanzione pagata, ha senso cancellare anche Sanzione, ma se devo tenere storico, meglio aggregazione. Scelta dipende da requisito!
  • 3) Restituzione attiva controllo data, se ritardo crea Sanzione e notifica bibliotecario via Observer.
  • 4) Se diventa servizio provinciale: sicurezza, scalabilità prestazionale, compatibilità (browser diversi), portabilità (cloud).