Ingeniería del Software II 2011 Tema 3. Procesos ligeros de desarrollo de software. Tipos de procesos ligeros. Tipos de procesos ligeros: Desarrollo Rápido de Software. Desarrollo Ágil. Programación Extrema. Scrum. Escalamiento de Métodos Ágiles. Desarrollo Rápido de Software. Las empresas maniobran en un entorno que cambia constantemente, al cual deben adaptarse para obtener beneficios. El software es parte de casi todas las operaciones industriales, de modo que debe desarrollarse rápidamente para aprovechar las nuevas oportunidades. Además resulta difícil definir un conjunto estable de requisitos, tal y como se requiere en los modelos de procesos tradicionales. Cada vez más se elige rapidez en la entrega en contraposición a la fiabilidad o a la calidad del producto. Principales características: Especificación, diseño e implementación están entrelazados. El sistema se desarrolla como una serie de versiones con los clientes involucrados en la evaluación de las mismas si es necesario. Los interfaces de usuario son a menudo desarrollados usando un IDE y herramientas gráficas. Métodos Ágiles. Nace como contraposición a la percepción generalizada durante los años ochenta y noventa de que una planificación cuidadosa del proyecto conduce a un mejor software. Esta planificación incluye costes significativos en su diseño y documentación y aunque está justificada en el 1 desarrollo de sistemas críticos, donde trabajen múltiples equipos o donde vayan a trabajar muchas personas diferentes a lo largo de su mantenimiento. Los Métodos Ágiles se caracterizan por: Estar centrados en el código más que en el diseño. Basados en aproximaciones iterativas al desarrollo de software. Destinados a entregar software operativo rápidamente y evolucionarlo para satisfacer los requerimientos cambiantes. Los objetivos de los Métodos Ágiles son: Reducir sobrecargas en los procesos software, por ejemplo limitando la documentación. Ser capaces de responder rápidamente a los requerimientos cambiantes sin excesivo trabajo adicional, sin rehacer demasiado trabajo. Manifiesto Ágil. Nace como resultado de las metodologías ágiles para el desarrollo de software, de forma sencilla este manifiesto propone que se valore: Individuos e interacciones sobre procesos y herramientas. Software operativo sobre documentación exhaustiva. Colaboración con el cliente sobre negociación del contrato. Respuesta al cambio sobre seguimiento de un plan. Los 5 principios de los Métodos Ágiles. 1. Participación estrecha del cliente. Los clientes deben intervenir estrechamente durante el proceso de desarrollo. Su función consiste en ofrecer y priorizar nuevos requerimientos del sistema y evaluar las iteraciones del mismo. 2. Entrega incremental. El software se desarrolla en incrementos con el cliente especificando los requerimientos que van a ser incluidos en cada uno. 2 3. Personas, no procesos. Deben reconocerse y aprovecharse las habilidades del equipo de desarrollo. Debe permitirse a los miembros del equipo desarrollar sus propias maneras de trabajar sin procesos establecidos. 4. Adoptar el cambio. Esperar que los requerimientos cambien y, de este modo, diseñar el sistema para adoptar dichos cambios. 5. Mantener la simplicidad. Centrarse en la simplicidad tanto en el software como en el proceso de desarrollo. Siempre que sea posible, trabajar de manera activa para eliminar la complejidad del sistema. Esfuerzo en mejorar del código. Aplicabilidad de los Métodos Ágiles. Las metodologías ágiles son aplicables por ejemplo en: Desarrollo del producto donde una compañía de software elabora un producto pequeño o mediano para su venta. Diseño de sistemas a medida dentro de una organización, donde hay un claro compromiso del cliente por intervenir en el proceso y donde no existen muchas reglas ni regulaciones externas que afecten al desarrollo. Dado su enfoque en equipos reducidos firmemente integrados hay problemas en escalarlos hacia sistemas grandes pero pueden ser aplicados en sistemas pequeños. Problemas con los Métodos Ágiles. Los principales problemas de estas metodologías son: Puede ser difícil mantener el interés de los clientes que intervienen en el proceso. Los miembros del equipo pueden ser inadecuados para la participación intensa característica de los métodos ágiles. Priorizar los cambios puede ser difícil cuando hay múltiples participantes. Mantener la simplicidad requiere trabajo adicional. Los contratos pueden ser un problema, como en otros procesos de desarrollo iterativo. Métodos Ágiles y mantenimiento. La mayoría de las compañías gastan más tiempo manteniendo software que creándolo nuevo. Por lo tanto si los Métodos Ágiles quieren tener éxito también tienen que dar un buen soporte al mantenimiento. 3 Las preguntas resultantes de esta afirmación son: ¿Son los sistemas desarrollados usando una aproximación ágil mantenibles, a pesar del énfasis en minimizar la documentación formal? ¿Los métodos ágiles pueden usarse con efectividad para evolucionar un sistema como respuesta a requerimientos de cambio por parte del cliente? Si el equipo cambia, ¿pueden aparecer otros problemas? Desarrollo Dirigido por un Plan y Ágil. Desarrollo dirigido por un plan: Está basado en etapas separadas con salidas producidas en cada una de ellas planeadas por adelantado. No es necesario seguir un modelo de cascada, es posible el desarrollo incremental. La iteración ocurre dentro de las actividades. Desarrollo Ágil: Especificación, diseño, implementación y prueba están solapados y las salidas se deciden a través de un proceso de negociación durante el desarrollo. La iteración ocurre a través de las actividades. 4 Programación Extrema (XP). Quizás el método ágil mejor conocido y más ampliamente utilizado. Lleva a niveles “extremos” el desarrollo iterativo. Método ágil llevado al extremo. Características: Pueden construirse versiones nuevas varias veces al día. Se entregan incrementos a los clientes cada poco tiempo (sobre 2 semanas variando en base al proyecto). Deben ejecutarse todas las pruebas para cada nueva versión y sólo es aceptada si las supera. Tres principios importantes de la Programación Extrema. 1. Los requerimientos se expresan como escenarios (llamados historias de usuario o casos de uso) que se implementan directamente como una serie de tarea. 2. Los programadores trabajan en pares o parejas. 3. Antes de escribir el código se desarrollan pruebas para cada tarea. Programación Extrema y Principios Ágiles. Desarrollo incremental apoyado por pequeñas y frecuentes liberaciones del sistema. La participación del cliente implica un compromiso a tiempo completo con el equipo de desarrollo. Personas y no procesos a través de programación por parejas, la propiedad colectiva del código y un proceso que evita las jornadas de trabajo largas. El cambio es soportado mediante liberaciones regulares del sistema. Se mantiene la simplicidad mediante la refactorización (depuración) constante del código. Ciclo de Liberación de la Programación Extrema. 5 Prácticas de la Programación Extrema. Planeación incremental. Los requerimientos se registran en tarjetas de historia y las historias que se van a incluir en una liberación se determinan por el tiempo disponible y la prioridad relativa. Los desarrolladores las desglosan en tareas. Pequeñas entregas. Se desarrolla primero el conjunto mínimo de funcionalidad útil que ofrece valor para el negocio. Las entregas son frecuentes y añaden funcionalidad incrementalmente. Diseño simple. Se realiza un diseño estrictamente suficiente para cumplir con los requerimientos actuales. Desarrollar primero las pruebas. Se utiliza un marco de trabajo automático de pruebas para testear cualquier nueva funcionalidad, dicho marco de trabajo es creado antes de que la nueva funcionalidad sea implementada. Refactorización. Se espera que todos los desarrolladores refactoricen el código continuamente tan pronto como sea posible en busca de mejoras. Esta práctica produce código simple y mantenible. Programación por parejas. Los desarrolladores trabajan en parejas, cada uno revisa el trabajo del otro, dando soporte para que siempre se realice un buen trabajo. Propiedad colectiva. Las parejas de desarrolladores trabajan en todas las áreas del sistema de manera que no se desarrollen islas de experiencia y todos los desarrolladores se responsabilicen de todo el código. Cualquiera puede producir cambios. Integración continua. Tan pronto como está completa una tarea se integra en el sistema completo. Después de la integración deben superarse todas las pruebas de unidad para que dicha tarea se considere añadida al sistema. Ritmo sostenible. No se consideran aceptables grandes cantidades de tiempo extra ya que su efecto neto suele ser la reducción de la calidad del código y una rebaja de la productividad media. Cliente in situ. Debe disponerse de un representante del usuario final del sistema (normalmente el cliente) a tiempo completo por parte del equipo. Se le considera un miembro más del equipo y es responsable de traer al equipo los requisitos para su implementación. 6 Escenarios de Requerimientos en la Programación Extrema. El cliente que forma parte del equipo es responsable de tomar decisiones sobre los requerimientos. Los requerimientos de usuario se expresan como escenarios o historias de usuario. Se escriben en tarjetas y el equipo de desarrollo las descompone en tareas de implementación. Estas tareas son la base para la planificación y la estimación de costes. El cliente elige las historias que hay que incluir en cada entrega en base a sus prioridades. Programación Extrema y el Cambio. Una creencia popular en la Ingeniería del Software tradicional es diseñar para cambiar, es decir, se considera valioso gastar tiempo y esfuerzo en anticipar cambios ya que se presupone que esto reducirá costes futuros durante la vida del producto. En contraposición con esta idea la Programación Extrema mantienen que no merece la pena y que los cambios no pueden ser anticipados de modo fiable de manera que es mejor mantener una mejora constante del código o refactorización para facilitar los posibles cambios que en el futuro tengan que se implementados. Refactorización en Programación Extrema. El equipo de programación busca posible mejoras en el software y hace estas mejoras incluso cuando no hay una necesidad inmediata de ellas, esto mejora la compresión del software y reduce la necesidad de documentación. Los cambios son más fáciles de hacer porque el código está bien estructurado, sin embargo algunos cambios requieren refactorización de la arquitectura algo mucho más costoso. Reorganizar una jerarquía de clases para remover código duplicado, ordenar y cambiar de nombre atributos y métodos para que sean más fáciles de comprender o sustituir código por llamadas a métodos incluidos en librerías son ejemplos prácticos de factorización. Pruebas dentro de la Programación Extrema. Probas es primordial para la Programación Extrema y para ello se ha desarrollado un enfoque donde el programa es probado después de cada cambio realizado. Este enfoque determinado se caracteriza por: 7 Desarrollar primero las pruebas. Desarrollo incremental de pruebas a partir de los escenarios. Implicación del usuario en el desarrollo y validación de las pruebas. Uso de marcos de pruebas automatizados para correr todas las pruebas cada vez que se construye una nueva versión. Desarrollar primero las Pruebas. Escribir las pruebas antes de codificar es un método de clarificación de los requerimientos. Son escritas como programas más que como datos de modo que puedan ejecutarse automáticamente y sirvan como verificación de las funcionalidades. Todas las pruebas previas y nuevas se ejecutan automáticamente cuando se añada una nueva funcionalidad, aumentando el control de errores y la depuración del código. Implicación del Cliente en las Pruebas. Ayuda a desarrollar pruebas de aceptación a partir de las historias que van a implementarse en la siguiente versión. Es parte del equipo que escribe las pruebas a medida que el desarrollo avanza y todo el código nuevo es validado para así asegurar que es lo que realmente necesita el cliente. Sin embargo, el cliente tiene disponibilidad muy limitada y es probable que no puedan participar a tiempo completo. Podría creer que aportar los requerimientos es suficiente contribución y ser reacio a intervenir en las pruebas. Dificultades con las Pruebas en Programación Extrema. Los programadores prefieren programar a probar y algunos toman “atajos” cuando escriben las pruebas como no comprobar todas las excepciones. Algunas pruebas pueden ser muy difíciles de escribir de modo incremental. Es difícil juzgar las completitud de un conjunto de pruebas. Programación en Parejas. Los programadores trabajan por pares, sentándose juntos para desarrollar el código en la misma máquina. Las parejas son creadas dinámicamente de modo que todos los miembros del equipo trabajen unos con otros durante el proceso, esto ayuda a desarrollar la idea de propiedad común y responsabilidad del código y extiende el conocimiento en el equipo. 8 Compartir el conocimiento es muy importante porque reduce el riesgo global del proyecto cuando se marchan miembros del equipo, al mismo tiempo programar por parejas sirve como revisión informal ya que el código está “testeado” por dos programadores favoreciendo la factorización. La productividad se mantiene o incluso aumenta ya que los programadores menos experimentados son apoyados por otros con mayor experiencia evitando salidas en falso, rediseño, errores y, aunque para los programadores experimentados pueda suponer una pérdida de productividad realmente el intercambio de información dinamiza el trabajo y reduce los riesgos del proyecto. Administración de un Proyecto Ágil. La responsabilidad principal de los administradores es dirigir el proyecto de modo que el software se entregue a tiempo y con el presupuesto planeado. El enfoque básico o estándar está basado en un plan: Qué se debe entregar. Cuándo se debe entregar. Quién trabajará en su desarrollo. El enfoque para la administración ágil es distinto y debe adaptarse al desarrollo incremental y a las fortalezas y debilidades particulares de los métodos ágiles. SCRUM. Es un método ágil general pero enfocado a la administración del desarrollo iterativo más que a prácticas ágiles específicas. Consta de tres fases: Planificación del boceto donde se establecen los objetivos generales del proyecto y el diseño de la arquitectura del software. Una serie de ciclos sprint donde cada ciclo desarrolla un incremento del sistema. Cierre del proyecto donde se completa la documentación requerida, manuales de usuario etc. En esta fase también se realiza la valoración de las lecciones aprendidas durante el proyecto. El Ciclo Sprint en SCRUM. 1. Los sprints tienen longitud fija, normalmente de 2 a 4 semanas. Corresponden al desarrollo de una liberación del sistema en Programación Extrema. 9 2. El punto de partida es el backlog de producto. Consiste en una lista de trabajo que se tiene que hacer en el proyecto, se revisan dichas tareas y se asignan prioridades y riesgos. 3. El equipo de desarrollo que trabaja con el cliente selecciona las características y la funcionalidad a desarrollar en el sprint. 4. Se organiza el equipo para desarrollar el software, se aísla del cliente y la organización canalizando todas las comunicaciones a través del Maestro de Scrum (Scrum Manager). 5. El papel del Maestro de Scrum es proteger al equipo de desarrollo de “distracciones” externas. 6. Al final se revisa el trabajo hecho y se presenta a los participantes antes de comenzar el siguiente sprint. El Equipo de Trabajo en SCRUM. Maestro de Scrum. Es un facilitador que organiza las reuniones diarias, planifica el trabajo por hacer, registra las decisiones, mide el progreso del proyecto y detecta los retrasos. Sirve como punto de comunicación entre el cliente, la dirección del proyecto y el equipo de desarrollo. Todo el equipo acude a reuniones diarias cortas donde se comparte información, describen su progreso, los problemas y sus planes desde la última reunión. Todos conocen todos los problemas y los progresos del resto del equipo y ayudan a replantear el trabajo a corto plazo y a solucionar dichos problemas de forma colectiva. Beneficios de SCRUM. El producto se desglosa en un conjunto de piezas manejables y comprensibles. Los requerimientos inestables no causan retraso. Todo el equipo tiene visibilidad total del proyecto mediante una comunicación directa y continua. Los clientes ven la entrega a tiempo de los incrementos y obtienen retroalimentación del funcionamiento del producto. Se crea confianza entre los clientes y los desarrolladores, es decir, nace una cultura positiva donde todos esperan el éxito del proyecto. Escalamiento de los Métodos Ágiles. 10 Se ha probado que son exitosos para proyectos de tamaño pequeño y medio que pueden ser desarrollados por un equipo local. Un factor de dicho éxito proviene de la comunicación entre todos los miembros del equipo. Escalar estos métodos conlleva cambiarlos para tratar con proyecto más grandes y largos o donde hay múltiples equipos de desarrollo incluso geográficamente distantes. Desarrollo de Grandes Sistemas. Usualmente son colecciones de sistemas separados que se comunican, desarrollados por distintos equipos, frecuentemente trabajando en diferentes sitios y zonas horarias diversas. Incluyen e interaccionan con sistemas ya existentes, muchos de sus requerimientos tienen que ver con esto y no permiten la flexibilidad y el desarrollo incremental. Cuando varios sistemas se integran para crear un sistema, una fracción significativa del desarrollo tiene que ver con la configuración del sistema más que con el desarrollo del código. A menudo sus procesos de desarrollo están restringidos por reglas externas y regulaciones que limitan la forma en que se llevan a cabo. Tienen un largo tiempo de elaboración y desarrollo. Es difícil mantener equipos coherentes que conozcan el sistema durante todo el desarrollo. Es inevitable que la gente cambie de trabajo o de proyecto. Normalmente tiene un conjunto diverso de participantes, es prácticamente imposible implicar a todos ellos en el desarrollo. Scaling Up y Scaling Out. Scaling Up. (Expansión) Los métodos ágiles se usan para desarrollar grandes sistemas software que no se logran desarrollar por un equipo pequeño. Scaling Out. (Ampliación) Los métodos ágiles se pueden introducir en una gran organización con muchos años de experiencia en el desarrollo de software. Cuando se escalan métodos ágiles es esencial mantener sus fundamentos ágiles: planificación flexible, frecuentes entregas del sistema, integración continua, desarrollo dirigido por pruebas y buenas comunicaciones de equipo. Adaptaciones para Grandes Sistemas. No es posible centrarse sólo en el código, se necesita más diseño y documentación. Tienen que diseñarse y usarse mecanismos de comunicación entre equipos como teléfono, videoconferencias, reuniones electrónicas, email… 11 La integración continua. El sistema completo se construye cada vez que un desarrollador comprueba un cambio, es imposible aunque es esencial mantener construcciones y liberaciones del sistema frecuentes. Adaptaciones para Grandes Compañías. Gerentes sin experiencia pueden ser reticentes al riesgo de un nuevo enfoque. Incompatibilidad con los procesos de calidad y estándares para todos los proyectos. Los métodos ágiles parecen funcionar mejor cuando se tiene un nivel de habilidad relativamente alto, pero puede haber una amplia gama de habilidades. Quizás haya una resistencia cultural en donde se tenga un largo historial de uso de procesos convencionales de ingeniería de sistemas. 12