Lean Code

En la Software Craftsmanship 2011 tuve la suerte de asistir a una sesión sobre Lean Code, impartida por Chris Parsons. Las slides de la sesión están en su blog. La idea principal era aplicar los principios de Lean Manufacturing al desarrollo software, Lean Software Development.

La idea fue popularizada en el libro Lean Software Development de Mary Poppendieck y Tom Poppendieck y ha sido desarrollada en posteriores libros. Los principios Lean se pueden resumir en los siguientes puntos:

  1. Eliminar desperdicios (waste): todo lo que no aporta valor al cliente es superfluo, se considera un desperdicio y se deben minimizar o eliminar. Es interesante la clasificación de desperdicios (7+1) y su equivalencia en el desarrollo software:
    • Defectos (la falta de calidad es un desperdicio)
    • Esperas
    • Inventario
    • Transporte
    • Sobreproducción (fabricación de demasiados productos, lo que lleva a inventarios y gastos que tiene que asumir el cliente final)
    • Movimiento
    • Sobreproceso (entendido como la construcción de productos que hacen demasiadas cosas no útiles o que no necesita el cliente).
    • Infrautilización de las personas (como desperdicio de habilidad o talento)
  2. Entregar tan rápido como se pueda: Esta idea ha arraigado bien en el mundo del desarrollo, los ciclos de feedback son vitales para que el sistema solucione las necesidades reales y actuales del cliente.
  3. Decidir lo más tarde posible: Tomar decisiones en el último momento responsable, basadas en hechos y no en suposiciones. En The Art of Lean Software Development comentan una anécdota del desarrollo del Toyota Prius. Al parecer en las especificaciones de desarrollo no se concretaba el tipo de motor, sólo unas limitaciones en consumo. Toyota trabajó en base a esas especificaciones y paralelamente en varios diseños de motores, hasta que en el último momento posible se decidieron por un tipo específico de motor híbrido. Este principio parece que entra en conflicto con eliminar desperdicios, en el ejemplo del Prius se podría ver cómo desperdicio el diseño de motores que al final no se escogieron, pero el resultado final podría haber sido un desperdicio completo si no se hubiese tomado la decisión en el último momento posible, basada en hechos.
  4. Dar poder al equipo: La metodología Lean se centra en crear el ambiente correcto para que los desarrolladores puedan hacer su trabajo, eliminando impedimentos y dejándoles tomar decisiones.
  5. Ver el total: Se puede resumir en la máxima: “Think big, act small, fail fast; learn rapidly“. El producto es más que la suma de sus partes, tenemos que tener en cuenta las interacciones con terceros o dentro del propio equipo.

Lo más interesante (IMHO) de la sesión era el taller práctico en el que intentamos aplicar los principios comentados durante varias iteraciones. Posteriormente discutimos sobre qué entendíamos como waste en desarrollo y el resto de principios aplicados al desarrollo. Casos particulares recurrentes fueron tests que se quedaba desfasados con el cambio de funcionalidad (eliminarlos?, adaptarlos?)…

La experiencia en sí fue muy enriquecedora, la práctica nos reveló carencias técnicas (sobre todo en la interacción con entrada/salida), diferentes enfoques de desarrollo en los equipos (TDD, tests después, sin refactorización…). Hubo grupos que utilizaron sistemas de control de versiones, gente que terminó sin problemas, grupos que refactorizaron entre iteraciones y al final no llegaron…

Esta sesión se celebró después en el AOS2011, con @plagelao de facilitador y, cómo me gustó tanto la experiencia, actúe de facilitador en una sesión en mi empresa, LUCE I.T.. He podido visualizar el resultado de la sesión en tres entornos muy diferentes, con desarrolladores de diferentes niveles y ver las dificultades de cada grupo y los diferentes enfoques técnicos.

Las soluciones técnicas solían recaer en implementaciones llenas de ifs hasta casos más elaborados (en 10 minutos por iteración). Me gustó la simplicidad de aproximación de solución con Hashes de Ruby (ejemplo: DISCOUNT = { ‘A’ => {:quantity => 3, :discount => 20 } }).

Si queréis echar un ojo a la sesión (y estropear el estrés y las prisas que causa la parte práctica ) tenéis las slides traducidas con notas aquí (‘c’ para mostrar algunos comentarios).

Si tenéis alguna duda o queréis saber más, comentad!