Sistemas de control de versiones-II: Justificación del uso

En este post quisiera dar el siguiente paso hacia una mejor comprensión de los conceptos básicos de los sistemas de control de versiones. Una vez sentadas unas pequeñas bases teóricas en el post anterior, para saber de que estamos hablando en este contexto, creo que debemos aproximarnos a la siguiente fase: muy bien, pero ¿Que gano al usar control de versiones?, una cuestión que apunta a:  ¿Por qué usar control de versiones?.
 
Pues bien, vamos a ver algunas razones para ello. De momento y de forma intuitiva, sin razonar demasiado se me ocurre lo siguiente:
Ubiquemos una empresa en su contexto. Toma materias, usa personal y genera un producto final. De alguna forma hay que proteger el producto final, durante todas sus fases dentro del proceso productivo. Desde el modelado de la materia prima hasta la salida al mercado, es lógico establecer algún control sobre los cambios realizados en el proceso.
 
Es normal entonces que en la naturaleza de este trabajo nuestro, vaya implícita la necesidad de salvaguardar lo mejor posible y con la mejor información nuestro software.
 
Tomemos dos ejemplos en contraposición, pero que marcan un punto de vista muy amplio sobre el uso de control de versiones:
Por un lado, empiezo a tirar lineas de código.
public class ClaseEjemplo{
private int valor ;
private String valorDevuelto;
...
Y de repente decido que ahora para la variable valor, no es suficiente con un tipo int (32 bits), necesito un tipo long (64 bits). Modifico el código de la clase:
public class ClaseEjemplo{
private long valor ;
private String valorDevuelto;
...
Y después de mucho tiempo programando cotejo los valores que voy a recibir y me doy cuenta que con int y 32 bits tenía suficiente. Como soy un tipo ahorrativo :)  quiero volver al caso inicial, donde la variable valor era de tipo int. ¿Que habría que hacer?
 
Bueno en este caso es trivial, por que realmente se trata solo de la asignación del tipo de una variable en una sola linea de código, pero imaginemos que el código a revertir fuese el de varias variables, o de una clase completa, o de una aplicación. Entonces el procedimiento sería encontrar ficheros de backup, localizar el archivo original y reemplazarlo o directamente reescribirlo. Realmente un proceso de trabajo sustancial. En cambio con un sistema de control de versiones solo tendríamos que decidir a que versión del código querriamos volver y ejecutar la acción, simple, ¿no?
 
Veamos un segundo ejemplo, este de tipo grupal. Un equipo de desarrolladores, tres o cuatro personas que desarrollan para el mismo proyecto. Necesitamos desplegar el proyecto, para lo cual tenemos que reunir todo el código de los cuatro y configurar la versión a desplegar del proyecto. A priori, necesitariamos:
Localizar ficheros de código de cada uno de los usuarios.
Consultar si se ha realizado alguna modificación en otros ficheros, y si las hay, actualizar ficheros.
Encontrar si algún desarrollador no ha tocado código que estuviese dentro de un módulo encargado a otro desarrollador, porque entonces habría que cohesionar el código, decidir con cual nos quedamos y fusionar las partes.
...y esto es solo por nombrar las mas importantes...
Si tuviesemos un VCS, entonces sería suficiente con ir a buscar al repositorio la última versión disponible (si es centralizado), o solicitar que se sincronicen los repositorios de cada desarrollador (si es distribuido). Un VCS eficaz alertaría de conflictos, nos daría una comparación y la posibilidad de realizar las fusiones que decidamos en el código.
 
Con estos dos casos, creo que se ilustra bastante bien el sentido del uso de los sistemas de control de versiones, pero por si acaso, vamos a enumerar de forma esquemática sus ventajas:

  1. Es una herramienta muy eficaz para el trabajo concurrente sobre un proyecto y permite manejar las diferencias entre múltiples versiones de su proyecto.
  2. Se puede llevar un registro del historial y de la evolución del proyecto. Por cada cambio, habrá un registro lo mas completo posible sobre el cambio realizado: quién lo hizo; por qué se hizo; cuándo se hizo; y de qué se trataba el cambio.
  3. Si se desarrolla en equipo, los sistemas de control de versiones facilitan la colaboración. Por ejemplo, cuando varias personas hacen cambios potencialmente incompatibles de forma casi simultánea, el programa le ayudará a identificar y resolver tales conflictos.
  4. Un VCS puede ser muy util en la corrección de errores. Si aplica un cambio que posteriormente se evidencia como un error, puede revertirlo a una versión previa a uno o muchos ficheros. De hecho, una herramienta realmente buena, incluso puede ayudarle efectivamente a darse cuenta exactamente cuándo se introdujo el error.

Así que creo que con todo este contenido de hoy puede justificarse sobradamente el uso de control de versiones.
¡Un saludo y hasta el próximo post!
 
PD: Si te suena de algo este contenido, puede que sea porque en una primera iteración, anduvo por aquí: http://davidjguru.wordpress.com