
Concetti di Informatica | Le qualità del software
Proprio come un telefonino, un televisore o un'automobile, il software è a tutti gli effetti un prodotto. Tuttavia la sua natura intangibile lo rende un po' particolare e la valutazione della sua "bontà" può apparire meno immediata rispetto a un bene fisico.
Eppure distinguere un software "buono" da uno "meno buono" è fondamentale in molti ambiti.
In questo articolo, esploreremo le principali qualità che definiscono l'eccellenza di un software, cercando di fornire una panoramica completa e accessibile anche a chi non è direttamente coinvolto nel mondo dell'informatica.
Ci baseremo su una distinzione fondamentale: le qualità esterne e le qualità interne.
Qualità esterne: ciò che l'utente può apprezzare
Le qualità esterne sono quelle caratteristiche del software che possono essere valutate senza dover esaminare il suo codice sorgente. Sono quelle che l'utente finale percepisce direttamente attraverso l'utilizzo del software.
Esaminiamo le principali.
Correttezza
Un software è corretto quando svolge il compito per cui è stato creato, quindi opera in linea con le specifiche e le indicazioni di progetto.
Efficienza
Supponendo che il software sia corretto, ci chiediamo se svolge il suo compito nella maniera più efficiente possibile, ovvero utilizzando al meglio le risorse disponibili.
L'efficienza è inversamente proporzionale alla complessità computazionale, che misura le risorse necessarie per il funzionamento del software (tempo di elaborazione, spazio di memoria / disco).
Meno risorse un software richiede più è efficiente.
Proprio come esistono diverse strade per risolvere un problema, anche il software può raggiungere una soluzione in modi più o meno efficienti. I test comparativi spesso valutano l'efficienza misurando il tempo (inteso come numero di operazioni dominanti) necessario per eseguire determinati compiti.
Robustezza
Si tratta di una qualità che va oltre la semplice correttezza e rappresenta la capacità del software di reagire a situazioni impreviste e di adeguarsi di conseguenza.
Un aspetto cruciale della robustezza è la validazione dei dati.
Ad esempio, un software dovrebbe essere in grado di gestire input non validi (come inserire una stringa in un campo numerico o un valore negativo per un reddito) segnalando l'errore anziché produrre risultati inattesi. Anche la gestione delle password (richiesta di complessità minima, divieto di password già usate ecc.) è un esempio di robustezza.
Inoltre un software robusto dovrebbe saper gestire situazioni come la mancanza di risorse (disco non disponibile, rete assente), evitando blocchi o perdite di dati e segnalando opportunamente il problema all'utente.
Usabilità
In questo caso parliamo di fatto della facilità di utilizzo del software.
In un panorama con molteplici prodotti che risolvono lo stesso problema, l'usabilità diventa un fattore fondamentale strettamente legato al target di riferimento.
Sebbene esistano ancora strumenti a riga di comando utilizzati dai professionisti, un utente meno esperto troverà molto più semplice un'interfaccia grafica intuitiva, sebbene quest'ultima possa rendere il software più avido di risorse.
L'User Experience è un campo dedicato proprio alla progettazione di interfacce semplici ed efficaci.
Anche prodotti apparentemente banali sono il risultato di studi sull'usabilità, come dimostrano i telefoni cellulari con interfacce semplificate per target specifici (ad esempio persone anziane).
Un altro aspetto cruciale è ridurre il numero di passaggi necessari per raggiungere una specifica funzionalità.
Scalabilità
La scalabilità è la capacità del software di adeguarsi al carico applicativo.
Pensiamo a un'applicazione web o a un sito di e-commerce che deve gestire un numero variabile di richieste (ad esempio un picco durante il Black Friday o altre festività del genere).
Un software scalabile è in grado di gestire l'aumento del carico senza che l'utente finale percepisca rallentamenti o interruzioni del servizio.
Ecosostenibilità
Diventata sempre più importante negli ultimi tempi, riguarda la capacità del software di essere eco-compatibile, ovvero di non consumare eccessive risorse energetiche.
Anche se spesso non ce ne accorgiamo, un software mal progettato può appesantire il sistema, richiedere maggiore potenza di calcolo e quindi aumentare i consumi.
Questo è particolarmente evidente sui dispositivi mobili, dove un'applicazione inefficiente può scaricare rapidamente la batteria. A livello globale un elevato consumo energetico da parte dei software ha un impatto ambientale non indifferente.
Qualità interne: l'architettura nascosta del software
Le qualità interne non sono direttamente visibili all'utente finale, ma possono essere valutate solo esaminando il codice sorgente e la documentazione di progetto. Tuttavia, queste qualità hanno un impatto significativo sulla "bontà complessiva" del software.
Anche in questo caso vediamo le principali.
Modularità
Un software dovrebbe essere ben modulare, ovvero strutturato in moduli indipendenti.
Un modulo può essere una classe, un insieme di classi o una libreria.
L'opposto della modularità è il cosiddetto "spaghetti code", un codice confuso e intrecciato difficile da comprendere e gestire. Un'organizzazione modulare facilita la comprensione del software, dove ogni "blocco" (modulo) ha un ruolo e un compito ben preciso.
Nell'ingegneria del software esistono principi come il "principio della singola responsabilità", che idealmente dovrebbe applicarsi anche ai moduli, assegnando a ciascuno un unico compito. La modularità rende più semplice intervenire su una parte specifica del software senza influenzare il resto del codice.
Riusabilità
Se un software è ben progettato e modulare, è possibile riutilizzare singoli moduli in progetti diversi.
Ad esempio, un modulo per la gestione dei pagamenti con carta di credito può essere integrato in più applicazioni.
La riusabilità comporta vantaggi in termini di tempi di sviluppo, costi e manutenzione, evitando di dover riscrivere da zero funzionalità già implementate.
Estensibilità
Un software estensibile è un software che può essere facilmente modificato e ampliato per rispondere a nuove esigenze o specifiche che cambiano nel tempo.
Una buona struttura, l'utilizzo di design pattern, facilitano l'aggiunta di nuove funzionalità con un ridotto impatto sul codice esistente.
Leggibilità
La leggibilità del codice è in parte una conseguenza della modularità, ma dipende anche da come il codice è scritto concretamente.
Utilizzare nomi significativi per classi, metodi e variabili (anziché nomi generici o arbitrari) è fondamentale. Un codice leggibile è cruciale per chiunque debba intervenire sul codice, sia per la manutenzione da parte di un team diverso da quello di sviluppo o anche per lo stesso a distanza di tempo.
Anche l'uso consapevole dei commenti (senza eccessi ma nei punti critici) e l'adozione delle convenzioni del linguaggio di programmazione utilizzato contribuiscono alla leggibilità.
Infine una documentazione di progetto chiara e dettagliata (che descriva le scelte progettuali, le strutture dati, le API) è essenziale per la comprensione del software.
Manutenibilità
Indica la facilità con cui il software può essere modificato, corretto e aggiornato nel tempo.
Software complessi, con elevati costi di sviluppo, tendono ad avere un ciclo di vita lungo, rendendo la manutenzione una fase cruciale.
La manutenzione può essere correttiva (per risolvere bug che emergono durante l'uso) o adattativa (per adeguare il software a nuove specifiche o normative).
È importante sottolineare che, sebbene i test siano fondamentali per ridurre i bug, non possono garantirne l'assenza completa.
La manutenibilità è strettamente legata a tutte le altre qualità interne: un software modulare, riusabile, estendibile e leggibile sarà anche più facile da manutenere.
Spesso i costi di questa fase del ciclo di vita del software superano quelli di sviluppo, sottolineando l'importanza di progettare software manutenibile fin dall'inizio.
Conclusioni
Valutare la qualità del software è un processo complesso che va oltre la semplice osservazione. Richiede la considerazione di una vasta gamma di parametri, sia esterni che interni.
Speriamo che questa panoramica abbia fornito una comprensione più approfondita di ciò che si cela dietro la "bontà" di un software.