lunes, 22 de febrero de 2010

Desarrollo en equipo con SVN, Maven y Nexus (parte II)

Banco de experiencias (V)

En la primera parte de este artículo, enumeraba los problemas de coordinación a los que se enfrenta un equipo de desarrollo diariamente y cómo la utilización de Maven los soluciona de un plumazo por el simple hecho de utilizarlo. Hay un problema sin embargo, inherente al desarrollo en equipo, para el cual se necesita una herramienta más: un gestor de repositorios.

Imaginemos el siguiente escenario de proyecto: un equipo está desarrollando una aplicación empresarial (ear) formada por un par de módulos web, otro par de módulos ejb (ejb-jar), un conector JCA (rar) y tres módulos de librerías comunes (jar).

En un proyecto de éstas características (proyecto con varios módulos) cada desarrollador trabaja en uno o varios módulos (en función de la funcionalidad, de su perfil, habilidades o experiencia...), pero no suele participar en todos... Al menos, eso es lo habitual. Sin embargo necesita tener las actualizaciones y los progresos de todos (o la mayoría) de los módulos, debido a las dependencias entre ellos. Estas dependencias inter-proyecto o inter-módulo son las que denominé como dependencias internas en la primera parte de este artículo. Pero ¿ćomo estar actualizados y poder tener las nuevas funcionalidades y servicios que han desarrollado nuestros compañeros para poderlos usar en los módulos que estamos desarrollando? Típicamente esto se hace de dos formas:
  1. Todos los desarrolladores tienen todos los proyectos creados en su IDE y vinculados con SVN o, al menos, los proyectos en los que está trabajando, los proyectos dependientes, y los dependientes de los dependientes (dependencias transitivas), y así sucesivamente... es decir, típicamente todos. Esto es lógicamente un engorro, porque cada vez que alguien realice una refactorización que suponga la creación de un nuevo proyecto, afectará a todo el equipo de desarrollo. Todos los cambios impactan a todos (cambios en la configuración, dependencias, nuevos proyectos, etc...), favoreciendo, además, la incidencia de errores dada la exposición de todos los fuentes a todo el equipo.
  2. Los desarrolladores que trabajan en proyectos que son requeridos por el resto "publican" sus artefactos en SVN o un repositorio común en red. Esta segunda opción introduce complejidad de configuración y coordinación en el equipo y scripts adicionales que realicen esas tareas, ya que hay que "avisar" de cuando hay que actualizar las dependencias... en todo caso: la gestión de las dependencias (en este caso internas) se manejan manualmente vía scripts (típicamente de ant).

Software de gestión de repositorios Maven

El software para de gestión de repositorios Maven sirve precísamente para eso: para crear y gestionar nuestros propios repositorios de Maven. De esta forma tendremos la gestión de dependencias solucionada:
  • las dependencias externas, a través del mismo Maven, usando el repositorio Central. También podemos crear nuestros propios repositorios proxies de otros, reduciendo el tráfico de red.
  • las dependencias internas (o inter-proyecto) con nuestro repositorio.
Veamos el siguiente ejemplo: tenemos un equipo de tres desarrolladores que está desarrollando una aplicación que tiene un módulo JAR, que a su vez es usado por un módulo EJB y otro módulo WAR que usa (necesita) los dos anteriores.
  • El desarrollador A participa en el desarrollo del módulo EJB, y es el único que desarrolla el módulo JAR. Este desarrollador no tiene que resolver dependencias internas, digamos que es un "productor" y debe "publicar" su trabajo para los demás.
  • El desarrollador B sólo trabaja en el módulo WAR: por tanto debe disponer de los otros proyectos. Sería el caso del "consumidor" exclusivo.
  • El desarrollador C trabaja en los módulos WAR y EJB: es decir, es consumidor y productor a la vez. Debe publicar su trabajo, pero también requiere del trabajo del desarrollador A.



En el caso anterior, usando un repositorio remoto con un software de gestión de repositorios, Maven realizará todos los trabajos de sincronización de forma transparente, realizando la publicación de artefactos al repositorio (mvn deploy) para los desarrolladores A y C, y la actualización automática para todos. Lo único que hay que hacer es especificarle la URL del repositorio en los pom.xml de los proyectos, simplificando enormemente la coordinación en proyectos reales típicos (más grandes, complejos y con más desarrolladores).

El software repositorio que yo conozco es Nexus, de la compañía que creó Maven (Sonatype), y la verdad, estoy muy satisfecho con su funcionamiento. No obstante, hay otros también bastante usados como Apache Archiva, o Artifactory. En general, todos parecen cumplir correctamente su misión principal y tienen una instalación sencilla. Al final del artículo puedes encontrar algunas referencias útiles con datos y opiniones sobre Archiva y Nexus. Con independencia de la elección, el objetivo del artículo es dejar claro para qué sirve y por qué nos es tan útil un software de gestión de repositorios. En nuestro caso particular, nos decidimos por Nexus porque usamos eclipse y pensábamos que tendríamos menos problemas si todas las herramientas estaban bien integradas por ser de la misma compañía: Maven, Nexus y m2eclipse.

La verdad, he de decir, que m2eclipse nos ha dado algún problema que otro, especialmente alguno  bastante gordo que nos retrasó en el conocimiento del plugin y cómo funcionaba (p.e.: la opción "Enable Workspace resolution" ha dado problemas en sucesivas versiones del plugin), pero nada que decir sobre Nexus: hasta el momento, perfecto.

Finalmente, SVN, Maven y Nexus conforman una tríada perfecta para empezar cualquier proyecto pequeño adoptando buenas prácticas y un mínimo de coordinación automatizada, permitiéndonos poder escalar a proyectos y grupos más grandes afinando más hacia la integración continua con una buena base.

Referencias:




martes, 9 de febrero de 2010

Desarrollo en equipo con SVN, Maven y Nexus (parte I)

Banco de experiencias (V)


El orden es el placer de la razón pero el desorden es la delicia de la imaginación.
-Paul Claudel.

El desarrollo de software aúna una fascinante mezcla de pensamiento divergente (o creativo) con conceptos técnicos y prácticas metódicas. Para que un desarrollador (y especialmente un equipo de desarrollo) alcance los mayores niveles de eficiencia y productividad, las herramientas utilizadas deben garantizar la seguridad del proceso, pero siempre de forma proporcional a la envergadura del proyecto y manteniendo compatibilidad con el proceso creativo sin ahogarlo. Hay herramientas libres que nos ayudan a mantener este este delicado equilibrio entre orden y libertad para todo tipo de proyectos de forma sencilla e impecable.

Éste, como el resto de los artículos de la serie "banco de experiencias", no pretende ser un artículo más de documentación sobre las herramientas aquí comentadas ni encontrarás tampoco el enésimo tutorial sobre el asunto. Hay mucha documentación en la red y a lo largo del artículo suelo ofrecer información y referencias suficientes para que puedas profundizar en el tema. La idea de estos artículos es exponer buenas prácticas y comentar mi punto de vista, basado en mi propia experiencia profesional, sobre la utilidad real y pragmática de los temas abordados. Sin demagogia rimbombante ni publicidad interesada. Simplemente la síntesis de mi experiencia subjetiva.

Subversion

Subversion (también conocido simplemente como svn) es probablemente el mejor sistema de control de versiones centralizado que existe. Sin entrar en la discusión Centralizado vs Distribuido (DVCS), lo que si está claro es que el control de versionado es un aspecto crítico de cualquier proyecto de software.

En todo caso, si has llegado hasta aquí y no has usado nunca un software de control de versionado (VCS) la recomendación es clara: úsalo. Debes usarlo. Aunque tu proyecto sea muy pequeño. Aunque sólo exista un desarrollador. Has de asumir que, de la misma forma y con la misma naturalidad que usas un IDE o un compilador, deberás usar un VCS. Es absolutamente esencial. Si ya tienes claro que hay que usar uno y has decidido usar uno centralizado (o simplemente sueles usar otro, como CVS, por ejemplo), la recomendación también es clara: usa svn. En la wikipedia puedes consultar por qué SourceForge.net, Apache o Google Code lo eligieron, así como la documentación y herramientas disponibles.

Como decía, un software de control de versiones es necesario aunque el proyecto sea pequeño ya que te garantiza un seguimiento de cambios que te puede ahorrar muchas horas de trabajo. Si tienes clara la diferencia entre un editor de texto y un procesador de texto, entenderás enseguida la diferencia de usar backups de tu directorio de código y usar un VCS. No obstante, hay otro aspecto importante de los VCS que no suele ser tan comentado (quizá por obvio) y es su dimensión como herramienta colaborativa. Si de forma individual es extremadamente importante, para un equipo es absolutamente imprescindible. Un equipo no puede trabajar de forma "decente" sin Subversion. La idea de no usar un VCS o de usar uno bloqueante (tipo Visual SourceSafe) es una pesadilla para no dormir: "¡eh, cuidado!, no toquéis que voy a tocar yo" "¡Oh, mierda!, ya ha tocado alguien. ¡A ver ahora cómo lo arreglamos!"... o "¡fulanito, desbloquea el fichero que necesito añadir un método de la clase!" "¡No, espera que termine!"... Qué pesadilla. Me recuerda a aquellas herencias arcaicas de los programas COBOL de no pasarte de la columna 73 y poner los asteriscos en la columna nº 7... Bufff.

Trabajar con svn en equipo es lo más parecido a hacerlo como si estuvieses tú sólo. Si las tareas están repartidas, los conflictos son muy poco frecuentes (para que existan, dos desarrolladores deben haber modificado la misma línea simultáneamente antes del último commit) y cuando los hay, se suelen solucionar en pocos segundos. Es muy gratificante comprobar cómo un equipo numeroso puede trabajar en una aplicacion Web (un tipo de proyecto con un alto grado de colisión y concentración de trabajo) de forma cómoda y fluida sin problemas.

Maven

Aunque llevamos oyendo hablar de Maven desde hace varios años (Maven tiene ya 8 años), la adopción hasta hace cuatro o cinco años ha sido puntual y conceptual. Es desde la aparición de Maven2 (con su nueva arquitectura revisada) cuando realmente empieza a incorporarse (aunque también de forma muy lenta) a los distintos proyectos open source y esto ha hecho que en la comunidad de desarrollo comencemos a interesarnos y a integrarlo en nuestros proyectos. A mucha gente le ocurre que, tras leer sobre Maven y Ant, entiende las diferencias entre ellas, pero no alcanza a concretar por qué es tan importante y para qué le sirve realmente (qué le aporta que no tenga ya). Para aclarar definitivamente este punto simplemente hay que preguntarse cómo realizamos el proceso de construcción (generación de empaquetados y otros artefactos) en nuestros proyectos, y esto nos dará la respuesta. Veamos las opciones:
  1. Construimos con nuestra herramienta de desarrollo (Eclipse, Netbeans, etc...).
  2. Construimos con un fichero (build.xml) ant que nos hemos hecho nosotros.
Si se trata de un pequeño proyecto de un sólo módulo (un war, un jar, etc...) y/o el ciclo de vida de la aplicación es muy reducido (es una pruebecilla nuestra, una pequeña aplicación de las que se hacen en casa en zapatillas, etc) no importa, claro. ¿Qué más da? La he hecho yo y podré volverla a construir con mi IDE favorito o con mi Ant dentro de un año cuando tenga que hacer un cambio. Incluso aunque cambie el IDE o cambie mi entorno, podré adaptarme a la situación sin más problemas, hacer las correcciones y volver a generar el empaquetado.

Ahora bien, si nos situamos ahora un escenario profesional, el tema cambia mucho. A continuación expondré los problemas que nos encontramos con esas formas de construir aplicaciones. Seguramente ya te habrás encontrado con ellos, y si no, es porque el proyecto no era lo suficientemente grande o, simplemente, es una cuestión de tiempo que te los encuentres.
  • Homogeneidad. Cada desarrollador tiene sus costumbres y sus ubicaciones (paths) para sus proyectos, librerías, ubicación del JDK, etc. Es difícil e incómodo homologar a todo un equipo de desarrollo en una única estructura de ficheros. Aunque Sun hiciese su propuesta de convenciones para proyectos (estructura y nombrado) hace mucho tiempo, casi ningún IDE lo respeta al 100%. Además, la heterogeneidad de los distintos Sistemas Operativos no hacen más que complicar la posibilidad de tener una estructura y ubicación homogénea para todo el mundo. Eso hace que los ficheros de proyecto (.nbproject, .project, etc) no puedan ser portados de unos desarrolladores a otros ni compartidos entre distintas máquinas. Esta estructura acaba teniendose que modificar manualmente en los distintos IDE's o en el fichero build.xml de ant. En el caso de los IDE's es particularmente grave, ya que la información de librerías, por ejemplo, descansa en la configuración local del IDE de cada desarrollador, que suele ser distinta para cada uno, con lo cual la construcción se torna algo tremendamente frágil y poco transparente.
  • Reproducibilidad. Necesitamos realizar tareas forma constante y estable nuestro proyecto: construccion, pruebas unitarias, informes, etc... Repetibles en el tiempo (hoy y dentro de un año) y en el espacio (en mi máquina de desarrollo, en integración, en preproducción...). Necesitamos fijar parámetros que no están implícitos en el proyecto en si y que acaban también fijados en los IDE's o en el script ant: versión de Java, versiones de librerías, destino de cada librería (sólo para compilar, sólo para desplegar con la aplicación, para compilar y desplegar...), ficheros de configuración, etc... Esto dificulta el mantenimiento y oculta información esencial del proyecto. Si el proyecto se sube a SVN y no lo volvemos a tocar en un año, a menudo nos encontramos con que las partes esenciales del proyecto han quedado ocultas en IDE's (o lo que es peor, se han perdido porque eran parte de la configuración local de un miembro del equipo) o permanecen en un script de ant poco amigable para modificar.
  • Gestión del cambio. Algo tan común como añadir una nueva librería al proyecto o realizar una actualización de una existente tiene demasiado impacto en el equipo hasta resultar ligeramente traumático: todos deben realizar las tareas de la descarga y localización de las librerías, la configuración de su IDE y de su proyecto y/o la adaptación de sus ficheros ant. Incluso un equipo de desarrollo con normas rígidas y paths homologados, además de sufrir esta falta de libertad, sigue estando expuesto a este tipo de problemas.
  • Gestión de dependencias (externas). Este es sin duda el aspecto más importante, por delicado, y por el impacto de sus consecuencias. Imagina el siguiente proyecto: un EAR compuesto por dos módulos WAR, tres módulos EJB y un par de módulos de de librerías comunes (jar). Uno de los desarrolladores añade al EAR una librería "A" que necesita uno de los módulos EJB y otro desarrollador añade otra librería "B" que necesita uno de los módulos JAR. Ambas librerías tienen sus propias dependencias: la librería "A" requiere de xxx-commons-2.3 y de asm-2.1, la librería "B" de yyy-commons (que a su vez depende de xxx-commons-1.5) y asm-3.0. Ya tenemos el problema servido. Como ya comenté en el artículo "Errores comunes de despliegue JEE", este tipo de problemas algunas veces sólo se presentan aleatoriamente, ya que el problema puede presentarse o no en función de la secuencia de carga del ClassLoader de la máquina de turno. Esto ocurre muchas más veces de lo que nos pueda parecer a simple vista, si bien en la mayoría de los casos los conflictos no plantean problemas porque muchas librerías mantienen una compatibilidad perfecta hacia atrás. En mi experiencia, es habitual que ocurra sin embargo con grandes frameworks tipo Hibernate, Spring, Struts, etc, con consecuencias muy desagradables. Sin Maven, la gestión de dependencias no la hace nadie, o lo que es lo mismo, se hace manualmente si el equipo de desarrollo es muy cuidadoso y está muy bien coordinado.
  • Gestión de dependencias (internas). Otro aspecto de los proyectos medianos con varios módulos interdependientes entre si es que, además de tener que realizar gestión de dependencias de librerías de terceros tenemos que gestionar nuestras propias dependencias. Por ejemplo, para el caso anterior, si ambos WAR necesitan de los proyectos JAR de librerías comunes, todos los desarrolladores de los WAR deberán tener también que tener los proyectos (código fuente incluído) de dichos JAR, para estar debidamente actualizados... O bien buscar otra forma de distribución manual de empaquetados que también exigirá un esfuerzo adicional de coordinación.

Como puedes suponer a estas alturas, Maven es una solución perfecta a todos los problemas comentados anteriormente (salvo para el último punto, para el que se requiere un colaborador, pero eso lo comentaré en la segunda parte). Maven es y sirve para muchas cosas (compilación, paso de pruebas unitarias, control de calidad, etc) pero, fundamentalmente, es la mejor herramienta de construcción posible. Hasta ahora, para una construcción lo más homogénea y reproducible posible necesitábamos unas normas (o convenciones) y ant. Pero ant es un lenguaje específico de dominio para la construcción de proyectos: te tienes que crear tus propios scripts basado en tus convenciones y el esfuerzo de mantenimiento es exponencial a la envergadura del proyecto. Maven ya te aporta ambas cosas: convenciones (sobre disposición de directorios de proyecto, por ejemplo) y todo el trabajo listo para usar sin tener que configurar nada. Con Maven puedes realmente bajarte unos fuentes y ejecutar un "mvn build" sobre el directorio que contiene el "pom.xml". Y tener en poco tiempo todos los empaquetados, un informe de construcción, pruebas unitarias realizadas, etc, etc.. con configuración cero.

No obstante, el punto fuerte (e incluso espectacular) de Maven es la gestión de dependencias: sólo por la gestión de dependencias transitivas que realiza de forma automática, ya merece la pena con creces. En este tema me recuerda a los repositorios de Ubuntu. Cuando quieres una librería, añades la dependencia y la versión que quieres de las disponibles y él se encargará de aprovisionarse de todas las dependencias transitivas adicionales.

Incluso aún respetando las convenciones de Maven (te las puedes saltar si especificas en el pom.xml cuáles son tus directorios) Maven te ofrece toda la libertad posible: permite que un equipo trabaje con IDE's heterogéneos: cada desarrollador con su IDE favorito. Lo único que debes subir a SVN son los fuentes y el pom.xml. Podrás construir el proyecto de forma repetible, independiente del IDE, ejecutar las pruebas unitarias y olvidarte de problemas de librerías.

Obviamente no te vas a olvidar de tu IDE o de ant. Toda esta maravilla de Maven tiene un precio: el rendimiento. Un build con Maven te lleva más segundos de los que estás dispuesto a considerar como aceptables para tu trabajo de desarrollo habitual. No es aceptable desarrollar realizando builds con Maven. Por lo menos para mi. Por eso yo continúo realizando los ciclos de iteración compilación-despliegue-pruebas con mi IDE. Maven lo dejo para realizar las construcciones, para subir a svn proyectos autónomos y autogenerables y para poder realizar las integraciones y las puestas a preproducción de una forma segura y repetible.


En esta primera parte he expuesto 2 de 3 de las herramientas más esenciales para el desarrollo en equipo de proyectos Java (especialmente JEE). En el siguiente artículo cerraré el círculo con la herramienta que falta: un gestor de repositorios de Maven. Y explicaré cómo, con tan sólo esas tres herramientas, tenemos un entorno de trabajo potente y seguro para equipos de tamaño mediano sin rígidas normativas ni procedimiento burocráticos.

Referencias:

(continuación: Parte II)

martes, 12 de enero de 2010

Alternativas gratuitas a MS Project

“Como nada es más hermoso que conocer la verdad, nada es más vergonzoso que aprobar la mentira y tomarla por verdad”. -Cicerón.

MS Project es un software de administración de proyectos para asistir a administradores de proyectos en el desarrollo de planes, asignación de recursos a tareas, dar seguimiento al progreso, administrar presupuesto y analizar cargas de trabajo, aunque la verdad es que el uso mayoritario se centra (y de forma generalizada también acaba) en una planificación/cronograma acompañada de un diagrama de Gantt que nunca cabe en el documento de "Plan de Proyecto" y acaba tan reducido que es difícil de apreciar.

El uso de este software y sus artefactos (especialmente los diagramas Gantt) materializan la ficción extendida de las métricas del software a la que me referí en un artículo anterior. Y es que el mundo empresarial, inmerso en sus propios vicios adquiridos autojustificativos, requiere de éste tipo de "justificantes" falsificados, de la misma manera que se recoge un justificante por visita médica: es probablemente inútil, de redacción incomprensible y caligrafía críptica, puede que hasta falso o adulterado... pero se ha hecho necesario para que continúe la cadena de responsabilidad indirecta.

El software en realidad es bastante útil, el problema es que, como explicaba en el artículo comentado, los artefactos generados con el mismo se presentan como una verdad inmutable, como un producto exacto y preciso fruto de la ciencia y la ingeniería cuando en realidad, en el mejor de los casos, son producto de unas buenas prácticas, una experiencia dilatada, un buen equipo, unas acertadas predicciones y una ración de buena suerte. ¿Por qué? Pues sencillamente porque estamos estimando, estamos realizando diversas predicciones del tiempo que tardan varias personas cualificadas en realizar tareas moderadamente complejas y débilmente definidas, teniendo en cuenta una enorme sucesión de suposiciones relacionadas e interdependientes entre sí, y entre esas suposiciones, unos requisitos de proyecto inmutables o congelados en el tiempo: es decir, una conjetura como la copa de un pino, aunque más o menos razonable y convenientemente adornada.

No obstante lo anterior, el software tiene su utilidad para ayudarnos a realizar y gestionar esas conjeturas y tener pronósticos lo más acertados posibles: podemos desglosar las tareas, conocer sus relaciones y dependencias, realizar asignaciones aproximadas, conocer el camino crítico, detectar riesgos, etc... Si esos cronogramas fuesen algo vivo, como lo son los requisitos y el resto de los factores durante el ciclo de vida del proyecto, y se actualizasen y ajustasen periódicamente, podríamos tener una buena herramienta para gestionar nuestras hipót... perdón, quiero decir, tareas.

Dicho esto, vamos al tema que nos ocupa: en muchos casos, el coste de adquisición de este software es desproporcionado con una utilización parcial (digamos al 30% como mucho) y eventual (¿menos de 2 o 3 veces al año?), así que, ¿hay alternativas gratuitas?. Vamos a ello.


OpenProj

Probablemente el más parecido funcionalmente a MS Project y una de sus mejores alternativas. Está disponible para Linux, Unix, Mac y Windows (hecho en Java). Es gratuito, multilenguaje y distribuido bajo licencia CPAL, ha sido elegido para su inclusión en la suite Star Office para Europa.

Como herramienta de trabajo es perfecto. Sólo un inconveniente con respecto a la generación de artefactos: la impresión/exportación del diagrama Gantt y otros informes es sólo personalizable en la versión que se distribuye como Software as a Service (SaaS): Projects On Demand. La buena noticia es que el coste de esta versión es apenas de unos unos pocos 15€ al mes.


Ganntt Project

Esta herramienta cumple con el famoso Principio de Pareto (o "regla del 80-20") en cuanto a la funcionalidad esperada: la mayoría de los usuarios de MS Project (yo diría que mucho más del 80%) apenas utiliza un 20% de su funcionalidad. Esta funcionalidad mínima es la que nos ofrece este software.

Sus capacidades de importación/exportación, así como la generación de artefactos (diagramas e informes) cubren los mínimos necesarios como para que esta herramienta sea suficiente para realizar cronogramas de proyectos pequeños y medianos.

Es totalmente gratuito, multilenguaje, y distribuido bajo licencia GPL 2.0. Como también está desarrollado en Java, está disponible para Linux, Unix, Mac y Windows.

He ido probando cada actualización que hacen al producto y desgraciadamente siempre me he encontrado con ciertas carencias y deficiencias típicas de un producto aún falto de madurez. Ligeramente "tosco" y sin apenas hot-keys, tenía deficiencias editando tareas en proyectos no demasiado grandes, pero con muchas relaciones y tareas jerarquizadas (a la hora de mover tareas dependientes en el tiempo, gestionaba mal las dependencias "fuertes" o "rígidas" dejándolas sin desplazar). Tampoco nunca encontré una forma de realizar una re-distribución de recursos en casos de reasignación.

No obstante, seguiré probando hasta poder disfrutar su madurez definitiva.

OpenWorkbench

Probé la versión 1.1.6 cuando salió, allá por 2006. Realmente quedé impresionado porque era realmente una excelente alternativa a MS Proyect. Especialmente me gustó la facilidad para presentar distintas vistas a modo de hojas de cálculo que permitían obtener costes y realizar cálculos en base a estimaciones con bastante facilidad.

El producto es gratuito y open source (aunque no he encontrado el tipo de licencia exacto) no obstante, no es un proyecto muy activo: no parece haber evolucionado en estos últimos 4 años. Lamentablemente sólo está disponible para para plataformas Windows y yo no uso ese tipo de plataformas desde hace varios años, así que no lo volví a probar desde aquella vez. No obstante, si usas Windows, te animo a probarlo (y sobre todo, a cambiar a Kubuntu, claro ;-).

Nota: es bastante posible que funcione con Wine, pero me seducen más otras opciones... ;-)

KPlato

KPlato es la aplicación para gestión de proyectos de la suite KOffice. Es el más ágil, ligero y fluido de todos los comentados hasta ahora, y tiene el aspecto elegante y sencillo propio de la suite de Office para KDE.

Al igual que comenté en otro post sobre alternativas a MS Visio, se nota que si bien aún no ha alcanzado un nivel de madurez equivalente al OpenProj (en la redacción de este artículo he probado la versión 0.6.3), es equivalente o superior a Ganntt Project en cuanto a funcionalidad y muy superior a todos los demás en cuanto a usabilidad y agilidad. Al igual que con el resto de paquetes de la Suite, KPlato tiene un futuro muy prometedor ya que el roadmap evolutivo del producto nos depara probablemente la mejor alternativa a MS Project completamente gratuita.
Con licencia GPL, y originariamente para Linux, está disponible para muchas plataformas actualmente, incluído Windows.



Como siempre, recomiendo probarlos todos (lo que vale para mi, no necesariamente tiene que valer para ti ;-), aunque yo me estoy apañando perfectamente con los tres. Incluso he llegado a importar un .mpp de MS Project, modificarlo y volverlo a exportar para generar un mini-site HTML con Ganntt Project (del cual podía extraer perfectamente las imágenes de Cronograma Gantt que necesitaba).




miércoles, 23 de diciembre de 2009

La UE aprueba finalmente la adquisición de Sun

Larry Ellison ha conseguido salvar el último obstáculo para hacerse con la totalidad de Sun sin renunciar a MySQL, que era el punto conflictivo tras las objeciones de la UE a la adquisición por la posible vulneración de la libre competencia en Europa en el sector de las bases de datos.

La Comisión Europea ha obligado a Oracle a realizar 10 concesiones y seguir invirtiendo en MySQL durante un tiempo. Este tema relativo a MySQL, aunque muy importante, no ha sido nunca mi mayor preocupación en torno a este tema de la adquisición (como comenté en un artículo anterior) sino, obviamente, aquellos activos de Sun (ahora de Oracle) que me afectan directamente: Java y Glassfish (y en ese orden).

Entiendo que Oracle tiene mucho interés en mantener la tecnología, ya que lleva años basando sus productos en ella. Otro tema serán cómo se afrontará el Java Community Process y los distintos comités por un lado y la gestión de un Servidor de Aplicaciones de código abierto y comercial compitiendo directamente con sus dos actuales: no creo que se vaya a quedar con tres productos equivalentes y en el mismo segmento de mercado.

Y todo esto, de forma contemporánea con la aprobación de la JSR 316, o más conocida como la especificación JEE 6, tras tres largos años de trabajo. Una de las especificaciones más esperadas y con grandes avances en muchos campos que sin duda nos facilitarán las cosas como por ejemplo un tipo específico de EJB para realizar singleton o las invocaciones asíncronas a EJB's.

La implementación de referencia (Glassfish v3) está disponible desde el 10 de Diciembre.

El próximo 2010 será el primer año de Java y Glassfish bajo el control de Oracle, con todas sus interesantes novedades (especialmente en lo que a JEE se refiere). Veremos cómo evoluciona la adopción de estas nuevas especificaciones.

Feliz año 2010.



Si queréis ir echando un vistazo a las novedades de JEE 6:

General
EJB 3.1

domingo, 22 de noviembre de 2009

Magnitudes astronómicas

"El hombre es la medida de todas las cosas" -Protágoras de Abdera, s V a.C.

El hombre siempre ha tenido la necesidad de medir el mundo que le rodea: para explorarlo y comprenderlo, para relacionarse con los demás e intercambiar, para prevenir sucesos, pronosticar su devenir y desarrollarse. Como patrones, el ser humano ha utilizado todo tipo de elementos conocidos a su alrededor: su propio cuerpo, elementos de su entorno, fabricados ad-hoc para permitir su duplicación, etc.

Hace casi 2.300 años, Erastótenes determinó el tamaño de la tierra en "estadios" que, como su nombre indica, era una unidad de longitud equivalente a la longitud del estadio de Olimpia [1]. Ya no usamos científicamente unidades antropométricas, pero seguimos necesitando unidades de medida relacionadas con el mundo habitual que vivimos que nos ayuden a comprenderlo y materializarlo comparando con elementos conocidos. Todos podemos representar en nuestra mente o imaginar 1 Kilómetro, porque lo comparamos con distancias conocidas. Podemos también imaginar cientos e incluso miles de kilómetros porque conocemos mapas y el tiempo que se tarda en recorrer esas distancias en diferentes medios de transporte... Pero en lo que respecta a las distancias, nos quedamos ahí. Cifras como millones de kilómetros o años luz escapan de nuestra imaginación porque somos incapaces de compararlas con nada que conozcamos.

Recientemente ví el vídeo a continuación y quedé impresionado por los descomunales tamaños de los distintos cuerpos celestes y cómo unos cuerpos gigantescos se hacen ínfimos con respecto a otros.



Tras ver esto, me puse manos a la obra a intentar "imaginar" esos tamaños comparándolos con elementos conocidos, así que convertí el universo en una diezmilmillonésima de lo que es ahora. Lo que viene a continuación es un nano universo con objetos conocidos (disculpad las imprecisiones y redondeos, pero he primado la visualización de objetos en nuestra imaginación a la exactitud).

En este mundo, la tierra es como una canica grande (de 1,3 cm). La luna, del tamaño de una lenteja pequeña girando a su alrededor a un par de cuartas (casi 40 cm) de distancia. Una unidad astronómica (UA) es, en este mundo, la longitud de tres piscinas olímpicas, así que tenemos a nuestra canica girando alrededor de un sol del tamaño de un Smart (visto por detrás, ya que es más largo que ancho) a unos 150m de distancia. Girando también alrededor de esta esfera de metro y medio hay un guisante llamado Marte a 230m. de distancia y un balón de balonmano llamado Júpiter a unos 780m. Es decir, que si nuestro sol estuviese en la estación de Atocha de Madrid, Júpiter estaría girando a su alrededor al final del Paseo del Prado, por la fuente de Neptuno.

Otras estrellas son gigantescas incluso en este mundo enano. Betelgueuse, la supergigante roja de la constelación de Orion es del tamaño de un monte (480m.). Imaginaos una canica al lado de un monte. Pues eso no es nada, VV Cephei y VY Canis Majoris son esferas inimaginables de 1,5km y 2Km de diámetro respectivamente. Para intentar imaginar esas enormes hipergigantes rojas, deberíamos cambiar de escala, imaginando ahora que nuestro sol es del tamaño de un balón de balonmano y nuestra tierra de un grano de arena: en este caso, VV Cephei es como el Palacio de Comunicaciones de Madrid (en la plaza de Cibeles) y VY Canis Majoris es como el estadio Santiago Bernabéu. Impresionante, ¿no? Al final, como Erastótenes, he acabado también midiendo en estadios.

En fin, mientas pensaba en todo esto y hacía mis cálculos, me entero de la publicación del libro "La Galaxia en un campo de fútbol" [2]. Libro que, por supuesto, ya tengo nuevecito y reluciente a mi lado (muchísimas gracias, Eva, por el regalo). El libro trata de ésto mismo, proponiendo un método y nuevas unidades de medida para comprender el Universo. Os contaré cuando acabe sus páginas en una nueva entrada del blog... pero ya os avanzo que tiene una pinta estupenda.



[1]: Afortunadamente, Cristóbal Colón justificó la viabilidad de su viaje a las Indias por occidente con los datos erróneos de Ptolomeo. Posiblemente, con las mediciones de Erastótenes, el viaje no se habría realizado en aquella época. Seguramente éste sea el error más influyente en la historia de la humanidad y una de las pruebas de que los errores también nos conducen a fantásticos descubrimientos.
[2]: "La galaxia en un campo de fútbol", de Juan Fernández Macarrón, Edita: Equipo Sirius (2009)


jueves, 1 de octubre de 2009

La falacia de la Ingeniería del Software

A partir de los años 70 comenzó a desarrollarse lo que, en mi opinión, es la falacia de la Ingeniería del Software y sus métricas para la cuantificación y planificación de proyectos de software. Desde las simplistas LOC (Lines Of Code), hasta la Complejidad Ciclomática, las métricas de producto han ido cambiando desde enfoques tan extremadamente matemáticos como inútiles, hasta pesadas y burocráticas metodologías y análisis de negocio según las cuales hay que documentar durante cuatro meses para un proyecto de dos.

Es ahora, en el reciente 40 cumpleaños de la denominación de "Ingeniería del Software" como disciplina, cuando por primera vez uno de los padres del Análisis Estructurado, Tom DeMarco, en un artículo autocrítico realmente sorprendente (tratándose de él) reconoce con honestidad que la Ingeniería del Software es una idea obsoleta y que el Desarrollo de software es algo experimental, al menos en su concepción.

Durante este tiempo, la mayor parte del stablishment académico ha insistido de forma machacona a los sufridos universitarios de informática con la última metodología que aprendió (pero que jamás aplicó en ningún proyecto empresarial) el profesor de turno cuando tomó su plaza titular y en la que se anclaría de por vida, mientras se sucedían las promociones de informáticos frustrados en sus primeros proyectos laborales por dos razones: la primera, porque la metodología aprendida ya estaba desfasada, y la segunda porque resultaba impracticable para la mayor parte de los proyectos del mundo real.

En efecto, es una trampa porque se trata de una falacia que persiste una y otra vez en un mundo endógeno. Los creadores de las métricas y de las metodologías vienen de monstruosos proyectos militares o gubernamentales, o del mundo académico. Mientras en el mundo académico éstas se toman como una "ciencia", como una verdad absoluta y dogmática aunque jamás la hayan aplicado o la hayan visto aplicar, los casos de éxito en los grandes proyectos son nulos... ni que decir tiene del 99% restante de proyectos medianos para los que no fue ni imaginado. Y así, se suceden nuevas metodologías cada cinco años, una tras otra, que se van enseñando en la confortable ilusión de que algún día servirá, o de que esta sí es la "bala de plata" definitiva, aunque su éxito real sea anecdótico.

La falsa ilusión del control

La ingeniería del software es una falacia porque es una aserción que podría estar compuesta por verdades parciales, pero que es falsa en su conjunto. Durante mucho tiempo se ha transmitido la idea del desarrollo del software como algo medible con exactitud, con el rigor científico aplicable a elementos físicos cuyos precisos procesos de fabricación son conocidos y estandarizados desde hace años... como comentó Dijkstra en un interesante ensayo: "...que los programas son simplemente dispositivos como cualquier otro, la única diferencia que se admite es que su fabricación pueden requerir un nuevo tipo de expertos, a saber: programadores" ([1]).

Todo esto para lograr prácticas consistentes y predictibilidad. Y en parte, en efecto, es así. Las sucesivas metodologías han ido aportando buenas prácticas que han servido, en los proyectos en los que es posible, un análisis más exhaustivo y pormenorizado de los requisitos, trazabilidad, control de cambios, control de calidad, etc... El problema es que han transmitido y calado en la conciencia colectiva empresarial una falsa ilusión de control del proceso. Esta ilusión también ha calado en el mundo académico, (demasiado separado, por cierto, del mundo profesional) donde parece que preocupa más la lírica teórica que la formación de profesionales prosaicos, que es lo que el mundo necesita, en definitiva. Pero también ha calado incluso en los mismos profesionales, que pinchan en hueso constantemente intentando aplicar aquellas prácticas y métricas aprendidas que teóricamente les alejan y diferencian de la "artesanía" de los sistemas de información de antaño, porque han recibido una formación en la que les han asegurado que "esto" nuevo, es "ciencia".

Pero la verdad es que la mayor parte de las decenas metodologías y métricas de estos últimos 40 años no son más que un conjunto de buenas prácticas adornadas con estadísticas, algunas desplegadas con un imponente soporte matemático. Decenas de metodologías con una relación de casos de éxito tan exigua, que en cualquier otra disciplina científica no serían siquiera consideradas. Y hoy día, ninguna de ellas se aplica con éxito de forma generalizada ni se ha convertido en estándar, ni garantiza el éxito de la "fabricación"... y aun así se sigue llamando "ingeniería". Imaginen, por ejemplo, metodologías quirúrgicas con anecdóticos casos de éxito... ¿Se enseñarían en las facultades de medicina como "metodologías a aplicar"?.

El objetivo de las metodologías ha sido siempre la de aumentar la productividad y la calidad del desarrollo del software para que éste sean sistemático, predecible y repetible. Hoy sabemos que las métricas y el control de calidad cuestan mucho tiempo y dinero... y ya hace más de 20 años que sabemos que "el testing de programas puede convincentemente demostrar la presencia de errores, pero nunca puede demostrar su ausencia" ([1]). Aun así se sigue manejando el término control de calidad como si realmente pudiéramos controlar de verdad la calidad del software. Se habla de las metodologías como si realmente hubiesen conseguido el objetivo para las que fueron creadas. Ésta es la falacia.

Los ladrillos de código

Yourdon/DeMacro, Merisse, SSADM, Métrica (nuestro particular "me too" a modo de refrito de modelo de procesos y formas de llevarlo a cabo: dos por uno, oiga)... todas las metodologías a las que me he acercado están orientadas correctamente al proceso y a la funcionalidad, pero ignorando o trivializando unos de los aspectos fundamentales, que es tratado a menudo como un "recurso" de un determinado "perfil": los programadores, los hacedores del proceso mismo. En todos ellos, los recursos se mueven entre tareas o a lo largo de proyectos al más puro estilo de las obras civiles como si fuesen elementos pre-formados, estáticos, constantes, clónicos, sustituibles e inalterables. De la misma forma que las máquinas excavadoras ("Máquina A:  X metros cúbicos por hora"), los programadores son capaces de realizar "una funcionalidad X en una unidad de tiempo Y". Ja, ja.

Y nos lo creemos. Nos han hecho creérnoslo, y seguimos haciendo como si fuese verdad. En el mantenimiento de esta mentira participamos todos (unos más que otros, eso si) pero especialmente es una cadena de mentiras necesarias. El cliente necesita creerlo y necesita que le digamos que estará en determinada fecha, y le enseñamos complejos cronogramas llenos de hitos y gantts que terminan, qué casualidad, justo en la fecha que él desea. El comercial también lo necesita porque hay que vender el proyecto. El gerente tiene dos opciones: el cinismo de créerselo o la resignación... normalmente acaba en la primera. Y asi una y otra vez. Clientes descontentos, equipos quemados buscando otra empresa, proyectos desastres inmantenibles, etc...

La cultura corporativa nos exige y nos sugiere permanentemente algo que sabemos positivamente que es falso, pero en lo que se insiste una y otra vez: la semejanza entre los proyectos de desarrollo de software con los proyectos de edificación u obras. ¡Como si fueran comparables!. En los primeros hay procesos de fabricación fiables, comprobables, y certificados. Hay procesos de construcción definidos desde la ciencia y la experiencia de cientos  de años. Hay materiales probados, con tolerancias comprobadas y medidas. En definitiva, en los primeros se hace "ingeniería", en los segundos no. Es así de sencillo. Y las titulaciones adquiridas no tienen menos valor por lo que estoy diciendo. Tampoco diagnosticar una enfermedad u operar un corazón es ingeniería y no tienen menos valor los títulos en medicina por eso.

Adivina quién viene a cenar o el factor humano.

Lo curioso de todo esto es que "el método" falla en lo más importante. Y es que al final, tras las buenas prácticas, la toma de requisitos, el análisis, el diseño, el control de calidad y la documentación, el cliente está esperando los únicos dos parámetros que le interesa: tiempo y dinero. Aquí es donde "el método" se viene abajo o, simplemente, no sabe/no contesta. ¿Por qué? Muy sencillo. Porque ahora es donde entra en juego la estimación, es decir, la predicción, la pronosticación. Y esto no parece muy científico que digamos. Y aquí no contamos con buenas estadísticas de trabajos mecánicos y repetitivos como en obras de edificación. Aquí no hay paredes estandarizadas, ni obreros equivalentes... Aquí nos encontramos con equipos de distinta experiencia en distintas áreas tecnológicas, con equipos con su propio ciclo de vida y sus modus operandi distintos. Personas muy distintas con experiencias y destrezas muy diferenciadas. Y dichas diferencias tienen un impacto brutal en el resultado (rendimiento, mantenibilidad, limpieza, etc...).

Sinceramente, nunca me he encontrado a nadie que aplique métricas tipo COCOMO (¿de verdad alguien se cree que ése tipo de técnicas es precisa?). Al final, todas las técnicas predictivas utilizadas se basan en la experiencia de una forma u otra: bien por analogía con otros proyectos, bien por experiencia personal individual o en grupo (Wideband delphi).

Además, hay dos aspectos fundamentales del factor humano a tener en cuenta:
  • Especialización. En el desarrollo hay una tremenda especialización. Las distintas tecnologías forman a expertos no intercambiables y, por supuesto, nada tiene que ver un proyecto de una aplicación empresarial con un proyecto de un software de desktop o un videojuego, por ejemplo. Esta especialización hace que cierto programador pueda ser tremendamente eficiente en un proyecto y nada eficiente en otro.
  • Formación. Todo proceso de programación lleva implícita una parte más o menos grande de formación, que puede ser un porcentaje alto del tiempo dependiendo de la experiencia del desarrollador en la tecnología.

Sin duda, la variable más compleja de manejar es la del factor humano, ya que las estimaciones se pueden ir al traste con mucha facilidad. Los proyectos medianos con equipos medianos son especialmente sensibles, ya que la dependencia del equipo humano es el factor esencial: no es lo mismo repetir con un equipo que ya ha trabajado junto que con un equipo nuevo... no es lo mismo un equipo de doce programadores inexpertos que otro de seis expertos. Y ya sabemos que, en muchos casos, incorporar al señor XY en el proyecto es una buena razón para tener ocupado a XY, no para que el proyecto termine antes o lo haga con más calidad.

Tell me sweet little lies

Parafraseando la famosa canción de Fleetwood Mac, ha sido la industria del software la que se ha fijado mantener la mentira y encargarse de que se cuente mil veces (especialmente en la universidad, donde parece que se dan menos cuenta) para que, así, a fuerza de repetirla, acabe en algo cierto. Pero los los procesos de desarrollo aún distan mucho de ser medibles, predecibles, estables y repetibles. Lo que se ha venido en llamar (y es posible que desde ahora empiece a dejar de hacerlo) "ingeniería" del software aún está en pañales y le queda muchísimo camino por recorrer. Es posible que algún día, se parta de unidades básicas estándares (procesadores estándares, sistemas operativos estándares, lenguajes estándares, procesos estándares...) pero supongo que yo no estaré aquí para verlo.

Como comentaba en mi primer post, no todos los desarrolladores experimentados son expertos. El factor humano es la columna vertebral de los desarrollos y se requiere que los proyectos tengan una orientación al equipo tanto como lo hacen al proceso. Es fundamental. Es más, se precisa que sean los proyectos los que se asignen a los equipos y no al revés. Hoy por hoy, la experiencia sigue siendo la forma generalizada e imprecisa de realizar las estimaciones.


Referencias y otra información:
  • Excelente artículo sobre las metodologías ágiles y su diferenciación con respecto a las metodologías clásicas basadas en la métrica y la predictibilidad.
  • The Mythical Man-Month:  otro extraordinario resumen del libro del mismo nombre con reflexiones tangenciales a la mías (en mi modesta opinión, por supuesto)
  • La raíz de la precariedad en informática. Interesantísimo y revelador artículo sobre las consecuencias de la concepción "taylorista" del proceso de desarrollo de software y de la consideración de la programación como proceso de construcción en lugar de proceso de diseño.
  •  [1] El ensayo comprometido y crítico de Dijkstra es demoledor. En castellano, aquí.

Related Posts Plugin for WordPress, Blogger...
cookieassistant.com