Riesgos y calidad
"El proyecto que no identifica riesgos no es un proyecto sin riesgos — es un proyecto donde los riesgos van a aparecer sin aviso."
Qué vas a aprender en este capítulo
Todo proyecto tiene riesgos: técnicos, de negocio, de equipo, externos. Este capítulo cubre cómo identificarlos sistemáticamente, evaluarlos, y mitigarlos antes de que se conviertan en problemas. Y cómo asegurar calidad sin convertirse en gate-keeper que frena al equipo.
3.1 Gestión de riesgos
💡 Intuición
Un riesgo es algo que podría salir mal. Una vez que ocurre, ya no es un riesgo — es un issue.
La gestión de riesgos es identificarlos antes de que se materialicen, decidir qué hacer con ellos, y monitorear que no se materialicen.
📐 Fundamento
Categorías típicas de riesgos en TI:
| Categoría | Ejemplos |
|---|---|
| Técnico | Tecnología nueva no escala, incompatibilidad |
| Recursos | Persona clave renuncia, falta de presupuesto |
| Externos | Cambio de regulación, proveedor falla, mercado cambia |
| Operacional | Procesos manuales, dependencia de un equipo |
| Seguridad | Brecha de datos, ataque DDoS |
| Compliance | GDPR, PCI-DSS, leyes locales |
| Reputacional | Cliente importante se queja en redes |
Proceso de gestión de riesgos:
1. Identificar → ¿qué puede salir mal?
2. Analizar → ¿probabilidad? ¿impacto?
3. Priorizar → ¿cuál atendemos primero?
4. Planificar → ¿qué hacemos? (4 estrategias)
5. Monitorear → ¿cambió la situación?
6. Cerrar → riesgo desapareció o se materializó
Matriz de probabilidad x impacto:
Impacto bajo Impacto medio Impacto alto
Prob. alta │ Medio │ │ Alto │ │ CRÍTICO │
Prob. media │ Bajo │ │ Medio │ │ Alto │
Prob. baja │ Mínimo │ │ Bajo │ │ Medio │
Atender CRÍTICO y Alto. Monitorear Medio. Aceptar Bajo y Mínimo.
4 estrategias de respuesta:
| Estrategia | Cuándo | Ejemplo |
|---|---|---|
| Evitar | Eliminar la causa | No usar tecnología nueva sin probar |
| Mitigar | Reducir probabilidad/impacto | Pair programming en código crítico |
| Transferir | Pasar el riesgo a otro | Seguros, contratos con cláusulas |
| Aceptar | Convivir con él | Tener plan de contingencia |
Risk Register (registro de riesgos):
ID | Riesgo | Cat | Prob | Imp | Score | Resp | Acción
----+---------------------------------+-------+------+-----+-------+----------+--------------------
R01 | Migración a microservicios falla| Tec | M | A | 6 | CTO | POC primero, paralelo a monolito
R02 | Líder técnico renuncia | Rec | B | A | 3 | Director | Documentar, mentoría 2 personas
R03 | AWS sube precios 20% | Ext | M | M | 4 | CFO | Negociar contrato anual fijo
R04 | Falla seguridad — data breach | Seg | B | A | 3 | CISO | Pen test trimestral, MFA, cifrado
R05 | Competidor lanza app similar | Ext | A | M | 6 | CEO | Acelerar features diferenciadores
Revisar y actualizar semanalmente o por sprint.
Risk burn-down: trackear cuántos riesgos críticos/altos quedan abiertos. Tendencia descendente = buena gestión.
3.2 Análisis cuantitativo de riesgos
📐 Fundamento
EMV (Expected Monetary Value):
Riesgo: "AWS sube precios 20%"
Probabilidad: 30%
Impacto si ocurre: $50,000/año extra
EMV = 0.30 × <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>50</mn><mo separator="true">,</mo><mn>000</mn><mo>=</mo></mrow><annotation encoding="application/x-tex">50,000 = </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mord">50</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">000</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span></span></span></span>15,000
Decisión: vale la pena gastar hasta $15,000 en mitigar (ej: contrato fijo).
Análisis de Monte Carlo aplicado a riesgos:
Simular miles de escenarios para entender el rango de resultados posibles del proyecto.
import numpy as np
# Distribución de duración base
base_duration_days = np.random.triangular(60, 90, 150, 10000)
# Riesgos identificados
def aplicar_riesgos(duracion):
# 30% prob: feature técnico complejo añade 20-40 días
if np.random.random() < 0.30:
duracion += np.random.uniform(20, 40)
# 10% prob: persona clave se va, atrasa 10-30 días
if np.random.random() < 0.10:
duracion += np.random.uniform(10, 30)
# 5% prob: cambio de scope mayor, +30-90 días
if np.random.random() < 0.05:
duracion += np.random.uniform(30, 90)
return duracion
resultados = [aplicar_riesgos(d) for d in base_duration_days]
print(f"Probabilidad de terminar en 90 días: {(np.array(resultados) <= 90).mean():.1%}")
print(f"Probabilidad de terminar en 120 días: {(np.array(resultados) <= 120).mean():.1%}")
print(f"P50: {np.percentile(resultados, 50):.0f} días")
print(f"P90: {np.percentile(resultados, 90):.0f} días")
Permite comunicar a stakeholders: "P50: 95 días, P90: 145 días, presupuestar 145 días".
3.3 Riesgos típicos en TI y mitigaciones
📐 Fundamento
Top 10 riesgos más comunes en proyectos de software:
| # | Riesgo | Mitigación |
|---|---|---|
| 1 | Requerimientos cambian a mitad de proyecto | Sprints cortos, contratos basados en valor no en scope |
| 2 | Estimación inicial muy optimista | Cono de incertidumbre, refinamiento continuo |
| 3 | Persona clave renuncia/enferma | Pair programming, documentación, no silos |
| 4 | Tecnología elegida no escala | POC antes, decisiones reversibles |
| 5 | Integración con sistemas legacy es más difícil de lo esperado | Spike técnico early |
| 6 | Performance/calidad mala en producción | Testing continuo, performance budgets |
| 7 | Stakeholders no alineados | Reuniones de sync regulares, RACI |
| 8 | Bug crítico en producción | Feature flags, canary deploys, rollback rápido |
| 9 | Costos cloud explotan | Budget alerts, FinOps |
| 10 | Vulnerabilidad de seguridad | Pen testing, dependency scanning |
Patrón importante: "decisiones reversibles":
Distinguir entre one-way doors (decisiones difíciles de revertir) y two-way doors (fácil revertir).
| Decisión | Tipo |
|---|---|
| Lenguaje principal del proyecto | One-way (caro de cambiar) |
| Cloud provider | One-way |
| Esquema de BD principal | One-way |
| Color del botón | Two-way |
| Feature nueva en beta | Two-way (con feature flag) |
Para one-way doors: invertí mucho más tiempo en evaluar. Para two-way doors: decidí rápido, ajustá si hace falta.
3.4 Gestión de calidad
💡 Intuición
"Calidad" no es solo "sin bugs". Es:
- Adecuación al uso (functional fitness).
- Performance (rapidez, eficiencia).
- Seguridad.
- Mantenibilidad (que el equipo pueda evolucionarlo).
- Usabilidad (que el usuario lo use sin frustración).
📐 Fundamento
QA en agile vs tradicional:
| QA tradicional (waterfall) | QA en agile | |
|---|---|---|
| Cuándo | Al final del proyecto | Continuo, cada sprint |
| Quién | Equipo separado de QA | Todos (devs incluidos) |
| Tipo | Manual mayoritariamente | Automatizado mayoritariamente |
| Foco | Encontrar bugs | Prevenir bugs |
| Rol | Gatekeeper | Coach |
Pirámide de testing (recap):
╱╲
╱E2E╲ ← pocos, lentos, frágiles
╱──────╲
╱ Integ. ╲ ← medianos
╱──────────╲
╱ Unit ╲ ← muchos, rápidos
╱──────────────╲
(Ver TDD y Testing — capítulo 4 de Ingeniería de Software para detalle.)
Definition of Done (DoD) — el criterio claro:
Una historia está "Done" cuando:
[ ] Código implementado y revisado (PR aprobada por al menos 1 dev).
[ ] Tests unitarios escritos y pasando.
[ ] Tests de integración pasando.
[ ] Documentación actualizada.
[ ] Probada en ambiente de staging.
[ ] PO ha verificado los criterios de aceptación.
[ ] Deployed a producción (o lista para deploy).
[ ] Métricas de monitoreo configuradas.
Sin DoD claro → "casi done" se acumula → el proyecto siempre parece estar al 90%.
Quality gates:
Puntos en el pipeline donde el código debe cumplir criterios para avanzar.
Code commit
↓
[Gate 1: Lint + format] → falla → rechaza commit
↓
[Gate 2: Unit tests + coverage > 80%]
↓
[Gate 3: Integration tests]
↓
[Gate 4: Security scan (SAST)]
↓
[Gate 5: Code review aprobado]
↓
Deploy a staging
↓
[Gate 6: E2E tests + performance tests]
↓
Deploy a production
Coste de un bug por fase de detección (recap del cap. 1 de Ingeniería de Software):
| Fase | Costo relativo |
|---|---|
| Diseño | 1× |
| Código | 6× |
| Pruebas | 15× |
| Producción | 100× |
Conclusión: invertir más en prevención (revisión de diseño, pair programming) y testing temprano paga 100x.
3.5 Métricas de calidad
📐 Fundamento
Defect Density: bugs / KLOC. Objetivo: < 1 bug crítico / KLOC.
Defect Escape Rate: bugs encontrados en producción / bugs totales encontrados. Objetivo: < 10%.
Mean Time To Detect (MTTD): cuánto tarda en detectarse un bug en producción.
Mean Time To Recover (MTTR): cuánto tarda en arreglarse.
DORA Metrics (referencia mundial):
| Métrica | Elite | High | Medium | Low |
|---|---|---|---|---|
| Deployment frequency | On-demand | Daily-Weekly | Weekly-Monthly | Monthly+ |
| Lead time for changes | < 1 hora | < 1 día | < 1 semana | < 1 mes+ |
| Change failure rate | 0-15% | 16-30% | 16-45% | 16-60% |
| Time to restore | < 1 hora | < 1 día | < 1 día | < 1 semana |
(De "Accelerate" — Forsgren, Humble, Kim).
SLOs/SLIs/SLAs (Site Reliability Engineering):
- SLI (Service Level Indicator): la métrica (ej: latencia P99).
- SLO (Service Level Objective): el objetivo interno (ej: P99 < 200ms el 99.9% del tiempo).
- SLA (Service Level Agreement): lo prometido al cliente (con consecuencias si no se cumple).
Error budget: "podemos fallar el 0.1% del tiempo" → 43 minutos de downtime/mes. Si el equipo se "gasta" su error budget, frena features y se enfoca en confiabilidad.
🛠️ En la práctica
La Esquina Cloud — top 5 riesgos del proyecto de expansión:
| Riesgo | Prob | Imp | Mitigación |
|---|---|---|---|
| Migración de datos a la nube falla | M | A | Migración incremental por local, rollback automático, ensayo con datos sintéticos |
| Performance se degrada con 10x más tráfico | A | A | Load testing en staging con 10x carga simulada, autoscaling configurado, plan de capacidad |
| Equipo de soporte no puede manejar volumen de tickets | A | M | Contratar 5 personas adicionales 1 mes antes del lanzamiento, mejorar self-service |
| Stripe (pagos) tiene outage durante lanzamiento | B | A | Provider secundario configurado (PayPal), retry logic robusto |
| Regulación de delivery cambia en algún municipio | M | M | Revisar normativa con asesor legal por ciudad antes de lanzar |
3.6 Ejercicios
✏️ Ejercicio 3.1 — Risk Register
Imagina que estás liderando la migración de un sistema legacy de COBOL a Java en una empresa bancaria. Identificá 5 riesgos relevantes con su categoría, probabilidad, impacto y estrategia de mitigación.
Solución
| ID | Riesgo | Cat | P | I | Mitigación |
|---|---|---|---|---|---|
| R01 | El equipo no tiene expertise en Java | Recursos | A | A | Capacitación intensiva 3 meses + contratar 2 senior Java + pair programming con expertos COBOL |
| R02 | Lógica de negocio en COBOL no documentada se pierde en migración | Técnico | A | A | Análisis exhaustivo del COBOL legacy, documentar reglas, tests de regresión que validan resultados idénticos |
| R03 | Migración de datos corrupta saldos | Técnico | M | CRÍTICO | Migración con dual-write (COBOL+Java escriben), reconciliación diaria, rollback en < 5 min |
| R04 | Regulador exige cambios mid-proyecto | Externo | M | A | Buffer de 20% en cronograma, asesor regulatorio en el equipo |
| R05 | Performance Java peor que COBOL en transacciones críticas | Técnico | M | A | Benchmark continuo, performance tests automatizados en CI |
3.7 Para profundizar
- PMBOK Risk Management Process Group.
- "Continuous Delivery" — Jez Humble (calidad como cultura).
- "Site Reliability Engineering" — libro Google (gratis online).
- Siguiente: Equipos y stakeholders.
Definiciones nuevas: riesgo vs issue, Risk Register, EMV, matriz prob×impacto, evitar/mitigar/transferir/aceptar, one-way vs two-way doors, Definition of Done, quality gates, defect density, defect escape rate, DORA metrics, SLI/SLO/SLA, error budget.