Informazioni sullo sviluppo

Lo sviluppo software prevede l'attività di base che consiste nel convertire la visione di un progettista software in codice applicativo operativo che genera il risultato richiesto, funziona in base a condizioni predefinite, è efficace e sicuro, viene eseguito nei parametri specificati e consegue tutti questi risultati nel massimo dell'efficienza e utilizzando le risorse disponibili. Potrebbe sembrare un'impresa difficile, ma le tecniche di progettazione software, le metodologie, gli strumenti, gli ambienti di sviluppo moderni consentono ai team di creare software per completare questa attività in modo logico e ordinato per aumentare al massimo la percentuale di successo e ridurre al minimo gli sprechi.

Competenze nello sviluppo

Benché una progettazione iniziale mediocre non consenta generalmente la creazione di software di buon livello, esistono diversi strumenti e tecniche per gli architetti, i progettisti e gli sviluppatori che possono considerevolmente aumentare le possibilità di una progettazione di successo da cui derivi software eccezionale. Gli sviluppatori devono attenersi alle specifiche di progettazione, ma parte dell'abilità del lavoro consiste nell'avere la capacità di visualizzare il modo in cui interagiscono i sistemi e i componenti, comprendere le limitazioni applicate dall'hardware e dall'infrastruttura su cui verranno eseguite le applicazioni e nell'effettuare valutazioni ponderate in merito ai compromessi richiesti.  

Ciò significa che non è sufficiente conoscere come utilizzare un linguaggio di programmazione quale C# o Visual Basic. I framework e i linguaggi di programmazione moderni forniscono astrazioni che nascondono gran parte delle complessità alla base dell'hardware di runtime. Tuttavia, gli sviluppatori devono comunque comprendere la modalità di esecuzione del codice, la modalità di interazione delle diverse istruzioni di programmazione con l'infrastruttura sottostante e la modalità di implementazione della comunicazione tra i componenti che devono collaborare reciprocamente (spesso quando si trovano in una posizione remota ed è possibile accedervi tramite una rete, ad esempio Internet).

Con una progettazione attenta del software si tenta di sfruttare al massimo una vasta gamma di fattori importanti, quali la sicurezza, l'usabilità, la testabilità, la manutenibilità, le prestazioni e altro. Gli sviluppatori devono comprendere il modo in cui le proprie implementazioni del progetto possano avere delle conseguenze su tali fattori ed essere preparati a collaborare con l'architetto o il progettista software quando si tratta di stabilire i compromessi appropriati per ciascuno di tali fattori.

Linguaggi di programmazione

Per la scrittura di software esiste una vasta gamma di linguaggi tra cui scegliere. Alcuni sono specifici per particolari tipi di applicazioni, mentre altri vengono utilizzati per la maggior parte delle tipologie. Quando si lavora in modo autonomo, si predilige spesso il linguaggio più conosciuto per una vasta gamma di applicazioni. Quando si lavora in un team, la scelta del linguaggio è solitamente demandata ai responsabili di progetto.

Tuttavia, è possibile che per alcune applicazioni sia necessario l'utilizzo di più linguaggi di programmazione o tecnologie. Un esempio è rappresentato dallo sviluppo Web, dove è possibile che per il codice eseguito nel server Web per la creazione delle pagine vengano utilizzati Web Form ASP.NET o pagine Web WebMatrix. È possibile che le pagine stesse contengano codice JavaScript eseguito nel browser dell'utente per fornire l'interattività e che il codice di back-end che interagisce con il database sia stato scritto in un linguaggio basato su .NET Framework, quale C# o Visual Basic.

Ciò significa che spesso è necessario avere una certa familiarità con più linguaggi. Generalmente non si tratta di un'impresa difficile, poiché la maggior parte dei linguaggi utilizzano un approccio simile per la definizione delle istruzioni del codice sorgente e differiscono principalmente nella sintassi, benché ciascun linguaggio presenterà delle particolarità con cui sarà necessario acquisire dimestichezza. Solitamente, tuttavia, una volta comprese le nozioni fondamentali della programmazione e una volta appreso un linguaggio, diventa semplicissimo apprenderne altri.

La maggior parte delle applicazioni di oggi vengono create tramite linguaggi di programmazione orientati a oggetti e guidati da eventi. In questi tipi di linguaggi di programmazione vengono utilizzati costrutti e istruzioni di codice, tra cui cicli e istruzioni decisionali per l'esecuzione di una serie di attività. Contengono inoltre procedure e funzioni chiamate dal codice principale, spesso da diverse posizioni all'interno del codice. Gli oggetti vengono definiti all'interno del codice per rappresentare elementi reali, quali clienti, ordini e account che devono essere gestiti dal codice.

Tali oggetti includono proprietà che espongono i dati contenuti e i metodi eseguibili per la gestione dei dati, nonché generano eventi quando si verifica un'azione specifica, a seguito della quale il codice gestirà tali eventi secondo necessità. Tipici linguaggi di programmazione orientati a oggetti e guidati da eventi utilizzati nella piattaforma Microsoft sono C#, Visual Basic, C++, F# e JavaScript.

Framework, librerie di codice e modelli

Uno dei fattori principali nella semplificazione dell'attività di sviluppo delle applicazioni di oggi sempre più complesse, è rappresentato dall'utilizzo di framework, librerie di codice e modelli. La maggior parte degli sviluppatori non ama riscrivere lo stesso codice più volte (si tratta di un'attività ripetitiva che comporta uno spreco di tempo e di risorse) e preferisce concentrarsi sugli aspetti del processo di sviluppo più strettamente correlati ai requisiti dell'applicazione in corso di sviluppo. Una soluzione che si adatta allo scopo e che consente di ridurre al minimo tempi, costi e sforzi consiste nel riutilizzare il codice esistente per l'esecuzione di attività specifiche predefinite.

Il codice riutilizzabile è disponibile in varie forme. I team di sviluppo spesso creano librerie di funzioni e procedure che utilizzano in più componenti e applicazioni. Ne sono esempi tipici le funzionalità per l'implementazione della registrazione, della gestione delle eccezioni, della memorizzazione dei dati nella cache e dell'accesso ai database. È inoltre possibile ottenere o acquistare framework e librerie di codice che eseguano queste e una vasta gamma di altre attività. Il riutilizzo di codice già testato e di cui sia stato verificato il corretto funzionamento consente di ridurre in modo considerevole l'impegno richiesto per la creazione di software; l'abilità dello sviluppatore consiste nel conoscere quali siano i framework più adatti nonché quando e come applicarli in modo corretto.

Qualora non fosse disponibile alcun framework o libreria riutilizzabili e predefiniti, il team di sviluppo dovrà scrivere il codice richiesto. Il team di sviluppo dovrà inoltre scrivere il codice di "coesione" che colleghi i componenti insieme e chiami le funzioni nei framework e nelle librerie di codice. È in questo caso che è necessario una conoscenza approfondita dei linguaggi di programmazione. Tuttavia, esiste un altro modo in cui è possibile sfruttare i vantaggi derivanti dal lavoro effettuato in precedenza da altri sviluppatori, anche quando non esiste fisicamente il codice, ovvero l'applicazione di modelli di software.

I modelli sono un concetto volto a formalizzare la conoscenza e l'esperienza conseguite nel tempo durante la soluzione di problemi comuni nello sviluppo di software. Gli scenari che richiedono una soluzione per il codice sono stati spesso affrontati più volte da altri sviluppatori e ne è derivata una soluzione ottimale basate sulla valutazione e sull'esperienza di esperti nel settore. Tali scenari sono documentati come modelli di progettazione software e comprendono definizioni generiche della soluzione non strettamente specifiche di un linguaggio. Tuttavia, offrono tecniche di comprovata efficacia per la risoluzione del problema e il compito dello sviluppatore consiste quindi nel conoscere i modelli più adatti e nello scrivere il codice specifico per l'applicazione basato sulla soluzione generica descritta dal modello. Ciò consente di ridurre al minimo gli errori e di evitare gli errori comuni che si verificano in ciascun scenario.

Tecniche e metodologie di programmazione

Anche i programmatori più esperti commettono errori durante la scrittura di codice. Le applicazioni complesse contengono molte variabili e il codice apparentemente corretto potrebbe comportarsi in modo imprevisto in determinate condizioni non evidenti in fase di scrittura del codice. Con il passare del tempo, le tecniche e le metodologie che consentono di ridurre al minimo gli errori si sono evolute e formalizzate. È necessario avere dimestichezza con tali tecniche e metodologie anche quando si lavora in modo autonomo piuttosto che all'interno di un team.

Una delle principali metodologie attualmente utilizzate è la metodologia TDD (Test Driven Development) che è volta a far riflettere lo sviluppatore sui requisiti del codice e a formulare i risultati richiesti prima di scrivere il codice vero e proprio. Il processo comporta la creazione di una serie di unit test, ciascuno dei quali esercita una funzione specifica nella progettazione della sezione del codice creata. Ad esempio, se il codice applicherà un deposito nel conto di un cliente, il test acquisirà l'importo del deposito e il saldo del conto attuale e li invierà alla funzione del codice in corso di creazione. A questo punto, confermerà la correttezza del risultato controllando il saldo del conto.

Vengono creati prima gli unit test e successivamente il codice che implementa le funzioni richieste nell'applicazione. A questo punto, il codice può essere verificato tramite un framework di test (o test harness) in cui verranno eseguiti tutti gli unit test e verranno visualizzati i risultati relativi a tutte le asserzioni. Durante la scrittura, le continue modifiche e i miglioramenti del codice, i test possono essere rieseguiti per garantire la validità dei risultati.

Ovviamente, gli unit test non possono funzionare con i dati reali e potrebbero non disporre dell'accesso ad altre parti dell'applicazione ancora in fase di creazione. Al contrario, lo sviluppatore crea componenti di simulazione che rappresentano il componente reale, ma che vengono eseguiti in locale nella macchina di sviluppo. Ciò garantisce che i test abbiano effetto solo sul codice creato e i risultati non siano influenzati da altri fattori esterni.

La metodologia TDD viene spesso combinata con altre metodologie di programmazione. Ad esempio, la programmazione in coppia viene normalmente utilizzata per convalidare il codice e ridurre al minimo gli errori. Due sviluppatori lavorano insieme su un computer, scrivendo a turno il codice ed eseguendo gli unit test. Gli sviluppatori collaborano, condividono e integrano le esperienze e le conoscenze, valutando in modo critico il codice scritto dall'altro sviluppatore. L'input aggiuntivo e la competizione tra i due sviluppatori consente di produrre codice migliore.

Test, gestione temporanea e distribuzione

Il codice creato durante lo sviluppo rappresenta spesso solo una sezione dell'applicazione o sistema complessivo e deve essere integrato nell'applicazione o sistema completo a intervalli regolari per garantire che non si verifichino problemi in termini di interazione tra ciascun componente o ciascuna sezione del codice. Un approccio tipico consiste nell'archiviare il codice a intervalli regolari, in corrispondenza dei quali viene inizializzata una compilazione completa dell'applicazione o del sistema. In questo modo, verranno individuati eventuali conflitti di compilazione e test che dovranno essere risolti prima della successiva compilazione integrata.

Una volta che l'applicazione completa è stata compilata e ha passato il ciclo di test, potrà essere trasferita a un server o computer di gestione temporanea per il test di accettazione finale. A differenza del computer di sviluppo e dei server di compilazione, il server di gestione temporanea è una replica dell'ambiente di runtime finale e ciò consente al software di essere testato nelle condizioni che si verificheranno in produzione. Ancora una volta, il team di sviluppo dovrà risolvere eventuali problemi che si presentano durante il ciclo di test di accettazione di gestione temporanea.

Per le applicazioni sarà solitamente necessario un tipo di programma di installazione che ne consenta la distribuzione nei sistemi di gestione temporanea e di produzione finali. Il team di sviluppo dovrà creare i programmi di installazione richiesti per installare, configurare i componenti dell'applicazione e l'ambiente di runtime nonché preparare il sistema secondo necessità. Si tratta spesso di un problema complesso, specialmente per un software preconfezionato che potrebbe essere installato su piattaforme di runtime diverse con una vasta gamma di hardware di base e altre applicazioni presenti.

Lavorare in un team di progetto

Lavorare all'interno di un team di progetto può rivelarsi molto gratificante, ma richiede altre competenze per ottenere i migliori risultati. All'interno di un team, gli sviluppatori devono essere in grado di comunicare e interagire correttamente con diverse altre figure, tra cui dirigenti, architetti, progettisti, team dei test, team della documentazione e molti altri.

Stili diversi di gestione del progetto comportano agli sviluppatori la necessità di applicare capacità diverse. Alcuni progetti vengono eseguiti in modalità tradizionali "a cascata" in cui ciascuna attività viene compartimentalizzata e completata prima dell'avvio di quella successiva. Progressivamente, tuttavia, i progetti vengono eseguiti in una modalità più interattiva, che offre vantaggi in diversi scenari dello sviluppo di applicazioni.

Ad esempio, un progetto potrebbe essere sviluppato con una delle metodologie Agili, caratterizzate dalle brevi iterazioni di sviluppo, le riunioni quotidiane e le riunioni di verifica e di pianificazione delle iterazioni vengono utilizzate per fare in modo che il progetto proceda secondo i piani. Lo sviluppo con metodologie Agili predilige l'input del cliente e delle controparti esterne tramite rilasci regolari del software durante lo sviluppo e l'invio costante di suggerimenti e commenti. Solitamente viene utilizzato un archivio contenente gli elementi di lavoro per tenere traccia del progetto, ma non esiste alcuna fase di progettazione degna di nota oltre quella necessaria per avviare il progetto.       

La comunicazione interpersonale è fondamentale nei team di sviluppo software moderni ed è più semplice e solitamente più produttiva quando il team lavora insieme nello stesso edificio se non nella stessa stanza. Tuttavia, è stato dimostrato che anche i team geograficamente separati possano lavorare in modo efficiente fintantoché i singoli riescano a gestire correttamente le comunicazioni con gli altri membri del team. Le riunioni vengono tenute tramite software di conferenza telefonica e video, l'archivio delle informazioni è disponibile su Internet e i membri del team si attengono a rigide pianificazioni relative a riunioni quotidiane e settimanali. Ciò richiede che i singoli sviluppatori si adeguino alle limitazioni imposte dal fuso orario e interagiscano in modo efficiente con i membri del team di diverse nazionalità, e che utilizzino sistemi di comunicazione che consentano a tutti i membri del team di lavorare come una squadra.

Formazione ed esperienza

Esistono pochi altri settori in cui le tecnologie, le procedure e gli ambienti di lavoro cambiano altrettanto velocemente come avviene nel mondo IT. I progetti ingegneristici di tipo edile e meccanico di un certo livello spesso si protraggono per anni, mentre le applicazioni software anche più importanti potrebbero avere un piano di progetto, sviluppo e distribuzione che non supera l'anno e spesso anche meno. Contemporaneamente, gli strumenti, i framework, le infrastrutture e le tecnologie disponibili cambiano molto rapidamente, talvolta annualmente.

Ciò significa che lo sviluppatore deve essere preparato a dedicare del tempo nel mantenersi aggiornato apprendendo nuovi linguaggi di programmazione, tecniche e altre novità tecnologiche. Ciò implica inoltre la comprensione delle tendenze del mondo IT in costante mutamento e della capacità di interpretare il modo in cui queste si ripercuoteranno sul software attualmente in corso di sviluppo e di adattare le proprie competenze di programmazione per sfruttare al massimo queste nuove capacità.

Tra tutte le competenze dello sviluppatore, quella che garantisce maggiore successo è l'esperienza, la quale può essere conseguita solo con il tempo. Lavorare in un team, interagire con altri sviluppatori e mantenersi aggiornati sono requisiti fondamentali. Integrando ciò con un tocco di logica, creatività e una passione per la perfezione si ottiene la ricetta ideale per uno sviluppatore di software.