Sunday, April 14, 2024

Conceptos Lean interesantes para desarrollo de software

 En esta entrega de nuestra serie sobre Lean Software Development, nos enfocaremos en explorar una serie de conceptos fundamentales que no solo enriquecerán nuestro diálogo a lo largo de los próximos artículos sino que también aspiran a despertar la curiosidad del lector para profundizar en ellos de manera independiente. El objetivo es doble: dotarnos de un lenguaje común para discutir principios y prácticas Lean en el desarrollo de software y, al mismo tiempo, incentivar una exploración autodidacta que enriquezca nuestra comprensión y aplicación de estos conceptos en el entorno laboral.

Valor

  • Valor en Lean: Se define desde la perspectiva del cliente. Cualquier acción que satisfaga una necesidad del cliente, solucione un problema o nos permita aprender sobre dicho problema o sobre el comportamiento de la solución, se considera de valor. Es crucial identificar y concentrarse en las actividades que generan valor para aumentar la eficiencia. Si algo no está desplegado y activado, su valor es cero. 
  • Cadena de Valor: Representa la secuencia completa de actividades necesarias para entregar un producto o servicio al cliente. En nuestro caso, la cadena de valor abarca desde entender el problema hasta que la solución (software) está en manos del cliente. Si varios equipos intervienen en esta cadena, es vital identificarlos y optimizar la cadena de valor completa. No basta con ser rápidos en el desarrollo si no podemos implementar adecuadamente la solución, o si ésta no es la correcta. Siempre debemos enfocarnos en optimizar toda la cadena de valor.
  • Flujo / Flow: Se refiere a la manera en que el trabajo avanza de forma continua a través de la cadena de valor. Un flujo óptimo se caracteriza por el movimiento constante del trabajo, sin interrupciones, bloqueos, ni cuellos de botella. El objetivo es mantener un flujo continuo y sostenible en el tiempo, poniendo especial atención en mejorar este flujo a lo largo de toda la cadena de valor.

Eficiencia

  • Eficiencia de Flujo: Esta métrica mide la proporción del tiempo que un ítem de trabajo es activamente procesado en comparación con el tiempo total desde que se inicia hasta que se entrega. Un flujo eficiente busca minimizar el tiempo inactivo. En otras palabras, evalúa la relación entre el tiempo activo de trabajo en un cambio y el tiempo que dicho cambio permanece bloqueado o en espera en una cola. El objetivo es reducir al máximo estos periodos de inactividad para agilizar la entrega.
  • Eficiencia de Recursos: A diferencia de la eficiencia de flujo, la eficiencia de recursos se centra en maximizar la utilización de los recursos disponibles, como personas y máquinas. Este enfoque tiende a mantener a los empleados lo más ocupados posible, lo cual frecuentemente conduce a la especialización de tareas y a la formación de colas de espera antes de cada especialidad. Esto garantiza que cada área (front-end, QA, back-end, operaciones, producto) siempre tenga trabajo. Sin embargo, puede resultar en que cada cambio tome más tiempo en estar disponible para el cliente, contraviniendo los objetivos de Lean Software Development.
  • Eficiencia en Lean: Aunque Lean reconoce ambos tipos de eficiencia, da prioridad a la eficiencia de flujo porque maximiza la velocidad de entrega al cliente. Esto no significa que se ignore la optimización de la eficiencia de recursos, pero la prioridad inicial es el cliente a través de la eficiencia de flujo. Adicionalmente, dado que Lean pone un gran énfasis en la eliminación de desperdicios, la eficiencia global alcanzada suele ser muy alta. Traduciendo a desarrollo de software, primero optimizamos el flujo para poder sacar los incrementos en el menor tiempo posible (eficiencia de flujo) y una vez que tenemos ese proceso funcionando de forma sostenible, optimizamos recursos y tiempo de personas (eficiencia de recursos). En siguientes articulos veremos como optimizar ese flujo continuo de entrega de valor mediante la Entrega Continua / CD y los equipos multi disciplinares. Este fantástico video explica perfectamente los tipos de eficiencia en Lean.


Métricas Lean

  • Throughput: El throughput (o tasa/ritmo/frecuencia de entrega) en una cadena de valor mide cuánto valor se genera para el cliente por unidad de tiempo. En un contexto de manufactura, esto podría referirse al número de piezas o elementos producidos por un proceso en una unidad de tiempo específica (día, hora, etc.). En el desarrollo de software, se refiere a cada incremento que desplegamos y que el cliente puede empezar a usar. Maximizar el throughput es crucial para incrementar la eficiencia en la entrega de valor.
  • Lead Time: Este término se refiere al tiempo total que transcurre desde que se identifica la necesidad de un producto o servicio hasta que éste es entregado al cliente. Reducir el lead time es fundamental para la satisfacción del cliente. En el caso de Lean Software Development, corresponde al tiempo desde que detectamos una necesidad hasta que la solución está disponible para el cliente.
  • Tiempo de Ciclo / Cycle Time: Mide el tiempo que tarda en completarse un ciclo de trabajo específico dentro del proceso de producción. Ofrece una perspectiva del rendimiento operativo interno. Para el desarrollo de software, el tiempo de ciclo se mide desde que comenzamos a trabajar en un incremento hasta que está desplegado y activo para el cliente. El objetivo es minimizar el tiempo de ciclo para obtener retroalimentación de manera más frecuente, lo cual es crucial para la mejora continua. Para más información sobre la importancia de trabajar en pequeños lotes, puedes consultar https://www.eferro.net/2021/01/small-batches-for-win-continuous.html.


  • Trabajo en Progreso (WIP): Este término se refiere a todos los ítems de trabajo que se han iniciado pero aún no se han completado. En el contexto del desarrollo de productos y software, el WIP no solo incluye el código en una rama en la que se está trabajando, sino todo el trabajo y contexto de cualquier incremento que no está desplegado y activado para el cliente. Esto abarca elementos en espera de revisión de código, validación de seguridad, o tareas que están analizadas pero aún no han comenzado. Esencialmente, cualquier trabajo del que el cliente aún no se ha beneficiado pero que hemos comenzado de alguna manera. Cuando se usa como métrica, sería el número de tareas que se encuentran en este estado.
  • Límite de Trabajo en Progreso (WIP Limit): Se refiere a la restricción establecida sobre la cantidad máxima de tareas en curso permitidas en un sistema. Este límite es crucial para mantener el enfoque, reducir el tiempo de entrega y mejorar la calidad, ya que previene la sobrecarga de trabajo y promueve la finalización de tareas antes de comenzar nuevas. Establecer estos límites ayuda al equipo a mejorar su forma de trabajar, enfocándose en entregar valor al cliente en lugar de abrir nuevas tareas cuando se encuentran bloqueos. Mantener un bajo nivel de trabajo en curso minimiza la necesidad de cambiar de tarea, reduciendo así el desperdicio asociado con el cambio de contexto frecuente.


Organización del trabajo / Flujo

  • Just-in-Time (JIT): Este principio se centra en producir y entregar exactamente lo que se necesita, en el momento que se necesita y en la cantidad necesaria. En el desarrollo de software, esto implica realizar muchas actividades solo cuando son necesarias y en pequeños lotes. A nivel de desarrollo, el JIT implica trabajar en pasos muy pequeños y siempre en respuesta a la necesidad actual. Por ejemplo, implementamos una funcionalidad solo cuando hay una demanda real, o proponemos una mejora de arquitectura cuando los requisitos del negocio o del cliente lo requieren. Trabajar de esta manera es muy eficiente, pero requiere flexibilidad en el proceso y buenas prácticas técnicas que permitan agilidad en el trabajo.
  • Procesamiento Pull: Este enfoque asegura que la producción se base en la demanda real, en contraposición al procesamiento Push, que produce según lo planificado. En desarrollo de software, trabajar con un enfoque Pull significa que iniciamos las tareas solo cuando existe una demanda específica del cliente o cuando se basan en hipótesis en negocios no validados. Esto mejora la eficiencia y reduce el exceso de producción. Contrastando con el método Push, que define un plan de trabajo y empuja las tareas independientemente de la demanda real.


Desperdicio / waste

  • Muda: Este término japonés significa "desperdicio". En Lean, se identifican siete tipos de muda que deben ser eliminados para optimizar los procesos: sobreproducción, tiempo de espera, transporte, sobreprocesamiento, inventario, movimientos y defectos. En el próximo artículo de esta serie, describiremos los principales tipos de desperdicio en el desarrollo de producto de software y exploraremos prácticas que nos ayudan a eliminarlos o minimizarlos.
  • Muri: Se refiere al concepto japonés de sobrecarga o esfuerzo innecesario. En el contexto Lean, muri implica una presión excesiva sobre los empleados y los procesos, lo que puede desembocar en ineficiencia y desgaste del personal. La meta de eliminar muri es asegurar que el trabajo y los recursos se optimicen sin sobrecargar el sistema, promoviendo un ambiente laboral eficiente y sostenible. En nuestros equipos, muri puede generarse por un exceso de carga cognitiva o por la presión para completar tareas en un proceso Push. En un proceso Pull, es menos probable que ocurra muri, ya que el WIP está limiteado y solo comenzamos una tarea cuando existe la capacidad disponible al haber concluido otra.
  • Mura: Significa inconsistencia o irregularidad. En Lean, mura se asocia con la variabilidad en los procesos de producción que conduce a ineficiencias y desperdicios. La estrategia para abordar mura incluye la estandarización de procesos y la nivelación de la carga de trabajo, lo que resulta en un flujo de trabajo más constante y predecible, mejorando así la eficiencia y la calidad del servicio o producto. Sin embargo, en desarrollo de software donde la alta variabilidad es inherente (demanda irregular, incertidumbre, alta complejidad, desconocimiento, necesidades emergentes), es más prioritario abrazar el cambio y ser adaptable (usando prácticas de desarrollo ágil), en lugar de intentar evitarlo.


Imagen usada con permiso del autor Jose Manuel Beas

Cambio y mejora

  • Kaizen: Esta filosofía japonesa, cuyo significado es "cambio para mejorar", es fundamental en el pensamiento Lean. Kaizen promueve la mejora continua a través de pequeños cambios graduales que, acumulativamente, resultan en grandes mejoras en eficiencia y satisfacción del cliente. Implica a todos los niveles de la organización y se centra en mejorar los procesos diarios, haciendo que cada empleado participe activamente en la sugerencia de mejoras. Una forma de implementar este proceso Kaizen es mediante retrospectivas y generando el espacio para implantar las mejoras identificadas por el equipo.
  • Kaikaku: En contraste con Kaizen, Kaikaku significa "reforma radical". Este enfoque busca implementar cambios grandes y disruptivos que mejoren significativamente el rendimiento y la eficiencia. Generalmente es iniciado desde la dirección de la empresa o de la unidad y puede llevar a innovaciones revolucionarias. Aunque Kaikaku puede resultar en mejoras substanciales, también conlleva mayores riesgos debido a la magnitud de los cambios que propone. Importante mencionar que el Kaikaku NO se refiere a los cambios técnicos u organizativos que son obligados por situaciones de alto riesgo para la supervivencia de la empresa (bancarrota técnica, caos organizativo, incidentes en producción, etc).
  • A3 Thinking: Este es un enfoque sistemático y estructurado para la resolución de problemas, utilizado dentro de la metodología Lean. A3 Thinking se ayuda de un documento del tamaño de una hoja de papel A3 para condensar el problema, el análisis, las soluciones propuestas y los planes de acción en una vista integral. Este proceso no solo fomenta el pensamiento crítico y la colaboración, sino que también mejora la comunicación entre los miembros del equipo, permitiendo abordar desafíos complejos de manera más efectiva y eficiente. En mi experiencia, el A3 Thinking es una muy buena herramienta para cambios significativos en pasos muy pequeños, sobre todo cuando las mejoras requieren un seguimiento muy detallado y continuo.


Recursos altamente recomendados:

Algunos de los conceptos descritos en este artículo, aunque fundamentales, pueden ser inicialmente contraintuitivos. La experiencia muestra que se suelen entender mejor mediante demostraciones visuales. Por esta razón, os recomiendo encarecidamente ver los siguientes videos, la mayoría de los cuales son bastante cortos, para profundizar y realmente comprender estos principios de manera práctica:

Eficiencia de recursos vs Eficiencia de flujo

WIP Limits:

General processes / Team Work:


Con estas recomendaciones terminamos este pequeño artículo sobre conceptos que nos pueden ser útiles para entender el resto de artículos de la serie sobre Lean Software Development.

En nuestra próxima entrega, nos enfocaremos en Eliminar Desperdicios, uno de los principios claves de Lean Software Development.

¡Nos vemos en la próxima entrega!


Recursos relacionados:

No comments: