apuntes:proyectos
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previa | |||
apuntes:proyectos [23/10/2019 18:53] – [SCRUM] Fernando Valdeón | apuntes:proyectos [16/09/2024 19:32] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Gestión de proyectos ====== | ||
+ | |||
+ | ===== Ciclo de vida del Software ===== | ||
+ | El Desarrollo de Software es una área cuyo comienzo se dio exactamente en el año 1948, año en el que la [[https:// | ||
+ | {{ : | ||
+ | Durante años el tiempo de vida de un producto acabado (software) era muy largo; durante este tiempo, generaba beneficios a las empresas, para las que era más rentable este producto que las posibles novedades. | ||
+ | |||
+ | A partir de los 80, esta situación empieza a cambiar. La vida de los productos es cada vez más corta y una vez en el mercado, son novedad apenas unos meses, quedando fuera de él enseguida. Esto obliga a cambiar la filosofía de las empresas, que se deben adaptar a este cambio constante y basar su sistema de producción en la capacidad de ofrecer novedades de forma permanente. | ||
+ | |||
+ | |||
+ | ==== Los roles dentro de un equipo | ||
+ | {{ : | ||
+ | Saber distinguir las obligaciones y limitaciones de cada uno de los roles del equipo ayuda a que el trabajo lo realicen las personas mejor capacitadas para ello, lo que se traduce en mayor calidad. | ||
+ | Roles distintos no necesariamente significa personas distintas, sobre todo en equipos muy reducidos. Una persona puede adoptar más de un rol, puede ir adoptando distintos roles con el paso del tiempo, o rotar de rol a lo largo del día. Hagamos un repaso a los papeles más comunes en un proyecto software. | ||
+ | |||
+ | * Dueño del producto: su misión es pedir lo que necesita (no el cómo sino el qué), y aceptar o pedir correcciones sobre lo que se entrega. | ||
+ | * Cliente: Es el dueño del producto y el usuario final. | ||
+ | * Analista de negocio: También es el dueño del producto porque trabaja codo a codo con el cliente y traduce los requisitos en tests de aceptación para que los desarrolladores los entiendan, es decir, les explica qué hay que hacer y resuelve sus dudas. | ||
+ | * Desarrolladores: | ||
+ | * Arquitectos: | ||
+ | * Administradores de sistemas: Se encargan de velar por los servidores y servicios que necesitan los desarrolladores. | ||
+ | |||
+ | |||
+ | ===== Modelos de desarrollo ===== | ||
+ | ==== Modelo de desarrollo en Cascada ==== | ||
+ | {{ : | ||
+ | Es el más básico de todos los modelos y ha servido como bloque de construcción para los demás paradigmas de ciclo de vida. Está basado en el ciclo convencional de una ingeniería (Se comienza por el principio) y su visión es muy simple: **el desarrollo de software se debe realizar siguiendo una secuencia de fases**. | ||
+ | |||
+ | Cada etapa tiene un conjunto de metas bien definidas y las actividades dentro de cada una contribuyen a la satisfacción de metas de esa fase. Es un modelo de ciclo de vida usado en el software de hace varias décadas, aunque sigue siendo un modelo a seguir ante cierto tipo de desarrollos. | ||
+ | |||
+ | El modelo en cascada abarca las siguientes etapas: | ||
+ | Se parte de las especificaciones o requisitos de un proyecto: qué se debe realizar. Estas pueden estar en documentos, o se pueden obtener de reuniones con el cliente, pero deben tenerse claros antes de comenzar el desarrollo. | ||
+ | |||
+ | - __Análisis__: | ||
+ | - __Diseño__: | ||
+ | - __Codificación o implementación__: | ||
+ | - __Pruebas__: | ||
+ | - __Mantenimiento__: | ||
+ | |||
+ | A veces también se pueden tener en cuenta otras fases como por ejemplo la **fase de documentación** (creamos la documentación del proyecto), o la **fase de implantación** (// | ||
+ | |||
+ | En el modelo vemos una ventaja evidente y radica en su sencillez, ya que sigue los pasos intuitivos necesarios a la hora de desarrollar el software. Pero el modelo se aplica en un contexto, así que debemos atender también a él y | ||
+ | saber que: | ||
+ | * Los proyectos reales raramente siguen el flujo secuencial que propone este modelo. Siempre hay iteraciones, | ||
+ | * Es difífil para el cliente establecer todos los requisitos antes de comenzar. | ||
+ | * El cliente no puede ver una versión operativa del proyecto hasta las etapas finales. **Un error no detectado hasta que el programa esté funcionando conllevará muchos problemas para su solución**. | ||
+ | |||
+ | {{ vimeo> | ||
+ | > | ||
+ | |||
+ | |||
+ | ==== Modelo de desarrollo Iterativo e Incremental ==== | ||
+ | |||
+ | Se basan en realizar una iteración de varios ciclos de vida en cascada realimentados. | ||
+ | {{ : | ||
+ | |||
+ | En la imagen se observa la iteracion (repetición) de distintas fases de desarrollo en cascada para la obtención de un nuevo incremento (versión del programa). | ||
+ | |||
+ | Como ejemplo de aplicación de este modelo se puede considerar el desarrollo de un procesador de textos. En el primer incremento se desarrollan funciones básicas de gestión de archivos y de producción de documentos; en el segundo incremento se desarrollan funciones gramaticales y de corrección ortográfica, | ||
+ | |||
+ | Ventajas: | ||
+ | * No se necesitan conocer todos los requisitos al comienzo | ||
+ | * Permite la entrega temprana de partes operativas de software. | ||
+ | * Las entregas facilitan la realimentación de las siguientes. | ||
+ | |||
+ | Se recomienda cuando los requisitos o el diseño no están completamente definidos y es posible que haya grandes cambios. | ||
+ | |||
+ | **Los procesos ágiles se basan en este modelo**, con iteraciones cortas. | ||
+ | |||
+ | ===== Modelos de desarrollo Ágil ===== | ||
+ | El agilismo es una respuesta a los fracasos y las frustraciones del modelo en cascada. Contempla un enfoque para la toma de decisiones y la forma de organización en los proyectos de software, basándose en los modelos de desarrollo iterativo e incremental, | ||
+ | |||
+ | En el 2001, 17 representantes de las nuevas tecnologías y el desarrollo de software se juntaron para discutir sobre el desarrollo de software. De esa reunión surgio el [[http:// | ||
+ | |||
+ | //" | ||
+ | * **Individuos e interacciones** sobre procesos y herramientas | ||
+ | * **Software funcionando** sobre documentación extensiva | ||
+ | * **Colaboración con el cliente** sobre negociación contractual | ||
+ | * **Respuesta ante el cambio** sobre seguir un plan | ||
+ | //Esto es, aunque los elementos a la derecha tienen valor, nosotros valoramos por encima de ellos los que están a la izquierda."// | ||
+ | |||
+ | Estas ideas se explican en los [[http:// | ||
+ | |||
+ | === ¿En qué consiste el desarrollo ágil? Características=== | ||
+ | * La esencia del agilismo es la habilidad para adaptarse a los cambios. La superación de obstáculos imprevistos tiene prioridad sobre las reglas generales de trabajo preestablecidas. Es decir, se para la forma habitual de trabajo o la forma en la que se lanzan nuevas versiones, para resolver un problema. | ||
+ | * También existen las fases de análisis, desarrollo y pruebas pero, en lugar de ser consecutivas, | ||
+ | * En cada iteración se habla con el cliente para analizar requerimientos, | ||
+ | * Al cliente se le enseñan los resultados después de cada iteración para comprobar su aceptación e incidir sobre los detalles que se estimen oportunos. | ||
+ | * Todo el equipo trabaja unido, y el cliente es parte de él. No es un oponente. La estrategia de juego ya no es el control sino la colaboración y la confianza. | ||
+ | * La jerarquía clásica (director técnico, analista de negocio, arquitecto, programador senior, junior ...) pierde sentido y los roles se disponen sobre un eje horizontal, donde cada cual cumple su cometido pero sin estar por encima ni por debajo de los demás. | ||
+ | * En lugar de trabajar por horas, se trabaja por objetivos y se usa el tiempo como un recurso más. ( Pero existen fechas de entrega para cada iteración). | ||
+ | * En cualquier método ágil, los equipos deben ser pequeños, típicamente menores de siete personas. | ||
+ | * Todo el equipo se reúne periódicamente, | ||
+ | * La aplicación se ensambla y se despliega a diario, de forma automatizada. Las baterías de tests se ejecutan varias veces al día. | ||
+ | * Los desarrolladores envían sus cambios al repositorio de código fuente al menos una vez al día (commit). | ||
+ | |||
+ | El abanico de metodologías ágiles es amplio, existiendo métodos para organizar equipos o proyectos, y técnicas para escribir y mantener el software. Tanto las técnicas de desarrollo de software como las de organización de proyectos se pueden combinar siendo de las más famosas la programación extrema junto con la gestión Scrum. | ||
+ | |||
+ | ==== SCRUM ==== | ||
+ | Es una técnica de __gestión de proyectos__ englobada dentro del paradigma de desarrollo ágil. No se aplica únicamente al desarrollo de software, sino a la gestión de cualquier tipo de proyectos. El nombre de Scrum, se traduce por Melé, palabra del argot del Rugby usada para designar la unión de los jugadores en bloque. | ||
+ | |||
+ | Como las demás, se basa en el desarrollo **iterativo e incremental** en el que el proyecto se planifica en diversos bloques temporales (un mes, normalmente) llamados **Sprints**. Cumple con las características del desarrollo ágil. | ||
+ | |||
+ | La metodología Scrum se organiza de la siguiente forma: | ||
+ | {{ : | ||
+ | |||
+ | ==Fases== | ||
+ | * Reunión inicial | ||
+ | El cliente nos indica qué es lo que quiere. De esta reunión entre el cliente y el //Scrum Master// surge la lista de requisito del producto (//Product Backlog//). Se realiza una sola vez al inicio del proyecto, a diferencia de las demás fases que se realizan en cada Sprint. | ||
+ | * Planificación de la iteración (**Sprint Planning**) | ||
+ | Es una reunión realizada antes de cada Sprint en la que el cliente indica los requisitos prioritarios de la iteración (Sprint), se plantean las dudas y se traducen dichos requisitos a tareas (Sprint Backlog), que deben ser realizadas por cada uno de los miembros del equipo de desarrollo durante el Sprint. Estas tareas se incorporan a un panel que controlará su estado de realización (por hacer, en progreso, terminado, pendiente, etc). | ||
+ | |||
+ | * Ejecución de la iteración (**Sprint**) | ||
+ | Es el bloque de tiempo, iteración, en el cuál se realizan la tareas (2-4 semanas), siendo recomendable que siempre tengan la misma duración y la duración esté definida por el grupo en base a su experiencia. | ||
+ | |||
+ | * Reunión diaria del equipo (**Daily Scrum Meeting**) | ||
+ | Una vez comenzado el Sprint, cada día se celebra una reunión rápida (no más de 10 minutos, siempre puntual y suele ser de pié) en la que se habla del estado de las tareas del Sprint (Sprint Backlog). Se revisan las tareas en proceso del día anterior, y se marcan como terminadas. Se asignan nuevas tareas a miembros del equipos y se ponen en proceso. Solo se habla del estado de las tareas y solo los miembros del equipo pueden hablar. | ||
+ | * Revisión de la entrega (**Sprint Review**) | ||
+ | Es una reunion que se produce al final del Sprint en la que se presenta al cliente el incremento (parte del producto pactada) realizado durante el Sprint. En ella el cliente puede ver cómo han sido desarrollados los requisitos que indicó para el Sprint (Sprint Backlog), si se cumplen las expectativas, | ||
+ | * Retrospectiva (**Sprint Retrospective**) | ||
+ | Cuando se ha terminado un //Sprint//, se comprobarán, | ||
+ | |||
+ | ==Roles== | ||
+ | * Cliente (**Product Owner**) | ||
+ | Es quién plantea los objetivos y requisitos y ayuda al usuario a escribir las **historias de usuario** que se incorporarán al //Sprint Backlog//, definiendo las prioridades. Representa a todas las personas interesadas en el proyecto | ||
+ | * Facilitador (**Scrum Master**) | ||
+ | Se asegura de que se sigan los valores y principios ágiles, de la existencia de las listas de requisitos para cada iteracion, facilita las reuniones, quitar los impedimentos que se van encontrando en el camino y proteger y aislar al equipo de interrupciones. | ||
+ | * Equipo (**Team**) | ||
+ | Tienen un objetivo común, se autoorganizan, | ||
+ | |||
+ | ==Herramientas== | ||
+ | * Lista de requisitos priorizada (**Product Backlog**) | ||
+ | {{ : | ||
+ | Es un documento abierto que representa la lista de objetivos o requisitos, y expectativas del cliente respecto a los objetivos y entregas del producto. Se concreta en la reunión inicial, antes de entrar en la planificación de los Sprints. Solo puede ser modificado por el //product owner// | ||
+ | |||
+ | * Lista de tareas pendientes del Sprint (**Sprint Backlog**) | ||
+ | Lista de tareas que el equipo elabora en la reunión al inicio del Sprint,// | ||
+ | |||
+ | La forma de definir las tareas o los requisitos de cada Sprint se suele hacer en terminos de [[https:// | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | * Gráficos de trabajo pendiente (**Burndown Chart**) | ||
+ | Es un gráfico de trabajo pendiente a lo largo del tiempo, en el que se muestra la velocidad a la que se están completando los requisitos. También ayuda a intuir si el equipo terminará en el tiempo estimado. Lo normal es que la linea que une todos los sprints completados sea descendente, | ||
+ | {{ : | ||
+ | |||
+ | En resumen, Scrum permite conocer en un vistazo rápido cual es el estado general de las cosas, detectando rápidamente qué tareas se han quedado atascadas o qué equipos no están rindiendo al nivel que se esperaba.Es un método de desarrollo ágil ideal para entornos con mucha incertidumbre en cuanto al trabajo a realizar, en los que las tareas cambian muy rápidamente y son susceptibles de olvidarse. | ||
+ | |||
+ | {{ vimeo> | ||
+ | > | ||
+ | ==== Programación Extrema ==== | ||
+ | Conocida comúnmente como **XP** (eXtreme Programming), | ||
+ | |||
+ | Se trata de realizar entregas continuas de software funcional, en cortos ciclos de desarrollo, de modo que el cliente con cada entrega puede indicarnos nuevos requisitos. | ||
+ | Es una metodología enfocada en grupos de desarrollo pequeños en los que hay gran colaboración con el cliente. | ||
+ | |||
+ | Esta forma de trabajar está fundamentada en un modelo de desarrollo incremental con **entregas extremadamente rápidas** y esperando feedback (opinión, información, | ||
+ | {{ : | ||
+ | |||
+ | Prácticas llevadas al extremo: | ||
+ | * Revisión del código -> Revisión diaria, Programación por parejas, Refactorización constante del código | ||
+ | * Probar cada funcionalidad -> Diseño de pruebas unitarias automatizadas para cada pequeña implementación de código. | ||
+ | * Entregas al cliente muy rápidas, cada pocos días. | ||
+ | * Integración equipo-cliente para recibir feedback casi diario, aceptación de cambios y modificaciones. | ||
+ | |||
+ | === Programación por parejas === | ||
+ | Es una técnica de desarrollo ágil de software en la que dos programadores trabajan juntos en el mismo ordenador. Uno, el **controlador** (//o driver//), escribe el código mientras que el otro, el **observador**, | ||
+ | |||
+ | Mientras que el código es revisado por el observador, este va pensando en la dirección estratégica a tomar, incluyendo nuevas ideas para mejoras futuras y anticipándose a futuros problemas. De esta forma el controlador puede prestar su completa atención a terminar la tarea actual, usando al controlador como guía. | ||
+ | {{ : | ||
+ | |||
+ | Características: | ||
+ | * Calidad del Diseño: programas más cortos, diseños mejores, pocos defectos, etc. El código debe ser comprensible para dos programadores, | ||
+ | * Coste reducido de desarrollo: Cuando los defectos son la parte más cara del desarrollo de software, especialmente si se encuentran en etapas avanzadas, se minimizan programando por parejas. | ||
+ | * Aprendizaje y formación: el conocimiento pasa fácilmente entre programadores. | ||
+ | * Superación de problemas difíciles | ||
+ | * Incremento de la disciplina y mejor gestión del tiempo: menos distracciones para cada uno, menos tiempo perdido en tareas ajenas, etc. | ||
+ | * Menos interrupciones externas: cuesta más interrumpir a una pareja que a una persona que trabaja sola. | ||
+ | |||
+ | === Programación dirigida por tests === | ||
+ | Es otra metodología de desarrollo ágil de software en la que primero se escriben las pruebas a partir de unos requisitos funcionales (cómo debe funcionar) y posteriormente se implementa únicamente el código que debe pasar dichas pruebas. De esta forma el programa se enfoca simplemente en la superación de esas pruebas o tests, que corresponden con los requisitos del programa. | ||
+ | |||
+ | Para escribir las pruebas se usa algún framework de **pruebas unitarias** (unit tests), que permita crear tests tan pequeños como para probar si el código sobre el que se aplica pasa o no la prueba. El framework JUnit permite crear pruebas unitarias y es una herramienta habitual en la disciplina de //software testing//. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | ===== Prácticas ==== | ||
+ | - Planificación modelo de desarrollo en cascada. | ||
+ | - Gestión de proyectos Scrum con Trello | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | (c) {{date> %Y}} Fernando Valdeón | ||