Preguntas para Entrevistas de Desarrollador Full Stack Senior: Guía Completa

Milad Bonakdar
Autor
Domina el desarrollo full stack con preguntas esenciales para entrevistas que cubren frameworks frontend, arquitectura backend, bases de datos, diseño de sistemas y prácticas DevOps para desarrolladores senior.
Introducción
El desarrollo full stack ha evolucionado hasta convertirse en una disciplina integral que requiere experiencia en frontend, backend, bases de datos e infraestructura. Se espera que los desarrolladores full stack senior diseñen sistemas escalables, tomen decisiones tecnológicas informadas y cierren la brecha entre las diferentes capas de las aplicaciones modernas.
Esta guía cubre las preguntas esenciales de la entrevista para desarrolladores full stack senior, que abarcan los marcos de frontend, la arquitectura de backend, el diseño del sistema, las bases de datos y las prácticas de DevOps. Cada pregunta incluye respuestas detalladas, evaluación de rareza y calificaciones de dificultad para ayudarle a prepararse eficazmente.
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


