lunedì 30 marzo 2015

Version Control Systems: una piccola introduzione

Poniamo che vogliamo mantenere uno "storico" di tutte le versioni di un file che stiamo scrivendo. Questa operazione è chiamata (con un brutto inglesismo) "versionamento".Come tenere traccia di tutte le modifiche, aggiunte e rimozioni dei file che ci interessano?


I VCS

Uno dei sistemi più pratici è quello di affidare il versionamento a un Version Control System (Sistema di Controllo della Versione).
Il VCS censisce tutti i file in una determinata posizione, verifica le modifiche che occorrono al suo interno e garantisce di poter tornare indietro, se necessario, a una versione specifica dei file.

I CVCS...

Mettiamo ora che non si voglia semplicemente avere controllo delle versioni dei file che si lavorano in autonomia, ma che si collabori con altre persone sullo stesso file.
Usiamo un'analogia e vediamo insieme un "classico" esempio:



Allo stesso modo in cui quattro amici collaborano alla lista degli oggetti per il campeggio, possiamo collaborare a qualsiasi documento (che sia un file di testo contenente un elenco puntano, oppure migliaia di righe di codice).

Con un CVCS (Centralized VCS), ciascuno scarica in locale la propria copia del documento, ci lavora e la modifica contemporaneamente ad altri utenti, poi ciascuno carica il file sul repository centrale che gestisce gli eventuali conflitti.
In questo modo si può collaborare collettivamente a un medesimo documento, garantendo che il repository remoto contenga la versione più aggiornata possibile del file.



...e i DCVS

Un'ulteriore passo in avanti sono i Distributed CVS, ovvero i sistemi di controllo versione distribuiti.
I CVCS richiedono un'interazione diretta con il server per poter versionare i file, ovvero per poter aggiornare il codice all'ultima versione e contemporaneamente caricare le proprie modifiche, è necessario essere collegati al server che ospita il repository remoto.
I DCVS permettono invece di versionare i file in un repository locale (può essere banalmente una cartella del proprio computer) e in un secondo tempo di caricare tutte le modifiche intercorse sul server.


Si garantiscono così al contempo i vantaggi di un CVS (ovvero mantenere lo storico delle modifiche), gli aspetti di collaborazione, senza però dipendere necessariamente da una connessione. Con un DCVS puoi versionare un file anche mentre sei sull'isola deserta!
Il vero vantaggio definitivo dei DCVS, tuttavia, è che ciascun collaboratore possiede una copia più o meno aggiornata del repository centrale. Se il server dovesse risultare irraggiungibile o peggio ancora danneggiato, sarà possibile ripristinarlo senza troppo sforzo!

A chi può essere utile

Tipicamente il controllo di versione è utile in ambienti di sviluppo software in cui la quantità di modifiche del codice è elevata.Se il tuo scopo è quello di mantenere un back-up cumulativo (ovvero incrementale) dei tuoi file, lo strumento migliore è sicuramente un programma come Time Machine su Mac OS X (ma una funzione simile è implementata anche in Windows e Ubuntu).


Se collabori a piccoli progetti di sviluppo, il mio consiglio è di usare Git: è uno strumento gratuito, si installa velocemente ed è facile da mantenere. Git sarà oggetto di alcuni post futuri.
Un'alternativa a Git, sempre open-source è Mercurial.


Due dei CVCS più conosciuti e usati sono Subversion (SVN), anch'esso open-source, e Microsoft Team Foundation Server (TFS). Quest'ultimo ha una curva di apprendimento piuttosto elevata, è concepito per grandi team ed è utilizzato prettamente in ambito Microsoft-compliance (ovvero ambienti di sviluppo che utilizzano solo o prevalentemente tecnologia Microsoft). Se sviluppi da solo o in piccoli team, Microsoft fornisce un account TFS gratuito sul proprio cloud (con limitazioni).