Salta al contenuto
Note per Studenti Ingegneria dei requisiti - requisiti funzionali e non funzionali

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.

interfaccia che cosa si specifica esempio
utente schermate, comandi, messaggi, accessibilità "I messaggi di errore indicano la causa e la correzione"
con altri sistemi software operazioni, formato dei dati, protocolli "Il sistema espone una API REST per il catalogo in formato JSON" (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 →)
hardware dispositivi collegati "Il lettore di codici a barre invia il codice come testo terminato da invio"
di comunicazione rete, sicurezza "Le comunicazioni con il server usano HTTPS"

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

(La stessa specifica è provata con casi di test nella nota 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 →.)

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

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

Esercizi su questo argomento

Teoria collegata