Tu proyecto está desplegado, probado, medido y vigilado. Y sin embargo hay un hecho incómodo que conviene decir sin rodeos: nadie lo sabe, nadie entiende qué decisiones hay detrás, y tú todavía no has practicado cómo contarlo. Un trabajo que no se puede enseñar ni defender vale mucho menos de lo que es — y no por injusticia, sino porque quien lo evalúa tiene diez minutos y ninguna forma de adivinar lo que hiciste bien. Esta lección convierte lo construido en algo que se puede enseñar, defender y mejorar. Verás cómo escribir un README que haga que alguien entienda el proyecto en dos minutos, con plantilla completa y comentada; cómo documentar las decisiones de arquitectura con registros breves (ADR), y por qué documentar el porqué vale mucho más que documentar el qué; cómo preparar una demostración de cinco minutos con su guion, su orden narrativo, sus datos preparados y su plan B; cómo hablar del proyecto en una entrevista técnica —incluida la pregunta que te van a hacer seguro, «¿por qué no usaste React?»—, cómo reconocer una limitación sin sonar inseguro y cómo contar un bug difícil; cómo autoevaluarte con una rúbrica completa por dimensiones; cómo revisarte el código a ti mismo y buscar revisión externa sin hundirte con la crítica; cómo publicar el proyecto con un repositorio ordenado, un historial limpio y una licencia; y cómo iterar después de la entrega, que es lo que distingue un ejercicio terminado de un producto vivo.

Contenido

  1. Por qué presentar es parte del trabajo
  2. El README que se entiende en dos minutos
  3. La plantilla completa, comentada
  4. Capturas, GIF y demo
  5. Documentar decisiones: los ADR
  6. La plantilla de ADR y cinco ejemplos reales
  7. Por qué el porqué vale más que el qué
  8. La demostración de cinco minutos
  9. El guion y el orden de la narración
  10. Datos de ejemplo preparados y plan B
  11. Hablar del proyecto en una entrevista técnica
  12. «¿Por qué no usaste React?»
  13. Reconocer una limitación sin sonar inseguro
  14. Contar un bug difícil
  15. La autoevaluación con rúbrica por dimensiones
  16. La revisión de código a uno mismo
  17. Buscar revisión externa y recibir crítica
  18. Publicar: repositorio, historial y licencia
  19. El portafolio
  20. Iterar después de la entrega
  21. Errores Comunes y Consejos
  22. Ejercicios
  23. Conclusión

  1. Por qué presentar es parte del trabajo

Hay una creencia extendida y falsa: que el buen trabajo habla por sí solo. No lo hace. Lo que ocurre en la realidad es esto:

Quién mira tu proyecto Cuánto tiempo le dedica Qué necesita saber
Un reclutador técnico 30–90 segundos Qué es, si funciona, si el repositorio parece serio
Un desarrollador que te evalúa 5–15 minutos Cómo está estructurado, si las decisiones tienen criterio
Un futuro compañero 30 minutos Si podría trabajar en esto sin preguntarte
Tú, dentro de un año Lo que haga falta Por qué demonios lo hiciste así

Ninguno de los cuatro va a leer 4.000 líneas de código para descubrir que tu detección de ciclos en el árbol cubre los tres casos. Eso hay que contarlo.

Y hay un argumento que va más allá del portafolio: explicar es una habilidad profesional de primer orden. En el trabajo real pasarás una parte considerable del tiempo justificando decisiones, escribiendo documentación, explicando a alguien por qué algo tardará más de lo que parece, y defendiendo un enfoque frente a otro. Quien construye bien pero no sabe explicarlo tiene un techo profesional muy concreto, y no es técnico.

La buena noticia es que esta lección no pide inventar nada: todo lo que hay que contar ya lo has hecho. Se trata de ordenarlo.

  1. El README que se entiende en dos minutos

El README.md es la portada de tu proyecto. Se lee más que cualquier otra cosa que hayas escrito, incluido el código.

La prueba de los dos minutos: dáselo a alguien que no sepa nada del proyecto y cronometra. A los dos minutos debería poder responder:

  1. ¿Qué es esto y para quién?
  2. ¿Funciona? ¿Puedo verlo?
  3. ¿Qué tiene de interesante técnicamente?
  4. ¿Cómo lo ejecuto?

Si no puede, el README falla — por muy bien escrito que esté.

Los cuatro errores que hacen fallar la prueba:

Error Por qué falla Cómo se arregla
Empezar por la instalación A quien llega no le interesa instalar nada todavía Primero qué es y un enlace a la demo
No tener imagen Nadie se imagina una interfaz leyendo Captura o GIF en los primeros 300 píxeles
Listar tecnologías sin decir qué hace «React, Redux, Tailwind» no dice qué es el producto Qué hace primero; las decisiones después
Ocultar las limitaciones Se descubren solas y entonces parecen engaño Declararlas: es lo que más credibilidad da

La estructura que funciona, en orden estricto de interés decreciente:

flowchart TD
    A["Nombre + una frase<br/><i>10 segundos</i>"] --> B["Captura o GIF<br/><i>20 segundos</i>"]
    B --> C["Enlace a la demo<br/><i>5 segundos</i>"]
    C --> D["Qué problema resuelve<br/><i>30 segundos</i>"]
    D --> E["Qué hace · funcionalidades<br/><i>30 segundos</i>"]
    E --> F["Decisiones técnicas<br/><i>1 minuto</i>"]
    F --> G["Cómo ejecutarlo y probarlo"]
    G --> H["Arquitectura"]
    H --> I["Limitaciones conocidas"]
    I --> J["Hoja de ruta · Licencia"]

    style A fill:#dcfce7,stroke:#16a34a
    style F fill:#dbeafe,stroke:#2563eb
    style I fill:#fef3c7,stroke:#d97706

Los tres bloques destacados son los que más peso tienen: la frase inicial decide si siguen leyendo, las decisiones técnicas son lo que diferencia tu proyecto de otros diez iguales, y las limitaciones son lo que demuestra madurez.

  1. La plantilla completa, comentada

<!-- 1 · IDENTIDAD: nombre, insignias, una frase. Nada más. -->
# Órbita

[![CI](https://github.com/usuario/orbita/actions/workflows/ci.yml/badge.svg)](…)
[![Cobertura](https://img.shields.io/badge/cobertura%20dominio-96%25-brightgreen)](…)
[![Licencia: MIT](https://img.shields.io/badge/licencia-MIT-blue.svg)](LICENSE)

**Gestor de trabajo para equipos pequeños**: tareas, subtareas, carga por
persona e historial de cambios. Construido en **JavaScript puro, sin frameworks**.

🔗 **[Ver la demo](https://orbita.example)** · 📖 [Decisiones de arquitectura](docs/adr/)

<!-- 2 · LA IMAGEN: lo primero que se mira. GIF de 10-15 s del flujo principal. -->
![Órbita en funcionamiento](docs/imagenes/demo.gif)

---

<!-- 3 · EL PROBLEMA: por qué existe. Dos o tres frases, sin épica. -->
## El problema

Un equipo de tres o cuatro personas necesita saber quién hace qué, qué está
bloqueado y quién está sobrecargado. Las herramientas grandes exigen más
configuración de la que aporta valor a esa escala; una hoja de cálculo se
queda corta en cuanto hay reglas que respetar (no cerrar una tarea con
subtareas abiertas, no superar 40 horas semanales por persona).

<!-- 4 · QUÉ HACE: funcionalidades reales, no adjetivos. -->
## Qué hace

- **Tareas** con estado, prioridad, etiquetas, responsable, revisor y fecha límite
- **Subtareas** con horas y progreso agregados, y reglas de cierre en cascada
- **Filtro múltiple** por etiquetas (modo *todas* / *cualquiera*), responsable y
  estado, con el filtro reflejado en la URL para poder compartirlo
- **Informe de carga** por persona y semana ISO, con aviso de sobrecarga
- **Historial inmutable** de todos los cambios, con quién y cuándo
- **Sin conexión**: los cambios se encolan y se sincronizan al recuperar la red
- Instalable como **PWA**

<!-- 5 · DECISIONES TÉCNICAS: la sección que te diferencia. -->
## Decisiones técnicas

| Decisión | Por qué | Detalle |
|---|---|---|
| **Sin framework** | Una sola SPA con lógica de dominio rica y equipo de una persona: el coste de mantener la infraestructura propia (≈ 200 líneas) es menor que el de aprender y mantener la ajena | [ADR-0002](docs/adr/0002-sin-framework.md) |
| **Arquitectura por capas** | El dominio debe probarse sin navegador y sobrevivir a un cambio de vista. Verificado con reglas de ESLint que rompen la compilación | [ADR-0001](docs/adr/0001-capas.md) |
| **Árbol plano con `tareaMadreId`** | Buscar y mover son O(1); se serializa trivialmente; el árbol se construye en memoria en una pasada | [ADR-0003](docs/adr/0003-arbol-plano.md) |
| **`localStorage` con migraciones numeradas** | Volumen medido: ~900 kB con 500 tareas y 3.000 cambios, un orden de magnitud bajo el límite. La frontera del repositorio permite pasar a IndexedDB sin tocar el resto | [ADR-0004](docs/adr/0004-persistencia.md) |
| **Actualización optimista con reversión** | La sensación de rapidez importa más que la consistencia inmediata en operaciones reversibles | [ADR-0006](docs/adr/0006-optimista.md) |

<!-- 6 · CÓMO SE EJECUTA: comandos que funcionan copiados y pegados. -->
## Cómo ejecutarlo

git clone https://github.com/usuario/orbita.git cd orbita npm install npm run dev # http://localhost:5173

Requisitos: Node.js 20 o superior.

## Cómo probarlo

npm test # 251 pruebas unitarias y de integración npm run test:cov # con informe de cobertura npm run e2e # 3 recorridos de extremo a extremo (Cypress) npm run verificar # lint + formato + pruebas + build

**251 pruebas** · **3 recorridos E2E** · **96 % de cobertura en el dominio**

<!-- 7 · ARQUITECTURA: un diagrama vale más que tres párrafos. -->
## Arquitectura

src/dominio/ Entidades y reglas R1-R15. Sin dependencias. Se prueba en Node. src/datos/ Persistencia y red. Un contrato, tres implementaciones. src/vista/ DOM, eventos y accesibilidad. No sabe de dónde vienen los datos. src/aplicacion/ Casos de uso y estado. Une las tres anteriores.

Las fronteras entre capas están **verificadas por ESLint**: un `import` de
`datos/` dentro de `dominio/` rompe la compilación.

<!-- 8 · LIMITACIONES: la sección que más credibilidad da. -->
## Limitaciones conocidas

- **Un solo dispositivo.** Sin backend, los datos no se sincronizan entre
  navegadores. La capa de API existe y está probada contra un servidor local,
  pero no hay servidor desplegado.
- **Sin autenticación.** Los datos viven en el navegador y **no son privados**
  frente a quien use el mismo equipo.
- **Subtareas de un nivel** en la interfaz; el dominio admite tres.
- **Calendario no optimizado** para lectores de pantalla con más de 30 tareas
  en un mes (ver [informe de accesibilidad](docs/accesibilidad.md)).
- Probado en Chrome, Firefox y Safari recientes. Sin soporte de navegadores antiguos.

## Rendimiento y accesibilidad

| Métrica | Presupuesto | Medido |
|---|---|---|
| JS inicial (comprimido) | ≤ 60 kB | 54,1 kB |
| LCP (móvil simulado) | ≤ 2,5 s | 2,1 s |
| CLS | ≤ 0,1 | 0,03 |
| Lighthouse rendimiento | ≥ 90 | 94 |
| Lighthouse accesibilidad | ≥ 95 | 98 |
| Incidencias graves de axe | 0 | 0 |

Metodología: mediana de 15 ejecuciones, CPU 4×, red Slow 4G, sobre la
compilación de producción. Ver [informe completo](docs/rendimiento.md).

## Hoja de ruta

- [ ] v1.1 · Vista de calendario y exportación a CSV
- [ ] v1.2 · Tres niveles de subtareas en la interfaz
- [ ] v2.0 · Backend en Node.js con autenticación y sincronización

## Licencia

MIT — ver [LICENSE](LICENSE).

Las insignias del principio no son decoración: comunican en un vistazo que hay CI, que hay pruebas y que hay licencia. Son de las pocas cosas que un reclutador técnico interpreta en dos segundos.

La tabla de rendimiento con su metodología es un detalle poco común y muy valorado: demuestra que mediste con método, no que ejecutaste Lighthouse una vez con suerte.

  1. Capturas, GIF y demo

La imagen es lo que más se mira y lo que menos cuidado suele recibir.

Formato Cuándo Cómo hacerlo bien
Captura estática Para mostrar una pantalla concreta Datos realistas, sin «asdf»; ventana limpia sin barras de marcadores
GIF Para el flujo principal (lo mejor para el README) 10–15 s, sin sonido, bucle, < 3 MB
Vídeo corto Para flujos largos Enlace externo, no incrustado
Demo en vivo Siempre que sea posible Con datos de ejemplo ya cargados

Las siete reglas del GIF del README:

  1. Muestra el flujo principal completo, no un clic suelto.
  2. Datos realistas. Nada de «tarea 1», «prueba», «asdf». Usa los tuyos ficticios pero verosímiles.
  3. Movimiento del ratón lento y deliberado. Los movimientos rápidos marean.
  4. Sin barras de herramientas ni pestañas del navegador: solo la aplicación.
  5. Menos de 3 MB, o GitHub tardará en cargarlo y muchos verán un hueco.
  6. Empieza y termina en un estado limpio, para que el bucle no dé saltos.
  7. 10–15 segundos. Más largo, nadie lo termina.

La demo en vivo necesita datos preparados. Una aplicación vacía no demuestra nada, y pedirle a quien la visita que cree seis tareas para entender el producto es pedirle demasiado. Dos opciones:

  • Semilla automática la primera vez, con un botón «Empezar de cero».
  • Modo demostración por URL (?demo=1) que carga un conjunto de ejemplo.

Y en cualquiera de los dos casos, un aviso claro: «Datos de ejemplo. Todo se guarda solo en tu navegador».

  1. Documentar decisiones: los ADR

Un ADR (Architecture Decision Record, registro de decisión de arquitectura) es un documento corto que registra una decisión importante, su contexto y sus consecuencias. Nace de una observación simple: el código dice qué se hizo, pero nunca por qué, ni qué alternativas se descartaron, ni qué habría que revisar si cambiara el contexto.

Cuándo escribir uno. No para cada decisión: solo para las que cumplen alguna de estas condiciones:

Condición Ejemplo en Órbita
Es difícil de revertir Arquitectura por capas
Afecta a todo el proyecto No usar framework
Se descartaron alternativas razonables Árbol plano frente a anidado
Alguien preguntará «¿por qué así?» Desactivar usuarios en vez de borrarlos
Depende de un contexto que puede cambiar localStorage frente a IndexedDB

Para un proyecto de este tamaño, entre 5 y 10 ADR es el número correcto. Menos de 3 sugiere que no hubo decisiones —lo cual es improbable— y más de 20 sugiere que estás documentando detalles de implementación.

Dónde viven: en docs/adr/, numerados, en el repositorio, versionados con el código. Nunca en un servicio externo: se desincronizan.

  1. La plantilla de ADR y cinco ejemplos reales

# ADR-0003 · Árbol de subtareas plano con `tareaMadreId`

- **Estado**: Aceptada
- **Fecha**: 2026-10-08
- **Decide**: <tu nombre>
- **Relacionada con**: R12, R13, ADR-0004

## Contexto

Las tareas se descomponen en subtareas formando un árbol de hasta tres niveles
(R12). Hay que decidir cómo se representa esa estructura en memoria y cómo
se guarda.

Restricciones:
- Debe serializarse a JSON para `localStorage` y para la API.
- Buscar una tarea por `id` es la operación más frecuente (la hace cada evento
  de la interfaz a través de la delegación por `data-id`).
- Mover una subtarea de madre debe ser posible.
- Hay que detectar ciclos (R12) y limitar la profundidad.

## Opciones consideradas

### A · Anidado: `tarea.subtareas = [Tarea, Tarea]`
- ✅ Se lee y se pinta de forma natural, recursivamente.
- ❌ Buscar por `id` obliga a recorrer todo el árbol: O(n) en cada evento.
- ❌ Mover una subtarea implica cortar de un array y pegar en otro, con dos
  puntos donde el estado puede quedar inconsistente.
- ❌ La serialización anida sin límite y complica las migraciones.

### B · Plano con `tareaMadreId` (elegida)
- ✅ Buscar por `id` es O(1) con un `Map`.
- ✅ Mover es cambiar **un campo**.
- ✅ Serializa como una lista; las migraciones operan sobre elementos planos.
- ❌ Hay que construir el árbol en memoria (una función de ~15 líneas, O(n)).
- ❌ Hay que detectar ciclos explícitamente (tres casos distintos).

### C · Lista de adyacencia aparte (`{ madre: [hijas] }`)
- ✅ Consultas rápidas en ambos sentidos.
- ❌ Dos fuentes de verdad que hay que mantener sincronizadas: exactamente el
  problema que la arquitectura intenta evitar.

## Decisión

**Opción B.** El coste (construir el árbol y detectar ciclos) es acotado,
está cubierto por 22 pruebas unitarias y se paga una sola vez en `arbol.js`.
Los beneficios (búsqueda O(1), movimiento trivial, serialización directa)
se cobran en cada interacción y en cada migración.

Es además la forma en la que lo representaría una base de datos relacional,
lo que facilita el backend de la v2.0.

## Consecuencias

**Positivas**
- `construirArbol` es O(n) con un `Map`; con 500 tareas cuesta < 2 ms.
- Las migraciones (ADR-0004) operan sobre una lista plana sin recursividad.
- Mover una subtarea es una sola escritura.

**Negativas**
- Hay que validar la integridad al cargar: una `tareaMadreId` que apunte a una
  tarea inexistente lanza `ErrorDeDatos` en lugar de perder la tarea en silencio.
- La detección de ciclos exige comprobar tres casos (autorreferencia, ciclo
  indirecto, exceso de profundidad), cada uno con su prueba.

## Cuándo revisar esta decisión

Si la profundidad máxima subiera por encima de 5 niveles o si el número de
tareas superara ~50.000, convendría reevaluar con índices persistidos.

Las cinco secciones son obligatorias y ninguna sobra:

Sección Qué aporta
Contexto Las restricciones que había. Sin él, la decisión parece arbitraria
Opciones consideradas Demuestra que hubo evaluación y no la primera idea
Decisión La elección y el argumento, no solo la elección
Consecuencias Las negativas también. Es lo que da credibilidad
Cuándo revisar Convierte la decisión en algo vivo en lugar de dogma

Los cinco ADR mínimos de este proyecto:

# Decisión Por qué merece ADR
0001 Arquitectura por capas con fronteras verificadas Afecta a todo; difícil de revertir
0002 Sin framework La pregunta que te van a hacer seguro
0003 Árbol plano Hubo alternativas razonables
0004 localStorage con migraciones numeradas Depende de un contexto medible que puede cambiar
0005 Desactivar usuarios en lugar de borrarlos Afecta al modelo y a la interfaz; alguien preguntará

Y dos opcionales que quedan muy bien si tu proyecto los tiene: actualización optimista con reversión y historial inmutable append-only con anonimización en lugar de borrado.

  1. Por qué el porqué vale más que el qué

Compara estas dos formas de documentar exactamente lo mismo:

// ❌ Documenta el QUÉ: el código ya lo dice
// Normaliza el nombre antes de buscarlo en el mapa
const clave = nombre.normalize('NFC').trim();

// ✅ Documenta el PORQUÉ: el código no puede decirlo
// NFC obligatorio: los datos de la v1 mezclan 'í' precompuesta (U+00ED) con
// 'i' + acento combinante (U+0301). Se ven idénticas y no son iguales.
// Sin esta línea, la migración v1→v2 perdió 6 de 8 asignaciones (ver docs/depuracion.md).
const clave = nombre.normalize('NFC').trim();

El primer comentario es ruido: dice lo que ya se lee. El segundo contiene información que no existe en ningún otro sitio y que evita que alguien —tú— borre esa línea dentro de seis meses pensando que sobra.

La regla general:

Documenta el… Dónde Ejemplo
Qué En los nombres. Un buen nombre sustituye a un comentario puedeVincular en vez de check2
Cómo En el código y en las pruebas. Las pruebas son la mejor documentación de uso test('rechaza un ciclo indirecto')
Por qué En comentarios y ADR El fragmento de arriba
Por qué NO En ADR. Es lo que nadie documenta y más vale «Se descartó anidado porque buscar sería O(n)»

Esa última fila merece énfasis. Las alternativas descartadas son la información más valiosa y la que más rápido se pierde. Sin ella, quien llegue después propondrá exactamente lo que tú ya evaluaste y rechazaste, gastará una semana descubriéndolo, y llegará a tu misma conclusión.

  1. La demostración de cinco minutos

Vas a tener que enseñar tu proyecto: en una entrevista, a un compañero, en una presentación. Cinco minutos es la duración típica, y hay que prepararlos y ensayarlos.

Por qué cinco minutos son difíciles. Porque conoces el proyecto entero y quieres contarlo entero. La disciplina de la demostración consiste en elegir qué no contar.

El error más común, con nombre: el recorrido guiado por la interfaz. «Aquí está el tablero, aquí el botón de filtro, si pulso aquí sale esto, y aquí tenemos otro botón…». Es aburrido, no tiene tensión narrativa, y no dice nada de ti. Nadie recuerda un recorrido por botones.

El orden que funciona tiene estructura de historia:

flowchart LR
    A["1 · PROBLEMA<br/>45 s"] --> B["2 · SOLUCIÓN<br/>30 s"]
    B --> C["3 · RECORRIDO<br/>2 min"]
    C --> D["4 · DETALLE TÉCNICO<br/>1 min"]
    D --> E["5 · LIMITACIONES<br/>+ hoja de ruta<br/>45 s"]

    style A fill:#fef3c7,stroke:#d97706
    style D fill:#dbeafe,stroke:#2563eb
Paso Tiempo Qué haces Por qué funciona
1 · Problema 45 s Cuentas la situación concreta, sin hablar de tecnología Crea la necesidad. Sin ella, todo lo demás es una demo de botones
2 · Solución 30 s Una frase de qué es, y qué elegiste no hacer Enmarca el alcance y evita la pregunta «¿y por qué no hace X?»
3 · Recorrido 2 min Un flujo completo, de principio a fin, con datos preparados Demuestra que funciona de verdad
4 · Detalle técnico 1 min Una cosa de la que estés orgulloso, contada bien Es lo único que te distingue de otras diez demos
5 · Limitaciones 45 s Qué no hace, por qué, y qué viene después Demuestra criterio y honestidad. Casi nadie lo hace

  1. El guion y el orden de la narración

Un guion literal para Órbita, cronometrado. Adáptalo palabra por palabra a tu proyecto:

## Demostración de Órbita — 5 minutos

### 1 · El problema (45 s)
"Un equipo de tres personas se reparte el trabajo por mensajes y una hoja de
cálculo. Cada semana pasan dos cosas: alguien acaba con el doble de trabajo
que el resto sin que nadie se dé cuenta hasta que es tarde, y las tareas
grandes se dan por hechas cuando en realidad les falta la mitad.
Las herramientas grandes resuelven esto, pero exigen más configuración de la
que aporta valor a esa escala."

[No abrir nada todavía. Que miren a la cara.]

### 2 · La solución (30 s)
"Órbita es un gestor de trabajo para equipos pequeños. Hace tres cosas:
descomponer tareas en subtareas con reglas que impiden cerrar en falso,
ver la carga de cada persona por semana, y saber quién cambió qué.
Es una aplicación web sin framework, funciona sin conexión y se instala."

[Abrir con datos ya cargados.]

### 3 · El recorrido (2 min)
"Este es el tablero de un equipo de tres personas. Fíjate en dos cosas:
Iván tiene 25 horas abiertas y hay una tarea vencida marcada, con texto,
no solo con color."

- Crear "Preparar el taller de encuadernación", 12 h, asignar a Lucía.
- Descomponerla en dos subtareas. Las horas de la madre pasan a ser la suma.
- **Intentar cerrar la madre con una subtarea abierta** → el aviso nombra
  la subtarea que lo impide.
  "Esta es la regla que evita el 'está hecho' que no lo está."
- Abrir el informe de carga: "Lucía pasa de 14 a 26 horas esta semana.
  Antes esto se descubría el viernes."
- Abrir el historial de la tarea: quién, qué y cuándo, sin poder editarlo.

### 4 · El detalle técnico (1 min)
"Lo que más me costó y de lo que estoy más contento es la sincronización
sin conexión."

- Poner el navegador en modo sin conexión.
- Hacer tres cambios. Aparece "3 cambios sin sincronizar".
- Volver a conectar. Se envían en orden y el indicador desaparece.

"Cada cambio lleva una clave de idempotencia, así que si la red se corta
justo después de enviar y antes de recibir la respuesta, el reenvío no
duplica nada. Ese caso tiene su prueba automatizada, porque a mano es
imposible de comprobar de forma fiable."

### 5 · Limitaciones y siguiente paso (45 s)
"Tres cosas que no hace, a propósito:
No hay backend, así que los datos son de un dispositivo. La capa de API
está escrita y probada contra un servidor local, pero no desplegada.
No hay autenticación: sin servidor sería teatro de seguridad.
Y el calendario se quedó fuera del MVP porque la lista ordenada por fecha
cubría la necesidad principal.
Lo siguiente es el backend en Node reutilizando el mismo dominio: las
quince reglas son JavaScript puro sin dependencias del navegador, así que
se pueden ejecutar en el servidor sin duplicar una línea."

Cinco reglas de ejecución de la demostración:

  1. Ensáyala en voz alta al menos tres veces, con cronómetro. Se tarda entre un 30 % y un 50 % más de lo que uno cree.
  2. No leas el guion. Apréndete la estructura, improvisa las palabras.
  3. No enseñes código salvo que lo pidan, y si lo pides tú, que sea un fragmento corto y preparado.
  4. No pidas perdón por nada. «Esto está un poco feo», «no me dio tiempo a…» resta sin aportar. Las limitaciones van en el paso 5, dichas con seguridad.
  5. Termina con lo siguiente, no con «y ya está». Deja la sensación de proyecto vivo.

  1. Datos de ejemplo preparados y plan B

Los datos son la mitad de la demostración. Con «tarea 1», «tarea 2» y «prueba asdf», tu producto parece un ejercicio. Con datos verosímiles, parece un producto.

Qué debe contener tu conjunto de demostración, y por qué cada elemento:

Elemento Cuántos Para qué
Personas con nombre y rol 3–4 Que se entienda el reparto de un vistazo
Tareas variadas y creíbles 8–12 Suficientes para que parezca real, pocas para que se lea
Una persona sobrecargada 1 Es el problema que el informe resuelve
Una tarea vencida 1 Enseña R10 sin buscarla
Una tarea con subtareas mixtas 1 Enseña R13 en el recorrido
Un usuario inactivo con tareas 1 Enseña la decisión del ADR-0005 si preguntan
Etiquetas coherentes 5–8 Que el filtro múltiple tenga sentido

Todos los datos ficticios, siempre. Nunca uses nombres reales de compañeros, clientes o conocidos en una demostración pública o en un repositorio. Es una cuestión de respeto y, si el proyecto se publica, de protección de datos. Taller Nómada y su equipo son ficticios; los tuyos también deben serlo.

El plan B, que hay que tener preparado antes y no improvisado:

Qué falla Plan B
No hay red La aplicación funciona sin conexión: aprovéchalo y conviértelo en parte de la demo
El despliegue está caído Tener la aplicación corriendo en local, ya arrancada, en otra pestaña
El proyector cambia la resolución Probar antes; tener un tamaño de fuente cómodo
Un fallo en directo «Mira, esto es un fallo. Lo apunto». Se corrige y se sigue. Nadie espera perfección; todos observan la reacción
Se acaba el tiempo Tener marcado qué se salta: el paso 4 se acorta, el 5 nunca se elimina
Preguntas a mitad «Buena pregunta, la respondo al final para no perder el hilo»

Una precaución técnica que ha salvado muchas demostraciones: ten una grabación de vídeo de 90 segundos del flujo principal. Si todo falla —red, portátil, proyector—, sigues teniendo algo que enseñar. Cuesta media hora grabarla y es un seguro barato.

  1. Hablar del proyecto en una entrevista técnica

En una entrevista, tu proyecto es la mejor herramienta que tienes: es lo único de lo que sabes más que quien te entrevista.

Lo que se evalúa cuando hablas de él no es lo que la mayoría piensa:

Lo que crees que evalúan Lo que evalúan de verdad
Cuántas tecnologías usaste Si sabes por qué usaste cada una
Si es grande Si está terminado y funciona
Si es original Si tomaste decisiones y las puedes defender
Si es perfecto Si conoces sus defectos
Cuánto sabes Si aprendiste y si se puede trabajar contigo

La estructura de respuesta que funciona para «háblame de un proyecto tuyo», en unos 90 segundos:

1. QUÉ (15 s)      "Es un gestor de trabajo para equipos pequeños, en
                    JavaScript sin frameworks, desplegado y con 251 pruebas."
2. POR QUÉ (15 s)   "Quería un proyecto con reglas de negocio de verdad, no
                    un CRUD, para practicar arquitectura y pruebas."
3. RETO (30 s)      "Lo más interesante fue el árbol de subtareas: las horas
                    de una tarea madre son la suma de sus hojas, y eso hace
                    que sea muy fácil contar dos veces. Tuve un fallo real
                    ahí que me costó una tarde."
4. DECISIÓN (20 s)  "La decisión de la que estoy más contento es haber puesto
                    el dominio sin ninguna dependencia del navegador. Se
                    prueba en Node en milisegundos y podría ejecutarlo en un
                    backend sin duplicar una línea."
5. GANCHO (10 s)    "Si quieres te enseño esa parte o cómo funciona sin conexión."

El paso 5 es el que convierte un monólogo en una conversación: das a elegir, y quien entrevista pregunta por lo que le interesa. Eso siempre va mejor que seguir hablando.

Las preguntas que te van a hacer, con la clave de cada una:

Pregunta Lo que buscan Cómo responder
«¿Por qué no usaste X?» Criterio, no dogma Apartado 12
«¿Qué harías distinto?» Autocrítica y aprendizaje Algo concreto y técnico, no «lo haría mejor»
«¿Cuál fue la parte más difícil?» Cómo afrontas problemas Un problema real, con proceso (apartado 14)
«¿Cómo lo probaste?» Si las pruebas son cultura o adorno Estrategia por niveles, no «tiene pruebas»
«¿Cómo escalaría a 10.000 tareas?» Si piensas más allá de tu caso Lo que medirías primero, no una solución mágica
«¿Qué es lo que peor está?» Honestidad Algo real, y por qué está así (apartado 13)
«¿Cuánto tardaste?» Estimación y constancia La verdad, con el desglose por hitos

Y la respuesta a «¿cómo escalaría?» merece un apunte, porque casi todo el mundo la contesta mal improvisando optimizaciones. La respuesta buena empieza por medir:

«Primero mediría. Mi línea base está con 500 tareas: render() en 44 ms y 1.380 nodos. Con 10.000, lo primero que se rompería es el DOM, así que virtualizaría la lista, que ya está preparada porque el render y la actualización están separados. Lo segundo sería localStorage, que a ese volumen se queda corto: pasaría a IndexedDB, y eso solo toca un fichero porque el repositorio es una frontera con contrato probado. Lo tercero sería el informe, que hoy recalcula entero; ahí memorizaría el selector.»

Esa respuesta demuestra tres cosas de una vez: que mides antes de optimizar, que conoces tus propios números, y que tu arquitectura estaba pensada para eso.

  1. «¿Por qué no usaste React?»

Te la van a hacer. Es la pregunta más probable de todas si tu proyecto es JavaScript puro, y no es una trampa: quieren ver si elegiste o si simplemente no sabes React.

Las tres peores respuestas:

Respuesta Qué comunica
«No sé React» Que no elegiste: te limitaste
«Los frameworks son innecesarios / hinchados» Dogmatismo, que es lo contrario de criterio
«Quería aprender lo básico» Correcta pero pobre: no dice nada de la decisión

La respuesta buena tiene tres partes: criterio, honestidad y conocimiento del otro lado.

«Fue una decisión, y tengo los números. El producto es una única aplicación con mucha lógica de dominio —quince reglas de negocio— y poca superficie de interfaz: siete pantallas. El equipo soy yo. Con ese contexto, la infraestructura propia que necesito son unas doscientas líneas: un almacén con suscripciones, reconciliación por data-id y delegación de eventos. Eso es menos que el coste de aprender y mantener las convenciones de un framework para este caso concreto.

Y la cifra que más me convenció: en la comparación que hice, el fichero de reglas del dominio era idéntico en JavaScript puro, React, Vue y Angular. Lo único que cambiaba era la vista. Como el valor de este proyecto está en el dominio, el framework aportaba poco aquí.

Ahora bien, sé perfectamente cuándo cambiaría de opinión: con tres o más personas en el equipo, o con más de quince o veinte pantallas, esas doscientas líneas propias pasan a ser un problema, porque nadie más las conoce y no hay documentación ni comunidad detrás. Ahí React o Vue compensan claramente. De hecho reescribí la pantalla principal en los cuatro enfoques para poder comparar: 210 líneas y 18 kB en JavaScript puro, 130 líneas y 63 kB en React.»

Por qué esta respuesta funciona:

  1. Empieza afirmando que fue una decisión, no una limitación.
  2. Da el contexto concreto que la justifica: producto, equipo, superficie.
  3. Aporta un dato, no una opinión.
  4. Declara cuándo cambiaría de opinión, que es la marca del criterio frente al dogma.
  5. Demuestra que conoces la alternativa con números propios.

Y la variante honesta si no has hecho esa comparación: no la inventes. Di lo que sí puedes defender: «Fue una decisión por el contexto —un producto con mucha lógica de dominio y una persona—, y conozco React lo suficiente para saber que con un equipo de tres o con quince pantallas la balanza se invertiría. Lo que no puedo darte son números propios de la comparación; me quedé en el razonamiento.» Eso es infinitamente mejor que fingir.

El mismo esquema sirve para cualquier «¿por qué no X?»: TypeScript, Tailwind, una base de datos concreta. Contexto → decisión → dato → cuándo cambiaría.

  1. Reconocer una limitación sin sonar inseguro

Hay tres formas de hablar de un defecto de tu proyecto, y solo una funciona:

Forma Ejemplo Qué transmite
Ocultarlo No mencionarlo y esperar Se descubre solo y parece engaño
Disculparse «Está fatal, no me dio tiempo, perdona» Inseguridad; además invita a mirar ahí
Enmarcarlo «No lo hace, por esta razón, y esto es lo que haría» Criterio y control

La fórmula de tres partes, que funciona siempre:

1. QUÉ falta o está mal      (directo, sin rodeos)
2. POR QUÉ está así          (decisión consciente, o límite reconocido)
3. QUÉ HARÍAS                (concreto: demuestra que sabes cómo se arregla)

Tres ejemplos aplicados:

Limitación por decisión de alcance:

«No hay vista de calendario. La descarté del MVP porque la lista ordenada por fecha cubría la necesidad principal y el calendario eran doce horas para algo secundario. Está en la hoja de ruta como v1.1, y el modelo ya lo soporta: solo falta la vista.»

Limitación técnica reconocida:

«Con más de dos mil tareas el rendimiento se degradaría: mi línea base está medida con quinientas. Lo sé porque medí, no porque lo suponga. La solución sería virtualizar la lista, y la vista ya separa render de actualización precisamente para poder hacerlo sin reescribir nada.»

Algo que harías distinto:

«Empecé a escribir la vista antes de tener el dominio cerrado y perdí dos días rehaciendo. En cuanto lo reordené —dominio primero, luego una rebanada vertical— el ritmo cambió completamente. Es lo primero que haría distinto.»

Los tres ejemplos comparten lo mismo: son concretos, tienen dato o razón, y terminan en una acción. Ninguno pide perdón, y ninguno oculta nada.

Un matiz sobre las limitaciones del README, porque suele preocupar: declararlas no hace tu proyecto peor a ojos de quien lo evalúa. Hace lo contrario. Un proyecto sin limitaciones declaradas transmite una de dos cosas: o no las has buscado, o las escondes. Las dos son peores que tener limitaciones.

  1. Contar un bug difícil

Es una de las preguntas más frecuentes en entrevistas técnicas, y la mejor oportunidad que tienes para demostrar cómo piensas en lugar de qué sabes.

El formato SAR —situación, acción, resultado— estructura la respuesta:

SITUACIÓN (25 %)   El contexto y el síntoma. Concreto.
ACCIÓN (50 %)      Cómo lo abordaste. Aquí está el valor.
RESULTADO (25 %)   Qué pasó y qué aprendiste.

El error clásico es dedicar el 80 % a la situación («era muy raro, no había forma de…») y el 20 % a la acción. Justo al revés: la acción es lo que evalúan.

Un ejemplo completo, con el fallo de la condición de carrera de 11-04:

Situación. «Con la red lenta, a veces —no siempre— al marcar una tarea como hecha, volvía a aparecer como pendiente un segundo después. En mi máquina no pasaba nunca, y no había ningún error en consola.»

Acción. «Lo primero fue no tocar nada hasta poder reproducirlo a voluntad, porque un fallo intermitente no se puede depurar. Estrangulé la red y salía una de cada tres veces, que seguía sin bastar, así que envolví fetch para retrasar tres segundos solo las peticiones PUT. Con eso pasaba siempre.

Con la secuencia delante vi que había dos operaciones asíncronas: el PUT optimista, que tardaba tres segundos, y un refresco de la lista que se lanzaba medio segundo después y llegaba antes. El refresco sustituía la lista entera con datos que el servidor había generado antes de mi cambio.

Escribí primero la prueba que fallaba, con temporizadores falsos para controlar el orden exacto, y solo entonces toqué el código. Evalué tres soluciones: bloquear los refrescos mientras hubiera envíos en vuelo —frágil—, versionar cada tarea y descartar lo antiguo —lo más robusto pero dependía de la API—, y fusionar respetando los identificadores pendientes. Elegí la tercera.»

Resultado. «El fallo desapareció y la prueba se quedó en la suite como regresión. Lo que aprendí y aplico desde entonces son dos cosas: que un fallo intermitente casi siempre es una carrera entre dos operaciones asíncronas, y que cualquier código que sustituye un estado entero es sospechoso, porque descarta información que puede ser más reciente. Revisé el resto de la aplicación buscando ese patrón y encontré otro sitio igual.»

Los seis elementos que hacen buena esta respuesta:

  1. Síntoma concreto, con el detalle de que era intermitente.
  2. Reproducir primero, dicho explícitamente como principio.
  3. Una técnica concreta: retrasar solo un tipo de petición.
  4. La prueba antes de la corrección.
  5. Alternativas evaluadas, con el criterio de elección.
  6. Un aprendizaje generalizable, aplicado después. Este es el que más peso tiene.

Prepara dos historias antes de cualquier entrevista: una de un fallo técnico difícil y otra de una decisión de diseño complicada. Escríbelas, crónometralas en dos minutos, y ensáyalas en voz alta. No es hacer trampa: es no depender de la memoria bajo presión.

  1. La autoevaluación con rúbrica por dimensiones

Antes de enseñar el proyecto, evalúate tú. Con honestidad, porque el objetivo no es la nota: es saber qué dirás cuando te pregunten por lo peor.

15.1 La rúbrica

Ocho dimensiones, 0 a 4 puntos cada una. Máximo 32.

Dimensión 0 · Ausente 1 · Inicial 2 · Competente 3 · Sólido 4 · Destacado
Funcionalidad No funciona Funciona el camino feliz Casos límite y errores contemplados Estados vacío, de carga y de error en todas las pantallas Además pensada para el uso real: atajos, datos de ejemplo, exportación
Dominio Lógica repartida por la interfaz Alguna función separada Capa de dominio con reglas Reglas completas, con invariantes y errores tipados Dominio sin dependencias, ejecutable en servidor sin cambios
Calidad de código Sin convenciones Formato consistente Lint y formato automáticos Nombres claros, funciones cortas, sin duplicación Fronteras de arquitectura verificadas automáticamente
Pruebas Ninguna Algunas unitarias Unitarias + integración Estrategia por niveles con cobertura razonada Además parametrizadas, regresiones documentadas y suite estable
Accesibilidad No contemplada HTML semántico Teclado y etiquetas axe limpio + recorrido completo por teclado Probada con lector de pantalla, con informe y limitaciones
Rendimiento Sin medir Medido una vez Presupuesto definido Presupuesto vigilado en CI Línea base documentada y comparada, con metodología
Documentación README mínimo README completo Con decisiones técnicas Con ADR y limitaciones Además con informes de accesibilidad, rendimiento y depuración
Despliegue Solo local Desplegado a mano Despliegue continuo Con HTTPS, caché y cabeceras de seguridad Además con reversión probada, monitorización y actualización de PWA

15.2 Cómo interpretar la puntuación

Total Lectura Qué hacer
28–32 Proyecto de portafolio excelente Preséntalo con seguridad; itera con comentarios reales
22–27 Sólido y defendible Identifica las dos dimensiones más bajas y súbelas
16–21 Funcional con huecos claros Prioriza pruebas y documentación: son las de mejor relación esfuerzo/valor
10–15 Prototipo Termina el MVP antes de presentarlo
< 10 Sin terminar Recorta el alcance hasta poder cerrarlo

La regla del equilibrio, que importa más que el total: es mejor un 3 en las ocho dimensiones (24) que un 4 en cuatro y un 0 en otras cuatro (16… o incluso 32 mal repartido). Un proyecto brillante sin pruebas ni accesibilidad transmite un perfil desequilibrado; un proyecto sólido en todo transmite alguien con quien se puede trabajar.

La pregunta obligatoria de la autoevaluación, y la más útil de todas:

¿Cuál es tu dimensión más baja, y qué dirías si te preguntan por ella?

Prepara esa respuesta con la fórmula del apartado 13. Te la van a pedir, y tenerla lista es la diferencia entre parecer consciente y parecer pillado.

  1. La revisión de código a uno mismo

Antes de publicar, revisa tu propio código como si fuera de otra persona. Es incómodo y encuentra cosas.

El procedimiento que hace posible el cambio de perspectiva:

  1. Deja pasar tiempo. Un día como mínimo. Tu cerebro rellena huecos en el código reciente.
  2. Lee el diff completo del proyecto en la interfaz web de GitHub, no en tu editor. El cambio de contexto visual funciona sorprendentemente bien.
  3. Ve fichero por fichero, de abajo hacia arriba de la arquitectura: dominio, datos, aplicación, vista.
  4. Anota, no arregles. Primero la lista completa; después las correcciones. Si arreglas mientras lees, pierdes el hilo y la perspectiva.
  5. Clasifica lo anotado en tres cajas: arreglar ahora, arreglar después (a la hoja de ruta), y aceptar (con su porqué anotado).

La lista de comprobación completa:

# Pregunta Señal de problema
1 ¿Un desarrollador nuevo entendería la estructura en 10 minutos? Carpetas sin criterio, nombres genéricos
2 ¿Hay código muerto, comentado o TODO sin fecha? Cualquier bloque comentado
3 ¿Hay console.log olvidados? grep -rn "console.log" src/
4 ¿Los nombres dicen la verdad? calcular… que además guarda
5 ¿Alguna función supera las 40 líneas? Hace más de una cosa
6 ¿Hay lógica duplicada en tres sitios? Falta una abstracción
7 ¿Las reglas de negocio están todas en el dominio? Un if de negocio en un manejador de eventos
8 ¿Se manejan los errores en todos los caminos? Un await sin try/catch alrededor
9 ¿Hay algún catch vacío? Silencia fallos: el peor patrón que existe
10 ¿Los números mágicos tienen nombre? 40 suelto en vez de MAX_HORAS
11 ¿Hay innerHTML con datos? Riesgo de XSS
12 ¿Hay secretos, claves o URL internas? grep antes de publicar
13 ¿Hay datos personales reales en la semilla o en las pruebas? Nombres de conocidos
14 ¿Las pruebas prueban comportamiento o implementación? Aserciones sobre métodos internos
15 ¿Todo lo que se conecta se desconecta? Un addEventListener sin su baja
16 ¿El README refleja lo que hace hoy el proyecto? Funcionalidades prometidas que no están

Los puntos 12 y 13 se comprueban siempre antes de publicar un repositorio, sin excepción.

  1. Buscar revisión externa y recibir crítica

Tu revisión tiene un límite infranqueable: no puedes ver lo que no sabes que existe. Para eso hacen falta otros ojos.

Dónde pedirla, con expectativas realistas:

Sitio Qué esperar Cómo pedirlo
Alguien que conozcas que programe La mejor calidad, si tiene tiempo Específico: «¿me miras la capa de datos, 20 min?»
Comunidades de desarrollo en línea Variable; a veces excelente Con contexto, pregunta concreta y enlace directo
Foros y espacios de revisión de código Dirigido a esto Sigue sus normas; sé concreto
Grupos y encuentros locales Buen ambiente, conversación Enséñalo en un encuentro informal
Una persona no técnica Muy infravalorado Para usabilidad: «úsalo y piensa en voz alta»

Cómo pedir una revisión que sirva. Las peticiones vagas obtienen respuestas vagas:

❌ Vago ✅ Concreto
«¿Me miráis el proyecto?» «Estructura de un gestor de tareas sin framework: ¿la separación entre aplicacion/ y vista/ os parece razonable o es ceremonia innecesaria?»
«¿Qué os parece?» «¿Veis algún problema en cómo manejo los conflictos de sincronización? Está en datos/sincronizador.js, 80 líneas.»

Añade siempre: qué es el proyecto en una frase, qué has intentado, y qué pregunta concreta tienes. Y enlaza a un fichero, no al repositorio entero.

Cómo recibir la crítica, que es la parte difícil:

Situación Reacción útil
Te señalan un fallo real «Gracias, tienes razón.» Corrígelo. Es literalmente trabajo gratis
Te señalan algo que fue una decisión Explica el contexto y escucha la respuesta. Puede que tu contexto estuviera mal
Te dicen algo con malos modos Separa el contenido del tono. El contenido puede ser correcto aunque el tono sobre
Te contradicen dos personas Las dos pueden tener razón en contextos distintos. Pregunta por el contexto de cada una
No entiendes el comentario Pregunta. «¿Puedes ponerme un ejemplo?» no es debilidad

Y la regla que más ayuda: una crítica a tu código no es una crítica a ti. Es difícil de sentir así al principio, y se aprende con la práctica. El atajo mental que funciona: la persona que señala un fallo en tu código te está regalando información que no tenías. Es la reacción de gratitud, no la de defensa, la que hace que te vuelvan a revisar.

Y no todas las críticas se aceptan. «Deberías usar React» sin conocer tu contexto no es una crítica accionable. Escucha, valora, y si no aplica, agradece y sigue. Aceptar todo lo que te dicen es tan malo como no aceptar nada.

  1. Publicar: repositorio, historial y licencia

Antes de hacer público el repositorio, una revisión final:

# Comprobación Comando
1 Sin secretos en el código ni en el historial git log -p | grep -iE "(api[_-]?key|password|secret|token)"
2 .env ignorado y .env.example presente git ls-files | grep env
3 Sin datos personales reales Revisar semillas, pruebas y capturas
4 Sin ficheros basura .DS_Store, dist/, coverage/, node_modules/
5 README completo y actualizado Lectura de dos minutos
6 Licencia presente Fichero LICENSE
7 Descripción, temas y enlace a la demo en GitHub En la configuración del repositorio
8 CI en verde en main Insignia verde
9 Sin ramas muertas git branch -a
10 Sin incidencias abiertas sin sentido Cerrar o etiquetar

El punto 1 tiene un matiz que sorprende a mucha gente: borrar un secreto en un commit posterior no lo elimina del historial. Sigue ahí, accesible con git log -p. Si alguna vez confirmaste uno, la única respuesta correcta es rotarlo (cambiar la clave en el servicio); reescribir el historial es opcional y no basta por sí solo.

El historial limpio. Un git log legible es una señal de profesionalidad que quien revisa mira más de lo que crees:

❌ Historial descuidado ✅ Historial legible
cambios, arreglos, mas cosas, asdf feat(dominio): detectar ciclos indirectos al vincular subtareas
Un commit de 3.000 líneas Commits de 50–200 líneas, uno por incremento
WIP, WIP 2, WIP final Cada commit deja el proyecto funcionando

Si tu historial es un desastre, tienes tres opciones honestas: dejarlo y aprender para el siguiente (perfectamente aceptable), limpiar solo lo más reciente, o empezar un repositorio nuevo con un historial cuidado si estás al principio. Lo que no hay que hacer es reescribir el historial de una rama compartida.

La licencia, con lo que hay que saber:

Licencia En una frase Cuándo
MIT Haz lo que quieras, cita la autoría, sin garantías La más común y la recomendada para un portafolio
Apache 2.0 Como MIT, más una concesión explícita de patentes Proyectos que puedan usarse en empresa
GPL v3 Quien lo use y distribuya debe publicar su código Si quieres que las derivadas sigan siendo libres
Sin licencia Nadie puede usarlo legalmente Casi nunca es lo que quieres

Ese último punto sorprende a mucha gente: un repositorio público sin licencia no es de dominio público. Por defecto, se aplican todos los derechos de autor, y nadie puede copiarlo, modificarlo ni usarlo legalmente. Si quieres que tu proyecto sirva de portafolio y que alguien pueda inspirarse en él, añade una licencia.

Y dos avisos:

  • Comprueba las licencias de tus dependencias. La mayoría son MIT o similares y no dan problema, pero conviene mirarlo (npx license-checker --summary).
  • Nada de esto es asesoramiento legal. Para un proyecto personal de portafolio, MIT es una elección segura y habitual. Para un producto comercial, consulta.

  1. El portafolio

Tu proyecto tiene que aparecer donde la gente lo busque:

Sitio Qué poner Longitud
GitHub, repositorio fijado Descripción, temas, enlace a la demo 1 línea
Perfil de GitHub (README) El proyecto destacado con su GIF 3–4 líneas
Currículum Nombre, una frase, tecnologías, enlaces 2 líneas
LinkedIn Proyecto con imagen y enlaces Un párrafo
Web personal, si la tienes La versión completa Una página

En el currículum, el formato que funciona:

Órbita — Gestor de trabajo para equipos pequeños                    2026
JavaScript (sin frameworks), Vite, Jest, Testing Library, Cypress, PWA
Aplicación con arquitectura por capas y 15 reglas de negocio en un dominio sin
dependencias del navegador. 251 pruebas (96 % de cobertura en dominio), CI con
presupuesto de rendimiento y accesibilidad, despliegue continuo y funcionamiento
sin conexión con cola de sincronización idempotente.
Demo: orbita.example · Código: github.com/usuario/orbita

Qué hace bueno ese bloque: hay números concretos (15 reglas, 251 pruebas, 96 %), hay conceptos que demuestran nivel (arquitectura por capas, presupuesto en CI, idempotencia), y hay enlaces. No hay adjetivos vacíos: ni «robusto», ni «escalable», ni «moderno».

Un proyecto bien contado vale más que tres a medias. Si tienes varios, elige el mejor, cuéntalo entero, y menciona los demás en una línea.

  1. Iterar después de la entrega

Aquí está la diferencia entre un ejercicio y un producto: el ejercicio se entrega y se acaba; el producto tiene una versión siguiente.

Cómo conseguir comentarios reales, que es lo más valioso y lo que menos se hace:

Fuente Cómo Qué obtienes
Observar a alguien usarlo Dale una tarea concreta, siéntate al lado y no ayudes Lo más valioso, con diferencia
Pensar en voz alta «Di lo que estás pensando mientras lo usas» Dónde duda y por qué
Formulario corto 3 preguntas máximo Poca profundidad, algo de volumen
Analítica Qué se usa y qué no Datos sin el porqué
Incidencias en GitHub Un enlace visible en el README De gente técnica

La técnica de observar a alguien usarlo merece detalle porque es brutalmente eficaz y casi nadie la aplica: le das una tarea («crea una tarea con dos subtareas y averigua quién está más cargado esta semana»), te callas, y observas. La regla es no ayudar nunca. Cada vez que sientas el impulso de decir «tienes que pulsar ahí», eso es un fallo de diseño que acabas de encontrar. Con tres personas descubres el 80 % de los problemas de usabilidad.

Cómo priorizar lo que llega. No todo se hace, y decidir es la habilidad:

Mucho impacto Poco impacto
Poco esfuerzo Hazlo ya Hazlo si sobra tiempo
Mucho esfuerzo Planifícalo bien Descártalo

Con un filtro previo de tres preguntas para cada petición:

  1. ¿Cuántas personas lo han pedido? Una petición apasionada de una persona no es una tendencia.
  2. ¿Encaja con la frase del producto (11-01)? Si no, probablemente sea otro producto.
  3. ¿Qué se rompe si lo hago? Toda funcionalidad nueva añade superficie que mantener.

Planificar la versión siguiente es repetir el ciclo de 11-01 en pequeño: escoge tres o cuatro cosas, escríbelas como historias con criterios, estima con tu factor de corrección ya calibrado por el proyecto anterior —que ahora es real y no una suposición—, y ponte una fecha.

Y una nota sobre cuándo parar. No todos los proyectos deben continuar eternamente. Un proyecto puede estar terminado en el sentido de que cumple lo que prometía. Si decides no seguir, dilo en el README:

## Estado del proyecto

Órbita está **terminado** como proyecto de aprendizaje: cumple su MVP,
está desplegado y documentado. No está en desarrollo activo, pero se
aceptan incidencias y se corrigen fallos de seguridad.

Eso es mucho más honesto que un repositorio con la última actividad hace dos años y una hoja de ruta llena de casillas sin marcar.

Errores Comunes y Consejos

Un README que empieza por la instalación. A quien llega no le interesa instalar nada hasta que sepa qué es y para qué sirve. Nombre, frase, imagen, demo, problema — y luego lo demás.

No poner ninguna imagen. Es el fallo más caro del README, porque el 90 % de la gente que lo abre mira si hay imagen antes de leer una palabra. Un GIF de doce segundos vale más que tres párrafos.

Listar tecnologías en lugar de decir qué hace el producto. «React, Redux, Tailwind, Vite» no dice si es un gestor de tareas o un juego. Las tecnologías van en la sección de decisiones, con su porqué.

Ocultar las limitaciones. Se descubren solas, y entonces parece que ocultabas. Declararlas es lo que más credibilidad da, y es lo que casi nadie hace.

Documentar el qué en lugar del porqué. Un comentario que repite lo que el código dice es ruido que además se desactualiza. El porqué, las alternativas descartadas y el contexto son lo único que el código no puede contarte.

Una demostración que es un recorrido por botones. Sin problema al principio, no hay tensión narrativa y nadie recuerda nada. Problema, solución, un flujo completo, un detalle técnico, limitaciones.

Demostrar con datos de prueba. «Tarea 1», «asdf», «prueba prueba» hacen que tu producto parezca un ejercicio de clase. Prepara un conjunto verosímil y ficticio.

No ensayar la demostración. Se tarda un 30–50 % más de lo que uno cree, y sin ensayo se llega al minuto cinco por la mitad. Tres pasadas en voz alta con cronómetro.

Responder «no sé React» a «¿por qué no usaste React?». Convierte una decisión en una limitación. Contexto, decisión, dato, y cuándo cambiarías de opinión.

Pedir perdón por tu proyecto. «Está un poco feo», «no me dio tiempo». Resta, no aporta, e invita a mirar justo donde no quieres. Las limitaciones van enmarcadas, no disculpadas.

Publicar sin revisar el historial. Un secreto confirmado hace tres meses sigue accesible con git log -p. Si ocurrió, la respuesta es rotar la clave, no solo borrarla.

Publicar sin licencia. Un repositorio público sin licencia no puede ser usado legalmente por nadie. Si es portafolio, MIT y listo.

Consejo · Escribe el README como si fuera para alguien con prisa y sin contexto. Porque lo es. Frases cortas, tablas, listas, y lo importante arriba.

Consejo · Guarda el GIF y las capturas en el repositorio, en docs/imagenes/. Los servicios externos de imágenes caducan y dejan huecos en tu README dentro de dos años.

Consejo · Escribe los ADR el mismo día que tomas la decisión. Reconstruir el razonamiento un mes después es imposible: recordarás la conclusión, no las alternativas ni el porqué.

Consejo · Ensaya la demostración grabándote. Es incómodo verse, y es la forma más rápida de detectar muletillas, prisas y las partes donde te pierdes.

Consejo · Ten preparadas dos historias, un bug difícil y una decisión de diseño, escritas y cronometradas en dos minutos. Te las van a pedir, y no querrás improvisarlas.

Ejercicios

Estos ejercicios cierran el hito H6 de tu proyecto: README, ADR, guion de demostración y autoevaluación cumplimentada.

Ejercicio 1 — El README y los ADR.

  1. Escribe el README.md completo con la plantilla del apartado 3, adaptada a tu proyecto: identidad con insignias, imagen, demo, problema, funcionalidades, tabla de decisiones técnicas con enlaces a ADR, ejecución, pruebas con números reales, arquitectura, limitaciones conocidas, tabla de rendimiento con metodología, hoja de ruta y licencia.
  2. Graba un GIF de 10–15 segundos del flujo principal cumpliendo las siete reglas del apartado 4, guardado en el repositorio, de menos de 3 MB.
  3. Prepara los datos de demostración con los siete elementos de la tabla del apartado 10, todos ficticios, y añade el modo demo o la semilla automática.
  4. Escribe al menos cinco ADR con la plantilla completa del apartado 6, con sus cinco secciones —incluidas las consecuencias negativas y el «cuándo revisar»— y con al menos dos alternativas evaluadas en cada uno.
  5. Haz la prueba de los dos minutos: dale el README a alguien que no conozca el proyecto, cronometra, y pídele que responda las cuatro preguntas. Anota qué no supo contestar y corrige el README.

Ejercicio 2 — La demostración y las respuestas de entrevista.

  1. Escribe el guion de cinco minutos con la estructura de cinco pasos, con los tiempos anotados y lo que dirás en cada uno.
  2. Ensáyalo tres veces en voz alta con cronómetro y ajústalo hasta caber en cinco minutos con margen.
  3. Grábate haciéndolo y revísalo. Anota tres cosas a mejorar.
  4. Prepara el plan B completo: la tabla de seis situaciones adaptada a tu contexto, más una grabación de 90 segundos del flujo principal como último recurso.
  5. Escribe y ensaya las respuestas a estas seis preguntas, cada una en menos de dos minutos:
    • «Háblame de este proyecto» (estructura de cinco pasos del apartado 11).
    • «¿Por qué no usaste React?» (o el framework que corresponda), con contexto, decisión, dato y cuándo cambiarías de opinión.
    • «¿Qué es lo peor de tu proyecto?» (fórmula de tres partes del apartado 13).
    • «Cuéntame un bug difícil» (formato SAR, con aprendizaje generalizable).
    • «¿Cómo escalaría a 10.000 elementos?» (empezando por medir).
    • «¿Qué harías distinto?» (concreto y técnico).

Ejercicio 3 — Autoevaluación, revisión y publicación.

  1. Cumplimenta la rúbrica de ocho dimensiones del apartado 15, con una justificación de una frase por cada puntuación. Nada de puntuarte de memoria: abre el proyecto y compruébalo.
  2. Identifica tus dos dimensiones más bajas y escribe un plan concreto para subirlas, con el esfuerzo estimado.
  3. Prepara la respuesta a «¿cuál es tu punto más débil?» con la fórmula de tres partes.
  4. Haz la revisión de código a ti mismo con las 16 comprobaciones del apartado 16, dejando pasar al menos un día. Documenta los hallazgos clasificados en las tres cajas: arreglar ahora, después, y aceptar con su porqué.
  5. Pide una revisión externa con una pregunta concreta sobre una parte concreta. Documenta qué te dijeron, qué aceptaste y qué descartaste con su razón.
  6. Haz que al menos una persona use tu aplicación mientras la observas, sin ayudar. Anota cada momento de duda: cada uno es un fallo de diseño.
  7. Ejecuta las 10 comprobaciones previas a la publicación del apartado 18, incluida la del historial de Git. Añade licencia, descripción, temas y enlace a la demo.
  8. Añádelo a tu portafolio: repositorio fijado, README del perfil, y el bloque de currículum con números concretos.
  9. Planifica la versión siguiente: tres o cuatro mejoras priorizadas con la matriz impacto/esfuerzo, escritas como historias con criterios, y con fecha.

Soluciones

Rúbrica del ejercicio 1 — README y ADR (24 puntos)

Dimensión 0 1 2 3
Prueba de los dos minutos No la pasa Con ayuda La pasa La pasa y quien lee quiere probarlo
Imagen No hay Captura GIF del flujo GIF con datos verosímiles y las 7 reglas
Problema Ausente Mencionado Concreto Con la situación real que motiva el producto
Decisiones técnicas No hay Lista de tecnologías Tabla con porqué Con enlaces a ADR y datos que las respaldan
Limitaciones Ocultas Alguna Lista completa Con razón y plan para cada una
Instrucciones Incompletas Funcionan Con requisitos Copiadas y pegadas funcionan a la primera
ADR: número y forma < 3 3–4 5 completos 5+ con las cinco secciones
ADR: calidad Solo la decisión Con contexto Con alternativas Con consecuencias negativas y «cuándo revisar»

Umbral: 17/24, con obligatoriamente ≥ 2 en «Prueba de los dos minutos» y en «ADR: calidad».

Criterios de aceptación del ejercicio 1

# Criterio Verificación
1 Alguien externo responde las 4 preguntas en 2 min Prueba real, cronometrada
2 El GIF pesa menos de 3 MB y dura 10–15 s Propiedades del fichero
3 Los datos de demostración son ficticios y verosímiles Revisión
4 Los siete elementos del conjunto de demo están Lista comprobada
5 Cada ADR tiene ≥ 2 alternativas evaluadas Lectura
6 Cada ADR declara consecuencias negativas Lectura
7 Las instrucciones funcionan en una máquina limpia Clonar en otra carpeta y ejecutar
8 Los números del README son reales Comparar con npm run test:cov

Criterios de aceptación del ejercicio 2 — Demostración

# Criterio Verificación
1 La demo dura menos de 5 min Cronómetro en el ensayo grabado
2 Empieza por el problema, no por la interfaz Los primeros 45 s sin abrir nada
3 Un flujo completo, no un recorrido por botones Guion
4 Un detalle técnico contado con profundidad Guion
5 Las limitaciones se dicen sin disculparse Grabación
6 Hay plan B para las seis situaciones Documento
7 Existe la grabación de 90 s de respaldo Fichero
8 Las seis respuestas duran < 2 min cada una Cronometradas
9 La respuesta del framework incluye un dato propio Contenido
10 La historia del bug dedica ≥ 50 % a la acción Análisis del texto
11 La historia del bug termina en aprendizaje aplicado Contenido
12 Ninguna respuesta contiene «no sé» sin continuación Revisión

Rúbrica del ejercicio 3 — Revisión y publicación (21 puntos)

Dimensión 0 1 2 3
Honestidad de la autoevaluación Inflada Aproximada Justificada Con evidencia por dimensión
Plan de mejora No hay Genérico Concreto Con esfuerzo estimado y priorizado
Autorrevisión No hecha Superficial Las 16 comprobaciones Con hallazgos clasificados en tres cajas
Revisión externa No pedida Pedida en vago Pregunta concreta Documentada con qué se aceptó y qué no, y por qué
Prueba con usuario No hecha Preguntaste una opinión Observaste sin ayudar Con lista de momentos de duda y correcciones
Publicación Sin revisar Comprobaciones básicas Las 10 Incluido el historial y con licencia razonada
Portafolio No aparece Enlace suelto Repositorio fijado y currículum Con números concretos y sin adjetivos vacíos

Umbral: 14/21. Con una condición que no se compensa: cero secretos y cero datos personales reales, ni en el código ni en el historial ni en las capturas.

La autoevaluación final del proyecto. Antes de dar el hito por cerrado:

Pregunta Sí / No
¿Alguien que no conozca mi proyecto lo entiende en dos minutos?
¿Puedo explicar cada decisión técnica importante con su alternativa descartada?
¿He ensayado la demostración en voz alta con cronómetro?
¿Sé qué responder a «¿por qué no usaste un framework?» con un dato propio?
¿Sé cuál es mi punto más débil y qué diré cuando me lo pregunten?
¿He visto a alguien usar mi aplicación sin ayudarle?
¿Mi repositorio está limpio, con licencia y sin secretos en el historial?
¿Tengo escrita la versión siguiente, o he declarado que está terminado?

Conclusión

Has convertido un proyecto que funcionaba en un proyecto que se puede enseñar, defender y mejorar — y esa diferencia vale tanto como el código.

Sabes por qué presentar es parte del trabajo: porque nadie va a leer 4.000 líneas para descubrir lo que hiciste bien, porque quien te evalúa tiene entre 90 segundos y 15 minutos, y porque explicar decisiones es una habilidad profesional de primer orden con la que se topa cualquiera que construya bien y no sepa contarlo.

Tienes un README que pasa la prueba de los dos minutos, con el orden de interés decreciente que funciona: identidad, imagen, demo, problema, funcionalidades, decisiones técnicas —la sección que te diferencia de otros diez proyectos iguales— y limitaciones conocidas, que es la sección que más credibilidad da y que casi nadie escribe. Con insignias que comunican en dos segundos, con la tabla de rendimiento acompañada de su metodología, y con instrucciones que funcionan copiadas y pegadas. Y con un GIF que cumple las siete reglas, porque la imagen es lo primero que se mira y lo que menos cuidado suele recibir.

Tienes ADR para las cinco decisiones que lo merecen, con las cinco secciones obligatorias —contexto, alternativas evaluadas, decisión, consecuencias incluidas las negativas, y cuándo revisarla— y sabes por qué el porqué vale más que el qué: el código dice qué se hizo, los nombres y las pruebas dicen cómo, pero solo un ADR dice por qué no se hizo de la otra forma. Esa es la información más valiosa y la que más rápido se pierde, y sin ella quien llegue después gastará una semana en llegar a tu misma conclusión.

Tienes una demostración de cinco minutos con estructura de historia en lugar de recorrido por botones: problema, solución, un flujo completo, un detalle técnico contado bien, y limitaciones con hoja de ruta. Con las cinco reglas de ejecución —ensayar tres veces con cronómetro, no leer, no enseñar código salvo que lo pidan, no pedir perdón por nada, y terminar con lo siguiente—, con datos ficticios y verosímiles que contienen los siete elementos que hacen que el producto se explique solo, y con un plan B para seis situaciones más una grabación de 90 segundos que es el seguro más barato que existe.

Sabes hablar del proyecto en una entrevista entendiendo qué se evalúa de verdad: no cuántas tecnologías usaste sino por qué; no si es grande sino si está terminado; no si es perfecto sino si conoces sus defectos. Tienes la estructura de cinco pasos que termina en un gancho —«si quieres te enseño…»— que convierte un monólogo en conversación. Y tienes preparada la pregunta que te van a hacer seguro, «¿por qué no usaste React?», con las tres peores respuestas identificadas y una buena construida sobre contexto, decisión, un dato propio y —lo que separa el criterio del dogma— cuándo cambiarías de opinión. Con la variante honesta para cuando no tienes el dato, porque inventarlo siempre sale peor.

Sabes reconocer una limitación sin sonar inseguro con la fórmula de tres partes —qué falta, por qué está así, qué harías— que convierte un defecto en una demostración de criterio. Y sabes contar un bug difícil con el formato SAR dedicando la mitad a la acción y no a lo raro que era, con los seis elementos que la hacen buena y, sobre todo, con un aprendizaje generalizable que aplicaste después.

Te has autoevaluado con una rúbrica de ocho dimensiones y 32 puntos, sabiendo que el equilibrio importa más que el total —un 3 en las ocho vale más que un 4 en cuatro y un 0 en el resto— y con la pregunta obligatoria contestada: cuál es tu dimensión más baja y qué dirás cuando te pregunten por ella.

Sabes revisarte el código a ti mismo con distancia, en la interfaz web, de abajo hacia arriba de la arquitectura, anotando antes de arreglar y clasificando en tres cajas. Y sabes buscar revisión externa con peticiones concretas en lugar de vagas, y recibir la crítica con la regla que lo cambia todo: quien señala un fallo en tu código te está regalando información que no tenías. Con el matiz de que no todas las críticas se aceptan, y que aceptar todo es tan malo como no aceptar nada.

Sabes publicar con las diez comprobaciones previas, incluida la que sorprende —que borrar un secreto no lo quita del historial, y que la única respuesta correcta es rotar la clave—, con un historial legible, y con licencia, porque un repositorio público sin licencia no lo puede usar nadie legalmente. Y sabes ponerlo en el portafolio con números concretos y sin adjetivos vacíos.

Y sabes iterar después de la entrega, que es la diferencia entre un ejercicio y un producto: observar a alguien usarlo sin ayudar nunca —cada impulso de ayudar es un fallo de diseño encontrado—, priorizar con la matriz de impacto y esfuerzo y las tres preguntas de filtro, y planificar la versión siguiente repitiendo el ciclo de 11-01 con un factor de estimación que ya no es una suposición sino un dato de tu propio proyecto. O declarar honestamente que está terminado, que también es una respuesta válida y mucho mejor que una hoja de ruta abandonada.

El hito H6 está cerrado, y con él el proyecto: planificado, construido, persistido, probado, desplegado, documentado y defendible. Queda una sola lección, y no es de proyecto: es el balance de todo lo que sabes ahora, el mapa de lo que viene después —TypeScript, Node.js, un framework en profundidad, la plataforma web, la carrera— y cómo se sigue aprendiendo cuando ya no hay un curso que te diga qué toca. Es Siguientes Pasos: TypeScript, Node.js y tu Carrera.

Curso de JavaScript: De Principiante a Avanzado

Módulo 1: Introducción a JavaScript

Módulo 2: Estructuras de Control

Módulo 3: Funciones

Módulo 4: Objetos y Arrays

Módulo 5: Objetos y Funciones Avanzadas

Módulo 6: El Modelo de Objetos del Documento (DOM)

Módulo 7: APIs del Navegador y Temas Avanzados

Módulo 8: Pruebas y Depuración

Módulo 9: Rendimiento y Optimización

Módulo 10: Frameworks y Librerías de JavaScript

Módulo 11: Proyecto Final

© Copyright 2026. Todos los derechos reservados