jueves, 9 de junio de 2011

Elegir herramientas para un proyecto Java

Java
Cuando empezamos un nuevo proyecto siempre tenemos que tomar decisiones en el aspecto técnico eligiendo las herramientas que vamos a usar para desarrollar el proyecto. La selección adecuada de estas herramientas puede determinar en gran medida lo fácil que pueda resultar el mantenimiento del mismo que en muchos proyectos es la parte a la que más tiempo se le suele dedicar. El elegir la herramienta adecuada no es una decisión fácil ya que hay muchos lenguajes que podríamos utilizar, para cada lenguaje numerosos frameworks y para algunas tareas específicas como acceso a base de datos o generación de informes varias librerias. La decisión de cual elegir es un poco subjetiva según las preferencias de cada uno pero hay varios factores que pude ayudarnos como los conocimientos que tenga el equipo que lo va a desarrollar o las limitaciones impuestas por el mismo proyecto o cliente. Pero si tuviesemos una carta blanca y pudiesemos elegir libremente ¿cuales son las herramientas que utilizaríamos?

Independientemente del tipo del proyecto hay ciertas categorías de herramientas comunes a todos los proyectos para cada una de las cuales deberíamos elegir una. Estas serían:

Herramienta control de versiones: Esta es una herramienta imprescindible si son varias las personas que participan en el proyecto ya que permite compartir a todos los integrantes del mismo el código fuente de una forma rápida y cómoda. Y aún trabajando solo en el proyecto una herramienta de este tipo nos permite almacenar un historial de todos los cambios que hemos ido realizando al código fuente por si necesitamos recuperar alguna parte en algún momento además de etiquetar ciertas versiones para igualmente poder recuperarlas si es necesario. En estos momentos Subversion y Git son dos de las herramientas más conocidas y utilizadas. La principal diferencia entre ellas es que Subversion utiliza un modelo cliente/servidor y Git utiliza un modelo distribuido. Git sería la opción que elegiría por ser la evolución que están tomando estas herramientas y por tener algunas ventajas sobre Subversion como la mayor facilidad para crear branches.

Herramienta gestión de peticiones: Habiendo trabajado con un herramienta de este tipo uno piensa como era posible trabajar sin una y es que permite conocer a todos los miembros de equipo las tareas que están pendientes de realizar, que está haciendo cada uno y cual es el progreso de las mismas y su estado evitando que se «pierdan». Además pueden integrase con el sistema de control de versiones permitiendo anotar en los tickets referencias a una revisión del código fuente y ver que cambios tiene cada petición cosa que puede implicar varios commits en la herramienta de control de versiones. Tenemos a disposición varias herramientas (bugzilla, Mantis, ...) pero de las que he visto Trac y Redmine (por tener ambas una wiki que permite anotar documentación) son las que más me han gustado.

Herramienta de construcción del proyecto: Si queremos trabajar de forma cómoda y no perder el tiempo realizando tareas repetitivas necesitamos una herramienta que nos automatice la tarea de compilar el proyecto y desplegarlo en el servidor asi como de ejecutar las pruebas unitarias. Herramientas específicas para este propósito son Ant, Maven y por la que yo optaría si pudiese elegir sería Gradle.

Herramienta de pruebas unitarias: Si queremos asegurarnos de que las cosas hacen lo que tienen que hacer deberíamos desarrollar junto con nuestro código fuente sus pruebas unitarias. Además estas mismas pruebas nos servirán para comprobar si las cosas siguen funcionando después de un determinado cambio. Herramientas de pruebas hay muchas pero varias de ellas son JUnit, Mockito, PMD, Checkstyle y Selenium.

Herramienta de integración continua: Las herramientas de integración continua permite realizar ciertas tareas cada cierto tiempo de forma automática y se suelen utilizar para comprobar que el proyecto sigue compilando correctamente con los cambios que se van haciendo en la herramienta de control de versiones, para comprobar que siguen pasando las pruebas unitarias y para construir una versión a ser desplegada en los servidores. Quizá la más conocida y utilizada en estos momentos es Jenkins. Uno de sus puntos fuertes es su extensibilidad a través de plugins.

Después de estas herramientas comunes a todos los proyectos deberemos elegir algunas específicas para el proyecto que tengamos por delante:

Lenguaje de programación: Esta será una elección que condicionará algunas de las herramientas que utilizaremos y el hecho de optar por un determinado lenguaje nos obligará a buscar y a encontrar librerías en ese lenguaje para resover las tareas del proyecto si no queremos reinventar la rueda.

En mi caso opto por Java por ser un lenguaje orientado a objetos, fuertemente tipado (esto tiene la ventaja de que el compilador nos ayuda a encontrar errores rápidamente en tiempo de compilación) y con un montón de librerías con licencia de código abierto o de software libre que podemos usar. En estos momentos Java tiene algunas carencias como el no disponer de closures (aunque muy posiblemente se añadan en la versión 8) pero para alguna tarea específica podemos utilizar Groovy (que es un lenguage de programación que puede ejecutarse sobre la JVM y si dispone de ellas).

Plataforma de desarrollo: Siendo este un blog con una temática entorno a software libre y Linux no podría elegir otra que no fuera el sistema del pingüino. Pero también hay motivos importantes por lo que lo recomendaría como tener a tu disposición un montón de software libre a un comando o unos cuantos clics de ratón para instalar y tenerlo actualizado. En windows pasado un tiempo se hace pesado y es una pérdida de tiempo el desinstalar el programa, buscar el instalador para la nueva versión y volverlo a instalar. Lo ideal sería que el proyecto pudiese ser desarrollado en cualquier plataforma y que cada persona eligiese con la que más cómodo se encontrase. Uno de los contras que tengo sensación es que al usar Arch Linux por una actualización en algún momento algo se «rompa» y me deje el sistema inutilizado.

IDE de desarrollo: Siendo Java el lenguaje de desarrollo por el que he optado como IDE optaría por eclipse. Aunque si necesitamos algo más liviano podríamos optar por Gedit directamente, emacs o vim. Una de las cosas importantes sería utilizar una que nos resalte la sintaxis de nuestro código fuente, soporte para hacer refactor o asistente de código.

Base de datos: En muchos proyectos necesitaremos persistir información y consultarla. Para resolver este asunto están las bases de datos, lo más probable sea que necesitemos una relacional y para ello tenemos MySql o PostgreSQL aunque en estos momentos las bases de datos orientadas a documentos están siendo muy nombradas como MongoDB, CrouchDB o Redis.

Herramienta de persistencia en base de datos: Entre los lenguajes de programación orientados a objetos y las bases de datos relacionales hay una discordancia en la forma de representar los datos. Para tratar de abstraernos del Sql que utilizan las bases de datos relacionales podemos utilizar un ORM que nos permitirá trabajar de una forma orientada a objetos además de abstraernos de la base de datos en concreto que utilizamos ya que aunque cada una implementa una especificación común de Sql hay ciertas diferencias entre ellas que deberemos tener en cuenta si no utilizamos un ORM. Uno de ellos es hibernate.

Framework de desarrollo web: Framework de desarrollo en Java hay para aburrir. De entre los que he usado en proyectos reales JSP, Struts, JSF, Grails y Tapestry me quedo con este último principalmente por poder desarrollar componentes y librerías de componentes que incluyen toda la funcionaliadad necesaria para que funcionen, que pueden ser reutilizados entre diferentes proyectos, que simplifica enormemente el desarrollo y es altamente extensible y adaptable a las necesidades que podamos tener en el proyecto.

Tomcat: es un contenedor de servlets y jsp «secillo» sobre el que desplegar nuestras aplicaciones web Java.

Framework Javascript: trabajar con javascript puede ser arduo más teniendo en cuenta que cada navegador tiene su propias peculiaridades por ello se hace casi imprescindible que en un proyecto web elegir un framework javascript que nos permita abstraernos de estas peculiaridades y nos simplifique el trabajo. Quizá uno de los más conocidos y utilizados sea jQuery aunque disponemos de otros como Prototype, Mootools aunque quizá menos usados y con menos plugins disponibles.

Otra serie de herramientas que quizá tengamos que tener en cuenta son:
JasperReports/iReport: generación de informes en varios formatos.
Lucene: indexación de datos.
JBoss: si necesitamos algo más completo que Tomcat prodíamos optar por servidor de aplicaciones como este.
Cherokee, Lighttpd, nginx: servidor web ligero y rápido.
jBPM: permite modelar flujos de trabajo de negocio.
Freemarker: herramienta para genergar archivos de texto basandose en plantillas.
Quartz: planificador de trabajos.
SLF4J y Logback: trazas de log.
Less: lenguaje para CSS.

Estas son las herramientas que seguramente elegiría para un proyecto web desarrollandolo con Java y que serán suficientes para la mayoría de proyectos web, si tuviese que elegir otra plataforma probablemente optaría por PHP y Symfony si el proyecto no es excesivamente complejo. Pero como digo hay muchas opciones y uno puede elegir la que más cómodo se encuentre desarrollando o considere más adecuada.

¿Alguna herramienta distinta de estas que tú consideres imprescincible o te haya gustado trabajar con ella?