Integración continua, principio #2: build everywhere

Particularmente la tarea de Build debe poder ejecutarse tanto en el servidor de integración continua como en la máquina del programador. Esto es fundamental para que en caso de falla del build, los programadores sean capaces de reproducir la falla en sus ambientes locales ejecutando la misma tarea que ejecutó el servidor.

Al mismo tiempo esto reduce la dependencia con el servidor de integración continua, ya que el mismo solo agrega un paso previo y uno posterior al build. En concreto:

  • El servidor de IC monitorea al repositorio de código y dispara nuevas ejecuciones en caso de detectar cambios
  • Una vez disparado el build y descargado el código fuente, el servidor de IC ejecutará la tarea de build que es justamente la que debe poder ejecutarse en la máquina de los programadores
  • Finalmente el paso adicional que ejecuta el servidor de IC es la notificación del resultado del build

Integración continua, principio #1: Independencia de IDE

Desde el punto de vista conceptual esta práctica está muy bien descripta en el artículo de Martin Fowler (#lecturaObligatoria), pero a la hora de intentar implementar la práctica, no suele alcanzar con la teoría. En este sentido un libro que me parece muy útil es Jenkins: The definitive guide de John Ferguson.

Luego de la lectura de los mencionados recursos y de haber recorrido un largo camino con esta práctica he identificado algunos principios fundamentales para la efectiva implementación de esta práctica. A partir de hoy y durante los próximos días voy a compartir una serie de post explicando cada uno de dichos principios. Si bien los principios los voy a ir numerando, su numeración no tiene correlación alguna con su importancia. Aquí va el primero.

Independencia del IDE

La generación del build no puede depender de un IDE. Es sorprendente la cantidad de programadores que no son capaces siquiera de compilar su aplicación sin usar un IDE. Esta es una situación que veo en muchos ambiente Java (alta dependencia de Eclipse) y .Net (alta dependencia de Visual Studio). En la actualidad todos los lenguaje de programación cuentan con alguna herramienta de build e incluso si no existe una herramienta específica para algún lenguaje, siempre es posible utilizar alguna herramienta genérica como el noble make.

Elegir un sistema de control de versiones

En más de una ocasión he sido consultado por organizaciones sobre la elección de sistemas de control de versión. Actualmente estoy trabajando con una organización que usa CVS y que está evaluando distintas herramientas para reemplazarlo.

Si bien basta con googlear un poco para encontrar miles de post sobre las diferencias, beneficios y problemas de los distintos sistemas de control de versiones, cambiar el sistema de control de versiones implica varias cuestiones no triviales.

Desde mi perspectiva estamos hablando de una herramienta que nos ayudará a resolver ciertas cuestiones de trabajo colaborativo y recalco esto: nos ayudará, la herramienta por sí sola no resolverá nada. Más aún, una herramienta mal utilizada puede traer más problemas que soluciones. Para que la herramienta nos permita resolver algún problema, debemos establecer ciertas reglas/convenciones para su uso (y luego respetarlas).

Dicho esto, deberíamos comenzar por identificar el/los problemas a resolver y luego analizar cómo es que cada alternativa de herramienta nos permitiría resolver esas cuestiones.

Desde mi óptica, hay 3 dimensiones de considerar en la evaluación.

Sistema de control de versiones: Git, Subversion, CVS, Mercurial, Darcs, son algunos sistemas de control de versiones. Para elegir uno posiblemente debamos comenzar por preguntarnos si queremos un sistema distribuido o centralizado y con ese punto de partida podremos ir acotando nuestras opciones. No voy a profundizar sobre este punto pues considero que es el que más desarrollado está y basta googlear un poco para encontrar pros y contras de cada uno.

Producto/Servicio: una vez elegido el sistema debemos elegir un producto o servicio que lo implemente. En este caso la discusión podría comenzar por: ¿queremos tener el sistema en nuestra infraestructura o preferimos contratarlo como servicio?. Una vez definido esto deberemos elegir un opción concreta. Ejemplo: supongamos que decidimos ir un sistema distribuido y concreto nos inclinamos por Git, entonces podríamos utilizar un servicio en la nube como el ofrecido por GitHub o Bitbucket o bien podríamos decidir adquirir un producto e instalarlo en nuestro entorno como podria ser GitLab o Stash.

Forma de uso: por más que hayamos elegido una producto/servicio concreto (supongamos GitLab), aún no basta para resolver nuestro problema, deberíamos definir ciertas cuestiones respecto de cómo usarlo. Esto implica responder preguntas tales como: ¿Cuál es el criterio para la creación de repositorios: creamos un único repo por equipo o creamos un repo por componente de nuestra solución? ¿usamos branches o forks? ¿cómo debería ser la estructura de cada repositorio?¿trabajamos todos sobre master o usamos feature branches?. Sin duda varias de estas cuestiones estarán influenciadas por la herramienta elegida pero más allá de eso, hay otra cuestiones que dependerán de problemática concreta de cada organización/proyecto.

En los últimos 2 años, he trabajado con al menos 5 organizaciones y en todos los casos la herramienta elegida ha sido Git. Si bien no siempre participé directamente en la elección de la herramienta, en varios casos estuve fuertemente involucrado en la definición de la forma de uso y la capacitación de los equipos.

Una empresa interesante: Poincenot Technology Studio

La segunda mitad de este año estuve trabajando con la gente de Poincenot. La experiencia me resultó muy interesante por una serie de cuestiones que van allá de la temática del proyecto en que participé.

En primer lugar me reencontré con algunos estudiantes/graduados de FIUBA, lo cual nos dio tema de conversación para más de un almuerzo.

Tuve la oportunidad de compartir algunas conversaciones con los fundadores de la empresa y me llamó poderosamente su visión, la cual yo interpreté como: «Somos un estudio de tecnología enfocados en habilitar negocios, no desarrollamos software porque sí, sino que lo hacemos para apalancar negocios. La tecnología no es un fin en sí mismo, sino un medio«. A mi entender esto representa un foco claro en la entrega de valor lo cual en gran medida explica el hecho de que muchas cosas en Poincenot se hagan con mindset ágil.

Poincenot es un empresa con menos de un año de vida, pero con un equipo de profesionales excepcionales tanto a nivel management como técnico. En el equipo de management están Mario López, un técnico convertido en hombre de negocios, Facundo Vazquez y Augusto Fernández Villa, ambos ex-Tecso. Dentro del equipo de técnicos destaco a Maia, egresada de FIUBA con quien tuve el gusto de trabajar años atrás. Maia tiene un master en Human-Computer Interaction y a penas regresó se sumó  a Poincenot donde está liderando las cuestiones de UX. También entre los técnicos hay un par de expertos Java con los que estuve trabajando de cerca y de quienes aprendí muchísimo (gracias Lio y Dani).

Y como si con todos esos profesionales fuera poco, han sumado algunos profesionales externos para colaborar con algunas cuestiones específicas. Fue así que durante mi participación en Poincenot me encontré trabajando con Alan Cyment, Sole Pinter y Diego Fontdevila.

Para cerrar te digo: si estas evaluando un cambio de trabajo, te interesa ser parte de un proyecto prometedor y trabajar en un ambiente profesional y ameno, no dudes en contactarte con Poincenot.

poincenot

Un caso robusto de integración contínua en Java

En el proyecto en el que he estado trabajando los últimos meses tenemos montado un proceso de integración continua bastante completo en mi opinión, comparto aquí algunos detalles. Se trata de un proyecto Java, basado en Spring, Hibernate, Camel y algunos otros frameworks. A nivel de herramientas tenemos quality checks con PMD, pruebas unitarias y de aceptación con JUnit y pruebas de aceptación y carga con JMeter. Como herramienta de build usamos Maven, como servidor de integración continua usamos Jenkins y el código lo tenemos en Git (gitlab). Al mismo tiempo tenemos un ambiente de tests en la nube donde desplegamos nuestra aplicación periódicamente. También tenemos un ambiente de prueba en las oficinas del cliente, donde desplegamos nuestra aplicación al final de cada iteración. En el jenkins tenemos varios jobs:

  • integración continua: monitorea el branch develop y ante cada cambio compila, ejecuta las pruebas de JUnit (unitarias y de integración)
  • quality-check: se ejecuta a continuación del job de integración continua y caso_java_jenkins_2básicamente ejecuta análisis de código (pmd)
  • integración continua de branches: en algunos casos creamos feature-branches, para lo cual seguimos una convención de nombres y este job se encarga de ejecutar integración continua sobre estos branches. En general procuramos que estos branches no vivan más de 3 días.
  • inicialización: es el job que dispara el build pipeline, y como tal comienza por inicializar el ambiente de test. Se ejecuta periódicamente (varias veces al dia siempre que haya cambios en el repositorio)
  • deploy: son dos jobs que se encargan de desplegar las dos aplicaciones que forman parte de nuestro sistema.
  • pruebas de aceptación: ejecuta las pruebas de aceptación (codeadas con jmeter) luego de cada despliegue
  • pruebas de carga: ejecuta un conjunto de pruebas de carga. Este job lo ejecutamos manualmente al menos una vez por iteración para asegurarnos que los cambios realizados no haya impactado en la performance del sistema
  • generador de release: este job lo ejecutamos manualmente al final de cada iteración para generar un nuevo release lo cual implica: taggear el repo, generar y publicar los artefactos (wars y jars) y actualizar la versión en los archivos del proyecto (pom.xml)
  • generador de instalable: este job toma  los artefactos generados por el job de generación de release y los empaqueta junto con un grupo de scripts que luego se utilizarán para instalar  el sistema en los ambientes del cliente.

caso_java_jenkins

FooTest el nuevo «Hola Mundo»

Tradicionalmente a la hora de aprender un nuevo lenguaje de programación uno comenzaba por programar una aplicación que imprimiera «¡Hola Mundo!» en la salida estándar. Creo que eso puedo estar bien en una época, pero en la actualidad escribir mensajes en la salida estándar no suele ser de gran utilidad.

Personalmente dejé de programar «Hola mundos» hace varios años y lo reemplacé por programar una prueba unitaria. Y en general suelo ir un poco más allá y hacer que la prueba unitaria se ejecute con la herramienta de build correspondiente con total independencia del IDE utilizado.

La prueba unitaria que suelo programar es siempre la misma, verifico que el método sayFoo de la clase Foo devuelva el string «foo!». Esto me lleva a escribir la clase FooTest, la clase Foo y un script de build para correr el test.

Y un día me fui de tema y la pasé bien: Open Space BA Turismo

El jueves pasado participé como facilitador de una jornada de trabajo organizada por el área de turismo del gobierno de la Ciudad de Buenos Aires.

Si bien me he desempeñado como facilitador en distintos eventos en el pasado, todos ellos siempre habían estado relacionados de una u otra forma al desarrollo de software. Cuando María e Ingrid de Fuerza Tres me invitaron a participar de esta actividad, lo dudé 30 segundos y acepté, ya que me pareció un desafío interesante por obligarme a salir de mi zona de confort y en cierto modo probarme en un contexto distinto al que suelo trabajar. Otro punto que me motivó para participar fue el hecho de trabajar con el gobierno, algo que no suelo hacer y que me resulta interesante ya que muchas veces las iniciativas de gobierno tienen impacto en la sociedad, cosa bastante menos común en el sector privado.

La semana previa al evento tuvimos una reunión de coordinación con todos los miembros del equipo que estaría a cargo de la facilitación. Debo admitir que por un momento me sentí sapo de otro pozo ya que la mayoría del equipo procedía de campos de trabajo bastantes distintos al mío, pero a medida que comenzamos a interactuar fui sintiéndome más cómodo.

La jornada tuvo lugar en el Centro Metropolitano de diseño y los participantes eran personas del sector público y privado del área de turismo. Largamos alrededor de las 9.30 con la bienvenida de uno de los funcionarios del ministerio. Luego de ello María Mauro y yo nos encargamos de explicar la dinámica de trabajo la cual fue en cierto modo similar a la de un open space (de hecho el evento estaba titulado Open Space Turismo). Inicialmente hubo un marketplace donde para mi sorpresa los participantes (casi en su totalidad sin experiencia en open spaces) presentaron muchísimas propuestas a un ritmo que nunca me hubiera imaginado. No terminaba uno de explicar su propuesta que ya había otro tomando su lugar. Increible. Luego de ello se paso a votar las propuestas y se ubicaron en la grilla las 10 propuesta más votadas y que serían sobre las que se trabajaría continuación. Cada propuesta se trabajó en un mesa con asistencia de los interesados y la colaboración un facilitador.

open_space_turismo
La facilitación gráfica fue realizada por Patricia Mollá.

El trabajo en las mesas duró casi dos horas y estuvo enfocado en identificar acciones concretas para realizar en cada una de las temáticas en cuestión. Ya hacía el mediodía se hizo una puesta en común de lo trabajado en las mesas y otro funcionario se encargó de las palabras de clausura. Como cierre compartimos un almuerzo.

Aún tenemos pendiente como cierre del trabajo la entrega de un informe, tareas que esperamos completar esta semana.

Una vez más la dinámica de agenda abierta característica de los Open Space ha resultado exitosa, y más aún, creo que funcionó mucho mejor que en algunos otros encuentros en los que he participado.

Me sentí muy bien, me gustó mucho el trabajo con el grupo de facilitadores, la demás gente de la organización y los participantes. Creo que el todo el evento estuvo muy bien.

Finalmente quiero agradecer especialmente a Maria e Ingrid por haberme invitado a participar de esta experiencia.

acreditacion_open_space_turismo

Un programador de otro pozo

Recientemente leí un artículo escrito por Hernán Wilkilson sobre las nuevas características incluidas en la versión 8 de Java. Más allá del interesante análisis que hace Hernán, creo que son muy valiosas las ideas compartidas en la conclusión del artículo (recomiendo tomarse unos minutos para leerlo) sobre todo el llamado a los programadores a «abrir a la mente». Profundizando en este llamado quiero sumar algunas impresiones.

Como dice la frase «el que tiene un martillo en la mano sólo ve clavos», las herramientas que utilizamos para resolver los problemas influyen de forma determinante en las soluciones que diseñamos. Si bien ya hace años que tomé conciencia sobre este hecho, me sorprendí muchísimo cuando hace unos meses me sumé a trabajar en un proyecto Java con un equipo de experimentados programadores que en su carrera profesional habían trabajado casi exclusivamente con Java. O sea, habían usado otros lenguajes pero muy por arriba. Por mi parte, he trabajado mucho con Ruby y C#, un poco menos con Smalltalk y Javascript y muy poco con Java, Python y Php. Estas diferencias de experiencia han hecho que a la hora de plantear soluciones nos encontremos con propuestas bastante distintas. Un ejemplo de esto que me resulta muy chocante, y que es muy común en el mundo Java, es la práctica de separar datos y lógica. Esto lleva a tener clases que son simples contenedores de datos y clases que sólo tienen métodos para manipular datos contenidos en otros objetos, algo bastante anti-POO.

Creo que lo ideal para todo equipo sería contar con programadores «políglotas» pero me parece que no es algo muy común. Mi impresión es que en general las empresas muchas veces apuntan a sacar el mayor provecho de sus «recursos» y eso provoca que «los recursos» se especialicen y «encierren» en una única tecnología. Ojo, no es algo que pase sólo en las empresas, muchos veces quienes trabajan en forma independiente también deciden enfocarse/encerrarse tecnológicamente, ya sea por cuestiones de comodidad y/o rentabilidad.

Dada esta situación y desde el punto de vista de equipo creo que puede resultar interesante contar con un un programador de otro pozo, o sea, integrar en el equipo un programador que tenga experiencia en otros lenguajes/tecnologías pues puede aportar una visión diferente y enriquecer al equipo.

Agiles Argentina 2014, sesiones dia 2

Comparto aquí algunas notas de las sesiones que participé.

Software Craftsmanship

La sesión fue propuesta por Emilio Gutter quien comenzó contando el surgimiento del movimiento de software craftsmanship a partir del cual surgió un pequeño debate sobre el gap entre la formación académica y el ejercicio profesional.

En línea con esto Emilio mencionó un programa apprenticeship que están llevando a cabo en 10 Pines.

Finalmente (no tengo en claro exactamente cómo fue) terminamos hablando sobre lenguajes de programación y la inclemencia de usar C en los primeros cursos de programación.

Sesión 2: Intro XP

A pedido del público esta sesión fue una repetición de la sesión que se había dictado el día anterior, pero en esta ocasión con la participación de más gente.

Sesión 3: Prácticas Pre-Agile

Esta sesión fue un adelanto de la sesión que daremos con @dfontde en Agiles 2014. La idea, como comenté tiempo atrás, es repasar aquellas prácticas, en muchos anteriores a las prácticas ágiles, que han demostrado gran utilidad y que en muchos casos han servido de base para las prácticas ágiles. Me gustó mucho como salió la sesión.

Sesión 4: Facilitación gráfica

Decidí sumarme a esta sesión para aprender de una vez los principios de está técnica que hasta ahora siempre había tocado de oído. La sesión tuvo dos partes, una primera donde se explicó la teoría y una segunda donde la pusimos en práctica. Me vino muy bien ya que además de lo visto en la sesión me traje varios punteros para profundizar entre ellos algunos recursos de Zulma Pataroyo [1][2] una experta del tema.

 

Hasta aquí llegó mi día, lamentablemente tenía otros compromisos y me perdí la última sesión y la retrospectiva.

agiles_arg_dia_2

 

[1] http://facilitaciongrafica.com/
[2] http://pataleta.net/

ChiliProject, my favourite project management tool

About 2 years ago I started working with Tipit guys. My first task was to migrate their project management tool. At that time they were using a tool called Bugnet that was build with C# and they wanted to move to ChiliProject that was built with Ruby. I had experience with both technologies so I was a good candidate to do the job. The migration was successful and after that, we continued working together.

For almost two years I have worked in several Tipit projects and in all of them we have used ChiliProject. In all this time we have also added several new features to ChiliProject and the good news is that all these features are open source and anyone can get them from GitHub.

What I like about ChiliProject is that it provides several features beyond issue tracking, here is a brief list of the most interesting features in my opinion:

  • Ability to define different kind of issues with different fields and workflows
  • Ability to create/update issues by email
  • Ability to connect to source code repository and link commits with issues
  • Discussion Forums
  • Project roadmap definition support
  • Project calendar
  • Wikis
  • File sharing

Beyond these features, ChiliProject is a open source tool, built on Ruby on Rails and very extensible.