Módulo 1: Understanding Deployment Options

8. Proyecto: Deployment Decision Workshop

Descripción del proyecto

Este es el proyecto integrador del Módulo 1. Vas a tomar todo lo que aprendiste — categorías de deployment, trade-offs en 5 dimensiones, serverless vs containers, cost modeling, decision matrix, y stage-based strategy — y aplicarlo a un caso de uso real. El resultado es un documento de decisión completo que podrías presentar a un equipo, a un manager, o incluir en la documentación de tu proyecto.

No es un ejercicio teórico. Si tienes una app AI propia, usa esa. Si no, usarás un caso de estudio provisto. En ambos casos, el entregable es una decision matrix funcional con recomendación documentada, justificada, y con condiciones de re-evaluación.

Por qué importa: Este documento de decisión es el artefacto que más impacto tiene fuera de esta guía. Es lo que muestras en una entrevista cuando te preguntan "¿cómo decides dónde deployar?" Es lo que le envías a tu tech lead cuando necesitas justificar una inversión en infraestructura. Y es la base que extienes en los Módulos 7 (plataformas) y 8 (proyecto integrador) de esta guía.


Objetivo del proyecto

Producir un Deployment Decision Document completo que incluya:

  1. Contexto del proyecto y requirements
  2. Decision matrix con criterios ponderados
  3. Evaluación de las 4 estrategias
  4. Recomendación con justificación
  5. Estimación de costes a 3 meses
  6. Condiciones de re-evaluación
  7. Migration path si cambian las condiciones

Recap del Módulo

Antes de empezar, asegúrate de dominar estos conceptos del módulo:

CápsulaConcepto claveLo usas para
024 categorías (Local, Serverless, Managed, Self-hosted)Identificar las opciones
035 dimensiones (coste, complejidad, escalabilidad, control, time-to-deploy)Definir criterios
04Serverless vs ContainersProfundizar la comparación principal
05Cost modelingEstimar costes reales
06Decision Matrix FrameworkEstructura del entregable
07Stage del proyectoCalibrar los pesos

Caso de Estudio (si no tienes app propia)

DocuSearch AI

Descripción: API de búsqueda inteligente sobre documentación técnica. Los usuarios envían una pregunta en lenguaje natural y reciben una respuesta basada en la documentación interna de la empresa, con las fuentes citadas.

Arquitectura:

User → FastAPI API → Embedding search (ChromaDB) → LLM (GPT-4o-mini) → Response
                   → Redis cache (responses frecuentes)

Datos del proyecto:

project_data = {
    "name": "DocuSearch AI",
    "type": "RAG (Retrieval Augmented Generation)",
    "stage": "Growth early",
    "team": "2 developers (backend + ML)",
    "users": {
        "current": 150,
        "expected_6_months": 500,
        "type": "internal (empresa de 2000 empleados)",
    },
    "traffic": {
        "daily_requests": 3000,
        "peak_hour_multiplier": 3,
        "pattern": "weekday 9am-6pm, minimal weekends",
    },
    "technical": {
        "framework": "FastAPI",
        "llm": "GPT-4o-mini via OpenAI API",
        "embeddings": "text-embedding-3-small via OpenAI API",
        "vector_db": "ChromaDB (in-memory, ~2GB)",
        "cache": "Redis",
        "container": "Docker (Dockerfile exists)",
        "ci_cd": "GitHub Actions (basic pipeline exists)",
    },
    "constraints": {
        "budget": "$50-100/mes para infraestructura",
        "compliance": "Datos internos, no regulados pero prefieren control",
        "latency": "<3 seconds para respuesta completa",
        "availability": "Business hours (no 24/7 critical)",
        "streaming": "No requerido actualmente, nice-to-have futuro",
    },
    "current_deployment": "Docker Compose local en laptop del developer",
}

Especificaciones del Entregable

Formato

Un archivo Markdown llamado deployment-decision.md con la siguiente estructura:

Sección 1: Contexto del Proyecto (10%)

# Deployment Decision: [Nombre del Proyecto]
Fecha: [Fecha]
Autor: [Tu nombre]
Stage: [MVP / Growth / Scale]

## Contexto

### Descripción del proyecto
[2-3 párrafos describiendo qué hace tu app AI]

### Datos técnicos
- Framework: [FastAPI, Flask, etc.]
- LLM: [GPT-4o, Claude, etc.]
- Base de datos: [ChromaDB, Pinecone, etc.]
- Cache: [Redis, etc.]
- Container: [Docker sí/no]
- CI/CD: [GitHub Actions, etc.]

### Requirements
- Usuarios: [número actual y esperado]
- Tráfico: [requests/día, patrón]
- Presupuesto: [rango mensual]
- Latencia: [máxima aceptable]
- Disponibilidad: [SLA esperado]
- Compliance: [restricciones]
- Features especiales: [streaming, GPU, etc.]

Sección 2: Decision Matrix (40%)

## Decision Matrix

### Criterios y Pesos

| # | Criterio | Peso | Justificación |
|---|----------|------|---------------|
| 1 | [Criterio] | [Peso] | [Por qué este peso] |
| 2 | [Criterio] | [Peso] | [Por qué este peso] |
| ... | ... | ... | ... |
| **Total** | | **100** | |

### Evaluación (1-5)

| Criterio (Peso) | Local | Serverless | Managed | Self-hosted | Notas |
|-----------------|:-----:|:----------:|:-------:|:-----------:|-------|
| [Criterio 1] ([Peso]) | [1-5] | [1-5] | [1-5] | [1-5] | [Justificación breve] |
| ... | ... | ... | ... | ... | ... |

### Scores Ponderados

| Criterio | Local | Serverless | Managed | Self-hosted |
|----------|:-----:|:----------:|:-------:|:-----------:|
| [Criterio 1] | [peso×score] | ... | ... | ... |
| ... | ... | ... | ... | ... |
| **TOTAL** | **[total]** | **[total]** | **[total]** | **[total]** |

Sección 3: Estimación de Costes (20%)

## Estimación de Costes (3 meses)

### Desglose por estrategia

| Componente | Local | Serverless | Managed | Self-hosted |
|-----------|-------|------------|---------|-------------|
| Infraestructura | $X/mes | $X/mes | $X/mes | $X/mes |
| LLM APIs | $X/mes | $X/mes | $X/mes | $X/mes |
| Ops (tiempo) | $X/mes | $X/mes | $X/mes | $X/mes |
| **Total mensual** | **$X** | **$X** | **$X** | **$X** |
| **Total 3 meses** | **$X** | **$X** | **$X** | **$X** |

### Notas de coste
- [Asunciones sobre tráfico]
- [Asunciones sobre modelo LLM]
- [Riesgos de coste identificados]

Sección 4: Recomendación (15%)

## Recomendación

### Estrategia elegida: [Nombre]
**Score:** [total] de [máximo posible]

### Justificación
[3-5 párrafos explicando por qué esta estrategia es la óptima
para este caso. Incluir los 2-3 criterios que más influyeron.]

### Opciones descartadas
| Opción | Score | Razón principal de descarte |
|--------|-------|-----------------------------|
| [Opción 2] | [score] | [Por qué no] |
| [Opción 3] | [score] | [Por qué no] |
| [Opción 4] | [score] | [Por qué no] |

Sección 5: Plan de Acción y Re-evaluación (15%)

## Plan de Acción

### Pasos para implementar
1. [Paso 1 — con estimación de tiempo]
2. [Paso 2]
3. [Paso 3]
4. [Paso 4]

### Timeline
| Semana | Acción | Entregable |
|--------|--------|-----------|
| 1 | [Acción] | [Entregable] |
| 2 | [Acción] | [Entregable] |

## Condiciones de Re-evaluación

### Triggers para migrar
- [ ] [Trigger 1 con métrica específica]
- [ ] [Trigger 2]
- [ ] [Trigger 3]

### Migration path
Si [trigger], migrar a [estrategia alternativa]:
1. [Paso 1]
2. [Paso 2]
3. [Paso 3]

### Review programado
- Fecha: [3 meses desde la decisión]
- Revisor: [quién]
- Datos a evaluar: [métricas]

Paso a Paso Guiado

Paso 1: Documenta el contexto (15 min)

Llena la Sección 1 con los datos de tu proyecto (o del caso DocuSearch AI). Sé específico con números — "algunos usuarios" no es un input válido para una decision matrix.

# Verifica que tienes todos los datos necesarios
required_data = [
    "Número actual de usuarios",
    "Requests/día estimados",
    "Presupuesto mensual",
    "Latencia máxima aceptable",
    "¿Necesita streaming?",
    "¿Hay constraints de compliance?",
    "¿Tienes Docker container?",
    "¿Tienes CI/CD?",
    "Stage del proyecto (MVP/Growth/Scale)",
]

for item in required_data:
    # Si no puedes responder, investiga antes de continuar
    print(f"✅ {item}: [tu respuesta]")

Paso 2: Define criterios y pesos (15 min)

Selecciona 5-7 criterios y asigna pesos que sumen 100. Usa las 5 dimensiones estándar como base y agrega criterios AI-specific si aplica.

# Template de criterios y pesos
criteria = {
    # Estándar (ajusta pesos según tu caso)
    "Coste mensual total": 0,         # Incluye infra + ops + APIs
    "Complejidad operativa": 0,       # Hrs/semana de mantenimiento
    "Time-to-deploy": 0,             # De commit a producción
    "Escalabilidad": 0,              # Capacidad de crecer
    "Control": 0,                    # Acceso a configuración
    
    # AI-specific (agrega si aplica)
    "Cold start latency": 0,         # Si latencia importa
    "Streaming support": 0,          # Si chat con streaming
    "Memory for models": 0,          # Si embeddings/modelos en RAM
}

# Ejemplo para DocuSearch AI (Growth, equipo de 2, presupuesto moderado)
criteria_docusearch = {
    "Coste mensual total": 20,
    "Complejidad operativa": 20,
    "Time-to-deploy": 15,
    "Escalabilidad": 15,
    "Control": 10,
    "Memory for models": 10,  # ChromaDB necesita ~2GB RAM
    "Latency < 3s": 10,
}

assert sum(criteria_docusearch.values()) == 100

Paso 3: Evalúa cada estrategia (20 min)

Para cada criterio, evalúa cada estrategia de 1 a 5 con justificación:

evaluation_docusearch = {
    "Coste mensual total": {
        "Local": (4, "VPS $24/mes + APIs $15 = $39"),
        "Serverless": (3, "Lambda $5 + APIs $15 + pero ChromaDB no cabe en Lambda"),
        "Managed": (4, "Railway $20/mes + APIs $15 = $35"),
        "Self-hosted": (1, "EC2 $30 + ops $400 + APIs $15 = $445"),
    },
    "Memory for models": {
        "Local": (5, "VPS con 4GB+ de RAM, ChromaDB cabe"),
        "Serverless": (1, "Lambda max 10GB pero stateless, ChromaDB no persiste"),
        "Managed": (3, "Railway Pro tiene hasta 8GB pero verificar"),
        "Self-hosted": (5, "Ilimitado, elegimos el instance type"),
    },
    # ... completar los demás criterios
}

Paso 4: Calcula scores (10 min)

def calculate_scores(criteria: dict, evaluation: dict) -> dict:
    """Calcula scores ponderados."""
    options = ["Local", "Serverless", "Managed", "Self-hosted"]
    scores = {opt: 0 for opt in options}
    details = {opt: {} for opt in options}
    
    for criterion, weight in criteria.items():
        for option in options:
            score, justification = evaluation[criterion][option]
            weighted = weight * score
            scores[option] += weighted
            details[option][criterion] = {
                "raw": score,
                "weighted": weighted,
                "note": justification
            }
    
    return {
        "totals": dict(sorted(scores.items(), key=lambda x: x[1], reverse=True)),
        "details": details,
        "max_possible": sum(criteria.values()) * 5,
    }

results = calculate_scores(criteria_docusearch, evaluation_docusearch)
print(f"Ranking: {results['totals']}")
print(f"Score máximo posible: {results['max_possible']}")

Paso 5: Estima costes (15 min)

Usa la calculadora de la Cápsula 05 con tus datos reales:

docusearch_costs = {
    "monthly_requests": 90_000,  # 3K/día × 30
    "avg_input_tokens": 800,     # RAG context + query
    "avg_output_tokens": 400,
    "embedding_requests": 90_000,
}

# LLM cost (GPT-4o-mini)
llm_cost = docusearch_costs["monthly_requests"] * (
    (800 / 1_000_000 * 0.15) + (400 / 1_000_000 * 0.60)
)
embedding_cost = docusearch_costs["embedding_requests"] * 0.0001

api_total = llm_cost + embedding_cost
print(f"API costs: ${api_total:.2f}/mes")

# Infra costs por estrategia
infra = {
    "Local (VPS 4GB)": 24,
    "Serverless (Lambda)": "N/A - ChromaDB no cabe",
    "Managed (Railway Pro)": 20,
    "Self-hosted (EC2)": 30,
}

Paso 6: Escribe la recomendación (15 min)

Con los scores y costes, redacta la recomendación. Incluye la segunda opción y los descartados con razón.

Paso 7: Escribe la recomendación y descartados (15 min)

Estructura tu recomendación en 3 partes:

### Estrategia elegida: [Nombre]
**Score:** [total] / [máximo posible]

### Justificación (3-5 párrafos)
1. Cuál es la estrategia y por qué ganó
2. Los 2-3 criterios que más influyeron en el resultado
3. Por qué la segunda opción no ganó
4. Riesgos conocidos de la estrategia elegida
5. Qué harías diferente si tus constraints cambiaran

### Descartados
- [Opción 2]: Score [X]. No elegida porque [razón principal]
- [Opción 3]: Score [X]. No elegida porque [razón principal]
- [Opción 4]: Score [X]. No elegida porque [razón principal]

Tip: Si tu recomendación contradice el score más alto (por ejemplo, elegiste la segunda opción por un deal-breaker), explícalo explícitamente. "Serverless ganó en score pero descartado por no soportar streaming" es perfectamente válido.

Paso 8: Define condiciones de re-evaluación (10 min)

Sé específico con métricas:

re_evaluation_triggers = [
    "Usuarios > 500 activos → evaluar escalabilidad",
    "Latencia p95 > 3s → evaluar infra más potente",
    "Factura > $100/mes → evaluar VPS vs managed",
    "Requerimiento de streaming → verificar soporte de plataforma",
    "Compliance SOC2 → evaluar self-hosted o AWS con VPC",
]

review = {
    "date": "3 meses desde deploy",
    "metrics_to_check": [
        "Tráfico real vs estimado",
        "Costes reales vs estimados",
        "Incidentes de downtime",
        "Feedback de usuarios sobre latencia",
    ],
}

Checklist de Completitud

Antes de considerar el proyecto terminado, verifica:

Estructura

  • Sección 1: Contexto con datos específicos (no vagos)
  • Sección 2: Decision matrix con ≥5 criterios, pesos que suman 100
  • Sección 3: Estimación de costes con números reales para ≥3 estrategias
  • Sección 4: Recomendación con justificación y descartados
  • Sección 5: Condiciones de re-evaluación con métricas

Calidad

  • Los pesos reflejan TUS prioridades (no son uniformes)
  • Cada evaluación (1-5) tiene justificación (no solo números)
  • Los costes incluyen APIs + infra + ops (no solo infra)
  • La recomendación nombra alternativas descartadas con razón
  • Hay ≥3 triggers de re-evaluación con métricas específicas
  • Hay fecha de review programado

Defensa

  • Podrías explicar la decisión en 2 minutos a un no-técnico
  • Si un colega cuestiona un peso, puedes justificarlo
  • Si cambia un constraint (más presupuesto, más usuarios), sabes cómo re-evaluar
  • El documento es autosuficiente (alguien externo lo entiende sin contexto adicional)

Rúbrica de Evaluación (100 puntos)

Sección 1: Contexto del Proyecto (15 puntos)

CriterioPuntosDescripción
Descripción del proyecto3Qué hace la app, qué problema resuelve
Datos técnicos completos4Framework, LLM, DB, cache, container, CI/CD
Requirements cuantificados4Usuarios, tráfico, presupuesto, latencia — con NÚMEROS
Constraints documentados4Compliance, streaming, GPUs, disponibilidad

0 puntos si: Los datos son vagos ("algunos usuarios," "presupuesto flexible")

Sección 2: Decision Matrix (35 puntos)

CriterioPuntosDescripción
Mínimo 5 criterios relevantes5Incluye las 5 dimensiones estándar + AI-specific si aplica
Pesos suman 1003Verificable — no hay discusión
Pesos diferenciados5NO son uniformes (no todos 20). Reflejan TUS prioridades
Justificación de pesos5Cada peso tiene 1 frase explicando por qué ese número
Evaluación 1-5 con justificación7Cada score tiene nota explicando por qué ese número
Scores ponderados calculados correctamente5Peso × Score, sin errores matemáticos
Ranking claro5Se identifica ganador, segundo, y descartados

0 puntos si: Los pesos son todos iguales o no suman 100

Sección 3: Estimación de Costes (20 puntos)

CriterioPuntosDescripción
Mínimo 3 estrategias costeadas5Idealmente las 4 categorías
Desglose: infra + APIs + ops5No solo infra — incluye coste de tu tiempo y LLM APIs
Números reales (no inventados)5Basados en precios de proveedores actuales
Proyección a 3 meses5Con escenario base y pesimista

0 puntos si: Solo costeas infraestructura sin incluir APIs ni ops

Sección 4: Recomendación (15 puntos)

CriterioPuntosDescripción
Estrategia elegida con score3Identificada claramente
Justificación en 3-5 párrafos5Explica los 2-3 criterios que más influyeron
Opciones descartadas con razón4Cada descartada tiene 1 frase de por qué no
Coherencia con la matrix3La recomendación coincide con el score más alto (o explica por qué no)

0 puntos si: La recomendación contradice la matrix sin explicar por qué

Sección 5: Re-evaluación (15 puntos)

CriterioPuntosDescripción
Mínimo 3 triggers con métricas5"Si tráfico > 500/hora" no "si crece mucho"
Migration path documentado5Pasos concretos si necesitas cambiar de estrategia
Fecha de review programada3Fecha específica, no "en un futuro"
Métricas a verificar en el review2Qué datos revisas para decidir si mantener o migrar

0 puntos si: No hay condiciones de re-evaluación

Tabla de calificación

RangoCalificaciónSignificado
90-100ExcelenteDocumento listo para presentar a un tech lead
75-89BuenoSólido, con áreas menores de mejora
60-74AceptableCubre lo básico pero le falta profundidad
40-59InsuficienteFalta contenido significativo o tiene errores
0-39No aprobadoNo demuestra comprensión del framework

Ejemplo de Implementación Mínima

Este es un ejemplo de cómo se ve un documento de decisión que cumple los requisitos mínimos (calificación "Aceptable," ~65 puntos). No es el mejor documento posible — es el mínimo para pasar:

# Deployment Decision: DocuSearch AI

Fecha: 2026-03-08
Autor: [Tu nombre]
Stage: Growth early

## Contexto

DocuSearch AI es una API RAG que busca en documentación técnica interna.
150 usuarios actuales, esperados 500 en 6 meses.
FastAPI + ChromaDB (2GB RAM) + Redis + OpenAI API.
3000 requests/día, picos 3x en horario laboral.
Budget: $50-100/mes. Latencia: <3s. Sin compliance regulatorio.

## Decision Matrix

### Criterios y Pesos

| # | Criterio | Peso | Justificación |
|---|----------|------|---------------|
| 1 | Coste mensual | 20 | Budget moderado, no es la constraint #1 |
| 2 | Complejidad operativa | 20 | Equipo de 2, preferimos simple |
| 3 | Time-to-deploy | 15 | No urgente pero queremos iterar |
| 4 | Escalabilidad | 15 | Crecimiento esperado de 3x |
| 5 | Control | 10 | Sin compliance especial |
| 6 | Memory (ChromaDB) | 10 | ChromaDB necesita 2GB mínimo |
| 7 | Latencia < 3s | 10 | SLA interno |
| **Total** | | **100** | |

### Evaluación y Scores

| Criterio (Peso) | Local | Serverless | Managed | Self-hosted |
|-----------------|:-----:|:----------:|:-------:|:-----------:|
| Coste (20) | 80 | 60 | 80 | 20 |
| Complejidad (20) | 60 | 80 | 100 | 20 |
| Time-to-deploy (15) | 45 | 60 | 75 | 15 |
| Escalabilidad (15) | 30 | 75 | 45 | 60 |
| Control (10) | 40 | 20 | 30 | 50 |
| Memory (10) | 50 | 10 | 30 | 50 |
| Latencia (10) | 50 | 30 | 40 | 50 |
| **TOTAL** | **355** | **335** | **400** | **265** |

## Estimación de Costes (3 meses)

| Componente | Local | Managed |
|-----------|-------|---------|
| Infra | $24/mes | $20/mes |
| APIs (OpenAI) | $45/mes | $45/mes |
| Ops (tiempo) | $150/mes | $25/mes |
| **Total mensual** | **$219** | **$90** |
| **Total 3 meses** | **$657** | **$270** |

## Recomendación

**Managed (Railway Pro)** — Score 400/500.

Railway gana por baja complejidad y time-to-deploy rápido. El equipo de 2
no quiere dedicar tiempo a mantener infra. ChromaDB cabe en Railway Pro
(hasta 8GB). Serverless descartado: ChromaDB necesita state persistente
que Lambda no ofrece.

## Re-evaluación

- Si usuarios > 500 → verificar limits de Railway
- Si latencia p95 > 3s → evaluar VPS dedicado
- Si factura > $150/mes → evaluar VPS como alternativa
- Review: Junio 2026

Este ejemplo cumple los requisitos mínimos. Para llegar a "Excelente":

  • Agrega justificación a cada evaluación (1-5)
  • Incluye escenario pesimista en costes
  • Detalla el migration path paso a paso
  • Agrega sensitivity analysis (¿qué pasa si cambio un peso?)

Troubleshooting Específico del Proyecto

"No tengo app AI propia, ¿uso el caso DocuSearch?"

Sí. El caso DocuSearch tiene datos suficientemente reales para producir una matrix genuina. Ajusta los parámetros si quieres simular un escenario diferente (más usuarios, menos presupuesto, streaming requerido).

"Dos estrategias tienen scores muy cercanos (<5% diferencia)"

Buena señal — tu caso no tiene constraints extremas. Opciones:

  1. Haz sensitivity analysis (cambia un peso ±10, ¿cambia el ganador?)
  2. Elige por factor no cuantificable (developer experience, familiaridad)
  3. Documenta ambas como viables y elige la más simple de migrar

"Serverless no funciona para mi caso (ChromaDB en memoria)"

Correcto. No fuerces la evaluación — dale un 1 o 2 en criteria de memory y documenta por qué. Una matrix honesta que descarta una opción con datos es más valiosa que una que fuerza opciones que no encajan.

"Mi manager no le importan los scores, solo quiere una respuesta"

El documento es para ti y para tu futuro yo. Pero para el manager, extrae un resumen de 3 frases: "Recomiendo X porque Y. Cuesta $Z/mes. Re-evaluamos en N meses." El detalle está en el documento para quien quiera profundizar.

"Quiero usar una herramienta visual (spreadsheet, Notion)"

El formato no importa — lo que importa es el contenido. Si prefieres Google Sheets con fórmulas automáticas para los scores ponderados, úsalo. El template Markdown de este proyecto es una guía, no un requisito de formato.

"No sé cómo estimar costes de LLM APIs"

Usa esta fórmula rápida:

# Fórmula rápida de coste LLM
monthly_requests = 3000 * 30  # req/día × 30 días
avg_tokens_per_request = 1200  # input + output promedio

# GPT-4o-mini: ~$0.75/1M tokens promedio
monthly_llm_cost = monthly_requests * avg_tokens_per_request / 1_000_000 * 0.75
# = 90,000 * 1200 / 1M * 0.75 = ~$81/mes

print(f"Estimación LLM: ${monthly_llm_cost:.2f}/mes")

Si no sabes los tokens promedio, usa 1000-1500 como estimación conservadora para una app RAG.

"Mi matrix tiene 10 criterios y se siente demasiado compleja"

Reduce a 5-7 criterios. Agrupa criterios relacionados: "Cold starts" + "Latencia" → "Performance de inferencia." Más criterios no significa mejor análisis — significa más ruido. Si un criterio pesa <5, probablemente no merece ser un criterio separado.

"¿Puedo cambiar la decisión después de empezar a implementar?"

Sí, y es más común de lo que piensas. Si después de 2 semanas implementando Railway descubres que necesitas más RAM que la que ofrece su plan, migra. Tu Docker container es portable — ese es el beneficio de haber containerizado primero. Actualiza tu matrix con los datos reales y documenta el cambio.


Tips para un Proyecto Excelente

Lo que separa un proyecto "Bueno" de uno "Excelente"

  1. Datos específicos, no genéricos. "50K requests/mes con duración promedio de 2.3 segundos" en vez de "tráfico moderado."

  2. Justificación en cada evaluación. No solo "Serverless: Coste = 5." Sino "Serverless: Coste = 5 — Lambda a este volumen cuesta $1.25/mes vs $24/mes de VPS."

  3. Sensitivity analysis incluido. "Si cambio el peso de coste de 25 a 15, el ganador sigue siendo Managed. La decisión es robusta."

  4. Migration path concreto. No "migrar a AWS si crece." Sino "si > 10K req/día: (1) exportar Docker image, (2) crear EC2 t3.medium, (3) docker compose up, (4) redirigir DNS. Tiempo estimado: 4 horas."

  5. Honestidad sobre incertidumbre. "El scoring de escalabilidad es estimado — no tenemos datos reales. Re-evaluamos en 4 semanas con métricas de producción."


Resultado Funcional

Al completar este proyecto, tendrás:

deployment-decision.md (o equivalente)
├── Contexto: Datos concretos de tu proyecto AI
├── Matrix: 5-7 criterios × 4 estrategias, ponderados
├── Costes: Estimación a 3 meses, 3+ estrategias
├── Recomendación: Con justificación y descartados
├── Re-evaluación: 3+ triggers con métricas
└── Review: Fecha y métricas a verificar

Este documento es:

  • Portfolio-worthy: Demuestra capacidad de tomar decisiones de infraestructura con criterio
  • Reutilizable: El framework aplica a cualquier decisión de deployment futura
  • Extensible: Se extiende en Módulo 7 (plataformas) y Módulo 8 (proyecto integrador)
  • Defendible: Cualquier ingeniero puede revisarlo, cuestionarlo, y entender tu razonamiento

Conexión con la Guía

¿Qué sigue?

Con tu decision matrix completada:

  • Módulo 2: Implementarás la estrategia "Local" con Docker Compose multi-container — independientemente de tu recomendación, porque necesitas dominar deployment local como base.
  • Módulo 3: Implementarás la estrategia "Serverless" con Lambda — para tener la habilidad en tu toolkit.
  • Módulos 4-6: Aprenderás AWS con LocalStack sin coste — para tener la opción cloud sin barreras.
  • Módulo 7: Extenderás tu decision matrix con criterios de plataforma (Render vs Railway vs Fly.io vs AWS).
  • Módulo 8: Aplicarás tu decision matrix actualizada para desplegar tu sistema AI en producción real.

Tu matrix del Módulo 1 es v1. La del Módulo 7 es v2. La del Módulo 8 es v_final — aplicada y verificada con un sistema real.

Evolución del documento

Módulo 1 (ahora): deployment-decision-v1.md
  → Evalúa 4 categorías, elige estrategia general

Módulo 7 (futuro): deployment-decision-v2.md
  → Agrega criterios de plataforma específica (Render vs Railway vs Fly.io)
  → Actualiza con datos reales si ya estás en producción

Módulo 8 (final): deployment-decision-final.md
  → Matrix aplicada al sistema desplegado en producción
  → Incluye métricas reales, costes verificados, lecciones aprendidas

Especificaciones Técnicas Extendidas

Formato del entregable

Tu deployment-decision.md debe ser un archivo Markdown autosuficiente. Cualquier persona del equipo debería poder abrir el archivo, leerlo de arriba a abajo, y entender: (1) qué app es, (2) qué opciones evaluaste, (3) por qué elegiste lo que elegiste, y (4) cuándo re-evaluar.

# Verifica que tu archivo es completo
wc -l deployment-decision.md
# Esperado: 100-200 líneas mínimo

# Verifica que tiene todas las secciones
grep "^## " deployment-decision.md
# Esperado:
# ## Contexto
# ## Decision Matrix
# ## Estimación de Costes
# ## Recomendación
# ## Re-evaluación (o similar)

Criterios de calidad del código Python (si incluyes scripts)

Si incluyes calculadoras o scripts Python en tu documento:

# ✅ Bueno: función reutilizable con parámetros
def estimate_cost(monthly_requests: int, model: str = "gpt-4o-mini") -> float:
    """Estima coste mensual de LLM APIs."""
    prices = {"gpt-4o-mini": 0.003, "gpt-4o": 0.06}
    return monthly_requests * prices.get(model, 0.003)

# ❌ Malo: números hardcoded sin contexto
cost = 50000 * 0.003  # ¿Qué es 50000? ¿Qué es 0.003?

Versionado del documento

Tu decision matrix es un documento vivo. Versiona con Git:

git add deployment-decision.md
git commit -m "feat: decision matrix v1 - Módulo 1"

# Después de re-evaluación:
git commit -m "update: decision matrix v1.1 - datos reales mes 1"

Resumen

  • El Deployment Decision Workshop es el proyecto integrador del Módulo 1 que produce un documento de decisión completo.
  • El entregable es un archivo deployment-decision.md con 5 secciones: contexto, matrix, costes, recomendación, y re-evaluación.
  • La rúbrica de 100 puntos evalúa: contexto (15), matrix (35), costes (20), recomendación (15), y re-evaluación (15).
  • Puedes usar el caso DocuSearch AI si no tienes app propia — tiene datos suficientemente reales.
  • Los pesos deben sumar 100 y reflejar tus prioridades reales, no valores uniformes.
  • Los costes incluyen 3 componentes: infraestructura + LLM APIs + tiempo de operación.
  • La matrix se reutiliza y extiende en los Módulos 7 (plataformas) y 8 (proyecto integrador).
  • Documenta cuándo re-evaluar con triggers específicos y métricas — es lo que convierte un documento estático en una herramienta viva.

Recursos para el Proyecto

  1. Architecture Decision Records (ADR) — Formato estándar para documentar decisiones de arquitectura
  2. AWS Well-Architected Framework — Framework de evaluación de arquitectura
  3. Decision Matrix Template — Miro — Template visual de decision matrix
  4. Cloud Cost Calculator — Vantage — Calculadora de costes cloud
  5. Railway Pricing — Para estimación de costes managed
  6. DigitalOcean Pricing — Para estimación de costes VPS