taiage/bloque3/tema9.md

452 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Bloque 3 · Tema 9
# Repositorios: estructura y actualización. Generación de código y documentación. Metodologías de desarrollo. Pruebas. Programas para control de versiones. Plataformas de desarrollo colaborativo de software.
---
# 1. Esquema introductorio (visión rápida)
**Control de versiones**
→ Sistema que registra los cambios en el código a lo largo del tiempo.
**Tipos de repositorios**
- Locales, centralizados (SVN), distribuidos (Git)
**Metodologías de desarrollo**
- Tradicionales: cascada, espiral
- Ágiles: Scrum, Kanban, XP
**Pruebas de software**
- Unitarias, integración, sistema, aceptación
- Caja blanca vs. caja negra
**Plataformas colaborativas**
- GitHub, GitLab, Bitbucket
---
# 2. Repositorios: concepto y estructura
## 2.1 Qué es un repositorio
Un **repositorio** (*repository* o *repo*) es un almacén centralizado o distribuido donde se guarda el código fuente y el historial de todos los cambios realizados sobre él.
Contiene:
- El **árbol de trabajo** (*working tree*): los archivos actuales.
- El **historial de commits**: cada instantánea del proyecto.
- Las **ramas** (*branches*): líneas de desarrollo paralelas.
- Las **etiquetas** (*tags*): marcas en commits concretos (versiones).
- Los **metadatos** del sistema de control de versiones.
## 2.2 Tipos de repositorios
### Repositorio local
- Existe solo en el equipo del desarrollador.
- Sin colaboración directa.
### Repositorio centralizado (VCS centralizado)
- Un único servidor central almacena el historial.
- Los desarrolladores hacen *checkout* del servidor.
- Ejemplos: **SVN (Subversion)**, CVS.
- Desventaja: punto único de fallo; sin acceso hay sin historial.
### Repositorio distribuido (DVCS)
- Cada desarrollador tiene una copia completa del repositorio (historial incluido).
- Se puede trabajar sin conexión.
- Ejemplos: **Git**, Mercurial.
- Ventaja: redundancia, velocidad, flujos de trabajo flexibles.
## 2.3 Estructura de un repositorio Git
```
proyecto/
├── .git/ ← Directorio oculto con todos los metadatos de Git
│ ├── HEAD ← Apunta a la rama actual
│ ├── config ← Configuración del repositorio
│ ├── objects/ ← Objetos (blobs, trees, commits, tags)
│ ├── refs/
│ │ ├── heads/ ← Ramas locales
│ │ └── tags/ ← Etiquetas
│ └── index ← Área de staging (índice)
├── src/
├── tests/
└── README.md
```
## 2.4 Objetos internos de Git
| Objeto | Descripción |
|--------|-------------|
| **blob** | Contenido de un archivo |
| **tree** | Directorio (lista de blobs y otros trees) |
| **commit** | Instantánea + autor + mensaje + referencia al commit padre |
| **tag** | Referencia con nombre a un commit concreto |
Todos los objetos se identifican por su **hash SHA-1** (40 caracteres hexadecimales).
---
# 3. Control de versiones con Git
## 3.1 Áreas de trabajo en Git
```
Working Directory → Staging Area (index) → Repositorio local → Repositorio remoto
(editar) (git add) (git commit) (git push)
```
| Área | Descripción |
|------|-------------|
| **Working directory** | Archivos que ves y editas |
| **Staging area** | Archivos preparados para el próximo commit |
| **Repositorio local** | Historial de commits almacenado en `.git/` |
| **Repositorio remoto** | Copia en servidor (GitHub, GitLab…) |
## 3.2 Comandos principales de Git
```bash
# Configuración inicial
git config --global user.name "Nombre"
git config --global user.email "email@ejemplo.com"
# Iniciar repositorio
git init # nuevo repo local
git clone URL # clonar repo remoto
# Ciclo básico
git status # ver estado de los archivos
git add archivo.py # añadir al staging
git add . # añadir todo
git commit -m "mensaje" # crear commit
git log --oneline --graph # ver historial
# Ramas
git branch # listar ramas
git branch nueva-rama # crear rama
git checkout nueva-rama # cambiar a rama
git checkout -b nueva-rama # crear y cambiar
git merge otra-rama # fusionar rama
git branch -d rama # eliminar rama
# Repositorio remoto
git remote add origin URL # vincular remoto
git push origin main # subir cambios
git pull origin main # bajar cambios
git fetch origin # descargar sin fusionar
# Etiquetas
git tag v1.0.0 # etiqueta ligera
git tag -a v1.0.0 -m "msg" # etiqueta anotada
git push origin --tags # subir etiquetas
# Deshacer
git revert HASH # crear commit que deshace otro
git reset --soft HEAD~1 # deshacer commit, mantener staging
git reset --hard HEAD~1 # deshacer commit y cambios (¡destructivo!)
git stash # guardar cambios sin commit
git stash pop # recuperar stash
```
## 3.3 Flujos de trabajo (workflows) con Git
### Gitflow
Workflow estructurado con ramas fijas:
- `main` código en producción.
- `develop` integración de features.
- `feature/*` nuevas funcionalidades.
- `release/*` preparación de versión.
- `hotfix/*` correcciones urgentes en producción.
### GitHub Flow / Trunk-Based
- Solo `main` + ramas de feature.
- Pull Request → revisión → merge a main.
- Más sencillo, orientado a despliegue continuo.
### Resolución de conflictos
Ocurre cuando dos ramas modifican las mismas líneas. Git marca el conflicto y el desarrollador debe resolverlo manualmente:
```
<<<<<<< HEAD
código de la rama actual
=======
código de la rama a fusionar
>>>>>>> otra-rama
```
---
# 4. Generación de código y documentación
## 4.1 Generación de código
### Herramientas de generación
| Herramienta | Descripción |
|-------------|-------------|
| **Scaffolding** | Genera estructura básica del proyecto (Rails, Angular CLI, Spring Initializr) |
| **ORM / generadores de mapeo** | Genera clases desde el esquema de BD (Hibernate, Entity Framework) |
| **Generadores de API** | Genera código desde especificación OpenAPI/Swagger |
| **Compiladores / transpiladores** | TypeScript → JavaScript, SASS → CSS |
| **Plantillas (templates)** | Freemarker, Thymeleaf, Mustache |
### Integración Continua (CI) y Entrega Continua (CD)
- **CI (Continuous Integration):** los cambios se integran y construyen automáticamente con cada push.
- **CD (Continuous Delivery):** el software puede desplegarse en cualquier momento.
- **CD (Continuous Deployment):** cada cambio validado se despliega automáticamente.
Herramientas: **Jenkins**, **GitHub Actions**, **GitLab CI/CD**, Travis CI.
## 4.2 Documentación del código
### Javadoc (Java)
```java
/**
* Calcula el área de un círculo.
*
* @param radio El radio del círculo (debe ser positivo).
* @return El área calculada.
* @throws IllegalArgumentException si el radio es negativo.
*/
public double calcularArea(double radio) {
if (radio < 0) throw new IllegalArgumentException("Radio negativo");
return Math.PI * radio * radio;
}
```
### Docstrings (Python)
```python
def calcular_area(radio: float) -> float:
"""
Calcula el área de un círculo.
Args:
radio: El radio del círculo (debe ser positivo).
Returns:
El área calculada.
Raises:
ValueError: Si el radio es negativo.
"""
```
### Herramientas de documentación
| Herramienta | Lenguaje |
|-------------|---------|
| **Javadoc** | Java |
| **Sphinx / pdoc** | Python |
| **JSDoc** | JavaScript |
| **Doxygen** | C, C++, y otros |
| **Swagger / OpenAPI** | APIs REST |
| **ReadTheDocs** | Publicación online |
---
# 5. Metodologías de desarrollo de software
## 5.1 Metodologías tradicionales (predictivas)
### Cascada (Waterfall)
Fases secuenciales, sin retroceso entre ellas:
1. Requisitos → 2. Diseño → 3. Implementación → 4. Pruebas → 5. Despliegue → 6. Mantenimiento
**Ventajas:** simple, bien documentado, adecuado para proyectos estables.
**Inconvenientes:** inflexible ante cambios de requisitos; los errores se descubren tarde.
### Modelo en V
Extiende la cascada asociando cada fase de desarrollo con una fase de pruebas:
- Diseño de sistema ↔ Pruebas de sistema
- Diseño de componentes ↔ Pruebas de integración
- Codificación ↔ Pruebas unitarias
### Modelo en Espiral (Boehm)
Combina iteración con análisis de riesgos en cada ciclo.
Cada espiral: Planificación → Análisis de riesgos → Ingeniería → Evaluación.
### RUP (Rational Unified Process)
- Iterativo e incremental.
- 4 fases: Inicio, Elaboración, Construcción, Transición.
- Usa artefactos UML.
## 5.2 Metodologías ágiles
El **Manifiesto Ágil (2001)** establece 4 valores:
- Individuos e interacciones > procesos y herramientas.
- Software funcionando > documentación exhaustiva.
- Colaboración con el cliente > negociación de contratos.
- Respuesta al cambio > seguir un plan.
### Scrum
| Elemento | Descripción |
|----------|-------------|
| **Sprint** | Iteración de 1-4 semanas con entregable funcional |
| **Product Backlog** | Lista priorizada de funcionalidades |
| **Sprint Backlog** | Tareas del sprint actual |
| **Daily Scrum** | Reunión diaria de 15 min (¿qué hice? ¿qué haré? ¿impedimentos?) |
| **Sprint Review** | Demostración del producto al cliente al final del sprint |
| **Sprint Retrospective** | Mejora del proceso del equipo |
| **Product Owner** | Representa al cliente, prioriza el backlog |
| **Scrum Master** | Facilita el proceso, elimina impedimentos |
| **Development Team** | Equipo autogestionado que desarrolla el producto |
### Kanban
- Visualización del trabajo en un tablero con columnas (Pendiente / En progreso / Hecho).
- Límite de trabajo en curso (WIP limits).
- Flujo continuo sin sprints fijos.
### XP (Extreme Programming)
Prácticas técnicas intensas: **TDD** (Test-Driven Development), **pair programming**, integración continua, refactoring, releases frecuentes.
### Comparativa
| | Cascada | Scrum | Kanban |
|-|---------|-------|--------|
| Plan | Fijo | Iterativo (sprints) | Continuo |
| Cambios | Difíciles | Cada sprint | En cualquier momento |
| Documentación | Extensa | Mínima necesaria | Mínima |
| Adecuado para | Requisitos claros y estables | Proyectos medianos/grandes con cambios | Mantenimiento, flujo continuo |
---
# 6. Pruebas de software
## 6.1 Objetivos de las pruebas
- Detectar defectos (*bugs*).
- Verificar que el software cumple los requisitos.
- Validar que el software satisface las necesidades del usuario.
- Aumentar la confianza en la calidad del producto.
> **Verificación:** ¿estamos construyendo el sistema correctamente?
> **Validación:** ¿estamos construyendo el sistema correcto?
## 6.2 Niveles de prueba
### Pruebas unitarias (Unit Testing)
- Prueban la **unidad mínima de código** (función, método, clase) de forma aislada.
- Se usan mocks/stubs para sustituir dependencias externas.
- Herramientas: **JUnit** (Java), **pytest** (Python), **Jest** (JavaScript).
### Pruebas de integración
- Verifican que varios módulos o componentes funcionan correctamente **juntos**.
- Detectan problemas de interfaz entre módulos.
### Pruebas de sistema
- Prueban el sistema completo como un todo.
- Verifican el comportamiento frente a los requisitos funcionales y no funcionales.
### Pruebas de aceptación (UAT)
- Realizadas por el usuario final o cliente.
- Confirman que el sistema cumple los requisitos del negocio.
- Criterio de **DoD** (Definition of Done).
## 6.3 Técnicas de prueba
### Caja negra (Black-box)
- No se conoce (o no importa) la implementación interna.
- Se prueba la **funcionalidad**: entradas → salidas esperadas.
- Técnicas: particiones de equivalencia, valores límite, tablas de decisión.
### Caja blanca (White-box / Glass-box)
- Se conoce y analiza el código fuente interno.
- Se persigue cubrir el máximo de rutas del código.
- Métricas: **cobertura de líneas**, **cobertura de ramas**, **cobertura de caminos**.
- Técnicas: recorrido de código, análisis de flujo de control.
### Caja gris (Grey-box)
- Combinación de las dos anteriores.
## 6.4 Tipos de pruebas por objetivo
| Tipo | Qué verifica |
|------|-------------|
| **Pruebas de regresión** | Que los cambios nuevos no rompen funcionalidad existente |
| **Pruebas de rendimiento / carga** | Comportamiento bajo condiciones de estrés |
| **Pruebas de seguridad (Pen Testing)** | Vulnerabilidades explotables |
| **Pruebas de usabilidad** | Facilidad de uso para el usuario |
| **Pruebas de accesibilidad** | Cumplimiento de estándares WCAG |
| **Smoke testing** | Verificación rápida de las funciones básicas |
| **Pruebas de humo / regresión automatizadas** | CI/CD pipeline |
## 6.5 TDD Test Driven Development
Ciclo **Red → Green → Refactor**:
1. **Red:** escribir un test que falle (la funcionalidad no existe aún).
2. **Green:** escribir el código mínimo para que el test pase.
3. **Refactor:** mejorar el código sin romper los tests.
**Ventajas:** código más simple, mejor diseño, alta cobertura de tests, documentación viva.
---
# 7. Plataformas de desarrollo colaborativo
## 7.1 GitHub
- Mayor plataforma de alojamiento de código Git basada en la web.
- **Pull Request (PR):** propuesta de cambios para revisión antes de mergear.
- **Issues:** gestión de tareas, bugs y mejoras.
- **GitHub Actions:** CI/CD integrado.
- **GitHub Pages:** alojamiento de sitios estáticos.
- **GitHub Copilot:** asistente de código basado en IA.
- Propiedad de Microsoft (desde 2018).
## 7.2 GitLab
- Alternativa a GitHub, disponible también como instalación **on-premise**.
- Incluye CI/CD integrado muy completo.
- **GitLab CI/CD Pipelines** con fichero `.gitlab-ci.yml`.
- Gestión de proyectos, wikis, registros de contenedores Docker.
- Muy usado en la Administración Pública y entornos corporativos.
## 7.3 Bitbucket
- Propiedad de **Atlassian** (misma empresa que Jira y Confluence).
- Integración nativa con Jira para gestión de proyectos.
- Compatible con Git y Mercurial (Mercurial fue descontinuado en 2020).
- Muy usado en entornos empresariales con ecosistema Atlassian.
## 7.4 Otras herramientas
| Herramienta | Tipo | Descripción |
|-------------|------|-------------|
| **Jira** | Gestión de proyectos | Seguimiento de tareas, sprints, backlog |
| **Confluence** | Documentación | Wiki corporativa |
| **SonarQube** | Calidad de código | Análisis estático, detección de code smells |
| **Jenkins** | CI/CD | Servidor de automatización open-source |
| **Docker Hub** | Registro de contenedores | Imágenes Docker públicas y privadas |
| **Nexus / Artifactory** | Repositorios de artefactos | Maven, npm, Docker |
## 7.5 Funcionalidades colaborativas clave
| Función | Descripción |
|---------|-------------|
| **Fork** | Copia independiente de un repositorio en tu cuenta |
| **Pull Request / Merge Request** | Solicitud para integrar cambios tras revisión |
| **Code review** | Revisión del código por otro desarrollador antes de mergear |
| **Branch protection** | Impide push directo a ramas protegidas (ej. main) |
| **Webhooks** | Notificaciones automáticas a servicios externos en cada evento |
| **Wiki** | Documentación del proyecto integrada en la plataforma |
---
# 8. Resumen: conceptos clave para el examen
| Concepto | Dato clave |
|----------|-----------|
| DVCS | Sistema de control de versiones distribuido; cada clon tiene el historial completo |
| Git | DVCS más usado; crea repositorios con `.git/` |
| Commit | Instantánea del proyecto identificada por hash SHA-1 |
| Branch | Línea de desarrollo paralela; `main` es la rama principal |
| Merge | Fusión de dos ramas |
| Gitflow | Rama main + develop + feature/* + release/* + hotfix/* |
| CI/CD | Integración y entrega/despliegue continuo (Jenkins, GitHub Actions…) |
| Cascada | Fases secuenciales, sin retroceso |
| Scrum | Sprints, Product Owner, Scrum Master, Daily, Review, Retrospective |
| Kanban | Tablero visual, límites WIP, flujo continuo |
| TDD | Test → Código → Refactor (Red → Green → Refactor) |
| Prueba unitaria | Prueba la unidad mínima de forma aislada |
| Prueba de integración | Prueba varios módulos juntos |
| Prueba de aceptación (UAT) | La realiza el usuario final |
| Caja negra | Prueba funcionalidad sin ver el código |
| Caja blanca | Prueba conociendo la implementación interna |
| Pull Request | Propuesta de cambios para revisión antes de mergear |
| GitHub / GitLab / Bitbucket | Principales plataformas de desarrollo colaborativo |
| SonarQube | Análisis estático de calidad del código |