Ingegneria dei requisiti - requisiti funzionali e non funzionali
In questa pagina 7
Definizione (ingegneria dei requisiti). Il requirements engineering (RE) è il processo con cui si stabiliscono i servizi richiesti al sistema dal cliente e i vincoli sotto i quali deve operare ed essere sviluppato. I requisiti di sistema sono le descrizioni di servizi e vincoli che questo processo produce.
È la prima delle attività fondamentali (la specifica, vedi Ingegneria del software - prodotto software e processo di sviluppoL'ingegneria del software (IdS) è la disciplina che copre tutti gli aspetti della produzione di software professionale, dalle prime specifiche alla manutenzione: il software sono programmi più documentazione, può essere generico (venduto sul mercato) o specifico (su misura per un cliente), e un buon prodotto ha quattro attributi (manutenibilità, affidabilità e sicurezza, efficienza, accettabilità); le attività fondamentali sono specifica, sviluppo, validazione ed evoluzione; i costi sono dominati dalla manutenzione e un difetto di requisiti scoperto dopo il rilascio costa fino a 100 volte uno scoperto subito; i tre problemi di fondo sono incertezza, irreversibilità e complessità; verifica ("costruiamo bene il prodotto?") e validazione ("costruiamo il prodotto giusto?") sono cose diverse.Ingegneria del software - prodotto software e processo di sviluppo →) ed è decisiva: un errore nei requisiti scoperto dopo la consegna costa fino a 100 volte uno di implementazione. Nella parte di database lo stesso tema compare come analisi dei requisiti di un sistema informativo (Ciclo di vita di un sistema informativo e analisi dei requisitiIl ciclo di vita di un sistema informativo ha le fasi studio di fattibilità, analisi dei requisiti, progettazione (dei dati e delle applicazioni), sviluppo, collaudo, esercizio e manutenzione; il modello a cascata procede in sequenza, quello a spirale itera per versioni. I requisiti sono funzionali (che cosa fa il sistema), non funzionali (come lo fa, es. tempi) e vincoli aggiuntivi imposti dai committenti; si raccolgono da frasi in linguaggio naturale, documentazione e applicazioni esistenti e si analizzano con frasi filtrate e glossario dei dati. La progettazione di una base di dati ha tre fasi: concettuale (schema ER, indipendente dal DBMS), logica (schema relazionale, per una classe di DBMS, con il carico applicativo) e fisica (strutture del DBMS scelto). Un modello è un insieme di costrutti, lo schema è la rappresentazione del mini-mondo (livello intensionale), l'istanza sono i dati (livello estensionale); un buono schema è completo, corretto, minimale e leggibile.Ciclo di vita di un sistema informativo e analisi dei requisiti →); qui si guarda il software. Esempio guida di tutta la parte di ingegneria del software: il sistema di prestito di una biblioteca.
Che cos'è un requisito
Un requisito può essere da un'affermazione astratta di alto livello a una specifica matematica dettagliata. La genericità è inevitabile, perché lo stesso testo ha due funzioni:
- base di un bando (un'offerta per un contratto): resta aperto all'interpretazione, perché imprese diverse possano proporre soluzioni diverse;
- base del contratto: deve essere definito in dettaglio.
Requisiti utente e di sistema
| requisiti utente | requisiti di sistema | |
|---|---|---|
| contenuto | servizi e vincoli operativi in linguaggio naturale e diagrammi | descrizione strutturata e dettagliata di funzioni, servizi e vincoli |
| per chi | clienti e utenti finali, senza competenza tecnica | sviluppatori, a volte parte di un contratto |
| livello | astratto | dettagliato, definisce che cosa va realizzato |
Esempio (biblioteca).
- Utente: "Il sistema deve permettere ai bibliotecari di registrare il prestito di un documento a un iscritto."
- Sistema: "1.1 Il sistema deve consentire di registrare un prestito indicando tessera e codice del documento. 1.2 Se l'iscritto ha già raggiunto il limite di prestiti (6 per gli adulti), il sistema deve rifiutare il prestito e mostrare il motivo. 1.3 Alla registrazione il sistema deve calcolare la scadenza (30 giorni per i libri, 3 per i DVD)."
Stakeholder
Definizione (stakeholder). Chiunque sia interessato al sistema o abbia un interesse legittimo nel suo funzionamento.
Categorie: utenti finali, gestori del sistema, proprietari, stakeholder esterni (per esempio i clienti di una banca che usano il software dell'istituto). Nella biblioteca: iscritti, bibliotecari, direttore, personale informatico, responsabile della privacy, il comune che finanzia. Hanno interessi in conflitto (l'iscritto vuole prestiti lunghi, il direttore meno costi di sollecito) e le richieste cambiano durante il processo.
Requisiti funzionali, non funzionali e di dominio
| tipo | che cosa dice | esempio nella biblioteca |
|---|---|---|
| funzionali | servizi che il sistema deve fornire, come reagisce a certi input, come si comporta in certe situazioni (e a volte che cosa non deve fare) | "Il sistema deve inviare un avviso all'iscritto che ha prenotato un documento quando questo viene restituito." |
| non funzionali | proprietà e vincoli su servizi e funzioni (tempi, standard, processo di sviluppo); spesso riguardano il sistema nel suo complesso | "La ricerca nel catalogo deve rispondere entro 2 secondi per il 95% delle richieste con 50 utenti contemporanei." |
| di dominio | vincoli che vengono dal dominio di applicazione | "I dati personali degli iscritti non si cedono a terzi (norme sulla privacy)." |
I requisiti non funzionali possono essere più critici dei funzionali: se non li soddisfa, il sistema può risultare inutilizzabile. Un solo requisito non funzionale (per esempio di sicurezza) può generare più requisiti funzionali (autenticazione, registro degli accessi) e requisiti che limitano altri requisiti. Per soddisfarli può essere necessario scegliere una certa Architettura del software - decisioni, organizzazione e stiliL'architettura del software descrive come un sistema è organizzato in componenti, le loro relazioni e la loro distribuzione; è il ponte tra requisiti e progetto dettagliato, e le sue decisioni derivano soprattutto dai requisiti non funzionali (prestazioni, sicurezza, disponibilità, manutenibilità), spesso in conflitto tra loro; si descrive con più viste (logica, processi, sviluppo, fisica); gli stili di organizzazione ricorrenti sono a livelli (layered), MVC, repository, client-server, pipe and filter, publish-subscribe e microservizi; la modularizzazione mira ad alta coesione e basso accoppiamento, nascondendo le decisioni dietro interfacce (information hiding, inversione delle dipendenze).Architettura del software - decisioni, organizzazione e stili → (per esempio pochi scambi tra componenti per le prestazioni).
Imprecisione, completezza, coerenza
- Un requisito ambiguo è letto in modo diverso da sviluppatori e utenti. Esempio: "L'utente può cercare nel catalogo": l'utente intendeva cercare in tutte le sedi; lo sviluppatore ha realizzato la ricerca in una sola sede scelta in precedenza.
- In teoria i requisiti sono completi (descrivono tutte le funzioni richieste) e coerenti (nessuna contraddizione); in pratica, per la complessità del sistema e dell'ambiente, non si ottiene un documento perfettamente completo e coerente.
Classificazione dei requisiti non funzionali
| classe | origine | esempi |
|---|---|---|
| di prodotto | il prodotto consegnato deve comportarsi in un certo modo | prestazioni, affidabilità, usabilità, sicurezza, portabilità |
| organizzativi | politiche e procedure dell'organizzazione | standard di processo, linguaggio o ambiente di sviluppo imposti, consegna |
| esterni | fattori fuori dal sistema e dal suo sviluppo | interoperabilità con altri sistemi, leggi, requisiti etici |
Obiettivi e requisiti verificabili
Un obiettivo (goal) è un'intenzione generale ("il sistema deve essere facile da usare") utile agli sviluppatori per capire che cosa vogliono gli utenti, ma non verificabile. Un requisito non funzionale verificabile usa una misura che si può testare oggettivamente:
| proprietà | misura |
|---|---|
| velocità | transazioni al secondo, tempo di risposta all'utente o all'evento, tempo di aggiornamento dello schermo |
| dimensione | megabyte, numero di chip ROM |
| facilità d'uso | tempo di formazione, numero di schermate di aiuto |
| affidabilità | tempo medio tra i guasti, probabilità di indisponibilità, tasso di guasti, disponibilità |
| robustezza | tempo di riavvio dopo un guasto, percentuale di eventi che causano un guasto, probabilità di corruzione dei dati |
| portabilità | percentuale di istruzioni dipendenti dalla piattaforma, numero di sistemi di destinazione |
Esempio. Obiettivo: "Il sistema deve essere facile da usare per il personale." Requisito verificabile: "Il personale deve poter usare tutte le funzioni dopo quattro ore di formazione e gli utenti esperti non devono commettere più di due errori per ora di uso."
Requisiti di interfaccia
Il programma cita esplicitamente le interfacce: i requisiti devono dire anche come il sistema comunica con l'esterno.
Le interfacce con sistemi esistenti generano spesso vincoli di progetto, e per descriverle sono adatti i linguaggi con notazione quasi di programmazione (le firme dei metodi in Java sono già una specifica di interfaccia).
Il processo di ingegneria dei requisiti
Le attività sono comuni a tutti i processi e si intrecciano in modo iterativo (a spirale):
| attività | contenuto |
|---|---|
| elicitazione | scoprire i requisiti con gli stakeholder |
| analisi | classificare, organizzare, assegnare priorità, negoziare i conflitti |
| specifica | documentare in un formato condiviso |
| validazione | verificare che il documento descriva ciò che il cliente vuole |
| gestione | controllare le modifiche durante tutto lo sviluppo |
Elicitazione e analisi
Fasi del ciclo: scoperta dei requisiti (compresi quelli di dominio); classificazione e organizzazione (gruppi coerenti); priorità e negoziazione (risolvere i conflitti); specifica. Problemi tipici: gli stakeholder non sanno che cosa vogliono; usano il proprio linguaggio; hanno esigenze contrastanti; fattori organizzativi e politici incidono; i requisiti cambiano durante l'analisi.
Tecniche di scoperta:
| tecnica | descrizione | limiti |
|---|---|---|
| interviste | chiuse (domande predeterminate), aperte (si esplorano temi), in pratica un misto; si parte da una domanda "trampolino", una proposta di requisiti o un prototipo | il linguaggio del dominio non si capisce; la conoscenza ovvia non si dice; poco utili per i requisiti di dominio |
| etnografia | si osserva il lavoro reale: requisiti che nascono da come le persone lavorano davvero e dalla cooperazione | scopre i processi esistenti, non le funzioni nuove; può studiare pratiche ormai superate |
| storie e scenari | esempi concreti di uso: gli stakeholder si riconoscono e commentano | richiedono molti casi per coprire il sistema |
| prototipi | versioni iniziali da mostrare | costo; non sostituiscono la specifica |
Uno scenario è una storia d'uso strutturata, con: situazione di partenza, flusso normale, che cosa può andare storto, attività concomitanti, stato finale. Esempio:
Scenario "Prestito con prenotazione". Ipotesi iniziale: il bibliotecario ha eseguito l'accesso; il documento ha una copia disponibile; l'iscritto Anna ha una tessera valida. Normale: il bibliotecario legge la tessera e il codice, il sistema registra il prestito, calcola la scadenza (30 giorni) e stampa la ricevuta. Può andare storto: (a) Anna ha raggiunto il limite: il sistema rifiuta e mostra il motivo; (b) tessera scaduta: il sistema propone il rinnovo; (c) la copia è già prenotata da un altro iscritto: il prestito è permesso solo se la prenotazione è di Anna. Altre attività: nello stesso momento un altro bibliotecario può prestare una copia diversa. Stato finale: copia in prestito, prestito attivo di Anna aumentato di uno.
Specifica dei requisiti
| notazione | quando |
|---|---|
| linguaggio naturale (frasi numerate) | requisiti utente; espressivo e comprensibile da tutti, ma impreciso |
| linguaggio naturale strutturato (moduli) | requisiti di sistema: ogni campo descrive un aspetto |
| notazioni grafiche (casi d'uso, sequenza UML) | funzioni e interazioni |
| tabelle | molti casi alternativi (per esempio tariffe) |
| specifiche matematiche | sistemi critici; non comprensibili dai clienti, che faticano ad accettarle come contratto |
| linguaggi di descrizione del progetto | oggi poco usati, utili per le interfacce |
Linee guida per il linguaggio naturale: un formato standard per tutti i requisiti; usare "deve" (shall) per i requisiti obbligatori e "dovrebbe" (should) per i desiderabili; evidenziare le parti chiave; evitare il gergo informatico; aggiungere la motivazione (rationale). Problemi: mancanza di chiarezza (precisione e leggibilità sono in contrasto), requisiti funzionali e non funzionali confusi, più requisiti accorpati in una sola frase.
Moduli (specifica strutturata). Campi: funzione o entità, input e provenienza, output e destinazione, informazioni necessarie per il calcolo e altre entità usate, azione, condizioni preliminari e finali, effetti collaterali.
Esempio (modulo).
- Funzione: registrare un prestito.
- Descrizione: assegna una copia di un documento a un iscritto.
- Input: numero di tessera, codice del documento (dal lettore di codici a barre).
- Sorgente: bibliotecario; Output: ricevuta di prestito con scadenza; Destinazione: stampante e archivio dei prestiti.
- Necessita di: anagrafica degli iscritti, catalogo, prestiti attivi.
- Azione: si controllano tessera valida, limite non superato e copia disponibile; si decrementa il numero di copie, si crea il prestito con scadenza = data odierna + durata del tipo di documento.
- Precondizione: tessera in corso di validità. Postcondizione: le copie disponibili sono diminuite di uno.
- Effetti collaterali: se c'è una prenotazione dell'iscritto, viene cancellata.
Specifica tabellare (per più alternative). Esempio: tariffa di multa.
| condizione | azione |
|---|---|
| ritardo 0 giorni | multa = 0 |
| ritardo da 1 a 10 giorni | multa = 0,30 euro per giorno |
| ritardo da 11 a 30 giorni | multa = 3,00 euro più 0,60 euro per ogni giorno oltre il decimo |
| ritardo oltre 30 giorni | multa = 15,00 euro (tetto) |
| socio | importo dimezzato |
Casi d'uso. Un caso d'uso è un tipo di scenario (UML): identifica gli attori (persone o altri sistemi) e descrive l'interazione; un insieme di casi d'uso deve coprire tutte le interazioni possibili. Si hanno un diagramma di alto livello e una descrizione tabellare (attori, descrizione, dati, stimolo, risposta, commenti). I diagrammi di sequenza aggiungono il dettaglio dei messaggi.
Il documento dei requisiti
È la dichiarazione ufficiale di ciò che chiedono agli sviluppatori. Contiene sia requisiti utente sia requisiti di sistema, e non è un documento di progetto: dice che cosa il sistema fa, non come (in pratica requisiti e progetto sono inseparabili: l'architettura può strutturare i requisiti e i sistemi con cui si interagisce impongono vincoli).
| capitolo | contenuto |
|---|---|
| prefazione | destinatari e storia delle versioni |
| introduzione | necessità del sistema, funzioni, rapporto con altri sistemi e obiettivi dell'organizzazione |
| glossario | termini tecnici, senza supporre competenze del lettore |
| requisiti utente | servizi per l'utente, requisiti non funzionali, standard |
| architettura | panoramica di alto livello, con i componenti riusati |
| requisiti di sistema | requisiti funzionali e non, dettagliati, interfacce |
| modelli di sistema | modelli grafici (oggetti, flusso dei dati, dati) |
| evoluzione | ipotesi di base e cambiamenti previsti, per evitare scelte che li ostacolino |
| appendici | hardware minimo, database |
| indici | alfabetico, dei diagrammi, delle funzioni |
I sistemi sviluppati in modo incrementale hanno meno dettaglio; esistono standard (IEEE) per grandi progetti. I metodi agili ritengono i requisiti dettagliati una perdita di tempo perché cambiano troppo in fretta (documento sempre obsoleto) e usano storie dell'utente (Processi di sviluppo - modelli plan-based, metodi agili e ScrumUn processo software è un insieme strutturato di attività (specifica, progetto e realizzazione, validazione, evoluzione) e si descrive con attività, prodotti, ruoli e condizioni; i processi plan-driven pianificano tutto in anticipo e misurano il progresso sul piano (cascata, modello a V con i livelli di test corrispondenti, sviluppo incrementale pianificato, integrazione e configurazione di componenti, con prototipi e consegna incrementale per gestire il cambiamento, e miglioramento del processo con i livelli di maturità SEI), mentre i metodi agili pianificano in modo incrementale e accolgono il cambiamento (manifesto agile, XP con i suoi valori e le sue dodici pratiche, storie dell'utente e story point); Scrum organizza il lavoro in sprint con tre ruoli (Product Owner, Scrum Master, team), eventi (planning, daily scrum, review, retrospective) e artefatti (product backlog, sprint backlog, incremento), stimando con il planning poker; non c'è un processo giusto, ma priorità diverse (stabilità dei requisiti, criticità, dimensione e distribuzione del team).Processi di sviluppo - modelli plan-based, metodi agili e Scrum →), il che è difficile per sistemi critici o sviluppati da molti gruppi.
Validazione dei requisiti
Dimostra che i requisiti definiscono il sistema che il cliente vuole. Controlli:
| controllo | domanda |
|---|---|
| validità | il sistema fornisce le funzioni che rispondono davvero alle esigenze? |
| coerenza | ci sono conflitti tra requisiti? |
| completezza | ci sono tutte le funzioni richieste? |
| realismo | sono realizzabili con budget e tecnologia disponibili? |
| verificabilità | si può dimostrare che sono soddisfatti? |
Tecniche: revisione sistematica (con personale del cliente e dell'appaltatore), prototipi, generazione di casi di test (se per un requisito non si riesce a scrivere un test, è probabilmente vago). Nella revisione si controllano anche comprensibilità, tracciabilità (origine del requisito) e adattabilità (si può modificare senza troppi effetti su altri requisiti).
Cambiamento dei requisiti e loro gestione
L'ambiente tecnico e commerciale cambia dopo l'installazione (nuovo hardware, altri sistemi, priorità aziendali, leggi); chi paga il sistema e chi lo usa raramente coincidono, e il risultato è un compromesso che con l'esperienza va ribilanciato. La gestione dei requisiti richiede:
- identificazione univoca di ogni requisito (per i riferimenti incrociati);
- un processo di gestione delle modifiche: analisi del problema e specifica della modifica, analisi del cambiamento e dei costi (con le informazioni di tracciabilità), poi modifica del documento e, se serve, di progetto e codice;
- politiche di tracciabilità: collegamenti tra requisiti, e tra requisiti e progetto;
- strumenti di supporto (da fogli di calcolo a sistemi dedicati).
Il documento va scritto in modo modulare, con pochi riferimenti esterni, perché si possano cambiare singole sezioni.
Modelli del sistema
I modelli astratti (di solito in UML) aiutano a chiarire e a comunicare i requisiti:
| prospettiva | modelli UML | scopo |
|---|---|---|
| contesto | diagramma dei confini del sistema, attività per i processi | che cosa sta dentro e fuori il sistema (decisione con effetti sui requisiti, anche politici) |
| interazione | casi d'uso, diagrammi di sequenza | interazione utente-sistema, sistema-sistema, tra componenti |
| struttura | diagrammi delle classi (classi, associazioni, generalizzazione, aggregazione) | struttura statica o in esecuzione |
| comportamento | diagrammi di attività (modelli guidati dai dati), diagrammi di stato (guidati dagli eventi) | risposta a dati ed eventi |
Un modello si usa per discutere (può essere incompleto), per documentare (accurato ma non completo) o come descrizione dettagliata da cui generare codice (corretto e completo: model-driven engineering). L'ingegneria guidata dai modelli ha avuto adozione limitata per costi degli strumenti e perché l'astrazione utile alla discussione non è quella giusta per l'implementazione.
Domande d'esame
1. Classificare ciascuna frase: (a) "Il sistema deve consentire la ricerca per autore"; (b) "Il sistema deve rispondere in meno di 2 secondi per il 95% delle richieste"; (c) "Il sistema deve essere facile da usare". Traccia. (a) requisito funzionale; (b) requisito non funzionale di prodotto, verificabile perché misurato; (c) è un obiettivo, non verificabile: va trasformato in un requisito misurabile (tempo di formazione, errori per ora).
2. Quali problemi ha il linguaggio naturale per la specifica? Come si limitano? Traccia. Ambiguità e mancanza di chiarezza, confusione tra requisiti funzionali e non, accorpamento di più requisiti. Si limitano con un formato standard, "deve/dovrebbe" usati con coerenza, evidenziazione, niente gergo, motivazione per ogni requisito, e con moduli o tabelle per i requisiti di sistema.
3. Quali controlli si fanno nella validazione dei requisiti e con quali tecniche? Traccia. Validità, coerenza, completezza, realismo, verificabilità; tecniche: revisioni, prototipi, generazione dei casi di test. Perché presto: l'errore costa fino a 100 volte di più dopo la consegna.
Versione ripasso
- RE: stabilire i servizi richiesti e i vincoli di funzionamento e sviluppo. Un requisito è base di offerta (astratto, aperto) e di contratto (dettagliato). Errore nei requisiti scoperto dopo la consegna: fino a 100× il costo di uno di implementazione.
- Utente: linguaggio naturale e diagrammi, per clienti. Sistema: documento strutturato e dettagliato, per sviluppatori, può essere contratto.
- Stakeholder: utenti finali, gestori, proprietari, esterni; interessi in conflitto da negoziare.
- Funzionali: servizi, reazioni agli input, comportamento (e ciò che il sistema non deve fare). Non funzionali: proprietà e vincoli, spesso sull'intero sistema, possono essere più critici dei funzionali e condizionano l'architettura (Architettura del software - decisioni, organizzazione e stiliL'architettura del software descrive come un sistema è organizzato in componenti, le loro relazioni e la loro distribuzione; è il ponte tra requisiti e progetto dettagliato, e le sue decisioni derivano soprattutto dai requisiti non funzionali (prestazioni, sicurezza, disponibilità, manutenibilità), spesso in conflitto tra loro; si descrive con più viste (logica, processi, sviluppo, fisica); gli stili di organizzazione ricorrenti sono a livelli (layered), MVC, repository, client-server, pipe and filter, publish-subscribe e microservizi; la modularizzazione mira ad alta coesione e basso accoppiamento, nascondendo le decisioni dietro interfacce (information hiding, inversione delle dipendenze).Architettura del software - decisioni, organizzazione e stili →). Di dominio: vincoli del dominio.
- NFR: di prodotto (prestazioni, affidabilità, usabilità, sicurezza), organizzativi (processo, standard, linguaggio), esterni (interoperabilità, leggi, etica). Obiettivo = intenzione generale non verificabile; NFR verificabile = con una misura.
| proprietà | misura |
|---|---|
| velocità | transazioni/s, tempo di risposta |
| dimensione | megabyte |
| facilità d'uso | tempo di formazione, schermate di aiuto |
| affidabilità | tempo medio tra i guasti, disponibilità |
| robustezza | tempo di riavvio, probabilità di corruzione dei dati |
| portabilità | percentuale di codice dipendente dalla piattaforma |
- Esempio: obiettivo "facile da usare" requisito: "tutte le funzioni dopo 4 ore di formazione, al massimo 2 errori per ora per gli esperti".
- Esempio biblioteca: utente "il sistema deve permettere di registrare un prestito"; sistema 1.1 registrare con tessera e codice documento, 1.2 rifiutare se il limite di prestiti è raggiunto mostrando il motivo, 1.3 calcolare la scadenza (30 giorni libri, 3 DVD). Funzionale: avviso all'iscritto che ha prenotato quando il documento torna. NFR verificabile: ricerca in catalogo entro 2 s per il 95% delle richieste con 50 utenti. Di dominio: i dati degli iscritti non si cedono a terzi.
- Modulo di specifica (prestito): funzione; input (tessera, codice documento) e provenienza (bibliotecario, lettore di codici); output (ricevuta con scadenza) e destinazione; dati usati (anagrafica, catalogo, prestiti attivi); azione (tessera valida, limite non superato, copia disponibile; scadenza = oggi + durata); precondizione (tessera valida); postcondizione (copie diminuite di uno); effetti collaterali (cancella la prenotazione dell'iscritto).
- Tabella delle multe: 0 giorni 0; 1-10 giorni 0,30 euro per giorno; 11-30 3,00 euro più 0,60 euro per giorno oltre il decimo; oltre 30 15,00 euro; soci metà.
- Ambiguità: "cercare" nel catalogo (tutte le sedi o una sola?). Completezza e coerenza perfette non si ottengono in pratica.
- Interfacce: utente, con altri sistemi (API, formato dati), hardware, di comunicazione (Servizi REST in Java - progettazione delle risorse e implementazione con servletUn servizio REST espone risorse, non pagine: il server risponde con dati (JSON) e codici di stato, e la presentazione passa al client. Per progettare l'API si individuano i sostantivi del dominio (aula, prenotazione), si dà a collezioni ed elementi un URI (/api/aule, /api/aule/3, /api/prenotazioni, /api/prenotazioni/7: nomi al plurale, mai verbi), si usano i metodi HTTP con la semantica di RFC 9110 (GET sicuro e idempotente, POST crea e non è idempotente, PUT e DELETE idempotenti) e si filtrano le collezioni con la query (?aula=1&giorno=2026-10-19). I codici fanno parte del contratto: 200 lettura, 201 creazione con Location, 204 cancellazione, 400 richiesta malformata, 404 risorsa inesistente, 405 metodo non consentito con Allow, 409 conflitto (orario già occupato), 415 tipo di contenuto, 422 richiesta ben formata ma non elaborabile (aula inesistente), 500 guasto. Il JSON usa i nomi delle colonne (aula_id, ora_inizio, ora_fine) e gli errori hanno un corpo {"errore": "..."}. In Java una servlet mappata su /api/prenotazioni/* fa il dispatch sul path: getPathInfo() nullo o "/" indica la collezione, "/12" l'elemento; doGet, doPost e doDelete implementano i metodi, Gson converte oggetti e JSON, i metodi non previsti rispondono 405 con l'header Allow. Il servizio è senza stato: niente sessione, ogni richiesta porta tutto ciò che serve.Servizi REST in Java - progettazione delle risorse e implementazione con servlet →).
- Processo (iterativo, a spirale): elicitazione, analisi (classificazione, priorità, negoziazione), specifica, validazione, gestione.
- Elicitazione: interviste (chiuse, aperte; limiti: linguaggio, conoscenza implicita), etnografia (come si lavora davvero; non trova funzioni nuove), storie e scenari, prototipi. Scenario = partenza, flusso normale, cosa può andare storto, attività concomitanti, stato finale.
- Specifica: linguaggio naturale ("deve" obbligatorio, "dovrebbe" desiderabile, formato standard, motivazione; problemi: poca chiarezza, FR e NFR confusi, requisiti accorpati), moduli (funzione, input, output, azione, pre/postcondizione, effetti collaterali), tabelle, casi d'uso (attori e interazione) con diagrammi di sequenza, matematica per i sistemi critici.
- Documento dei requisiti: prefazione, introduzione, glossario, requisiti utente, architettura, requisiti di sistema, modelli, evoluzione, appendici, indici. Dice che cosa, non come. Agile: storie dell'utente al posto di documenti dettagliati (Processi di sviluppo - modelli plan-based, metodi agili e ScrumUn processo software è un insieme strutturato di attività (specifica, progetto e realizzazione, validazione, evoluzione) e si descrive con attività, prodotti, ruoli e condizioni; i processi plan-driven pianificano tutto in anticipo e misurano il progresso sul piano (cascata, modello a V con i livelli di test corrispondenti, sviluppo incrementale pianificato, integrazione e configurazione di componenti, con prototipi e consegna incrementale per gestire il cambiamento, e miglioramento del processo con i livelli di maturità SEI), mentre i metodi agili pianificano in modo incrementale e accolgono il cambiamento (manifesto agile, XP con i suoi valori e le sue dodici pratiche, storie dell'utente e story point); Scrum organizza il lavoro in sprint con tre ruoli (Product Owner, Scrum Master, team), eventi (planning, daily scrum, review, retrospective) e artefatti (product backlog, sprint backlog, incremento), stimando con il planning poker; non c'è un processo giusto, ma priorità diverse (stabilità dei requisiti, criticità, dimensione e distribuzione del team).Processi di sviluppo - modelli plan-based, metodi agili e Scrum →).
- Validazione: validità, coerenza, completezza, realismo, verificabilità; tecniche: revisioni (anche tracciabilità, adattabilità, comprensibilità), prototipi, generazione di test (Software testing - progettazione dei casi di test e JUnitIl testing esegue il programma con dati artificiali per mostrare che soddisfa i requisiti (validation testing) e per scoprirne i difetti (defect testing), ma può rivelare la presenza di errori e non la loro assenza; il test di sviluppo comprende unit test (singole classi e metodi), test dei componenti (le interfacce) e test di sistema (le interazioni); i casi di test si ricavano con le classi di equivalenza (una per partizione) e i valori limite (ai bordi delle partizioni), più linee guida per sequenze e input anomali; JUnit automatizza i test con @Test, fixture @Before/@After (@BeforeClass/@AfterClass), le asserzioni (assertEquals con atteso per primo), eccezioni attese, timeout e @Ignore; nel TDD il test si scrive prima del codice (red, green, refactor) e i test automatici diventano la suite di regressione; seguono i test di rilascio (black box sui requisiti, prestazioni) e dell'utente (alpha, beta, accettazione).Software testing - progettazione dei casi di test e JUnit →).
- Gestione del cambiamento: identificatore univoco, processo di modifica (analisi del problema, analisi e costo con la tracciabilità, modifica), politiche di tracciabilità, strumenti; documento modulare.
- Modelli UML: contesto, interazione (casi d'uso, sequenza), struttura (classi), comportamento (attività, stati); come discussione, documentazione o descrizione completa (MDE).
- Errori tipici: scrivere NFR come obiettivi ("veloce", "facile"); mischiare cosa e come; frasi con più requisiti; "deve" e "dovrebbe" usati a caso; non dare identificatori ai requisiti (nessuna tracciabilità); considerare validato un requisito solo perché è stato implementato.
Esercizi su questo argomento
Teoria collegata
- Architettura del software - decisioni, organizzazione e stili
- Ingegneria del software - prodotto software e processo di sviluppo
- Principi GRASP per l'assegnazione delle responsabilità
- Processi di sviluppo - modelli plan-based, metodi agili e Scrum
- Software testing - progettazione dei casi di test e JUnit