Preguntas de entrevista para desarrollador full stack senior

Milad Bonakdar
Autor
Prepárate para entrevistas full stack senior con preguntas sobre React, Node.js, arquitectura, bases de datos, seguridad, DevOps y decisiones en producción.
Introducción
Las entrevistas para full stack senior evalúan más que sintaxis. Debes poder explicar rendimiento frontend, diseño de APIs, modelado de datos, fiabilidad, seguridad, despliegues y los trade-offs detrás de sistemas que realmente hayas llevado a producción.
Usa estas preguntas para practicar respuestas breves y conectarlas con proyectos reales: qué decidiste, por qué encajaba con las restricciones, qué falló y qué mejorarías ahora.
Cómo usar esta guía
- Empieza por React, Node.js, autenticación y diseño de sistemas, porque suelen aparecer en entrevistas senior.
- Convierte cada respuesta en una historia corta de tu experiencia: contexto, decisión, trade-off y resultado.
- No memorices listas de herramientas. En perfiles senior se valora el criterio, la forma de depurar y la responsabilidad sobre producción.
Desarrollo Frontend (6 Preguntas)
1. Explique el DOM Virtual de React y el algoritmo de Reconciliación.
Respuesta: El DOM Virtual es una representación ligera de JavaScript del DOM real. React lo utiliza para optimizar las actualizaciones.
- Proceso: Cuando cambia el estado, React crea un nuevo árbol DOM Virtual y lo compara con el anterior (diferenciación).
- Reconciliación: El algoritmo de React identifica el conjunto mínimo de cambios necesarios y actualiza solo esas partes del DOM real.
- Optimización clave: El uso de props
keyayuda a React a identificar qué elementos han cambiado, se han añadido o eliminado en las listas, lo que hace que la reconciliación sea más eficiente. - Arquitectura de fibra: React moderno utiliza Fiber, que permite dividir el trabajo de renderizado en fragmentos y priorizar las actualizaciones.
Rareza: Muy común Dificultad: Media
2. ¿Qué son los React Hooks y por qué se introdujeron?
Respuesta: Los Hooks son funciones que permiten utilizar el estado y otras características de React en componentes funcionales.
- Motivación: Antes de los Hooks, la lógica con estado requería componentes de clase. Los Hooks permiten reutilizar la lógica con estado sin cambiar la jerarquía de los componentes.
- Hooks comunes:
useState: Gestiona el estado localuseEffect: Gestiona los efectos secundarios (obtención de datos, suscripciones)useContext: Accede a los valores de contextouseMemo/useCallback: Optimización del rendimiento
- Hooks personalizados: Puede crear hooks personalizados para extraer y reutilizar la lógica de los componentes.
Rareza: Muy común Dificultad: Fácil
3. ¿Cómo optimiza el rendimiento de la aplicación React?
Respuesta: Existen varias estrategias para mejorar el rendimiento de React:
- División de código: Utilice
React.lazy()ySuspensepara cargar componentes bajo demanda. - Memorización: Utilice
React.memo()para componentes,useMemo()para cálculos costosos,useCallback()para referencias de función. - Listas virtuales: Para listas largas, utilice bibliotecas como
react-windoworeact-virtualized. - Evite las funciones en línea: En los métodos de renderizado, ya que crean nuevas referencias en cada renderizado.
- Profiler: Utilice React DevTools Profiler para identificar los cuellos de botella.
- Gestión del estado: Mantenga el estado lo más local posible, utilice el contexto con prudencia.
Rareza: Común Dificultad: Media
4. Explique la diferencia entre el renderizado del lado del servidor (SSR) y el renderizado del lado del cliente (CSR).
Respuesta:
- CSR: JavaScript se ejecuta en el navegador para renderizar la página. El HTML inicial es mínimo. Navegación posterior rápida pero carga inicial más lenta y SEO deficiente.
- SSR: El servidor genera HTML completo para cada solicitud. Mejor SEO y pintura inicial más rápida, pero navegación posterior más lenta y mayor carga del servidor.
- Enfoques híbridos:
- Generación de sitios estáticos (SSG): Renderiza previamente las páginas en tiempo de compilación (Next.js, Gatsby).
- Regeneración estática incremental (ISR): Actualiza las páginas estáticas después de la implementación sin una reconstrucción completa.
Rareza: Común Dificultad: Media
5. ¿Cuál es la diferencia entre localStorage, sessionStorage y Cookies?
Respuesta:
- localStorage: Conserva los datos sin fecha de caducidad. Límite de ~5-10MB. No se envía al servidor automáticamente.
- sessionStorage: Igual que localStorage pero se borra cuando se cierra la pestaña/navegador.
- Cookies: Datos pequeños (~4KB) enviados con cada solicitud HTTP. Se puede establecer la fecha de caducidad. Se utiliza para los tokens de autenticación.
- Seguridad: Las cookies pueden ser
HttpOnly(no accesibles a través de JS) ySecure(solo HTTPS). Utilizar para datos sensibles.
Rareza: Común Dificultad: Fácil
6. ¿Cómo funciona CSS-in-JS y cuáles son sus pros y sus contras?
Respuesta: Las bibliotecas CSS-in-JS (styled-components, Emotion) permiten escribir CSS directamente en JavaScript.
- Ventajas:
- Estilos con ámbito (sin contaminación del espacio de nombres global)
- Estilo dinámico basado en props
- Prefijado automático del proveedor
- Eliminación de código muerto
- Desventajas:
- Sobrecarga de tiempo de ejecución (estilos generados en tiempo de ejecución)
- Mayor tamaño del paquete
- Curva de aprendizaje
- Alternativas: CSS Modules, Tailwind CSS, CSS tradicional con metodología BEM.
Rareza: Media Dificultad: Media
Desarrollo Backend (6 Preguntas)
7. Explique el bucle de eventos en Node.js.
Respuesta: Node.js es de un solo hilo, pero gestiona la concurrencia a través del bucle de eventos.
- Fases:
- Temporizadores: Ejecuta las devoluciones de llamada
setTimeoutysetInterval - Devoluciones de llamada pendientes: Devoluciones de llamada de E/S diferidas a la siguiente iteración
- Sondeo: Recupera nuevos eventos de E/S, ejecuta devoluciones de llamada de E/S
- Comprobar: Devoluciones de llamada
setImmediate - Devoluciones de llamada de cierre: Eventos de cierre de socket
- Temporizadores: Ejecuta las devoluciones de llamada
- E/S sin bloqueo: Cuando se inician las operaciones de E/S, Node.js las delega al kernel del sistema y continúa ejecutando otro código.
Rareza: Muy común Dificultad: Difícil
8. ¿Qué es el Middleware en Express.js?
Respuesta: Las funciones de middleware tienen acceso a la solicitud, la respuesta y la siguiente función de middleware en el ciclo de solicitud-respuesta de la aplicación.
- Tipos:
- Nivel de aplicación:
app.use() - Nivel de enrutador:
router.use() - Manejo de errores: Tiene 4 parámetros
(err, req, res, next) - Integrado:
express.json(),express.static() - De terceros:
cors,helmet,morgan
- Nivel de aplicación:
- El orden importa: El middleware se ejecuta en el orden en que se define.
Rareza: Muy común Dificultad: Fácil
9. ¿Cómo se gestiona la autenticación en una API REST?
Respuesta: Existen varios enfoques:
- JWT (sin estado):
- El servidor genera un token firmado que contiene información del usuario
- El cliente almacena el token (localStorage/cookie) y lo envía con cada solicitud
- El servidor verifica la firma
- Pros: Escalable, sin almacenamiento de sesión en el lado del servidor
- Contras: Difícil de revocar, mayor carga útil
- Basado en sesión (con estado):
- El servidor crea una sesión, la almacena en DB/Redis
- El cliente recibe el ID de sesión en la cookie
- Pros: Fácil de revocar
- Contras: Requiere almacenamiento en el lado del servidor
- OAuth 2.0: Para la autenticación de terceros
- Mejores prácticas: Utilice tokens de actualización para el acceso de larga duración, tokens de acceso de corta duración.
Rareza: Muy común Dificultad: Media
10. Explique las transacciones de la base de datos y las propiedades ACID.
Respuesta: Una transacción es una secuencia de operaciones realizadas como una única unidad lógica de trabajo.
- ACID:
- Atomicidad: Todas las operaciones tienen éxito o todas fallan (todo o nada)
- Consistencia: La base de datos pasa de un estado válido a otro
- Aislamiento: Las transacciones concurrentes no interfieren entre sí
- Durabilidad: Las transacciones confirmadas persisten incluso después de un fallo del sistema
- Niveles de aislamiento: Lectura no confirmada, Lectura confirmada, Lectura repetible, Serializable (intercambio entre consistencia y rendimiento).
Rareza: Común Dificultad: Media
11. ¿Cuál es la diferencia entre las bases de datos SQL y NoSQL?
Respuesta:
- SQL (relacional):
- Esquema estructurado, tablas con filas/columnas
- Cumple con ACID
- Escalado vertical (servidor más grande)
- Ejemplos: PostgreSQL, MySQL
- Caso de uso: Consultas complejas, transacciones, datos estructurados
- NoSQL:
- Esquema flexible, documento/clave-valor/gráfico/familia de columnas
- BASE (Eventualmente consistente)
- Escalado horizontal (más servidores)
- Ejemplos: MongoDB, Redis, Cassandra
- Caso de uso: Desarrollo rápido, escala masiva, datos no estructurados
Rareza: Común Dificultad: Fácil
12. ¿Cómo se previenen los ataques de inyección SQL?
Respuesta: La inyección SQL se produce cuando la entrada del usuario se concatena directamente en las consultas SQL.
- Prevención:
- Consultas parametrizadas/Sentencias preparadas: Utilice marcadores de posición para la entrada del usuario
- ORM: Bibliotecas como Sequelize, TypeORM gestionan el escape automáticamente
- Validación de entrada: Lista blanca de caracteres permitidos
- Mínimo privilegio: El usuario de la base de datos debe tener permisos mínimos
- Procedimientos almacenados: Pueden proporcionar una capa adicional
Rareza: Muy común Dificultad: Fácil
Diseño y arquitectura del sistema (6 preguntas)
13. ¿Cómo diseñaría un sistema de notificación escalable?
Respuesta: Un sistema de notificación necesita gestionar múltiples canales (correo electrónico, SMS, push) a escala.
- Componentes:
- Servicio API: Recibe solicitudes de notificación
- Cola de mensajes: RabbitMQ/Kafka para el procesamiento asíncrono
- Trabajadores: Servicios separados para cada canal
- Base de datos: Almacena el historial de notificaciones, las preferencias del usuario
- Limitación de velocidad: Evitar el spam
- Consideraciones:
- Lógica de reintento para fallos
- Colas de prioridad para notificaciones urgentes
- Gestión de plantillas
- Preferencias del usuario (exclusión)
Rareza: Común Dificultad: Difícil
14. Explique la arquitectura de microservicios y sus desafíos.
Respuesta: Los microservicios descomponen una aplicación en servicios pequeños e independientes.
- Ventajas:
- Implementación y escalado independientes
- Diversidad tecnológica
- Aislamiento de fallos
- Autonomía del equipo
- Desafíos:
- Transacciones distribuidas: Difícil de mantener la consistencia entre los servicios
- Latencia de red: Sobrecarga de la comunicación entre servicios
- Monitorización: Necesidad de rastreo distribuido (Jaeger, Zipkin)
- Gestión de datos: Cada servicio posee su base de datos
- Pruebas: Las pruebas de integración son complejas
- Patrones: API Gateway, Service Mesh, Circuit Breaker, patrón Saga para transacciones.
Rareza: Muy común Dificultad: Difícil
15. ¿Qué es el almacenamiento en caché y cuáles son las estrategias comunes de almacenamiento en caché?
Respuesta: El almacenamiento en caché almacena los datos a los que se accede con frecuencia en un almacenamiento rápido para reducir la latencia.
- Capas:
- Caché del navegador
- CDN (CloudFlare, Akamai)
- Caché de la aplicación (Redis, Memcached)
- Caché de consultas de la base de datos
- Estrategias:
- Cache-Aside: La aplicación comprueba primero la caché, carga desde DB si no encuentra
- Write-Through: Escribe en la caché y en la base de datos simultáneamente
- Write-Behind: Escribe en la caché, escritura asíncrona en la base de datos
- Read-Through: La caché carga los datos de la base de datos automáticamente
- Políticas de desalojo: LRU (Least Recently Used), LFU (Least Frequently Used), TTL (Time To Live).
Rareza: Muy común Dificultad: Media
16. ¿Cómo se asegura el control de versiones de la API?
Respuesta: El control de versiones de la API permite la compatibilidad con versiones anteriores al realizar cambios.
- Estrategias:
- Control de versiones URI:
/api/v1/users,/api/v2/users - Control de versiones de encabezado:
Accept: application/vnd.api.v1+json - Parámetro de consulta:
/api/users?version=1
- Control de versiones URI:
- Mejores prácticas:
- Advertencias de obsolescencia
- Mantener al menos 2 versiones
- Guías de migración claras
- Control de versiones semántico
- Alternativa GraphQL: Evolución del esquema sin control de versiones (campos obsoletos).
Rareza: Común Dificultad: Media
17. Explique el teorema CAP.
Respuesta: En los sistemas distribuidos, solo se pueden garantizar 2 de 3:
- Consistencia: Todos los nodos ven los mismos datos al mismo tiempo
- Disponibilidad: Cada solicitud recibe una respuesta (éxito/fracaso)
- Tolerancia a la partición: El sistema continúa funcionando a pesar de los fallos de la red
- Realidad: Las particiones de red ocurrirán, por lo que debe elegir entre CP (Consistencia) o AP (Disponibilidad).
- Ejemplos:
- CP: MongoDB, HBase (sacrificar la disponibilidad durante la partición)
- AP: Cassandra, DynamoDB (consistencia eventual)
Rareza: Común Dificultad: Difícil
18. ¿Qué es el equilibrio de carga y qué algoritmos se utilizan?
Respuesta: El equilibrio de carga distribuye el tráfico entre varios servidores.
- Algoritmos:
- Round Robin: Distribución secuencial
- Mínimo de conexiones: Enviar al servidor con menos conexiones activas
- Hash IP: Hash del IP del cliente para determinar el servidor (persistencia de la sesión)
- Round Robin ponderado: Los servidores con mayor capacidad obtienen más solicitudes
- Tipos:
- Capa 4 (transporte): Basado en IP/Puerto, más rápido
- Capa 7 (aplicación): Basado en el contenido (URL, encabezados), más inteligente
- Herramientas: Nginx, HAProxy, AWS ELB, Google Cloud Load Balancer.
Rareza: Común Dificultad: Media
DevOps y nube (4 preguntas)
19. Explique Docker y los beneficios de la contenedorización.
Respuesta: Docker empaqueta las aplicaciones con sus dependencias en contenedores.
- Ventajas:
- Consistencia: El mismo entorno en dev/staging/prod
- Aislamiento: Cada contenedor está aislado
- Ligero: Comparte el kernel del SO del host (vs VMs)
- Inicio rápido: Segundos vs minutos para las VMs
- Portabilidad: Ejecutar en cualquier lugar donde esté instalado Docker
- Componentes:
- Imagen: Plantilla de solo lectura
- Contenedor: Instancia en ejecución de una imagen
- Dockerfile: Instrucciones para construir una imagen
- Registro: Docker Hub, registros privados
Rareza: Muy común Dificultad: Fácil
20. ¿Qué es CI/CD y por qué es importante?
Respuesta:
- Integración continua: Los desarrolladores fusionan el código con frecuencia, las pruebas automatizadas se ejecutan en cada commit
- Implementación continua: Implementar automáticamente en producción después de pasar las pruebas
- Ventajas:
- Retroalimentación más rápida
- Reducción de los problemas de integración
- Código de mayor calidad
- Tiempo de comercialización más rápido
- Herramientas: Jenkins, GitLab CI, GitHub Actions, CircleCI
- Etapas del pipeline: Construir → Probar → Implementar
- Mejores prácticas: Pruebas automatizadas, indicadores de características, mecanismos de reversión.
Rareza: Muy común Dificultad: Fácil
21. ¿Cómo se supervisan y depuran las aplicaciones de producción?
Respuesta: Una supervisión exhaustiva es fundamental para los sistemas de producción.
- Registro:
- Registro estructurado (formato JSON)
- Registro centralizado (ELK Stack, Splunk)
- Niveles de registro (ERROR, WARN, INFO, DEBUG)
- Métricas:
- Métricas de la aplicación (tiempo de respuesta, rendimiento)
- Métricas de la infraestructura (CPU, memoria, disco)
- Herramientas: Prometheus, Grafana, DataDog
- Rastreo:
- Rastreo distribuido para microservicios
- Herramientas: Jaeger, Zipkin, AWS X-Ray
- Alertas: PagerDuty, Opsgenie para problemas críticos
- Seguimiento de errores: Sentry, Rollbar para la supervisión de excepciones.
Rareza: Común Dificultad: Media
22. ¿Qué es la infraestructura como código (IaC)?
Respuesta: IaC gestiona la infraestructura a través del código en lugar de los procesos manuales.
- Ventajas:
- Control de versiones para la infraestructura
- Entornos reproducibles
- Aprovisionamiento más rápido
- Reducción de los errores humanos
- Herramientas:
- Terraform: Independiente de la nube, declarativo
- CloudFormation: Específico de AWS
- Ansible: Gestión de la configuración
- Pulumi: Utilizar lenguajes de programación
- Mejores prácticas:
- Almacenar en el control de versiones
- Componentes modulares y reutilizables
- Entornos separados (dev/staging/prod)
- Pruebas automatizadas de la infraestructura.
Rareza: Media Dificultad: Media
Pruebas y mejores prácticas (3 preguntas)
23. Explique la pirámide de pruebas.
Respuesta: La pirámide de pruebas representa la distribución ideal de los diferentes tipos de pruebas.
- Pruebas unitarias: Prueban funciones/componentes individuales de forma aislada. Rápidas, muchas de ellas.
- Pruebas de integración: Prueban cómo funcionan los componentes juntos. Velocidad media, número moderado.
- Pruebas E2E: Prueban flujos de usuario completos. Lentas, costosas, pocas de ellas.
- Razón: Más pruebas unitarias porque son rápidas y detectan los errores de forma temprana. Menos pruebas E2E porque son lentas y frágiles.
Rareza: Común Dificultad: Fácil
24. ¿Cuáles son los principios SOLID?
Respuesta: SOLID es un acrónimo de cinco principios de diseño:
- S - Responsabilidad única: Una clase debe tener una sola razón para cambiar
- O - Abierto/Cerrado: Abierto a la extensión, cerrado a la modificación
- L - Sustitución de Liskov: Los subtipos deben ser sustituibles por sus tipos base
- I - Segregación de la interfaz: Muchas interfaces específicas son mejores que una general
- D - Inversión de dependencia: Depender de las abstracciones, no de las concreciones
- Ventajas: Código más mantenible, comprobable y flexible.
Rareza: Común Dificultad: Media
25. ¿Cómo se gestionan los errores en JavaScript asíncrono?
Respuesta: Existen múltiples patrones para el manejo de errores asíncronos:
- Promesas:
- Async/Await:
- Manejadores de errores globales:
window.addEventListener('unhandledrejection', ...)para rechazos de promesas no gestionados- Middleware de error de Express para el backend
- Mejores prácticas: Siempre gestione los errores, utilice el manejo de errores centralizado, registre los errores correctamente.
Rareza: Muy común Dificultad: Fácil


