## Bloque 3 Tema 9. Repositorios y control de versiones. Generación de código. Metodologías de desarrollo software. Pruebas del software. Plataformas de gestión del ciclo de vida software.

Este tema estudia las herramientas y metodologías que estructuran el ciclo de vida completo del desarrollo de software.

---

## 1. Repositorios y control de versiones

Un repositorio es el almacén centralizado que guarda el código fuente de un proyecto junto con el historial completo de todos los cambios realizados. Permite colaborar en equipo, revertir cambios, gestionar versiones paralelas mediante ramas y auditar quién modificó qué y cuándo.

Los tipos de repositorios son tres. El repositorio local existe únicamente en la máquina del desarrollador. El repositorio centralizado, como SVN o Subversion, tiene un único servidor central con todo el historial; su principal inconveniente es que si el servidor falla nadie puede trabajar. El repositorio distribuido, como Git y Mercurial, hace que cada desarrollador tenga una copia completa del repositorio con todo el historial; esto elimina el punto único de fallo y permite trabajar sin conexión.

Git es el sistema de control de versiones distribuido más utilizado. Su estructura interna se basa en objetos identificados por un hash SHA-1. Los tipos de objetos son el blob, que almacena el contenido de un fichero; el tree, que representa un directorio; el commit, que es una instantánea del proyecto con autor, mensaje y referencia al commit anterior; y el tag, que es una referencia nombrada a un commit concreto.

Las tres áreas de trabajo en Git son el directorio de trabajo donde se editan los ficheros, el área de staging o índice donde se preparan los cambios con el comando git add, y el repositorio local donde se guardan los commits con el comando git commit. El repositorio remoto es el cuarto nivel, al que se envían los commits con git push.

Los flujos de trabajo con Git más conocidos son Gitflow, que usa las ramas main, develop, feature, release y hotfix; y GitHub Flow o Trunk-Based Development, que es más sencillo y usa solo la rama principal con ramas de feature de corta duración y Pull Requests.

---

## 2. Generación de código

El scaffolding o andamiaje es la generación automática de la estructura inicial de un proyecto mediante herramientas de línea de comandos. Los generadores ORM crean automáticamente el código de acceso a la base de datos a partir del modelo de datos. OpenAPI permite generar código cliente y servidor a partir de la especificación de una API REST.

La integración continua y el despliegue continuo, conocidos como CI/CD, automatizan el proceso de compilación, pruebas y despliegue. Las herramientas más conocidas son Jenkins, GitHub Actions y GitLab CI/CD.

La documentación del código se genera automáticamente a partir de los comentarios del código fuente. Las herramientas principales son Javadoc para Java, JSDoc para JavaScript, Sphinx para Python y Swagger u OpenAPI para APIs REST.

---

## 3. Metodologías de desarrollo software

Las metodologías de desarrollo son los marcos de trabajo que guían cómo se planifica, desarrolla y entrega el software.

Las metodologías tradicionales o predictivas siguen un plan detallado desde el principio. La metodología en cascada o waterfall divide el proyecto en fases secuenciales: requisitos, análisis, diseño, implementación, pruebas y mantenimiento. Su principal inconveniente es la rigidez ante cambios. El modelo en V extiende la cascada asociando a cada fase de desarrollo una fase de pruebas correspondiente. El modelo espiral de Boehm es iterativo e incorpora el análisis de riesgos en cada iteración. La metodología RUP o Rational Unified Process divide el proyecto en cuatro fases: Inicio, Elaboración, Construcción y Transición, y usa UML para el modelado.

Las metodologías ágiles nacen del Manifiesto Ágil publicado en 2001. Sus cuatro valores son: los individuos y las interacciones sobre los procesos y las herramientas; el software funcionando sobre la documentación exhaustiva; la colaboración con el cliente sobre la negociación de contratos; y la respuesta ante el cambio sobre seguir un plan.

Scrum es el framework ágil más usado. Se organiza en iteraciones llamadas Sprints de una a cuatro semanas. Los roles son el Product Owner, que gestiona el Product Backlog y prioriza los requisitos; el Scrum Master, que facilita el proceso y elimina impedimentos; y el Development Team, que desarrolla el producto. Los eventos son la Sprint Planning para planificar el Sprint, el Daily Scrum de quince minutos para sincronización diaria, la Sprint Review para demostrar el trabajo completado y la Retrospectiva para mejorar el proceso.

Kanban es un sistema de gestión visual del trabajo basado en un tablero con columnas que representan los estados del trabajo, habitualmente Pendiente, En progreso y Hecho. El principio fundamental es limitar el trabajo en curso mediante los límites WIP o Work In Progress para evitar la acumulación de tareas y mejorar el flujo.

XP o Extreme Programming aplica prácticas técnicas como el desarrollo guiado por pruebas o TDD, la programación en parejas, la integración continua y el refactoring constante.

---

## 4. Pruebas del software

Las pruebas del software son el proceso de verificar que el sistema hace lo que debe hacer y detectar los defectos antes de que lleguen al usuario.

Los niveles de pruebas son los siguientes. Las pruebas unitarias comprueban el funcionamiento de unidades mínimas de código como funciones o métodos de forma aislada usando objetos simulados llamados mocks o stubs. Las herramientas son JUnit para Java, pytest para Python y Jest para JavaScript. Las pruebas de integración verifican que varios módulos o componentes funcionan correctamente al trabajar juntos. Las pruebas de sistema comprueban el sistema completo integrado. Las pruebas de aceptación o UAT son realizadas por el usuario final para verificar que el sistema cumple los requisitos; su criterio de aprobación se define en el DoD o Definition of Done.

Los enfoques de prueba son los siguientes. La caja negra prueba la funcionalidad sin conocer la implementación interna, analizando las entradas y salidas. Las técnicas incluyen las particiones de equivalencia y los valores límite. La caja blanca prueba conociendo el código interno y busca maximizar la cobertura de líneas, ramas y caminos posibles. La caja gris combina ambos enfoques.

Otros tipos de pruebas son las de regresión, que comprueban que los cambios no han roto funcionalidades existentes; las de rendimiento o carga, que verifican el comportamiento bajo alta demanda; las de seguridad o pen testing; las de usabilidad; las de accesibilidad; y el smoke testing, que son pruebas rápidas para verificar que el sistema arranca y funciona básicamente.

El desarrollo guiado por pruebas o TDD sigue el ciclo Red, Green, Refactor: primero se escribe una prueba que falla, luego se escribe el código mínimo para que pase y finalmente se refactoriza el código manteniendo las pruebas en verde.

---

## 5. Plataformas de gestión del ciclo de vida

Las plataformas de alojamiento de repositorios más importantes son las siguientes. GitHub es la plataforma más popular a nivel mundial. Fue adquirida por Microsoft en 2018. Sus funcionalidades principales son los Pull Requests para revisar y fusionar código, los Issues para gestionar tareas y errores, GitHub Actions para CI/CD, GitHub Pages para publicar sitios web y GitHub Copilot para asistencia con inteligencia artificial. GitLab permite instalación en servidores propios llamada on-premise, tiene CI/CD nativo mediante ficheros .gitlab-ci.yml y es muy utilizada en las Administraciones Públicas por razones de soberanía y control. Bitbucket es la plataforma de Atlassian, integrada con Jira y Confluence.

Otras herramientas del ciclo de vida son Jira para la gestión de proyectos y seguimiento de incidencias, Confluence para la documentación colaborativa, SonarQube para el análisis estático de calidad del código, Jenkins para la automatización de CI/CD y Docker Hub para el alojamiento de imágenes de contenedores.

Las funcionalidades colaborativas comunes a estas plataformas son el fork o copia del repositorio, el Pull Request o Merge Request para proponer cambios y revisarlos, el code review o revisión de código, la protección de ramas, los webhooks para integraciones y la wiki para documentación.

---

## Miniresumen final del tema

Git es el sistema de control de versiones distribuido más usado, con áreas working, staging, repositorio local y remoto. Las metodologías ágiles nacen del Manifiesto de 2001; Scrum usa Sprints, Product Owner, Scrum Master y Daily; Kanban usa tablero con límites WIP. Las pruebas se dividen en unitarias, integración, sistema y aceptación; caja negra sin ver código, caja blanca con código. TDD sigue el ciclo Red Green Refactor. GitHub fue adquirida por Microsoft en 2018; GitLab es la opción on-premise preferida en las Administraciones Públicas; SonarQube analiza la calidad del código.
