Negli anni '80 Tom De Marco, padre dell'analisi strutturata, affermava: "non puoi controllare ciò che non sai misurare"; per misurare la complessità del software o per stimare le risorse necessarie alla sua produzione e alla sua manutenzione sono utilizzate le metriche software. Una metrica software è uno standard per la misura di alcune proprietà del software o delle sue specifiche. I principali casi in cui vengono utilizzate le metriche software sono i seguenti:
Il limite per le metriche software è che esse forniscono generalmente solo una “stima” di “quanto” software è presente in un programma ma non un valore esatto. Questo limite ha spinto chi si occupa dimetodologie di gestione a concentrarsi maggiormente sulle metriche di monitoraggio e controllo del processo di produzione del software, esempi di metriche di questo tipo sono:
Di seguito è riportata una descrizione sintetica delle metriche software più comunemente adottate.
SLOC è una metrica software basata sul conteggio del numero di linee di codice sorgente. L'idea alla base di questa metrica è che un software è tanto più complesso quanto maggiore è il numero delle sue linee di codice, ovviamente questo non è vero in assoluto perché è noto che il numero delle linee di codice sorgente può fornire solo un ordine di grandezza del software misurato. La misurazione delle SLOC nacque con i linguaggi tradizionali line-oriented (Fortran, Assembler, C) in un contesto in cui era legittimo supporre che la misura delle linee di codice potesse fornire una fotografia abbastanza veritiera della complessità del software. Oggi, con gli attuali paradigmi a oggetti, ciò non è altrettanto valido, ma, a causa della sua estrema semplicità, tale metrica è ancora largamente adottata. Usualmente si distingue fra:
Esempio
Consideriamo per esempio questo frammento dicodice C:
for(i=0; i<100;++i)printf("hello");/* quante linee di codice ci sono? */
In questo esempio abbiamo:
Nell’esempio seguente lo stesso codice è scritto con uno stile diverso:
for(i=0; i<100;++i)
{
printf("hello");
}/* Ora quante linee di codice ci sono? */
Le SLOC saranno:
Questa metrica tenta di cogliere la complessità del software contando il numero di cammini linearmente indipendenti all'interno del grafo di flusso. La complessità può riguardare singole funzioni, moduli, metodi o classi di un programma. Dire che un grafo di flusso ha una complessità ciclomatica pari a n, equivale a dire che in quel grafo n è il massimo numero di cammini fra ingresso e uscita tra loro indipendenti e ogni altro cammino possibile sul grafo si può costruire a partire da uno di quegli n cammini. Ad esempio, se il codice sorgente non contiene punti decisionali come IF o cicli FOR, allora la complessità ciclomatica sarà pari a 1, poiché esisterà un solo cammino nel grafo di flusso. Se, invece, il codice ha un singolo IF contenente una singola condizione, allora ci saranno due cammini possibili: il primo se l'IF viene valutato a TRUE e un secondo se l'IF viene valutato a FALSE. In generale, esistono formule matematiche che, a seconda dei casi, consentono di calcolare agevolmente la complessità ciclomatica anche partendo direttamente dal codice. La misura della complessità ciclomatica riveste particolare importanza in fase di valutazione dei test, in un grafo di flusso si può verificare che ogni cammino rappresenta una possibile sequenza di eventi e di conseguenza un potenziale test. Ne deriva che per testare in modo esaustivo un certo modulo software devono essere analizzati tutti i possibili cammini presenti in esso. Questo sistema di test, nei moduli particolarmente strutturati, implica una complessità molto elevata, invece, calcolando la complessità ciclomatica, possono essere individuati i cammini indipendenti del grafo di flusso e si possono condurre i test unicamente sui cammini indipendenti, sicuri di aver esperito tutte le possibili prove. Per tale motivo, il calcolo della complessità ciclomatica viene spesso impiegato per determinare a priori il numero di test a "scatola bianca" che sono richiesti per ottenere un’affidabilità sufficiente per un certo modulo software.
Il Function Point(FP) è un'unità di misura utilizzata nell'ambito dell'Ingegneria del Software per quantificare il numero di "funzionalità" fornite da un prodotto software. A differenza di altre metriche l’analisi dei Function Point prescinde dal codice e si concentra sugli aspetti funzionali dell'applicativo. Obiettivi dell'analisi dei function point sono:
La definizione dei concetti relativi alla misurazione della dimensione funzionale del software (FSM) e la descrizione dei principi per applicare un metodo FSM sono contenuti nello standard ISO/IEC 14143-1 del 1997 Information Technology - Software measurement - Functional size measurement - Definition of concepts.
In base a tali prescrizioni, un metodo di misurazione funzionale deve avere le seguenti caratteristiche:
In effetti i Function Point rappresentano qualcosa di più di una semplice tecnica di conteggio, in quanto:
Essi costituiscono inoltre un'ottima opportunità per effettuare diversi censimenti delle applicazioni esistenti nel sistema informativo. Ma la cosa più rilevante è che i Function Point possono essere messi in relazione con altre variabili quali:
I Function Point sono in definitiva una misura di prodotto. Il relativo prezzo unitario medio è funzione di vari fattori: linguaggio, processo e tecnologia di sviluppo o manutenzione, complessità, variabilità dei requisiti, contesto d'uso, riuso, coinvolgimento dell'utente, qualità del prodotto, eventuali servizi indiretti. Si è stimato che 1 FP equivale a 320 LOC Assembler o 128 LOC C o 107 LOC Cobol. I Function Point, anche grazie ad associazioni come l'IFPUG (International Functional Point User Group) e l'ISO (International Organization for Standardization), sono divenuti uno standard di misura di dimensione del software, utilizzata dalla gran parte delle industrie che usano metriche funzionali. Lo standard definisce i Function Point (FP) come: una metrica della dimensione funzionale di un'applicazione, basata sul numero e sul tipo delle informazioni in entrata, in uscita e memorizzazione. Per applicazione s'intende una collezione coesa di procedure automatizzate e relativi dati che supportano un obiettivo di business. Ogni applicazione è separata dalle altre e dall'utente poiché è individuabile un confine che la contraddistingue. Il confine agisce come una "membrana" attraverso la quale passano i dati processati dalle transazioni di input, output e inquiry. Il confine va visto da una prospettiva funzionale e non va basato su considerazioni tecniche o fisiche. Per dimensione funzionale di un'applicazione s'intende una misura convenzionale standard indipendente dalla tecnologia utilizzata nella realizzazione del software. La dimensione funzionale è una delle variabili principali del prezzo del software, il quale risente però anche di altri fattori. I Function Point sono di ausilio per stimare a priori l'impegno necessario per realizzare un progetto e a posteriori per calcolare il valore del prodotto e del patrimonio software. La quantità di informazione racchiusa nel numero dei FP è garantita dal metodo utilizzato, dalla certificazione del personale che effettua il conteggio, dalla fase del ciclo di vita del software considerato, dalla documentazione. I Function Point si concretizzano in una serie di punteggi (o pesi) assegnati secondo regole di conteggio a Input (EI), Interrogazioni (EQ), Output (EO), File logici interni (ILF), File logici esterni (EIF) evidenti dall'esame dell'applicazione e della sua documentazione. In termini molto semplici si può dire che la tecnica dei FP fornisce una quantificazione delle informazioni che, da un punto di vista logico, entrano, escono e si memorizzano in un computer attraverso l'esecuzione di una applicazione software. Per poter quantificare e certificare i FP occorre acquisire una certificazione IFPUG di Certified Function Point Specialist/Certified Function Point Pratictioner (CFPS/CFPP).
Vi sono inoltre metriche basate su altri criteri come: