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
- Por qué presentar es parte del trabajo
- El README que se entiende en dos minutos
- La plantilla completa, comentada
- Capturas, GIF y demo
- Documentar decisiones: los ADR
- La plantilla de ADR y cinco ejemplos reales
- Por qué el porqué vale más que el qué
- La demostración de cinco minutos
- El guion y el orden de la narración
- Datos de ejemplo preparados y plan B
- Hablar del proyecto en una entrevista técnica
- «¿Por qué no usaste React?»
- Reconocer una limitación sin sonar inseguro
- Contar un bug difícil
- La autoevaluación con rúbrica por dimensiones
- La revisión de código a uno mismo
- Buscar revisión externa y recibir crítica
- Publicar: repositorio, historial y licencia
- El portafolio
- Iterar después de la entrega
- Errores Comunes y Consejos
- Ejercicios
- Conclusión
- 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.
- 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:
- ¿Qué es esto y para quién?
- ¿Funciona? ¿Puedo verlo?
- ¿Qué tiene de interesante técnicamente?
- ¿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.
- La plantilla completa, comentada
<!-- 1 · IDENTIDAD: nombre, insignias, una frase. Nada más. --> # Órbita [](…) [](…) [](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. -->  --- <!-- 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
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.
- 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:
- Muestra el flujo principal completo, no un clic suelto.
- Datos realistas. Nada de «tarea 1», «prueba», «asdf». Usa los tuyos ficticios pero verosímiles.
- Movimiento del ratón lento y deliberado. Los movimientos rápidos marean.
- Sin barras de herramientas ni pestañas del navegador: solo la aplicación.
- Menos de 3 MB, o GitHub tardará en cargarlo y muchos verán un hueco.
- Empieza y termina en un estado limpio, para que el bucle no dé saltos.
- 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».
- 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.
- 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.
- 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.
- 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 |
- 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:
- 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.
- No leas el guion. Apréndete la estructura, improvisa las palabras.
- No enseñes código salvo que lo pidan, y si lo pides tú, que sea un fragmento corto y preparado.
- 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.
- Termina con lo siguiente, no con «y ya está». Deja la sensación de proyecto vivo.
- 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.
- 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íalocalStorage, 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.
- «¿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-idy 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:
- Empieza afirmando que fue una decisión, no una limitación.
- Da el contexto concreto que la justifica: producto, equipo, superficie.
- Aporta un dato, no una opinión.
- Declara cuándo cambiaría de opinión, que es la marca del criterio frente al dogma.
- 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.
- 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.
- 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í
fetchpara retrasar tres segundos solo las peticionesPUT. Con eso pasaba siempre.Con la secuencia delante vi que había dos operaciones asíncronas: el
PUToptimista, 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:
- Síntoma concreto, con el detalle de que era intermitente.
- Reproducir primero, dicho explícitamente como principio.
- Una técnica concreta: retrasar solo un tipo de petición.
- La prueba antes de la corrección.
- Alternativas evaluadas, con el criterio de elección.
- 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.
- 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.
- 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:
- Deja pasar tiempo. Un día como mínimo. Tu cerebro rellena huecos en el código reciente.
- Lee el diff completo del proyecto en la interfaz web de GitHub, no en tu editor. El cambio de contexto visual funciona sorprendentemente bien.
- Ve fichero por fichero, de abajo hacia arriba de la arquitectura: dominio, datos, aplicación, vista.
- Anota, no arregles. Primero la lista completa; después las correcciones. Si arreglas mientras lees, pierdes el hilo y la perspectiva.
- 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.
- 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.
- 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.
- 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 |
| 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/orbitaQué 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.
- 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:
- ¿Cuántas personas lo han pedido? Una petición apasionada de una persona no es una tendencia.
- ¿Encaja con la frase del producto (11-01)? Si no, probablemente sea otro producto.
- ¿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.
- Escribe el
README.mdcompleto 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. - 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.
- 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.
- 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.
- 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.
- Escribe el guion de cinco minutos con la estructura de cinco pasos, con los tiempos anotados y lo que dirás en cada uno.
- Ensáyalo tres veces en voz alta con cronómetro y ajústalo hasta caber en cinco minutos con margen.
- Grábate haciéndolo y revísalo. Anota tres cosas a mejorar.
- 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.
- 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.
- 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.
- Identifica tus dos dimensiones más bajas y escribe un plan concreto para subirlas, con el esfuerzo estimado.
- Prepara la respuesta a «¿cuál es tu punto más débil?» con la fórmula de tres partes.
- 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é.
- 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.
- 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.
- 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.
- Añádelo a tu portafolio: repositorio fijado, README del perfil, y el bloque de currículum con números concretos.
- 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
- ¿Qué es JavaScript?
- Configuración de tu Entorno de Desarrollo
- Tu Primer Programa en JavaScript
- Sintaxis y Conceptos Básicos de JavaScript
- Variables y Tipos de Datos
- Operadores Básicos
- Conversión de Tipos y Comparaciones
- El Proyecto del Curso: Nómada Tareas
Módulo 2: Estructuras de Control
- Sentencias Condicionales
- Bucles: for, while, do-while
- Sentencias Switch
- Control del Flujo: break, continue y Bucles Anidados
- Manejo de Errores con try-catch
Módulo 3: Funciones
- Definición y Llamada de Funciones
- Expresiones de Función y Funciones Flecha
- Parámetros y Valores de Retorno
- Ámbito y Closures
- Hoisting y el Contexto de Ejecución
- Funciones de Orden Superior
- Recursividad
Módulo 4: Objetos y Arrays
- Introducción a los Objetos
- Métodos de Objeto y la Palabra Clave
this - Arrays: Conceptos Básicos y Métodos
- Iteración sobre Arrays
- Buscar, Ordenar y Agregar Datos: find, sort y reduce
- Desestructuración de Arrays
- Desestructuración de Objetos, Spread y Rest
- JSON y Copias de Objetos
Módulo 5: Objetos y Funciones Avanzadas
- Prototipos y Herencia
- Clases y Programación Orientada a Objetos
- Encapsulación: Getters, Setters y Campos Privados
- Módulos e Importación/Exportación
- JavaScript Asíncrono: Callbacks
- Promesas y Async/Await
- El Bucle de Eventos y la Cola de Microtareas
- Iteradores y Generadores
Módulo 6: El Modelo de Objetos del Documento (DOM)
- Introducción al DOM
- Selección y Manipulación de Elementos del DOM
- Manejo de Eventos
- Propagación, Delegación y Eventos Personalizados
- Creación y Eliminación de Elementos del DOM
- Renderizado de Listas y Plantillas HTML
- Manejo y Validación de Formularios
Módulo 7: APIs del Navegador y Temas Avanzados
- Almacenamiento Local y de Sesión
- Fetch API y AJAX
- Peticiones Robustas: Errores, Timeouts y AbortController
- WebSockets
- Service Workers y Aplicaciones Web Progresivas (PWAs)
- APIs del Navegador Esenciales
- Introducción a WebAssembly
Módulo 8: Pruebas y Depuración
- Depuración de JavaScript
- Calidad de Código: ESLint, Prettier y Convenciones
- Pruebas Unitarias con Jest
- Dobles de Prueba: Mocks, Stubs y Spies
- Pruebas de Integración
- Pruebas de Extremo a Extremo con Cypress
Módulo 9: Rendimiento y Optimización
- Medir Antes de Optimizar: DevTools y Web Vitals
- Optimización del Rendimiento de JavaScript
- Gestión de Memoria
- Manipulación Eficiente del DOM
- Carga Perezosa y División de Código
Módulo 10: Frameworks y Librerías de JavaScript
- Por Qué Existen los Frameworks
- Introducción a React
- Gestión de Estado con Redux
- Conceptos Básicos de Vue.js
- Conceptos Básicos de Angular
- Elegir el Framework Adecuado
