Siempre hay algo nuevo que hacer por primera vez. Mi primer merendojo.

En la anterior oportunidad de participar en la realización de una kata me quedé con las ganas. Esta vez no había excusa y acudí desde Cáceres con @jearias, @jlhuertas y @oyabun a la sede de @kinetica_mobile, en Almendralejo, donde nos aguardaba @raultm que hacía de organizador y facilitador. También estaban @CarlosCondor, @branigan y @emorcillo, que fueron más puntuales que nosotros 😉

Estos eventos me gustan mucho porque, como diría Uncle Bob: “si has llegado hasta aquí es que eres programador y quieres mejorar, y eso es una buena noticia porque necesitamos buenos programadores”.

El mecanismo

Las diapositivas proyectadas por @raultm eran elegantes y eficaces

Las diapositivas proyectadas por @raultm eran elegantes y eficaces

Un enunciado se presenta a los asistentes, que por parejas deben solucionarlo usando TDD. Tras el primer pomodoro se cambia de pareja y se borra el código. Y así, sucesivamente.

La kata

El enunciado elegido fue el de la calculadora de números romanos. Dados dos números romanos como cadena, devolver la cadena resultante de sumarla.

El lenguaje

Elegí Java porque lo tengo a mano debido a mi tesis. JUnit para los tests, claro.

Primer pomodoro

Con mi pareja, @oyabun, nos repartimos las tareas de elegir los casos de prueba y resolver la implementación.

Nos negamos por completo, por supuesto, a resolver el test de I+I=II devolviendo el resultado directamente, ya que nos parecía infraingeniería.

El pomodoro acabó y nuestro código resolvía bastantes casos de prueba, pero la implementación no había sido dirigida por los tests porque habíamos buscado la resistencia al futuro permanentemente, perdiendo así la ventaja del TDD.

No obstante, la implementación que se acababa vislumbrando inspiró mucho el segundo pomodoro.

Segundo pomodoro

Con el código borrado y mi nueva pareja, @CarlosCondor, me volvió a tocar el rol de codificar funcionalidad, a elección de éste.

Carlos dirigió los tests muy avispadamente para buscar los puntos que debían forzarme a refactorizar, mientras mi implementación parecía pedirlo cada vez más.

La implementación, esta vez sí, comenzó devolviendo “II” y pasando el primer caso de prueba. Los siguientes fueron abordados con la concatenación de los argumentos.

A medida que Carlos añadía casos especiales con saña, JUnit avisaba explícitamente de la diferencia entre la cadena devuelta (para II+II, por ejemplo, “IIII”) y la cadena esperada (en este caso, “IV”). Animado por la fe del converso, resolvía vagamente los casos añadiendo un mísero replace al resultado. “Resuelve sólo lo necesario para pasar cada test”, reverberaba en mi cabeza el dios del TDD, vestido de verde amor.

Así, el código creció hasta que se convirtió en una función que trataba las entradas con 10 replaces, (IV->IIII,…) y otra que, después de concatenar, volvía a poner todo en su sitio (IIII->VI,…).

Había quedado bastante curiosa la solución. Apretábamos los labios y encogíamos los hombros como diciendo: “ha sido sin querer”.

Tercer pomodoro

Usamos el tercer pomodoro, con @raultm de ojeador, para refactorizar los replaces sacando las constantes a evidentes estructuras de datos que se recorrían con un bucle for, en dos sentidos.

Además, añadimos la operación resta, la multiplicación y la división, usando también replaces entre la invocación que parseaba la entraba y la que corregía la salida.

Catarsis

Una experiencia enriquecedora. Mientras comíamos sandwiches (gracias!!!) hablamos de cómo habíamos obligado a nuestro cerebro a pensar de forma incremental y cómo esto ayudaba a la solución del problema sin necesidad de abordarlo todo junto. También hablamos de diferentes formas de organización en las empresas de software, y comentamos el caso de una famosa iniciativa valenciana 😉

Para mí es fundamental mejorar como profesional del software y compartir tardes con los cracks de mi comunidad más cercana es claramente un paso divertido y necesario.

Gracias a todos, chicos.

Código

He liberado el código en un gist por si alguien quiere verlo.