Introduzione
Fin dalla loro nascita nel secolo scorso, le applicazioni software sono state oggetto di
ricerca. Era un mondo nuovo in cui ognuno provava a cimentarsi e trovare possibili
soluzioni [5]. Oggi nella maggior parte delle attività, sia economiche che finanziarie,
vengono utilizzati prodotti software per memorizzare dati, effettuare operazioni ma
soprattutto tenersi aggiornati e in collegamento con le varie parti del mondo. Per questo,
diventa sempre più importante che il software sia funzionale, risponda a specifici
requisiti, sia facile da usare, solo per citare alcuni dei requisiti da soddisfare.
Partendo da tali presupposti, tale tesi si pone l’obiettivo di evidenziare come tali esigenze
siano cambiate negli anni analizzando i diversi paradigmi di programmazione e
progettazione delle applicazioni software. Altro aspetto importante da considerare
riguarda il testing, utile per valutare se il prodotto software e le funzionalità realizzate
corrispondono a ciò che era stato richiesto dal committente. Data l’evoluzione continua,
tali sistemi software nel tempo tendono a diventare obsoleti, per questo verranno
analizzate tecniche di manutenzione del software e standard di qualità da rispettare.
Nella parte successiva, si analizzeranno le tecnologie utilizzate nella pubblica
amministrazione, sulla base dei regolamenti imposti e dei requisiti da rispettare, ponendo
anche attenzione alla sicurezza di tali strutture. Poi si passerà all’analisi delle linee guida
rispetto ai vari ambiti che sono competenza dell’Agid (Agenzia per l’Italia Digitale, tra
cui requisiti non funzionali generici, come accessibilità e sicurezza informatica, ma anche
requisiti funzionali relativi a SPID (Sistema Pubblico di Identità Digitale), Firma
elettronica qualificata e cloudPA. Nell’ultima sezione delle linee guida è presente una
panoramica dei progetti attivati in ambito di sanità digitale.
In seguito, si entrerà più nel dettaglio analizzando il caso specifico che riguarda il
cloudPA. Successivamente, considerando le soluzioni adottate dagli enti locali, verrà
effettuato un confronto per valutare come tali standard sono stati applicati e adattati alle
diverse esigenze.
Per quanto riguarda l’organizzazione della tesi, nel capitolo 1 verrà presentata una
panoramica su ingegneria del software, ciclo di vita del software e modelli di sviluppo di
applicazioni software, ma anche paradigmi di programmazione, tecniche di testing,
manutenzione e la qualità del software. Il capitolo 2 sarà dedicato all’agenzia per il
digitale (Agid), analizzando funzioni e competenze. Nel capitolo 3 sono presenti linee
guida rispetto ai vari ambiti che sono competenza di tale agenzia. Il capitolo 4 si
concentrerà solo su uno di questi ambiti che riguarda il cloudPA. Nel capitolo 5 verranno
analizzate le esperienze nell’ambito degli enti locali.
Capitolo 1 – Stato dell’arte
1.1 Ingegneria del Software
Con il termine ingegneria del software (o software engineering in inglese) si fa
riferimento a una disciplina informatica che studia i metodi di produzione, le teorie alla
base di tali metodi, e gli strumenti di sviluppo che hanno lo scopo di realizzare sistemi
software. Tale disciplina è anche empirica in quanto tiene conto dell’esperienza e della
storia dei progetti passati.
L'ingegneria del software ha diversi obiettivi, come quello relativo alla misura della
qualità dei sistemi software prodotti e quello relativo all’evoluzione dello sviluppo del
software a livello di tecnologie utilizzate e dal punto di vista metodologico (ad esempio,
considerando i modelli utilizzati).
In questa sezione verranno analizzati il ciclo di vita del software e i modelli di sviluppo
presenti in letteratura.
1.1.1 Ciclo di vita del software
Il termine ciclo di vita del software indica una metodologia di sviluppo in cui l'attività di
realizzazione di prodotti software viene divisa in diverse sotto attività correlate tra loro.
Come risultato finale verrà realizzato il prodotto software e la relativa documentazione
da consegnare poi al cliente che ha richiesto tale prodotto. Tale attività prevede diverse
fasi, tra cui studio di fattibilità, la progettazione, la realizzazione, testing, l'installazione e
la manutenzione [1]. Tali attività vengono realizzate da un team di sviluppatori o dal
singolo sviluppatore a seconda della complessità e delle tempistiche del sistema da
realizzare. In figura 1 è possibile vedere come le diverse fasi sono collegate tra loro.
Fig.1 – Ciclo di vita del software schematizzato
1
Più nel dettaglio, si parte dall’analisi, in cui si analizza il contesto in cui va introdotto il
prodotto software e i possibili problemi da risolvere. Alla fine di tale fase sarà realizzato
un documento con specifiche e caratteristiche del prodotto da realizzare. Nella fase
successiva di progettazione, sulla base dei requisiti definiti, viene definita la struttura del
software realizzando un progetto architetturale e un progetto più dettagliato con le
caratteristiche dei singoli componenti. Nella fase di codifica viene sviluppato il prodotto
software realizzando l’implementazione, che può essere svolta per i singoli moduli o
componenti del prodotto software che verranno successivamente integrati tra loro. Di pari
passo viene realizzata anche la fase di test, che può essere relativa ai singoli moduli o
1
https://www.artera.net/it/blog/software/che-cose-il-ciclo-di-vita-del-software/
all’interazione di componenti software realizzati. Alla fine di tale fase si avrà una versione
prima alfa e poi beta del prodotto. Anche le versioni alfa e beta vengono sottoposte a test
per verificare che il prodotto realizzato soddisfi i requisiti precedentemente definiti.
Quindi si effettua il collaudo dei singoli componenti e dell’integrazione tra essi. Nella
fase di debugging vengono risolti problemi evidenziati nella fase di testing. Risolti tali
aspetti, viene pubblicata una versione definitiva del software. L’ultima fase riguarda la
manutenzione in cui viene modificato il software dopo il rilascio in caso di cambiamenti
richiesti o nuove esigenze.
1.1.2 Modelli di sviluppo
Esistono diversi modelli di sviluppo software, tra cui Modello a cascata, Modello
evolutivo, Modello trasformazionale, Prototipazione rapida, Modello a spirale, Modello
a fontana (o metamodello), Metodologia agile, Modello a stella
2
.
Uno dei primi modelli realizzato è stato il modello a cascata in cui le diverse fasi sono
eseguite in modo sequenziale, allo stesso modo come avveniva per la produzione
manufatturiera. Il coinvolgimento del cliente è minimo. Tale modello è utilizzato per
progetti piccoli e con requisiti chiari. Tuttavia, negli anni ’80, tale modello è stato criticato
e revisionato e si è passati a modelli diversi come quello a spirale.
Il modello a spirale (o iterativo) è un modello più complesso rispetto al precedente
3
e le
diverse fasi sono collegate in modo diverso tra loro. Infatti, poiché tale modello opera su
iterazioni, è possibile tornare a fasi precedenti. Ad esempio, dalla fase di testing si torna
2
https://it.wikipedia.org/wiki/Modello_di_sviluppo_del_software
3
https://it.strephonsays.com/waterfall-and-vs-spiral-model-4079
a quella di pianificazione per effettuare correzioni e/o miglioramenti. Il cliente è più
coinvolto e più consapevole di quale sarà il prodotto finale.
Un altro modello che cerca di superare i limiti del modello a cascata è il modello evolutivo.
Tale modello utilizza la prototipizzazione, cioè vengono usati strumenti specifici per
realizzare rapidamente una versione semplificata del sistema da realizzare sul quale
provare le funzionalità. A seconda dei risultati raggiunti, si potrà decidere di utilizzare
tale modello o ricominciare dall’inizio con un nuovo prototipo o modificare i requisiti
iniziali. Tale modello prevede dei tempi lunghi, per questo si è passati al modello
incrementale.
Nel modello incrementale, le diverse fasi possono essere ripetute più volte per diminuire
il rischio di fallimento e aggiungere nuovo valore al prodotto da realizzare. Tale ciclo si
ripete finché non vengono soddisfatti tutti i requisiti. Tale modello è consigliabile nei casi
in cui la specifica dei requisiti risulta complessa e di difficile realizzazione.
Successivamente, a partire dagli anni 2000, si è iniziato a parlare di metodologia Agile.
Tale metodologia prevedere un approccio meno strutturato e con l’obiettivo di consegnare
un prodotto di qualità al cliente in tempi rapidi e con il rilascio frequente di prototipi via
via più completi. Per poter realizzare ciò, vengono formati gruppi di sviluppo piccoli con
più funzioni e il cliente viene coinvolto direttamente e spesso rispetto ai precedenti
modelli.
I modelli proposti presentano diversi vantaggi o svantaggi a seconda del caso in cui vanno
utilizzati. Per fare un confronto, analizziamo il primo e l’ultimo modello proposti. Ad
esempio, i vantaggi del modello a cascata sono: facilità di gestione, utile per progetti di
dimensioni non elevate, processo di sviluppo documentato bene. Invece, i vantaggi della
metodologia Agile sono: coinvolgimento del cliente in ogni fase, garanzia del
mantenimento della qualità dello sviluppo, meno rischi nel processo di sviluppo poiché il
cliente è più presente, consegna più veloce dei diversi output prodotti in ogni fase al
cliente
4
.
Per quanto riguarda i limiti, nel modello a cascata, terminata la fase di sviluppo è più
difficile apportare modifiche, la fase di test inizia solo alla fine dello sviluppo, quindi si
potrebbero trovare più bug che possono far aumentare i costi. Invece, la metodologia
Agile non è utile per progetti di piccole dimensioni, costi di implementazioni non inferiori
rispetto agli altri modelli, il progetto può terminare se il cliente non è chiaro nelle
richieste.
1.2 Paradigmi di Programmazione
Con il termine linguaggio di programmazione si fa riferimento a una notazione
5
per
descrivere algoritmi e strutture dati. È importante conoscere i principi alla base dei
moderni linguaggi di programmazione e i relativi aspetti implementativi per diversi
motivi. Tale conoscenza permette di scegliere di volta in volta il linguaggio più adatto per
risolvere un determinato problema, permette di utilizzarlo in maniera efficiente e aiuta a
predirne i costi. Inoltre, conoscendo i principi base, anche l’apprendimento di un nuovo
linguaggio di programmazione risulta più semplice.
I componenti alla base di un linguaggio di programmazione sono:
4
https://vitolavecchia.altervista.org/differenze-tra-il-modello-a-cascata-e-la-metodologia-agile/
5
http://www-lia.deis.unibo.it/Courses/FondT-0910-ELT/materiale/03.introC.pdf
• Il paradigma (o modello computazionale) del linguaggio formato dall’insieme dei
concetti chiave del linguaggio.
• La sintassi del linguaggio che può essere descritta mediante una grammatica.
Secondo Chomsky, una grammatica è formalmente definita da una quadrupla (N,
T, P, S0), in cui :
o N: insieme dei simboli non terminali che possono essere riscritti;
o T: insieme dei simboli terminali disgiunti da N;
o S0: assioma, simbolo non terminale iniziale; S0 appartiene ad N.
o P: regole di produzione.
• La semantica del linguaggio, ossia il significato che il linguaggio attribuisce alle
frasi sintatticamente corrette dal punto di vista del linguaggio.
• La pragmatica del linguaggio che indica il modo con cui il linguaggio è utilizzato
in pratica.
Per quanto riguarda i paradigmi di programmazione, essi fanno riferimento al modo in
cui viene organizzata la programmazione relativamente a caratteristiche quali stile e
livello di dettaglio. Si possono distinguere alcuni principali paradigmi di
programmazione: imperativa (o procedurale), funzionale, logica ed ad oggetti.
1.2.1 Imperativo
In questo tipo di programmazione, un programma viene visto come un insieme di
istruzioni (o comandi) . Nel codice sorgente di tale programma sono presenti i comandi
che stabiliscono cosa deve essere fatto da un computer per raggiungere un determinato