Sviluppo di programmi su commissione
Lo sviluppo di programmi è una attività molto complessa e difficile, specie se il software da produrre è di una certa complessità.
Niente può essere lasciato al caso e si dovrebbe riuscire a prevedere ogni possibile eventualità.
Purtroppo questa complessità non è percepibile da chi non è del mestiere, quindi il cliente non riesce a valutare se lo sviluppatore a cui si rivolge sarà in grado di realizzare quanto richiesto con un sufficiente grado di qualità.
Desidero dare alcune semplici indicazioni, dal mio punto di vista di sviluppatore, a chi desidera commissionare lo sviluppo di un programma o a chi vuole intraprendere questa professione.
Per il cliente
Chi commissiona lo sviluppo di un programma deve prevedere un investimento non indifferente che va attentamente valutato sia in termini di costi che di tempo e risorse impiegate.
Un programma di una certa complessità richiede tempo, e il tempo va pagato. Chi si offre di sviluppare un programma per un prezzo irrisorio è uno sprovveduto, un incapace, o ha altre forme di guadagno.
Cosa dovrebbe considerare il committente?
1) Comprendere le problematiche da risolvere
Spesso si conosce il problema ma non sono chiare le possibili soluzioni.
Anche quando la soluzione fosse stata identificata, è difficile riuscire a formalizzarla tecnicamente.
E' necessario avvalersi dell'aiuto di un esperto che sappia tradurre le esigenze funzionali in richieste tecniche formali.
2) Valutare eventuali software esistenti sul mercato e il costo del loro adattamento alle esigenze specifiche
Nel mercato si trovano software di ogni tipo, ma difficilmente se ne trova uno perfettamente adeguato alle specifiche esigenze.
I software standard più sofisticati offrono la possibilità di introdurre delle piccole modifiche che li rendono adattabili ad esigenze impreviste.
Il costo dello sviluppo può essere limitato a quello delle sole modifiche (personalizzazioni). Tuttavia si deve tenere presente che in questi casi ci sono di norma costi molto elevati nella manutenzione e assistenza post-vendita (il fornitore deve pur guadagnare in qualche modo).
L'utilizzo di un software standard spesso comporta una modifica alle proprie procedure operative da tempo consolidate. Questo adattamento è solitamente sgradito, ma non andrebbe scartato a priori. Si tenga presente che chi ha realizzato il programma standard ha considerato le procedure operative di molti soggetti e ha scelto di implementare quelle più ragionevoli. Non partire dal presupposto che tutti gli altri sbagliano...
3) Quantificare l'impatto in termini di costi e benefici che si avrebbe utilizzando un programma realizzato su specifiche richieste
La realizzazione di un programma ha un costo elevato. Però potrebbe comportare anche un risparmio considerevole in termini di tempo e denaro se aiuta a risolvere meglio e più velocemente determinati problemi.
4) Scegliere l'azienda o il professionista che realizzerà il programma richiesto
Non è facile trovare un soggetto a cui affidare lo sviluppo. Nel mercato esistono molti professionisti e aziende che si dicono capaci di sviluppare qualsiasi cosa, ma di sviluppatori realmente competenti ce ne sono pochi. Si deve valutare l'esperienza effettiva dello sviluppatore, ad esempio visionando progetti già realizzati. Tenere presente che non si può essere bravi in tutto e che uno sviluppatore competente avrà sempre presenti anche i limiti delle sue capacità e si rifiuterà di accettare richieste non realizzabili.
5) Quantificare i tempi e i costi di sviluppo, modifica e manutenzione del programma
Sviluppare un programma è una attività creativa per la quale è difficile fare previsioni. Tenere presenti probabili sviluppi futuri per esigenze che emergono usando il programma commissionato. E' fondamentale che lo sviluppatore offra qualche garanzia di disponibilità alla manutenzione del programma dopo la sua consegna.
Scelta dello sviluppatore
La facilità di accesso agli strumenti per lo sviluppo del software e la mancanza di normative in materia fa sì che sul mercato si trovino moltissimi soggetti che si propongono per lo sviluppo di programmi.
Di norma il cliente non ha le competenze tecniche per valutare le capacità del professionista e i criteri di scelta diventano il prezzo più basso e altri fattori di tipo personale (amicizia, simpatia, aspetto, loquacità, ecc.) che poco hanno a che vedere con ciò che si deve realizzare.
Affidarsi ad una azienda o a un professionista non dotato delle adeguate competenze comporta in genere una ingente perdita di tempo e denaro, con possibile abbandono del progetto di sviluppo.
Rischi da tenere presenti:
- mancata realizzazione del programma
- mancato rispetto dei tempi/costi previsti
- programma non rispondente ai requisiti funzionali richiesti
- malfunzionamenti e continui aggiustamenti
- elevati tempi di intervento
- elevati costi di manutenzione
- impossibilità di ampliamento delle funzionalità
- inutilità del programma per incoerenza nelle specifiche funzionali
Programmi a basso costo possono indicare:
- mancanza di esperienza da parte di chi li sviluppa
- servizi offerti ridotti al minimo o di scarsa qualità
- sviluppo del programma come attività promozionale che implica il recupero dei costi di sviluppo in altro modo (es. manutenzione e aggiornamento, vendita di hardware, altro)
Per lo sviluppatore
Uno sviluppatore è un artista. Crea qualcosa che prima non esisteva. E' come un pittore al quale viene commissionato un quadro. Il cliente può descrivere ciò che vuole, ma il risultato è frutto della creatività di chi lo realizza. Per quanto bene il cliente descriva il quadro desiderato, l'opera non sarà mai ciò che aveva in mente.
Quindi uno dei problemi maggiori dello sviluppatore è capire cosa vuole il cliente. Meglio lo capisce e più elevato sarà l'apprezzamento da parte del cliente.
Chi sviluppa software deve occuparsi dell'analisi del problema e della formulazione della soluzione che si traduce nello sviluppo di un programma.
1) Comprendere il contesto operativo e il problema da risolvere formulando una possibile soluzione tramite un apposito programma
Il programma non è una entità isolata. Il programma opererà in un ambiente e interagirà con utenti e altri sistemi hardware e software.
2) Raccogliere e analizzare i requisiti funzionali del software da realizzare
Prima di iniziare lo sviluppo è necessario chiarire bene le idee su ciò che il cliente desidera.
3) Interagire continuamente col cliente per meglio definire tecnicamente il problema fino al suo completamento
Ci sono difficoltà di comunicazione tra cliente e sviluppatore dovute ai diversi ambiti operativi in cui i soggetti sono competenti.
Si deve prevedere un continuo scambio di informazioni per indirizzare lo sviluppo verso le effettive esigenze.
4) Verificare la fattibilità di quanto richiesto e proporre soluzioni alternative
Non sempre si può fare quanto richiesto. A volte richiede uno sforzo eccessivo, a volte non è tecnicamente possibile. Essere onesti e saper dire qualche NO alle richieste del cliente per non ritrovarsi inguaiati in un progetto che non si può portare a termine.
5) Individuare le risorse utilizzabili e quelle da acquisire
Verificare sempre di avere tutto il necessario per procedere con lo sviluppo.
6) Formulare una soluzione razionale suggerendo eventuali modifiche alle procedure operative per ottenere una soluzione efficiente ed efficace
I clienti difficilmente accettano di modificare le proprie procedure operative consolidate ritenendole ottimali. Tuttavia uno sviluppatore ha una forma di pensiero razionale che permette di suggerire alternative più efficienti ed efficaci.
7) Redigere i requisiti funzionali
E' opportuno formalizzare le richieste per avere un riferimento certo a cui attenersi nello sviluppo e nella valutazione finale del prodotto.
8) Realizzare un prototipo del programma con funzionalità ridotte all'essenziale per verificare il corretto recepimento delle specifiche
Le difficoltà di comunicazione possono far intendere cose sbagliate. E' meglio avere quanto prima un riscontro dal cliente.
9) Scrivere il programma in maniera robusta che sia in grado di reggere a situazioni anomale
Una delle cose che distinguono un professionista da uno "smanettone". Non basta gestire la normalità, ma si devono gestire anche le eccezioni.
10) Gestire gli errori e i comportamenti errati degli utenti
Gli utenti sbagliano. Il programma deve gestire anche gli errori.
11) Verificare il corretto funzionamento in condizioni normali e in condizioni limite
Verificare sempre che tutto funzioni come ci si aspetta.
12) Prevedere opportune modalità di intervento per manutenzione, modifica e correzione di errori
I programmi non sono mai conclusi. Mettersi nelle condizioni di poterli modificare adottando tecniche di progettazione e sviluppo razionali.
13) Rivedere le specifiche funzionali in base a nuove indicazioni che dovessero emergere utilizzando il software
Quando il cliente usa il programma si accorge di nuove funzionalità di cui necessita.
14) Documentare le funzionalità offerte
Aiutare gli utenti ad usare il programma.
15) Istruire gli operatori aziendali sull'utilizzo del programma
Non dare per scontato che gli utenti capiscano ciò che a noi sembra evidente.
16) Aggiornare il programma in base all'evolversi del contesto operativo (sistema operativo e altri software utilizzati)
I programmi invecchiano. Cercare di avere sempre una prospettiva di lungo termine per non ritrovarsi con programmi inutilizzabili.
Il costo dello sviluppo di un programma
Lo sviluppo di un programma è una attività complessa e dinamica che richiede continue revisioni e adattamenti.
E' impossibile quantificare a priori il costo complessivo dello sviluppo di un software.
Ciò è dovuto a:
- frequente revisione delle specifiche funzionali da parte del cliente durante e dopo la realizzazione del programma
- problemi inattesi nella interazione con altri software su cui non si ha il controllo
La stima a priori del costo non potrà che essere per eccesso, prevedendo il recupero dei costi imprevisti nella successiva fase di manutenzione e assistenza.
Licenza d'uso
Le aziende e i professionisti che sviluppano software raramente (mai) rilasciano un programma nella forma in cui viene scritto da un programmatore.
Quando ciò avviene è solo a fronte di un compenso abbastanza elevato.
Questo perché il sorgente di un programma contiene tutta la competenza tecnica del soggetto che lo realizza e la sua divulgazione equivale alla rivelazione di segreti industriali di un'azienda.
Parimenti la proprietà del programma di norma rimane a chi lo sviluppa, che concede al cliente una licenza d'uso, più o meno ampia a seconda degli accordi presi.
In altre parole il programma viene prestato al cliente che lo può utilizzare nei limiti previsti dal contratto di licenza.
Errori di funzionamento
E' impossibile rilasciare un programma privo di errori, anche per le più grandi aziende di sviluppo.
E' necessario che il cliente accetti l'eventualità che si verifichino problemi durante l'utilizzo del programma. L'importante è che il programmatore corregga gli errori in tempi brevi.
Si tenga presente che l'attività di verifica di un programma è molto onerosa e richiede la creazione di un ambiente di prova quanto più possibile simile a quello in cui si andrà ad operare (cosa non sempre realizzabile). Se tale attività è tutta a carico del programmatore, andrà quantificata nel costo di sviluppo.
A volte può essere conveniente che tale attività sia parzialmente delegata agli operatori aziendali che andranno ad usare il programma.
In tale modo il cliente, a fronte di un disagio contenuto, consegue un duplice vantaggio:
- gli operatori verificano che le funzionalità del programma siano conformi alle esigenze permettendo di intervenire precocemente in caso di fraintendimenti
- gli operatori propongono delle migliorie funzionali
- il costo di sviluppo si mantiene contenuto
Definizione delle responsabilità
Si deve tenere presente che di norma un programma va ad interagire con altri programmi (come minimo col sistema operativo) e funziona su un hardware complesso (computer e rete).
Per quanto un programma sia ben fatto si possono verificare delle situazioni particolari in cui compaiono malfunzionamenti imprevedibili non dovuti al programma in sè, ma alle sue interazioni con l'ambiente operativo.
Nel caso si verifichino dei problemi è bene cercare di chiarire a chi imputarne la responsabilità.
Nel caso si richieda che il programma interagisca con altri programmi, assicurarsi che sia ben chiaro il ruolo di ogni soggetto. In ogni caso è bene limitare all'essenziale le interazioni.
Lo scambio di informazioni tra programmi dovrebbe essere sempre responsabilità di chi riceve le informazioni che in questo modo le elabora secondo i propri requisiti funzionali.