Lean Product Development

viernes, 4 de mayo de 2007

Lean es una metodologia genérica para mejorar la calidad y productividad. Es usada exitosamente en industrias de manufacturación o logística.

Lean Product Development es una variación de la metodologia Lean, toma los principios Lean para aplicarlos en el diseño y producción de software. Se basa en la identificación y eliminación de cualquier fuente que genere "desperdicios", para que los objectivos globales se cumplan exitosamente, estimulando la productividad. El uso de esta metodologia puede ser el paso previo al uso de metodologías de las llamadas Agiles.

Los principios Lean, aplicados al desarrollo de software, son:
  • Eliminar los desperdicios
    Es el principio fundamental y del cual dependen el resto de los principios.

    Significa invertir el tiempo solo en aquello que agregue valor real.
    Hay que entender cual es el valor real y qué actividades y recursos son necesarios para crearlo. A menudo, el trabajo de determinar qué es y qué agrega valor se hace en los niveles altos de la jerarquía.

    Los principales tipos son:
    Funcionalidad que se desarrolla y no se utiliza en producción. Esto genera código extra, el cual tuvo que seguirse, compilarse y testearse, el mismo incrementa la complejidad y es un posible punto de fallo.
    La documentación, consume recursos, demoras, se pierde y se vuelve obsoleta. Si se utiliza, que sea solo la necesaria.
    Asignar una misma persona a múltiples proyectos. Cada vez que el desarrollador de software tiene que cambiar entre tareas, pierde un tiempo significativo para recordar de que se trataba el proyecto. Pertenecer a diferentes equipos de trabajo causa más interrupciones que beneficios.
    Las Esperas, uno de los grandes desperdicios, en cuanto a tiempo, es esperar a que sucedan cosas: se espera al comienzo del proyecto, en la definición de requerimientos, en el armado de la excesiva documentación, en la codificación, en revisión y aprobación, en testeo, etc.
    Puesta en marcha, cuando un desarrollador tiene una pregunta, ¿cuanto cuesta encontrar la respuesta? Los requerimientos van a los analistas, de los analistas a los diseñadores, de aquí a los desarrolladores y luego al testeo… en cada pasaje es probable que se pierda algo, ya que un porcentaje de conocimiento tácito queda con el creador del documento y no se transmite.
    Errores en el Software, el porcentaje de desperdicio causado por un error se puede medir como el impacto del mismo por el tiempo sin ser detectado. Hay que encontrarlos en cuanto ocurran, corregirlos, testearlos y actualizar la versión en producción.
  • Ampliar el aprendizaje
    Hay que incrementar el feedback con el usuario,
    para poder determinar con la mayor exactitud posible lo que desea y para resolver los problemas complicados que se presenten. Esto derivará en que la funcionalidad que se desarrolle sea exactamente lo que el usuario deseaba y que la utilice, de esta forma se puede eliminar alguna fuente de despercidio.
    Se puede, por ejemplo, mostrar al usuario los bosquejos de las pantallas de la aplicación y así tener su punto de vista, no solo del diseño visual, sino también de la funcionalidad.

    También es necesario incrementar el feedback dentro del equipo de trabajo, lograr que todos los involucrados conozcan el problema y participen en la resolución.
    Por ejemplo, se pueden hacer tests periódicos para detectar rápidamente cuando un proceso no funciona. Esto nos permite aprender mediante la experimentación.

  • Decidir lo mas tarde posible
    La idea no es aplazar la toma de decisiones, sino poder
    tomar una decisión en el momento de mayor certeza, así la misma estará basada en conocimiento concreto, no en especulación.

    La idea es esperar hasta el momento en que se encuentre disponible la mejor y mayor información. De esta forma, se evitarán cambios en la etapa final del desarrollo, y se bajarán los costos del mismo.

    Por ejemplo, antes de desarrollar una funcionalidad de diferentes formas, es mejor comunicarlas y decidir junto al usuario.

  • Entregar lo mas temprano posible
    Hacer entregas de funcionalidad rápidamente tiene muchas ventajas:
    El usuario tiene la funcionalidad que necesita cuando la necesita
    Se tiene un feedback más confiable por parte del usuario
    Se puede retrasar la toma de decisiones: se pueden tener varias opciones hasta estar mejor informado.
    Es mas claro, para el equipo de trabajo, de qué forma contribuir más efectivamente: pueden resolver qué hacer y cómo por si solos..

  • Dar poder al equipo
    Se le da prioridad a la gente y a los equipos de colaboración por sobre los procesos.
    Al reconocer que las personas que realizan el trabajo son las que conocen los detalles, se focaliza en métodos de formación de equipos para que puedan resolver sus propios problemas. Se los involucra en la toma de decisiones, de esta forma se logra que cada integrante el equipo se sienta participe del proyecto y la organización, y, por lo tanto, usen su potencial al máximo.
    El líder del equipo se encargara de marcar el objetivo, establecer ciertas pautas de trabajo, ser el guía.

  • Construir Integridad
    Se pueden encontrar
    2 clases distintas de integridad: Perceptiva, Conceptual.
    La integridad perceptiva tiene que ver con la percepción que tiene del cliente del sistema, cuanto mas a gusto este y cuanto mas cercano sea a sus exigencias y requerimientos, mas alta será la integridad perceptiva.
    La integridad conceptual significa que el concepto central del sistema trabaje en conjunto, como un todo cohesivo, y es un factor crítico que impacta en la integridad perceptiva.
    Otro nivel de integridad para el software es aquel que esta relacionado con la adaptabilidad del mismo en el futuro. Un software con integridad tiene una arquitectura coherente, se ajusta a los propósitos, es mantenible, adaptable y extensible fácilmente.
    La integridad se puede lograr con un sabio liderazgo, comunicación efectiva y una disciplina saludable.

  • Ver el Todo
    La integridad, en sistemas complejos, require una profunda experiencia en diversas areas. Uno de los problemas mas difíciles a tratar en el desarrollo de un producto es que los expertos en alguna area especifica tienden a maximizar la performance de la parte del producto que representan, en lugar de hacer foco en la performance del sistema en gral. Esto se denomina Sub-Optimización. El desafio es implementar practicas que la eliminen.

Conclusión

La aplicación de los principios Lean en el desarrollo de software permite mejorar los procesos y asi obtener mejores resultados.

Aumenta la calidad del producto, posibilitando bajar los costos y acortar los tiempos de desarrollo.

Estos principios son una guia, son algo general y universal, las metodologias agiles serian la forma de aplicar esta guia en la practica, indican qué hacer, adaptadas al dominio.

Lo importante es poder entender y adoptar la escencia de los principios Lean. Es claro que su aplicación puede ser dificil en algunas companias, ya que requiere un cambio importante en la cultura y en los habitos organizacionales. Pero las mejoras que se pueden lograr son importantisimas, no solo en el producto final sino tambien en su evolución, en la participación, compromiso y satisfacción de las personas involucradas.


Para leer mas sobre LSD y como aplicarlo: "Lean Software Development: An Agile Toolkit", autores: Mary y Tom Poppendieck.