domingo, 25 de septiembre de 2011

Herramientas colaborativas para desarrollo de software

Resulta sorprendente la falta (o inexistencia) de herramientas colaborativas en empresas que desarrollan software, cuando es evidente que su uso puede mejorar notablemente la productividad del proceso de desarrollo.  

Seguramente, existe un cierto "miedo" a dedicar un gran esfuerzo a instalar y configurar servicios colaborativos y ver como, con el tiempo, las necesidades de capacidad cambian, y es necesario reinstalar el servicio desde 0. 

La falta de escalabilidad y portabilidad de estos servicios no me parece una razón convincente para prescindir de ellos, dado que aportan mucho al proceso de ingeniería del software. 

Mi propuesta para implementar un entorno colaborativo con servicios escalables y portables es el uso de la virtualización

Gracias a la virtualización, podemos disponer de N máquinas virtuales ejecutándose en M máquinas físicas (N>=M). Cada máquina virtual, debería contener un servicio colaborativo aislado, de manera que podamos replicar los servicios colaborativos simplemente replicando las máquinas virtuales. Este esquema nos proporciona mayor escalabilidad horizontal (se crean nuevos nodos a partir de nuevas instancias de la misma máquina virtual) y mayor portabilidad de los servicios (al ser máquinas virtuales).

La propuesta básica de servicios colaborativos realizada consta de 4 áreas: 
  • Servicios de información.
  • Despliegue de aplicaciones.
  • Soporte al desarrollo.
  • Gestión de proyectos.
Los servicios de información proporcionan un conjunto de máquinas virtuales con sistemas gestores de bases de datos, que pueden ser empleados por las diversas aplicaciones desarrolladas. La propuesta realizada es disponer de los SGBDs opensource MySQL y PostgreSQL, así como las versiones de desarrollo (o express) de SQLServer y Oracle. Este conjunto de SGBDs cubren gran parte de las necesidades del mercado. 



Respecto a los servicios de despliegue de aplicaciones, se proponen servidores para aplicaciones PHP y Java:
  • Servidor XAMPP. Permite desplegar aplicaciones PHP (o Perl) en un servidor Apache, con base de datos MySQL.
  • Contenedor de Servlets. Permite desplegar aplicaciones web Java (Servlet + JSP). Se propone Tomcat, del proyecto Jakarta de Apache, al ser opensource y uno de los más extendidos (aunque hay alternativas, como por ejemplo, Jetty).
  • Servidor de aplicaciones Java. Permite desplegar aplicaciones de empresa Java (contenedor Servlet&JSP  + contenedor EJB). Se propone JBoss, al ser opensource y por su extendido uso, aunque existen diversas alternativas: Glassfish, Jonas,...  
  • Servidor web para balancear carga de peticiones. Se propone Apache web server, al ser opensource y una referencia obligada de esta tipología de servidores. 
  • Servidor localizador de servicios (registro y localización de servicios). Este tipo de servidores son útiles para arquitecturas SOA, desacoplando la localización de servicios de las aplicaciones que los usan. Proporcionan alta disponibilidad de los servicios registrados, ya que su localización se realiza en tiempo de ejecución, y se permite el uso de servicios alternativos en caso de caídas (de uso extendido en servicios cloud). 

Por otro lado, los servicios de soporte al desarrollo propuestos constan de:
  • Control de versiones e integración continua. 
    • Con el ánimo de controlar los cambios realizados durante el proceso de desarrollo de software, es necesario utilizar alguna herramienta de control de versionado de código. La propuesta realizada es Subversion, una mejora del sistema CVS, muy extendida en el mundillo y de tipología opensource. 
    • En el mismo nodo (para hacer el proceso de monitorización más eficiente), sería interesante disponer de una herramienta de integración continua, para monitorizar el estado del código fuente de los, en cuanto a compilación, empaquetado, pruebas, estadísticas de actividad, etc. La propuesta para integración contínua es Hudson, otra herramienta opensource desarrollada con Java. Existen un gran número de alternativas opensource, como por ejemplo CruiseControl.  
  • Repositorio de librerías. Como herramienta de gestión de configuración de los proyectos se propone usar Maven. Esta herramienta de gestión de librerías necesita de un repositorio central. Existen un gran número de repositorios maven públicos (ibiblio, sonatype...), aunque se recomienda que cada organización disponga del suyo, por motivos de eficiencia, disponibilidad,etc. Artifactory es una buena opción para disponer en nuestra organización de un repositorio maven. Para más detalles, existe un buen artículo en The Server Side que habla del tema.



Finalmente, en toda empresa dedicada a la ingeniería del software son necesarias herramientas para la gestión de proyectos o management. Esta área es bastante especial, y cada empresa (o incluso cada manager) tiene su propia estrategia de gestión. Aún así, mi propuesta para esta fase es utilizar un conjunto de herramientas que nos permitan hacer un seguimiento de:
  • Definición de los objetivos del proyecto (oferta, requisitos, análisis, diseño, planificación, tareas, etc).
  • Seguimiento del avance del proyecto, durante su proceso de desarrollo (tareas completadas, estadísticas, asignación de recursos, control de desvíos,etc). 
  • Seguimiento de la evolución del producto, una vez finalizado (incidencias correctivas, evolutivas, etc).


Por tanto, podríamos cubrir estas necesidades con 2 nodos que contengan lo siguiente:
  • Un primer nodo que albergue un gestor documental. Permite controlar el versionado de los diversos documentos asociados a los proyectos, aunque también puede ser utilizado por aplicaciones desarrolladas y desplegadas en los entornos de despliegue. La propuesta opensource más extendida es Alfresco (versión community), desarrollado en Java. 
  • Un segundo nodo que contenga un conjunto de herramientas para la monitorización de los proyectos desde un punto de vista de gestión (se instalan en un mismo nodo porque no estará sujeto a una elevada carga de peticiones):
    • Gestión de tareas y recursos. Se propone el uso de PHPCollab, aplicación opensource desarrollada en PHP, que permite gestionar las tareas de un proyecto, los recursos asignados, etc. Actualmente no existe ninguna herramienta que sea referencia indiscutible opensource para este propósito (desarrollar una podría ser una buena iniciativa!).  
    • Gestión de incidencias correctivas. Se proponen el uso de Mantis Bug Tracker, aplicación opensource desarrollada en PHP, disponible en sourceforge, y que es una referencia obligada en el sector. Es sencilla y de uso simple, pero cumple perfectamente las necesidades de gestión de incidencias. 
    • Gestión de información sobre configuración y entornos de los proyectos. Existen un conjunto de datos sobre los proyectos que no es recomendable recoger en documentos dada su cambiabilidad (o por motivos de seguridad), como por ejemplo las credenciales de acceso a entornos, IPs y nombres de máquina de los entornos, etc. A pesar de no estar presentes en documentos, estos datos deben estar disponibles para todo el equipo del proyecto. Es por ello que suele ser útil disponer de una herramienta que permita a todos los integrantes del equipo incorporar y/o editar información de una forma rápida. La mejor herramienta para ello, es una wiki (del hawaiano, rápido). La propuesta es usar MediaWiki, desarrollada en PHP, opensource, y ampliamente extendida desde hace tiempo en el mundillo. 


La propuesta realizada cubre prácticamente todas las áreas del proceso de desarrollo de software, y permite, mediante la estrategia de la virtualización, que esos servicios colaborativos sean fácilmente escalables, tanto horizontalmente como verticalmente.