Progettazione del software**: definizione**

Nel processo di progettazione del software vengono presi in considerazione e analizzati i requisiti del cliente e quindi viene realizzato un progetto in grado di soddisfare tali esigenze. I progetti di successo devono bilanciare gli inevitabili compromessi che scaturiscono da requisiti in conflitto; devono attenersi ai principi di progettazione e alle tecniche consigliate maturate negli anni e integrarsi con i sistemi hardware, di rete e di gestione. Una solida progettazione software comprende una conoscenza avanzata di argomenti teorici e pratici, nonché la capacità necessaria per convertire scenari e requisiti aziendali, anche astratti, in progetti reali e funzionanti.

La progettazione del software comporta la definizione di una soluzione strutturata che soddisfi tutti i requisiti tecnici e operativi nonché l'ottimizzazione degli attributi generali di qualità,come le prestazioni, la sicurezza e la gestibilità. Comporta una serie di decisioni basate su una vasta gamma di fattori che potrebbero avere conseguenze dirette sulla qualità, sulle prestazioni, sulla manutenzione e quindi e sul successo complessivo del software.

Raramente il software è una realtà autonoma. Come minimo, nella maggior parte dei casi interagirà con un'origine dati, di solito un database aziendale che espone le informazioni. Solitamente i software interagiscono anche con altri servizi e altre funzioni di rete per l'autenticazione, per ottenere e pubblicare informazioni e per offrire un'esperienza utente integrata. Senza una progettazione accurata, il software potrebbe rivelarsi difficile o persino impossibile da distribuire, gestire, sottoporre a manutenzione e integrare correttamente con altri sistemi e non soddisferà i requisiti degli utenti.

La progettazione del software può essere definita come l'interazione tra le finalità di un software e i dettagli di implementazione in termini di codice. Una corretta progettazione garantirà equilibrio ottimale tra requisiti e risultati. Un software correttamente progettato svolgerà le attività specificate all'interno dei parametri dei requisiti originali e in modo da ottimizzare le prestazioni, la sicurezza, l'affidabilità e altri fattori legati alla qualità.

A livello più elevato, la progettazione dell'architettura dovrebbe esporre la struttura del sistema ma nascondere i dettagli di implementazione, prendere in considerazione tutti i casi e scenari di utilizzo, provare a soddisfare le esigenze di tutte le parti interessate e soddisfare per quanto possibile tutti i requisiti funzionali e di qualità.

Importanza della progettazione del software

I requisiti del software oggi sono sempre più complessi poiché gli utenti si aspettano sempre di più dalle applicazioni. Semplici applicazioni desktop autonome non sono più adatte nella maggior parte degli scenari aziendali e commerciali. In un mondo connesso in rete come quello di oggi, l'applicazione deve interagire con altre applicazioni e servizi ed essere eseguita in ambienti diversi, nella cloud e in dispositivi portatili. I progetti monolitici del passato sono stati sostituiti da software orientato ai servizi e suddiviso in componenti in cui vengono utilizzati framework, sistemi operativi, host di runtime e reti per implementare funzionalità impensabili solo pochi anni fa.

Un tale livello di complessità si ripercuote non solo sulla progettazione, ma anche sulla distribuzione, sulla manutenzione e sull'amministrazione del software. Il costo totale di proprietà (TCO) del software non è prevalentemente costituito dai costi successivi alla distribuzione. Un' applicazione correttamente progettata consentirà di ridurre al minimo il costo totale di proprietà mediante la riduzione dei costi e dei tempi richiesti per la distribuzione, la manutenzione e,l’aggiornamento necessario per soddisfare le nuove esigenze e per correggere i problemi. Consentirà inoltre di semplificare il supporto e la gestione degli utenti.

Il software deve inoltre soddisfare diversi criteri fondamentali per avere successo. Deve garantire sicurezza in modo che l'applicazione e i relativi dati siano protetti contro attacchi ed errori accidentali. Deve essere solido e affidabile in modo tale che gli errori e i costi associati siano ridotti al minimo. Deve poter essere eseguito nell'ambito dei requisiti richiesti per soddisfare le esigenze dei clienti, quali il tempo di risposta massimo o una capacità specifica di gestione del carico di lavoro. Deve essere facile da gestire per poter ridurre al minimo i costi di amministrazione e supporto e sufficientemente estensibile per consentire le modifiche e gli aggiornamenti richiesti nel tempo.

Tutti questi fattori comportano dei compromessi. Ad esempio, l'implementazione dei meccanismi di sicurezza tramite una crittografia complessa si ripercuoterà sulle prestazioni. L'implementazione di opzioni di configurazione e aggiornamento su larga scala può rendere la distribuzione e l'amministrazione più complicate. Inoltre, più complesso sarà il progetto, maggiori saranno i costi di implementazione. Un progetto di qualità mirerà a bilanciare tali fattori per produrre il risultato ottimale per lo scenario specifico.

Funzione del progettista software

La progettazione del software inizia con una serie di requisiti, che potrebbero essere espressi nella forma di diagrammi, diagrammi di flusso di processi, modelli o elenchi di attività operative che il software dovrà eseguire. Solitamente anche il cliente o il partner esprimerà l'esigenza di requisiti meno precisi, come l'aspetto o la modalità di funzionamento di determinate interfacce utente. I requisiti devono inoltre includere informazioni relative al software, ai sistemi, all'hardware e alle reti esistenti con cui si dovrà interfacciare il nuovo software, nonché altri fattori quali il piano di distribuzione e manutenzione e, ovviamente, il budget disponibile per il progetto.

Il progettista software deve considerare le esigenze del cliente. Tuttavia, il temine generico "cliente" solitamente comprende tre aree di responsabilità in conflitto: i requisiti aziendali, i requisiti dell'utente e i requisiti di sistema. Per requisiti aziendali solitamente si definiscono una vasta gamma di fattori quali i processi aziendali, i fattori legati alle prestazioni (ad esempio, sicurezza, affidabilità e velocità effettiva) e le limitazioni in termini di budget e costi. I requisiti dell'utente comprendono l'aspetto dell'interfaccia, le capacità operative e la facilità d'uso del software. I requisiti di sistema comprendono le capacità e le limitazione dell'hardware, della rete e di runtime. Nella Figura 1 viene illustrata la variabilità di questi diversi requisiti in conseguenza dei quali il progettista dovrà impegnarsi a realizzare un progetto che si adatti all'area di intersezione degli stessi.

requisiti in conflitto di un tipico cliente
Figura 1 - I requisiti in conflitto in un progetto

Ciascun progettista software ha un un proprio approccio alla raccolta e all'analisi dei requisiti, nonché alla definizione dell'architettura. Tuttavia, è tenuto a rispondere a quesiti del tipo: "In che modo gli utenti utilizzeranno l'applicazione?", "In che modo l'applicazione verrà distribuita e gestita nell'ambiente di produzione?", "Quali sono i requisiti di qualità dell'applicazione, come sicurezza, prestazioni, concorrenza, internazionalizzazione e configurazione?", "In che modo è possibile progettare l'applicazione per renderla flessibile e manutenibile nel tempo?" e "Quali sono le tendenze architetturali che potrebbero avere subito conseguenze sull'applicazione o dopo la sau distribuzione?"

Quest'ultima domanda è interessante e fondamentale. Una progettazione software di qualità non solo soddisfa i requisiti attuali dei clienti, ma continuerà a farlo anche nell'immediato futuro. Ciò interessa le decisioni che dovrà prendere il progettisti in merito all'hardware, ai componenti, ai framework, alle piattaforme di runtime, ai sistemi di gestione software e molte altre funzionalità incorporate nel software o con cui dovrà integrarsi il software.

Come la maggior parte delle attività nel settore della progettazione e dello sviluppo del software, la progettazione dell'architettura rappresenta sia un processo formale che iterativo. Molte attività iniziali quali l'analisi dei requisiti, la ricerca tecnica e l'identificazione degli obiettivi solitamente vengono effettuate all'inizio del processo. La fase successiva consiste nell'identificare gli scenari principali di destinazione del progetto. Esistono dei requisiti fondamentali che devono essere soddisfatti e delle limitazioni entro le quali il software deve operare. Sulla base di tali informazioni, il progettista potrà generare una panoramica dell'applicazione, che comprenderà dettagli di alto livello quali il tipo di applicazione (Web, telefono, desktop o cloud), l'architettura di distribuzione (solitamente un progetto multilivello con componenti che comunicano attraverso limiti hardware e di rete), gli stili architetturali appropriati da seguire (quali n livelli, client/server o orientati ai servizi) e le tecnologie di implementazione più adatte allo scenario.

A questo punto, il progettista potrà iniziare a produrre possibili versioni di progetti che soddisfino i requisiti di alto livello e più importanti identificati in precedenza. Il progetto viene quindi revisionato e testato rispetto agli scenari principali, spesso in associazione ai suggerimenti ricevuti dal cliente e alle versioni di valutazione e test, per garantire che offra una soluzione ottimale. Ciò è improbabile che accada durante la prima iterazione, ma man mano che il ciclo si ripete il progetto convergerà sui requisiti e sugli scenari principali. Nella Figura 2 viene illustrato questo approccio iterativo.

processo di progettazione architetturale iterativo
Figura 2 - Processo di progettazione architetturale iterativo

Man mano che il progetto diventa sempre più granulare e i singoli componenti e attività vengono identificati, il progettista potrà perfezionare e aggiungere dettagli al progetto in ciascuna fase. Ad esempio, dopo aver identificato lo stile architetturale e l'approccio di distribuzione, il progettista potrà prendere decisioni in merito alla comunicazione tra i vari livelli e componenti, tra cui probabilmente la scelta di un protocollo in base ai requisiti attuali e futuri e la considerazione delle anteprime di nuove tecnologie e funzionalità definite nei futuri standard.

Il prodotto finale del lavoro di un progettista comprende solitamente una serie di schemi, modelli e documenti che definiscono l'applicazione da diverse prospettive in modo tale, se combinati, offrono agli sviluppatori, ai team di test, agli amministratori e ai dirigenti tutte le informazioni richieste per implementare il progetto. Tali informazioni descriveranno la struttura e il layout delle parti di componenti e livelli dell'applicazione; il modo in cui vengono gestite questioni trasversali quali la registrazione e la convalida; il piano di test e distribuzione e la documentazione per assistere gli sviluppatori, gli amministratori e il personale del supporto tecnico.

Il progetto finale deve inoltre specificare gli attributi di qualità che devono essere soddisfatti dall'applicazione, che sono il risultato di decisioni e compromessi ponderati effettuati dal progettista in accordo con il cliente. Includono definizioni dei requisiti di sicurezza e il piano di implementazione di sicurezza, la scalabilità e le prestazioni richieste durante la distribuzione nella piattaforma di destinazione, le modalità di implementazione della manutenibilità e dell'estensibilità e le funzionalità che consentono l'interoperabilità con altri sistemi.

Competenze di un progettista software

È evidente che un progettista software deve disporre di una vasta gamma di competenze specifiche e, più in generale, deve conoscere anche aspetti legati all’ hardware. Durante le fasi di analisi e di revisione dei requisiti, il progettista deve collaborare con il cliente, consultarsi con i partner e con gli altri membri del team e agire come intermediario per responsabili, utenti e amministratori di sistema. L'eccellere in tali competenze consente di produrre un piano iniziale migliore e una serie più accurata di requisiti, con conseguente risparmio di tempo e risorse in seguito.

Un progettista software deve inoltre disporre delle competenze hardware necessarie per comprendere come funzionano i sistemi software, il modo in cui l'hardware è in grado di supportare i requisiti, il modo in cui i fattori legati alla rete e al sistema operativo possono influire sulle decisioni di progettazione e il modo in cui le tendenze e i cambiamenti in questi ambiti potranno avere conseguenze sulla progettazione. Dopo un'analisi iniziale dei requisiti, un progettista software deve inoltre applicare le proprie competenze hardware in merito ai modelli di progettazione, agli standard di comunicazione e di messaggistica, alle capacità del codice, ai problemi di sicurezza e alle limitazioni in termini di prestazioni. Tutto ciò richiede una conoscenza approfondita delle tecnologie che verranno utilizzate per implementare il software finale.

Ovviamente, la progettazione del software implica anche degli obiettivi. Prevedere il modo in cui i sistemi si integreranno e interopereranno, il modo in cui verranno partizionati e distribuiti e il modo in cui interagiranno con gli utenti è possibile solo se il progettista è in grado di visualizzare l'intera soluzione prima che venga realizzata. Ciò implica un approccio organizzato e una particolare attenzione ai dettagli per riordinare e comprendere tutti i requisiti e limitazioni, nonché per trasformarli gradualmente in un progetto tecnico funzionale e completo. Tuttavia, sono necessarie inoltre creatività e immaginazione per poter visualizzare il risultato finale e lavorare in modo metodico per ottenere la soluzione ideale.