Agiles 2012: Dia #1

La jornada comenzó con el KeyNote de David Hussman, cuyo título me resultó más que llamativo: «Shut up and Play Yer Guitar». Para guiar la presentación utilizó una analogía con el dominio de la producción musical, viendo al equipo como el conjunto de músicos y al scrum master como el productor. Sobre este hilo conductor habló sobre cómo agile ha ayudado a operar transformaciones en la forma que desarrollamos software. Personalmente me gustó mucho la idea de que no trabajamos en desarrollo de software sino en construcción de productos. Tengo varias notas de esta sesión, pero antes de volcarlas necesito procesarlas.

La siguiente sesión que asistí, fue la que dicté yo mismo: «Tutorial de Integración Contínua». Quedé muy contento con cómo salió. El tutorial duró 2 horas, hubo unos 25 asistentes y casi todos se quedaron hasta el final. Un desafio que debí afrontar fue que el 20% de los asistentes trabajaba con la práctica, el 40% la conocia «levemente» pero no la aplicaba y el 40% restante apenas si la habia escuchado. A pesar de esto, creo que logré un buen balance entre la teoría y los detalles de implementación. Para guiar la sesión utilicé este Prezi.

Luego del almuerzo asistí a una sesión excelente dictada por Angel Núñez Salazar (@snahider). La sesión se llamó «Test-Driven JavaScript». En la misma se venimos todo un set de herramientas mientra codificamos un un ahorcado. Saqué un montón de herramientas para investigar: Mocha, Sinon, Chai, Grunt y otras. Quedé deslumbrado por la velicidad con la que trabajó Angél y por la profundidad de sus conocimientos.

La última sesión que asistí fue la dictada por José Romaniello (@jfroma): «Opensource para agilizar». La misma consistió principalmente en ciertas ideas/opiniones que José quería compartir, algunas de las cuales me resultaron muy interesantes. Entre ellas me gustó una que se podria resumir como: «open source no es solamente poner disponible el código, sino que también sea posible realizar aportes».

Finalizada la jornada en UTN, cerramos la jornada en una cerveria del barrio universitario.

Agiles 2012: un poco de contexto

El evento se realiza en Universidad Tecnológica Nacional, Facultad Regional Regional (el mismo lugar donde se realizó JAIIO en año pasado).

En esta ocasión el viaje lo hice junto a mis colegas Kleerianos, salimos de Buenos Aires en un convoy de dos autos alrededor de las 15 hs. y arribamos a Córdoba alrededor de las 22 hs.

El evento está organizado en 3 dias, los 2 primeros de sesiones «tradicionales» y el tercero 100% open space.

En los próximos dias estaré escribiendo sobre lo que vaya aconteciendo en la conferencia.

Probando excepciones

¿Como probar que un método lanza una excepción ante una determinada situación excepcional? Usando NUnit o JUnit 4, basta con escribir el método de prueba y poner una simple anotación indicando el tipo de excepción esperada.

@Test(expected = ExceptionEsperada.class)  
public void xxxxxx(){
      // ejecutamos la código que debiera lanzar la excepción
}

Pero no todos los xUnit brindan esta posibilidad, entonces debemos apelar a una estrategia similar a la siguiente.

public void test_xxxxxx(){
     try{
         // ejecutamos la código que debiera lanzar la excepción
         fail(); // si ejecución llega hasta esta línea, entonces significa que no se lanzó la excepción esperada y por ende la prueba ha fallado
      }
      catch(ExceptionEsperada ex){
          /* si estamos aqui, entonces se ha producido la excepción esperada y no es necesario
             hacer nada pues a menos que se indique que algo ha ido mail, se asume todo estuvo 
             bien */
       }
       catch(Exception ex){
          // si estamos aqui, es que la excepción que se ha lanzado, no es la esperada, por lo tanto la prueba ha fallado
          fail();
       }
    }

Asi de simple, espero les resulte útil.

Escribiendo pruebas unitarias para código legacy

Desde que volví a trabajar en consultoría este es uno de los temas que más me he encontrado. Sinceramente no me sorprende pues:

  • TDD y la automatización de pruebas, son dos temas que están en claro ascenso de popularidad
  • Casi toda la bibliografía de TDD parte de la base de la creación de aplicaciones desde cero
  • Pero en una porción importante de casos, la gente ya cuenta con una aplicación, la cual muchas veces no ha sido diseñada de forma de facilitar su prueba

Casualmente ayer me crucé con un caso extremo. Resulta que hace un par de semanas dicté un workshop de TDD. Ayer me contactó uno de los asistentes para hacer una consulta de como encarar un caso concreto: tenia que agregar una funcionalidad a la una clase existente. La clase en cuestión tenia más de 3000 líneas de código. Si si, leiste bien, son tres ceros después del tres, o sea, tres mil líneas de código. El problema de una clase tan grande, es que resulta dificil que sea cohesiva. Se supone que pasar ser cohesiva, una clase debe hacer UNA cosa y hacer bien. Con tantas líneas, es muy posible que dicha clase esté haciendo demasiadas cosas.

Pero el problema que motivaba la consulta no eran las 3000 líneas de código, sino el constructor de dicha clase. Resulta que el constructor además de recibir varios parámetros, instanciaba un componente para conectarse a la base de datos. Eso impedia realizar una prueba unitaria de la clase, pues el solo hecho de instancialar implicaba conectarse a la base. Tampoco no habia chances de mockear la conexión pues era instanciada directamente dentro del constructor. ¿que hacer entonces?

Lo primero que uno intentaria es hacer un refactoring de la clase, pero dado que no existian pruebas de la misma, cualquier modificación implicaba un gran riesgo. Luego de analizar varias alternativas llegamos a una solución de compromiso, que nos permitiria escribir tests unitarios: agregar un constructor sin parámetros, que tenga la lógica para lanzar un excepción si era invocado en un ambiente distinto al de desarrollo/test. De esta forma podriamos instancias la clase en forma aislada en un ambiente de test y  aseguramos que no sea instanciada de esta forma en caso de estar en un ambiente distinto.

 

Preparando en Tutorial de Integración Continua

Esta semana estuve comencé a preparar el material el tutorial que voy a dictar en Agiles 2012. Decidí tomar como base el material que utilicé para la actividad que hice en Agiles@BsAs.

Entre las modificaciones que pienso incluir están Sonar, Gradle y algo de teoría de continuous delivery.

De cara a adaptar mejor el contenido a las particularidades de la audiencia, generé un formulario para relevar los conocimientos de aquellos que tengan planeado asistir. Este es el formulario en cuestión, que también está publicado junto a la descripción del tutorial en el sitio de la conferencia.

Continuous Delivery en FIUBA

La semana pasada asistí a la presentación del trabajo profesional de Hernán Carrizo.

El trabajo consistió en la implementación de un pipeline de continuous delivery en un proyecto existente. Tomé algunas notas interesantes, de directa aplicación en mi actividad profesional actual. Pero sin duda lo mejor de todo es ver que en Fiuba se hacen trabajos sobre temáticas actuales e incluso innovadoras en un punto.

Algo que me llamó la atención fue una de las preguntas de apertura de la presentación:  ¿Cuanto tiempo lleva poner en producción el cambio de una línea de código?

La presentación y el trabajo en general me resultaron muy interesantes, lo cual no me extraña considerando quienes fueron los directores del trabajo: Carlos Fontela y Juan Gabardini, Say no more.

JAIIO 41: Cursos de métodos ágiles

Del 27 al 31 de Agosto se llevarán a cabo las Jordanas Argentinas de Informática y al igual que el año pasado habrá un conjunto de cursos sobre métodos ágiles. Las jornadas se desarrollaran en la Facultad de Informática de la UNLP. El detalle de los cursos y la información de inscripción está disponible aquí.

Para el curso que dictaré yo (Introducción al desarrollo de software con métodos ágiles) tengo pensado estrenar una nueva dinámica que me compartió Pablito Tortorella en un charla que tuvimos la semana pasada en las oficinas de Kleer.

Más allá de estos cursos, habrá un poco más de «agilismo» en las JAIIO ya que en el contexto del Simposio de Ingenieria de software se presentarán los siguientes trabajos:

  • Reporte de experiencia: utilización de métricas en Scrum para analizar y mejorar la productividad de un equipo
  • Marco para evaluar el valor en metodología SCRUM
  • Improving Software Engineering Teaching by Introducing Agile Management

Sobre el Open Space de Educación

Me resultó muy interesante. Estimo que hubo alrededor de 30 personas de perfiles muy variados. La mayoría eramos de sistemas, pero también había gente de eduación de distintos ámbitos: sindicalismo, idiomas, educación social, etc, etc.

Hubo más propuestas de sesiones que los slots que teniamos disponibles, pero algunos de los que las habian propuesto fueron solidarios para juntar sus sesiones y que así todos los temas sean tratados.

Luego de la planifinición inicial, comenzamos con una sesion plenaria de Lightning Talks  de 3 minutos donde algunos de los asistentes compartimos técnicas/experiencias realizadas en nuestros respectivos contextos. En esta sesión Pablo Roca presento el proyecto Nahual.

Después de eso participé en las siguientes sesiones:

  • Evaluación: esta sesión fue propuesta Jorge Silva y Mariano Tugnareli. Compartimos distintas problemáticas y técnicas relacionadas a la evaluación: la evaluación como instancia de aprendizaje, la evaluación de pares, la evaluación en cursos masivos, etc.
  • Tutorias: esta sesión resultó de fusionar 3 sesiones relacionadas a las dificultades de enseñanza en los primeros años de la universidad. Yo compartí mi expericiencia como tutor en el programa PACENI y otros asistentes comentaron las dificultades que afrontaban en sus correspondientes ámbitos. Sinceramente no sacamos nada en límpio, fue más bien una sesión de catarsis.
  • Actividades: esta sesión fue propuesta por Juan Gabardini y la idea era compartir técnicas/dinámicas para enseñar en el aula. Comentamos más de 15 técnicas, muy interesante.

También hubo algunas otras sesiones sobre trabajo con niños, training from the back of the room y aprendizaje por descubrimiento.

Personalmente me resultó muy enriquecedor y me llevé algunas cosas para probar en mis materias.

Retrospectiva de Ing. de Software, primer cuatrimestre 2012

Antes de entrar en detalle sobre los resultados de la retrospectiva, quiero destacar por qué hacemos restrospectivas. La respuesta es simple: para mejorar. La idea es revisar como se desarrolló la materia intentando identificar puntos positivos y negativos, y partir de su análisis definir: qué cosas mantener, qué cosas cambiar y que cosas probar. Ahora sí, vamos a la restrospectiva.

Para la retrospectiva, utilizamos la técnica del timeline, mi favorita para estos casos (cierre de cuatrimestre). Lamentablemente, solo participaron 5 de los 7 alumnos. De todos los items identificados, una cuarta parte estaba relacionada a cuestiones «de ambiente» ajenas a la materia y sobre las cuales prácticamente no tengo posibilidad de influencia (por ejemplo: fallas en la infrastructura informática de la universidad). Respecto del resto de los items, esto es lo relevante:

Items a mantener

  • Estructurada iterativa de la materia
  • Actividades de aplicación
  • Dictado de una clase en forma remota
  • Presentación de invitados de la industria
  • Dinámica de evaluación final
  • Restrospectiva al final de cada iteración y restrospectiva final

Cuestiones a mejorar

  • Dificultades varias con Sinatra
    • Recomendar un tutorial y darlo con anticipación suficiente
  • Evaluación online
    • Hacer revisar las preguntas por un tercero para asegurar que sean claras y evitar posibles ambigüedades
    • Hacer una al final de cada iteración
    • Resolver las dificultades técnicas de la herramienta para permitir ver el resultado y las respuestas correctas al finalizar la evaluación
  • Retos del profesor (si, yo, los sermoneo mucho cuando no cumplen con las tareas)
    • No calentarme tanto
    • Mejorar las formas
    • Automatizar la corrección y parte del feedback con alguna herramienta
  • Material utilizado en clase no disponible (en algunas clases utilicé ppts que luego no compartí)
    • Publicar el material utilizado o bien ser explícito de antemano que no será publicado
  • Poca visibilidad de las notas
    • Publicar las notas al final de cada iteración

Para probar

  • Lecturas voluntarias: compartir algunas lecturas/videos opcionales que les permitan sumar «puntos adicionales» al presentarlos al resto de la clase
  • Proveer una guia de lectura para todas las lecturas, asi leen más enfocados
  • Dedicar los primeros 10 minutos de la primer clase de la semana para repasar los puntos destados de la lectura realizada

Bueno, esto es todo, voy a intentar incorporar todas estas cuestiones el próximo cuatrimestre.

Cómo enseñar/aprender a estimar

Tengo la impresión de que este es un tema muy pobremente tratado en los contextos académicos. Digo esto basado en mi experiencia personal y en lo que he hablado con varios colegas.

En mi caso vi la temática estimación en una clase en una materia, donde el docente realizó una explicación de diversos métodos. Nada más, sólo una explicación teórica. Nada de práctica para pudieramos entener mejor los métodos. Lamentablemente creo que esto no fué una situación aislada, pues he hablado con varios colegas de diversas casas de estudios y la situación no es muy distinta.

Personalmente creo que la estimación, al igual que varias de las actividades de la ingenieria de software, es una actividad que se aprende a partir de la práctica.

Cuando tuve que preparar el tema estimaciones para la materia que dicto en UNQ, determiné utilizar el siguiente enfoque:

  1. Explicar algunas generalidades sobre estimación (quien, cuando, para que, etc)
  2. Comentar brevemente los métodos más difundidos
  3. Explicar en detalle dos métodos
  4. Hacer un ejercicio grupal de estimación en clase
  5. Darles un apunte para lean y refuercen lo explicado en clase
  6. Pedirle a los alumnos que estimen cada tarea de la materia antes de realizarla
  7. Hacer un segundo ejercicio grupal de estimación en clase

El punto (6) lo hemos hecho a lo largo de todo casi toda materia, estimando y planificando cada tarea (esto es: cada alumno lleva un excel donde registra cuando va realizar la tarea de la materia y cuando tiempo estima decicarle). Luego de realizada la tarea, deben registrar también el tiempo real insumido. Con esto apunto a que los alumnos no solo hagan el ejecicio de estimar, sino que también se acostumbren a planificar.

Obviamente este enfoque me lleva más de una clase, pero creo que bien vale la pena.