Todos los proyectos de sistemas tienen sus problemas y desafíos particulares. Sin embargo, para poder asegurar la calidad y éxito de los mismos (y el no aburrirse con tareas repetitivas o simplemente tediosas!) es bueno seguir esta lista de Las 10 cosas más importantes para hacer en todos los proyectos.
A por la lista!
1. Control de versiones
Esta es la principal, primera y más básica de la infraestructura: un buen sistema de control de versiones. Hoy en día la herramienta favorita es Subversion. Para proyectos de código abierto, code.google.com es una buena opción; sino, siempre es bastante facil configurar un servidor propio. Dos cosas a no olvidar: backups periódicos del repositorio, y subir todo lo que necesite el proyecto al repositorio (librerias dependientes, scripts, documentación, etc.).
2. Scripts de construcción para la línea de comandos.
Por más IDE que utilicen y les facilite la vida, necesitan tener un script para construir el proyecto desde la línea de comandos, que les permite integrarlo facilmente a alguna herramienta de Integración Continua (usualmente Ant o Maven son buenas opciones). El script debería:
- Compilar el código
- Compilar los test
- Generar el JavaDoc
- Ejecutar los test con cobertura de código, como ser Emma o Cobertura.
- Construir el distribuible (JAR, WAR, EAR, etc.)
IDEs como NetBeans se encargan de crear automáticamente scripts Ant o Maven que funcionan desde la línea de comandos.
3. Integración continua
Estuve en varios proyectos donde la rama principal del proyecto no compila, resultando en una enorme pérdida de tiempo. Como regla, siempre recuerden que todo lo que esté en un repositorio de código debe compilar (y si pasa los tests, mejor). Utilicen alguna herramienta de integración continua para automatizar este proceso, como CruiseControl o Hudson. Personalmente prefiero Hudson porque es sumamente facil de configurar, y tiene montones de opciones útiles. Además, es bueno publicar en estas herramientas los distribuibles de su proyecto (JAR, WAR, etc), los JavaDoc, los reportes de test y cobertura de código. De esta manera, nunca habrá dudas sobre el estado del proyecto.
4. Despligue automático del proyecto
Configuren el sistema de integración continua para que automáticamente, si el proyecto se construye con éxito, lo publique a algún servidor de pruebas. Usualmente utilizo Tomcat para esto, ya que toma los cambios que ocurren automáticamente. De esta manera, siempre hay un servidor ejecutando la última versión del proyecto. Este servidor "alpha" se le puede dar al cliente para que vaya viendo continuamente el avance del proyecto, y se puede tener feedback mucho más rápidamente.
5. Tests y cobertura de código
Los beneficios de tener tests y cobertura de código integrado a un servidor de integración continua son enrome. Hay pila de libros dando vueltas sobre esto, así que no es necesario detallar mucho. Contar con tests y cobertura de código permiten tener una idea sobre cómo se está llevando adelante el proyecto, y qué problemas podrían ocurrir en el futuro.
6. Servidor web embebido
Si están construyendo una aplicación web, les recomiendo Jetty como web container. Lo copado de Jetty es que pueden iniciarlo en un método main común, y realizar el despliegue por código. Con Tomcat tienen que generar el WAR, desplegarlo y esperar a que Tomcat lo "instale". Con Jetty simplemente inician su aplicación a través de un método main (como una aplicación de escritorio común). Así, para los desarrolladores es mucho más rapido para desarrollar y realizar debug, para el cliente más simple de desplegar. Además, pueden ir un paso más allá y hacer que sus JAR sean también WAR, de forma que pueden desplegarlo en Tomcat si así lo necesitan.
7. Base de datos embebida
Nada me molesta más que las instrucciones complicadas para configurar una base de datos. Como alternativa pueden usar una base de datos embebida como HSQLDB. Para desarrollo y ejecución de tests dejo que el sistema cree una base de datos en-memoria; para el despliegue en ambitentes de prueba cambio la configuración para que quede en disco. En ambos casos, no hay tareas extra ni para los desarrolladores ni para el cliente. Obviamente, la aplicación queda preparada para utilizar una base de datos externa (como Oracle) para ambientes productivos.
8. Instalación automática de los esquemas
Cuando se inicia la aplicación por primera vez verifica si hay un esquema en la base de datos instalado. Si no existe, lo instala. Como generalmente utilizo Hibernate para la persistencia, dejo que haga todo el trabajo. Hibernate incluso permite actualizar un esquema si hay nuevas versiones.
9. Framework de inyección de dependencia
Si quieren tener una aplicación mantenible, testeable y facil de comprender a nivel de código, deben utilizar algún framework de Inyección de dependencia. Hay varios frameworks, si bien actualmente Spring Framework es el líder de mercado (existen otros como GUICE y PicoContainer).
10. Instalación y ejecución simples
Enfoquen sus esfuerzos en hacer que la aplicación sea fácil de probar para el cliente. Es muy interesante poder darle un JAR al cliente, decirle "hace doble click", y esto automáticamente levanta un web server, base de datos, instala el esquema y ejecuta un navegador web que apunta a localhost. O utilicen Java Web Start, que realiza este proceso de "un click" desde la web. Hagan que no sea necesario un manual de instalación:
- Ubiquen su clase principal en el JAR MANIFEST, de manera que al hacer doble click se ejecute la aplicación
- Incluyan todas las dependencias de su aplicación dentro del JAR.
- La ejecución sin argumentos debería levantar la aplicación en un "estado razonable": base de datos en memoria, instalación del esquema, ejecución del contenedor web, instalación de un usuario administrador por default, etc.
Basado en Top 10 things I do on every project