FASE 1 · SESIÓN 4

Mindset de Desarrollador

El 90% de los juniors no fracasan por falta de conocimiento técnico. Fracasan por no saber cómo aprender, debuggear y resolver problemas que no conocen.

⏱ 2 horas 🧠 Psicología + proceso 🔍 Debugging
AL TERMINAR ESTA SESIÓN VAS A SABER

Lo que separa a un junior de un senior

No es la cantidad de código que saben de memoria. No es la velocidad. Es cómo responden cuando se topan con algo que no conocen. Los seniors se topan con cosas desconocidas a diario. La diferencia está en el proceso.

JUNIOR SIN MINDSET
  • Intenta arreglar antes de leer el error completo
  • Busca en Google: "css not working"
  • Pide ayuda tras 5 minutos de frustración
  • Copia Stack Overflow sin entender qué hace
  • Cuando funciona, no pregunta por qué funciona
  • Trabaja horas en el mismo bloqueo sin parar
  • Siente que no saber algo = no sirve para esto
DESARROLLADOR CON MINDSET
  • Lee el error completo y la línea exacta donde ocurre
  • Busca: "css grid gap not working safari 17"
  • Dedica 20 min activos antes de pedir ayuda
  • Lee el código copiado y lo entiende antes de usarlo
  • Cuando funciona, quiere entender exactamente por qué
  • Toma pausas deliberadas cuando lleva 45 min bloqueado
  • Normaliza no saber: la documentación existe para eso

Debugging: un proceso, no magia

Debugging no es adivinar. Es un método sistemático. Los desarrolladores experimentados siguen pasos aunque no lo hagan conscientemente. Aquí el proceso explícito.

PASO 01

Lee el error completo

No el primer texto. El mensaje completo, la línea exacta, el stack trace. El 60% de los errores se resuelven en este paso. El mensaje te dice exactamente qué está mal y dónde.

PASO 02

Reproduce el error de forma consistente

Antes de tocar nada: asegúrate de poder reproducir el error cada vez. Si no puedes reproducirlo de forma consistente, no puedes arreglarlo de forma consistente.

PASO 03

Aisla el problema

Comenta código hasta que el error desaparezca. El último bloque que comentaste es el culpable. Crea el caso más simple posible que reproduzca el problema.

PASO 04

Formula una hipótesis y pruébala

No cambies múltiples cosas a la vez. Cambia una cosa, prueba, observa el resultado. Si cambias tres cosas y se arregla, no sabes cuál lo arregló.

PASO 05

Documenta la solución

Un comentario en el código, un commit descriptivo, o una nota personal. La próxima vez que veas este error (y la verás), habrás ahorrado horas.

EJEMPLO REAL

Escenario: el botón de enviar no hace nada

  1. Abrir DevTools → Console: ¿Dice "Cannot read properties of null"? → El querySelector falló
  2. Reproducir: pasa siempre al cargar la página, no solo al hacer clic
  3. Aislar: console.log(document.querySelector('#enviar')) devuelve null
  4. Hipótesis: el script corre antes de que el DOM exista. Mover script al final del body.
  5. Fix confirmado. Commit: "fix: move script to end of body — fixes null querySelector"

Las DevTools: tu laboratorio

Las DevTools del navegador son la herramienta más poderosa. La mayoría de novatos las usa solo para console.log. Hay mucho más.

Elements Console Network Sources
ELEMENTS — INSPECCIONAR HTML + CSS
  • Clic derecho en cualquier elemento → Inspect para abrirlo en Elements
  • Doble clic en el HTML para editarlo en tiempo real
  • Panel Styles: ve qué reglas CSS aplican y cuáles están sobreescritas (tachadas)
  • Panel Computed: el valor FINAL de cada propiedad CSS
  • Force element state: :hover, :focus, :active para debuggear sin mouse
  • Modo responsive: ícono de dispositivo para simular iPhone, iPad, etc.
CONSOLE — JAVASCRIPT Y LOGS
console.log('valor:', variable); // log básico console.table([array, de, objetos]); // tabla visual console.error('error!'); // rojo — para errores reales console.warn('cuidado'); // amarillo — warnings console.time('nombre'); // inicia timer /* ... código a medir ... */ console.timeEnd('nombre'); // para y muestra tiempo // Desde la consola directamente: $0 // el elemento seleccionado en Elements $$('.card') // querySelectorAll rápido
NETWORK — PETICIONES HTTP
  • Filtra por Fetch/XHR para ver solo las llamadas a APIs
  • Clic en una petición: Headers (qué enviaste), Response (qué recibiste)
  • Status 200=OK · 404=no encontrado · 401=sin auth · 500=error servidor
  • Throttling: simula 3G o Slow 3G para probar con conexión lenta
  • Disable cache mientras desarrollas para ver siempre los cambios
SOURCES — DEBUGGING LÍNEA A LÍNEA
  • Clic en el número de línea → breakpoint: el código para justo ahí
  • Step over (F10): ejecuta la siguiente línea sin entrar en funciones
  • Step into (F11): entra en la función de la línea actual
  • Watch: observa el valor de cualquier variable en tiempo real
  • Escribe debugger; en tu código → breakpoint automático desde JS

Buscar bien es una habilidad técnica

La diferencia entre una búsqueda que resuelve en 30 segundos y una que tarda 2 horas está en la especificidad. Saber qué buscar y cómo buscar es tan importante como saber código.

BÚSQUEDA INEFECTIVA
"css not working" "javascript error" "how to make button" "flexbox help"
BÚSQUEDA EFECTIVA
"css grid gap ignored safari 17 2024" "cannot read properties of null reading addEventListener" "html button submit prevent default event" "flexbox items overflow not wrapping"
CÓMO CONSTRUIR TU BÚSQUEDA
  1. Tecnología + descripción exacta del comportamiento
  2. Nombre del error exacto si lo hay (copia la primera línea)
  3. Año o versión si el comportamiento pudo cambiar recientemente
  4. Sitio específico cuando sabes dónde buscar: site:stackoverflow.com

MDN Web Docs

Para: qué hace un método/propiedad, parámetros, compatibilidad de navegadores. Siempre empezar aquí.

Stack Overflow

Para: errores específicos que otros tuvieron. Verifica la fecha: soluciones de 2016 pueden estar desactualizadas.

GitHub Issues

Para: bugs del framework o librería en sí. Si React, Next.js o Vite no funciona "como debería".

La anatomía de una buena pregunta

Contexto: Estoy construyendo [qué], usando [tecnología y versión]. Problema: Al hacer [acción específica], espero [resultado esperado] pero obtengo [resultado actual]. Error exacto: [mensaje de error o comportamiento] Ya intenté: - [cosa 1] - [cosa 2] Código mínimo que reproduce el problema: [solo el código relevante, sin imports innecesarios]

El pseudocódigo: programar en español primero

Los desarrolladores más rápidos son los que más planifican antes de escribir código. 10 minutos de planificación ahorran 2 horas de refactoring. El pseudocódigo es el puente entre el problema y la solución.

1. ENTENDER EL PROBLEMA

Antes de una línea de código: ¿Qué debe hacer exactamente? ¿Cuándo? ¿Qué inputs? ¿Qué outputs? ¿Edge cases?

Qué: filtrar notas en tiempo real Input: texto del usuario Output: lista de notas filtradas Cuándo: mientras el usuario escribe Edge: texto vacío → mostrar todas Edge: sin resultados → mensaje
2. PSEUDOCÓDIGO

Escribe los pasos en lenguaje natural. Sin preocuparte por sintaxis.

CUANDO cambia el input de búsqueda: 1. Obtener el texto (en minúsculas) 2. Si texto está vacío: → mostrar TODAS las notas 3. Si hay texto: → filtrar notas donde título O contenido contiene texto → renderizar notas filtradas 4. Si array filtrado está vacío: → mostrar "Sin resultados"
3. CÓDIGO

Ahora sí: traducir el pseudocódigo a JavaScript. Cada paso ya lo tienes claro.

inputBusqueda.addEventListener('input', () => { const texto = inputBusqueda.value .toLowerCase().trim(); const filtradas = texto === '' ? todasLasNotas : todasLasNotas.filter(n => n.titulo.toLowerCase().includes(texto) || n.cuerpo.toLowerCase().includes(texto) ); renderizar(filtradas); if (filtradas.length === 0) { mostrarVacio(`Sin resultados: "${texto}"`); } });

El síndrome del impostor es universal

El 70% de los profesionales exitosos lo experimentan. No es exclusivo de principiantes. La diferencia es que los seniors saben que es normal y siguen adelante de todas formas.

01

No saber ≠ no servir

Desarrolladores seniors con 10 años buscan en Google cómo hacer un loop. Nadie sabe todo de memoria. El trabajo es saber CÓMO encontrar lo que no sabes.

02

El impostor es señal de progreso

Sientes impostor syndrome porque estás creciendo más rápido de lo que tu autoconcepto puede actualizar. Si todo te pareciera fácil, no estarías aprendiendo.

03

Los errores son datos, no veredictos

Un error no dice nada sobre tu capacidad. Dice que tu hipótesis era incorrecta. Actualiza la hipótesis y sigue. Es exactamente cómo funciona la ciencia.

04

La comparación es injusta

Ves los portfolios y commits de otros, no sus frustraciones, sus horas de bloqueo, sus sesiones de debugging a medianoche. Compárate solo con quien eras el mes pasado.

Los hábitos que marcan la diferencia

Pequeños rituales diarios que, compuestos durante semanas, crean desarrolladores excelentes.

01

Lee el error antes de buscar

30 segundos leyendo el error valen más que 30 minutos buscando aleatoriamente.

02

console.log defensivo

Cuando algo no funciona, pon console.log antes de cada paso para ver exactamente dónde se rompe el flujo.

03

Commits pequeños y frecuentes

Cada vez que algo funciona: commit. No esperes a "terminar la feature". Si algo se rompe, vuelves en 10 segundos.

04

Lee código ajeno

Inspecciona el código fuente de webs que admiras. Lee PRs de proyectos open source. Leer código de calidad enseña más que muchos tutoriales.

05

El pomodoro técnico

25 minutos de foco intenso, 5 de descanso. Si llevas más de 25 minutos bloqueado en lo mismo, el descanso no es opcional.

06

Documenta mientras construyes

No al final. Mientras construyes. Un comentario de una línea cuando haces algo no obvio ahorra horas a tu yo del futuro.

07

Lee la documentación oficial

Tutoriales de YouTube son un punto de entrada. MDN, docs de React, docs de TypeScript: ahí está el conocimiento real y actualizado.

Ejercicio: encuentra y arregla los bugs

No escribirás código nuevo. Recibirás tres fragmentos de código roto. Usa el proceso de debugging para identificar el problema, formular una hipótesis y arreglarlo.

El botón no responde al clic

Se configuró un event listener pero el botón nunca dispara el evento.

CÓDIGO CON BUG
<button id="enviar">Enviar</button> <script> const boton = document.querySelector('.enviar'); boton.addEventListener('click', () => { console.log('¡enviado!'); }); </script>
PISTA

¿Qué selecciona .enviar vs #enviar? ¿Qué devuelve querySelector cuando no encuentra nada?

La función siempre devuelve undefined

calcularDescuento() se llama correctamente pero el resultado siempre es undefined.

CÓDIGO CON BUG
function calcularDescuento(precio, porcentaje) { const descuento = precio * (porcentaje / 100); const precioFinal = precio - descuento; // algo está faltando aquí } const resultado = calcularDescuento(100, 20); console.log(resultado); // undefined
PISTA

Una función en JavaScript sin return explícito devuelve undefined por defecto.

El fetch no muestra los datos

Se hace la petición a la API pero el DOM nunca se actualiza.

CÓDIGO CON BUG
function cargarDatos() { const datos = fetch('https://api.example.com/items') .then(r => r.json()); // datos aquí es una Promise, no los datos reales document.querySelector('.lista').innerHTML = datos.nombre; } cargarDatos();
PISTA

fetch() devuelve una Promise. Sin await o continuando la cadena .then(), los datos no están disponibles de forma síncrona.

Recursos de esta sesión

VIDEO
Chrome DevTools — Traversy Media Crash course completo de DevTools en 40 minutos.
REF
MDN — Referencia de errores JavaScript Catálogo completo de todos los errores de JS con causa y solución.
ARTÍCULO
How to ask good questions — Stack Overflow La guía oficial. Aplica a cualquier foro o canal de ayuda.
VIDEO
Síndrome del impostor en tech — Fireship 5 minutos. Honesto y útil.
REF
Chrome DevTools — Documentación oficial La referencia completa de todas las funciones de DevTools.