Il normale ciclo di sviluppo per un software, che coinvolge in genere molte persone, e richiede molto tempo per ogni aggiornamento, e quindi per rilasciare nuove versioni di un programma, è un procedimento piuttosto laborioso, che prevede una sequenza di operazioni necessarie a garantire il corretto funzionamento del programma, ma che tuttavia non riesce spesso a garantire comunque la creazione di software esente da bug, oltre a prolungare i tempi di rilascio e, conseguentemente, i costi di sviluppo.
Indipendentemente da come sono organizzati i team di sviluppo e dalle scelte implementative, il linguaggio più utilizzato in genere è il C++, evoluzione orientata agli oggetti del C (ma ci sono molte altre novità rispetto al linguaggio padre), e la tendenza attuale è quella di rilasciare i programmi, almeno quelli di un certo tipo, per piattaforma Windows e Mac, spesso non utilizzando direttamente le librerie di sistema presenti nei due OS, ma scrivendo, almeno per gestire la parte grafica e di interazione con l’utente, delle proprie librerie che si interfacciano a quelle di base del sistema, e permettono di avere programmi con aspetto e funzionalità simili sui diversi sistemi. Questo però complica ulteriormente le cose, visto che aumentano i parametri da controllare, e si fanno più alti i rischi di avere errori di programmazione, oltre all’appesantimento del programma finale, e dell’ulteriore aumento dei tempi di sviluppo e di testing.
Mi chiedo se non sarebbe possibile in qualche modo intervenire sul ciclo abituale di sviluppo, snellendolo un pochino, appoggiandosi in gran parte a tool che permettano uno sviluppo veloce e che eliminino in partenza la possibilità di errori (o almeno quelli di un certo tipo), e riducano i tempi di testing e di aggiornamento del software, facilitando inoltre il porting di un programma su diversi sistemi.
La cosa mi è venuta in mente facendo una ricerca comparativa tra i software di “color grading e finishing” video. Si tratta di programmi utilizzati nello stadio finale di una produzione video (soprattutto cinematografica, ma anche televisiva), che permettono di conformare i diversi spezzoni video che formeranno il montaggio finale, facendo si che si integrino al meglio, permettono di effettuare una correzione del colore per ottenere esattamente le immagini volute (che non sono mai, nel prodotto finale, uguali a quelle effettivamente girate sul set, ma hanno come minimo colori più… “pompati”) , e permettano di produrre il video finale sostituendo i file a bassa qualità usati per il montaggio (il montaggio si fa tipicamente “off-line“, lavorando con copie a bassa qualità dei video, che vengono sostituite solo alla fine con le pesanti versioni ad alta qualità, per la finalizzazione “on-line“) con quelli a piena qualità: ci sono un po’ di programmi di questo tipo, da quelli di fascia più bassa, e quindi più economici (come Color della Apple) a quelli più evoluti (come Scratch della AssimilateInc e Lustre della Autodesk), ma sono comunque tutti costosissimi (e spesso richiedono anche piattaforme hardware dedicate), indirizzati a studi di un certo livello, quindi per un utente normale è molto difficile accedervi, se non altro per imparare il flusso di lavoro (per intenderci, Scratch costa, in versione solo software, più di 30000 dollari…).
Mi chiedo se non sarebbe un progetto fattibile, per un team composto da pochi elementi (non più di una decina), produrre un software dalle analoghe capacità, con tempi e costi di sviluppo ridotti, grazie all’utilizzo di strumenti che permettano di eliminare o ridurre i problemi di cui parlavo all’inizio. Ripensando al mio passato, a quando muovevo i primi passi nella programmazione, m’è tornata in mente la praticità di linguaggi non compilati, ma interpretati in tempo reale, come il Turbo Pascal: fai una modifica e puoi subito testarne il risultato. O anche la praticità del Java: modifichi un file che implementa alcune funzioni usate da tutto il programma, e ricompili solo quello, non tutto il programma. Lo svantaggio di soluzioni simili? Ovviamente, l’efficienza dei programmi così realizzati.
Beh, non è più così! Esistono ormai ottime soluzioni che permettono di sviluppare velocemente, producendo codice nativo (non da interpretare, ma compilato), garantiscono che un certo tipo di errori non sia presente (ad esempio, un errore tipico nella programmazione C e C++ è non liberare porzioni di memoria quando non sono più necessarie, portando al suo prematuro esaurimento),e si integrano facilmente con le librerie già esistenti (normalmente scritte in linguaggio C). Due di questi sono Free Basic e Free Pascal. Sono entrambe implementazioni moderne degli storici linguaggi di programmazione,che permettono di produrre molto velocemente codice che gira su tantissime piattaforme diverse (soprattutto il Free Pascal), con una semplice compilazione (per Il C e il C++, checchè se ne dica, non è affatto così semplice…), hanno librerie di funzioni già pronte abbastanza complete, e si possono interfacciare facilmente con librerie o porzioni di codice scritte in altri linguaggi (il che permette di scrivere in C o Assembly le sole porzioni di codice da ottimizzare, e di produrre e aggiornare molto velocemente le altre, magari quelle che si interfacciano al sistema e all’utente, in Free Pascal o Free Basic (e teoricamente nulla vieta di miscelarli)). E non solo, nella collezione di compilatori della GNU, il GCC, è presente anche un compilatore Java, che permette di produrre non solo bytecode Java, ma anche codice nativo partendo da sorgenti o da bytecode Java già compilato, e anche in questo caso si può miscelare il codice con librerie già esistenti. L’ultima alternativa (che però mi sembra francamente la meno interessante, anche perché più vicina al C) è il linguaggio D.
In pratica, un piccolo team potrebbe scrivere l’ossatura del programma in un linguaggio come Java (compilato), Free Pascal o Free Basic, scrivendo in C, C++ o Assembly solo le parti che hanno bisogno di essere ottimizzate, e appoggiandosi a librerie già esistenti per utilizzare funzioni particolari (ad esempio per tutte le soluzioni citate èpossibile utilizzare l’ottima libreria GTK+, alla base di GIMP e GNOME, per gestire l’interfaccia grafica, o magari si può utilizzare tranquillamente la libreria OpenGL, per far svolgere determinati compiti alla scheda grafica invece che al processore, etc…), e la manutenzione e l’aggiornamento sarebbero decisamente più veloci rispetto a un ciclo “tradizionale”. Insomma… in questo modo, a mio parere, si prenderebbe il meglio dei due mondi: la velocità e sicurezza di sviluppo delle soluzioni di livello medio, e l’efficienza nell’esecuzione del programma tipica dei linguaggi di basso livello come C e Assembly. Certo, non sarebbero comunque tutte rose e fiori, però… credo francamente che certe soluzioni vadano avanti perché sono quasi le uniche ad essere conosciute, e per motivi prevalentemente “storici”, piuttosto che per vantaggi reali. Certo, bisognerebbe imparare un nuovo linguaggio, ma, francamente, quale VERO programmatore C o C++ ha difficoltà ad usare il Java, o anche il Pascal o il Basic?
Ovviamente sarei curioso di conoscere il parere di chi programma software costantemente. Io non sviluppo più software da parecchio tempo, come credo di sia capito, le mie passioni (e spero anche il mio lavoro) sono ormai diverse…
PS. I tipi di Red, partendo da zero, con pochissimi soldi, ma buone capacità e tanta volontà, sono riusciti a produrre un ottimo prodotto, molto meno costoso di soluzioni analoghe (o anche meno evolute), e in questo caso non si trattava di software, ma di hardware, quindi decisamente peggio…