Preparación de la entrevista

Preguntas de entrevista para Desarrollador Backend

Una entrevista de backend en España rara vez se decide por la sintaxis: se decide por cómo razona usted sobre datos, concurrencia y fallos. Encontrará aquí las preguntas que más se repiten en procesos de consultoras tecnológicas y de empresas de producto de Madrid y Barcelona, con respuestas modelo redactadas en primera persona para que pueda adaptarlas a su experiencia. Trabájelas en voz alta y sustituya siempre las cifras del ejemplo por las suyas: lo que convence no es la respuesta perfecta, sino el detalle verificable. Prepare además una versión breve de cada respuesta, porque en la primera criba con Recursos Humanos dispondrá de dos minutos, no de diez.

Written & reviewed by the CVWon Editorial Team · Updated julio 2026

Cree su CV

Preguntas y respuestas

Preguntas de entrevista y respuestas modelo

Prepárese para estas preguntas frecuentes con respuestas modelo detalladas.

Por qué se hace esta pregunta

Quieren comprobar si usted diseña con criterio de coste y contexto o si aplica una arquitectura de moda. La parte que más se valora no es lo que eligió, sino lo que descartó y por qué.

Respuesta modelo

Diseñé el servicio de pedidos de una plataforma de comercio electrónico con picos de 4.500 peticiones por segundo en rebajas. Opté por un monolito modular en Spring Boot con fronteras claras por dominio, en lugar de microservicios desde el primer día, porque éramos cinco personas y el coste operativo de doce despliegues independientes no se justificaba. Modelé pedidos y pagos en PostgreSQL con particionado por rango mensual y publiqué los cambios de estado mediante patrón outbox transaccional hacia Kafka, de modo que la publicación del evento nunca pudiera divergir de la transacción de base de datos. Descarté el envío directo a la cola dentro de la transacción por el riesgo de escritura dual, y descarté event sourcing completo porque el equipo no tenía experiencia previa y la trazabilidad exigida se cubría con una tabla de auditoría. Un año después extrajimos facturación como servicio independiente, que era justamente lo que las fronteras del módulo permitían hacer sin reescribir.

Prepare un único sistema y domínelo a fondo: esquema de datos, volúmenes, puntos de fallo y qué haría distinto hoy. Es preferible una historia con profundidad que tres contadas por encima.

Por qué se hace esta pregunta

Es la pregunta que separa a quien ha estado de guardia de quien solo ha desarrollado. Buscan un método reproducible y la prioridad correcta: primero restablecer el servicio, después entender la causa.

Respuesta modelo

Primero separo mitigación de diagnóstico: si hay impacto en usuarios, activo la medida de contención disponible, ya sea escalar réplicas, desactivar una funcionalidad con un feature flag o revertir el último despliegue. Después miro los datos en este orden: latencia por endpoint y por percentil en Grafana, trazas distribuidas en OpenTelemetry para saber si el tiempo se va en la base de datos, en una llamada externa o en la propia aplicación, y a continuación métricas de saturación (CPU, uso del pool de conexiones, pausas de recolección de basura, lag de Kafka). En el último caso real, el p95 se disparó tras un despliegue y las trazas señalaban una consulta que había perdido el índice porque un cambio en el ORM añadió una función sobre la columna filtrada. Lo confirmé con EXPLAIN ANALYZE, revertí la consulta y añadí una prueba que falla si el plan de ejecución hace un recorrido secuencial sobre esa tabla.

Diga explícitamente que mitiga antes de investigar y cierre siempre con la medida preventiva (prueba, alerta o límite). Sin esa última frase, la respuesta parece heroísmo en lugar de ingeniería.

Por qué se hace esta pregunta

Comprueban si distingue entre escalado vertical, horizontal y rediseño, y si entiende que el límite suele estar en el estado compartido y no en el cómputo.

Respuesta modelo

Empiezo midiendo, no comprando máquinas. Ejecuto una prueba de carga con k6 reproduciendo el reparto real de endpoints y busco el primer cuello de botella, que en mi experiencia casi nunca es la CPU de la aplicación sino la base de datos o el pool de conexiones. A partir de ahí actúo por capas: caché de lecturas en Redis con invalidación por evento para el catálogo, réplicas de lectura para las consultas analíticas, PgBouncer delante de PostgreSQL para no agotar las conexiones, y paso a asíncrono de todo lo que no necesite responder en la petición, como correos, facturación o indexado, enviándolo a Kafka. Añado limitación de peticiones por cliente y un mecanismo de degradación elegante: si el servicio de recomendaciones no responde en 200 ms, devuelvo el listado sin personalizar en lugar de dejar caer la página. Y fijo el autoescalado sobre una métrica que refleje la carga real, como peticiones en cola, no sobre la CPU.

Mencione una cifra concreta de antes y después. Decir que pasó de 400 a 2.100 peticiones por segundo con el mismo hardware es mucho más creíble que enumerar técnicas.

Por qué se hace esta pregunta

Evalúan honestidad y madurez. Una respuesta que niegue errores o culpe a otros descarta antes que el propio error; buscan si usted convierte un fallo en una mejora sistémica.

Respuesta modelo

Publiqué una migración que añadía una columna con valor por defecto y un índice sobre una tabla de 300 millones de filas dentro de la misma transacción. En preproducción, con 200.000 filas, tardaba dos segundos; en producción bloqueó la tabla durante once minutos y el checkout dejó de funcionar. Corté por lo sano revirtiendo la migración y liberando el bloqueo, y lo repetimos esa misma noche creando el índice con CONCURRENTLY y separando el cambio en pasos de expand-contract. Lo que cambió después fue el proceso, no solo mi cuidado: incorporamos un entorno de preproducción con un volumen representativo, una revisión obligatoria de toda migración por una segunda persona y una regla explícita de no ejecutar DDL sobre tablas grandes sin plan de reversión. Escribí el post mortem y lo presenté en la sesión de equipo, sin buscar culpables.

Elija un error técnico real y de impacto medible, nunca uno cosmético del tipo trabajé demasiado. Dedique un tercio al incidente y dos tercios a lo que cambió después.

Por qué se hace esta pregunta

Es un filtro de seniority. Un perfil junior recita ventajas de los microservicios; un perfil senior habla de coste operativo, consistencia eventual y estructura del equipo.

Respuesta modelo

Decido por organización y por ritmo de cambio, no por escala teórica. Si hay un solo equipo, un monolito modular con fronteras internas bien definidas es más rápido de desarrollar y muchísimo más barato de operar: una sola base de datos, transacciones locales, un despliegue. Separo un servicio cuando aparece alguna de estas tres señales: dos equipos se bloquean mutuamente en el mismo despliegue, una parte tiene un perfil de escalado radicalmente distinto (por ejemplo, un procesador de imágenes intensivo frente a una API de lectura), o existe una exigencia de aislamiento por seguridad o cumplimiento normativo. Antes de separar exijo tres cosas: observabilidad distribuida, contratos de API versionados y una estrategia clara para la consistencia, normalmente eventos con outbox y sagas en lugar de transacciones distribuidas.

Nombre de forma explícita el precio de separar: latencia de red, fallos parciales, depuración distribuida y consistencia eventual. Reconocer ese coste transmite experiencia real.

Por qué se hace esta pregunta

Quieren saber cómo se comporta usted bajo presión y si sabe conversar con Producto en lugar de aceptar todo o bloquearse.

Respuesta modelo

Negocio el alcance, nunca la red de seguridad. Mantengo siempre las pruebas del camino crítico y las migraciones reversibles, porque son lo que evita una incidencia cara, y en cambio propongo recortar funcionalidad secundaria, dejar la optimización para una segunda iteración o publicar detrás de un feature flag para un porcentaje reducido de usuarios. En un cierre de trimestre con dos semanas de plazo lo planteé así a Producto: entregamos el flujo de pago con un solo método y el resto en la siguiente iteración, con pruebas de integración completas sobre Testcontainers. Salió en fecha, sin incidencias, y la deuda quedó registrada como tarea con fecha y responsable, no como un comentario TODO en el código.

Explique que ofrece alternativas en vez de decir que no. Termine indicando cómo quedó registrada la deuda técnica: eso demuestra que hace seguimiento.

Técnica

¿Qué preguntas técnicas se hacen en una entrevista de Desarrollador Backend?

Estas preguntas técnicas propias del puesto pueden surgir durante su entrevista.

Con READ COMMITTED, que es el nivel por defecto en PostgreSQL, cada sentencia ve una instantánea nueva, por lo que dos lecturas dentro de la misma transacción pueden devolver valores distintos si otra transacción confirma cambios entremedias. Con REPEATABLE READ, la instantánea se fija al inicio de la transacción y todas las lecturas son coherentes entre sí, a cambio de que una escritura conflictiva provoque un error de serialización que la aplicación debe reintentar. Uso READ COMMITTED para la operativa normal de una API, donde cada petición es corta y no necesita coherencia entre varias lecturas. Elijo REPEATABLE READ o incluso SERIALIZABLE para procesos de cierre contable, informes y cálculos que leen varias tablas relacionadas y no pueden tolerar una lectura no repetible. Cuando subo el nivel, siempre implemento reintento con retroceso exponencial, porque los errores de serialización dejan de ser una excepción rara y pasan a ser parte del flujo normal.

Exijo al cliente una cabecera Idempotency-Key con un identificador único por intento de pago. Al recibir la petición, inserto esa clave en una tabla con restricción de unicidad dentro de la misma transacción que registra el cobro. Si la inserción falla por clave duplicada, devuelvo la respuesta previamente almacenada para esa clave, con el mismo código de estado y el mismo cuerpo, en lugar de volver a cobrar. Guardo también un resumen del cuerpo de la petición para detectar el caso de una misma clave reutilizada con datos distintos, que devuelvo como error 422. Para la ventana en la que la operación está en curso registro el estado como en proceso y respondo 409 si llega una petición concurrente. Le doy a la clave una caducidad razonable, de veinticuatro horas, y la propago al proveedor de pagos para que la idempotencia sea de extremo a extremo, no solo en mi capa.

Resuelve el problema de la escritura dual: si guardo el pedido en PostgreSQL y publico el evento en Kafka como dos operaciones separadas, cualquier caída entre ambas deja el sistema inconsistente, con un pedido sin evento o con un evento sin pedido. Con el patrón outbox escribo el evento en una tabla de la misma base de datos dentro de la misma transacción que el cambio de negocio, de modo que ambos se confirman o ninguno lo hace. Un proceso independiente, normalmente un conector de captura de cambios como Debezium o un publicador con sondeo, lee esa tabla y publica en Kafka marcando lo enviado. La entrega resultante es at-least-once, así que los consumidores deben ser idempotentes, habitualmente descartando por identificador de evento ya procesado. El coste es una tabla adicional que hay que purgar y una latencia de publicación de unos pocos cientos de milisegundos, que en la práctica compensa frente a perder eventos de pago.

Aparece cuando recupero una lista de N entidades con una consulta y después el ORM lanza una consulta adicional por cada elemento para cargar una relación perezosa, de modo que una única petición acaba generando cientos de viajes a la base de datos. Lo detecto de tres maneras: activando el registro de sentencias SQL en desarrollo, observando en las trazas de OpenTelemetry un span de servicio con decenas de spans de base de datos hijos, o midiendo una latencia que crece linealmente con el tamaño de página. Lo corrijo con carga anticipada explícita, mediante JOIN FETCH o entity graphs en JPA, con select_related y prefetch_related en Django, o resolviendo por lotes con un dataloader en GraphQL. Para que no reaparezca, añado una prueba de integración que cuenta el número de sentencias ejecutadas en el endpoint y falla si supera un umbral fijado.

Creo un índice compuesto cuando las consultas filtran de forma habitual por varias columnas a la vez. El orden importa porque el índice solo puede aprovecharse por prefijo: coloco primero las columnas con igualdad, después la de rango y por último las que solo se usan para ordenar. Para una consulta que filtra por estado igual a pendiente y fecha de creación mayor que un valor, ordenando por fecha, el índice adecuado es sobre estado y fecha en ese orden. Si el estado pendiente representa el 2 % de la tabla, prefiero un índice parcial con la condición del estado en el WHERE, que ocupa una fracción del espacio y se mantiene mucho más barato en escritura. Verifico siempre con EXPLAIN ANALYZE que el planificador lo utiliza y que no ha estimado mal las filas, y tengo presente que cada índice adicional penaliza las inserciones y actualizaciones, por lo que reviso periódicamente cuáles no se usan.

Con bloqueo optimista añado una columna de versión a la fila de stock: leo la unidad con versión 7, calculo la reserva y actualizo con la condición de que la versión siga siendo 7, incrementándola. Si otra transacción se adelantó, la actualización afecta a cero filas y reintento o devuelvo un error de conflicto. Es la opción adecuada cuando la contención es baja, porque no retiene bloqueos y escala bien. Con bloqueo pesimista tomo la fila con SELECT FOR UPDATE antes de calcular, de modo que cualquier otra transacción espera. Lo reservo para casos de contención alta sobre pocas filas, como la venta de entradas de un concierto, donde reintentar constantemente sería peor que esperar. En ambos casos fijo un tiempo máximo de espera de bloqueo para no propagar el atasco, y ordeno siempre los accesos a las filas por el mismo criterio para evitar interbloqueos.

Primero distingo si el problema es de producción o de consumo: comparo la tasa de entrada de mensajes con la de procesado por partición. Si el lag se concentra en unas pocas particiones, suele ser una clave de particionado desequilibrada, con un cliente grande que concentra el tráfico. Si es uniforme, el consumidor va lento y miro dónde se va el tiempo, normalmente una llamada externa síncrona o una escritura sin índice. Las opciones, por orden de coste: aumentar el número de consumidores hasta el número de particiones, ampliar particiones si ya he llegado al límite, procesar por lotes en lugar de mensaje a mensaje, mover el trabajo pesado a un flujo aparte para no bloquear el camino rápido y enviar a la cola de mensajes fallidos aquello que falla de forma reiterada, para que un mensaje envenenado no detenga la partición. Y ajusto max.poll.records y el tiempo de espera para no provocar reequilibrios continuos que empeoren el atasco.

Situacional

¿Para qué preguntas situacionales debe prepararse en una entrevista de Desarrollador Backend?

Situaciones y preguntas de comportamiento a las que puede enfrentarse.

Confirmo el impacto real en el panel antes de tocar nada, porque a veces la alerta es de la propia sonda. Si es real, abro el canal de incidencia y aviso, para que no haya dos personas actuando a ciegas sobre el mismo sistema. Mi primera hipótesis es siempre el último cambio: reviso los despliegues de las últimas horas y, si hay uno reciente, revierto y compruebo si los errores bajan, porque restablecer el servicio es prioritario frente a entender la causa. Si no hubo despliegue, miro dependencias externas, saturación del pool de conexiones y estado del proveedor de pagos. Cuando la tasa vuelve a la normalidad, dejo constancia de la línea temporal y programo el post mortem para el día siguiente. Lo que no hago de madrugada es un cambio de esquema o una optimización improvisada.

Lo trato como un problema de datos, no como un problema de la persona. Comento en la propia pull request con el resultado del EXPLAIN ANALYZE de esa consulta, que hace evidente el recorrido secuencial y el tiempo estimado, y propongo el índice concreto con el orden de columnas justificado, indicando que debe crearse con CONCURRENTLY para no bloquear la tabla. Si la urgencia es alta, ofrezco emparejarme quince minutos en lugar de dejar un hilo de comentarios que alargue el ciclo. Si observo que el patrón se repite en el equipo, propongo una medida estructural: una comprobación en la integración continua que detecte planes con recorrido secuencial sobre las tablas grandes, para que el aviso no dependa de que yo revise el código.

Explico el plan en términos de riesgo y fechas, no en términos técnicos. Propongo la estrategia expand-contract en tres fases: primero añado la columna nueva como opcional y escribo en ambos sitios; después lanzo un proceso de relleno por lotes con pausas para no saturar la base de datos, y verifico la coherencia; por último cambio la lectura a la columna nueva y, solo en una iteración posterior, elimino la antigua. Cada fase es reversible por separado. Con ese enfoque la funcionalidad puede salir en las dos semanas detrás de un feature flag, mientras que la limpieza final queda planificada para después. Si Producto insiste en hacerlo en un solo paso, expongo el escenario concreto: un bloqueo de la tabla de pedidos en hora punta significa checkout caído, y ese coste es mayor que dos semanas adicionales.

No reescribo nada al principio. Empiezo por hacer observable lo que hay: registro estructurado, métricas básicas de latencia y errores por endpoint, y un diagrama sencillo de las dependencias reales, obtenido mirando las llamadas salientes y las tablas que toca. A continuación escribo pruebas de caracterización sobre el comportamiento actual, aunque me parezca incorrecto, para tener una red de seguridad antes de tocar código. Solo entonces introduzco el cambio, aislado tras una interfaz y cubierto por pruebas nuevas. Anoto en un documento breve las trampas encontradas, porque la siguiente persona lo agradecerá. Si detecto deuda grave, la registro con impacto y coste estimados y la llevo a la planificación, en lugar de arreglarla por mi cuenta dentro de la misma entrega.

Preparación

Consejos de preparación

1

Prepare dos sistemas de su experiencia y domínelos hasta el detalle: esquema de datos, volúmenes reales, puntos de fallo, decisiones descartadas y qué haría distinto hoy. Casi todas las preguntas de la entrevista pueden reconducirse a un ejemplo concreto si lo tiene bien trabajado.

2

Practique en voz alta el diseño de un sistema en cuarenta y cinco minutos, con papel o pizarra: aclare requisitos y volúmenes, dibuje el modelo de datos antes que las cajas, calcule cifras aproximadas de peticiones por segundo y almacenamiento, y termine hablando de fallos, reintentos y observabilidad. Ese cierre es el que suele faltar.

3

Repase SQL con datos reales, no con ejercicios de sintaxis: sepa leer un EXPLAIN ANALYZE, explicar por qué el planificador ignora un índice, y distinguir entre índice compuesto, parcial y de cobertura. Es el bloque con más preguntas en las entrevistas técnicas españolas de backend.

4

Lleve preparadas cifras de latencia, throughput, disponibilidad y coste de sus proyectos anteriores, y asegúrese de poder explicar cómo se midieron. Una cifra que no sabe defender hace más daño que no aportar ninguna.

5

Infórmese sobre la empresa antes de la entrevista: si es una consultora, pregunte por el cliente final, la duración del proyecto, quién decide la arquitectura y si el puesto implica desplazamientos; si es producto, pregunte por la propiedad del servicio, la frecuencia de despliegue, la política de guardias y su retribución.

6

Repase el vocabulario técnico en inglés aunque la entrevista sea en español. En multinacionales de Madrid y Barcelona es habitual que una de las rondas se realice en inglés con un responsable técnico de otro país, y conviene manejar con soltura términos como throughput, backpressure, eventual consistency o rate limiting.

7

Prepare tres preguntas propias para el final. Las que mejor funcionan son concretas: cómo se gestiona la deuda técnica, cuánto tarda un cambio desde el commit hasta producción, qué ocurrió en la última incidencia grave y qué cambió después.

Cómo responder: «¿Cuáles son sus expectativas salariales?»

Antes de dar una cifra, agradezca la pregunta y sitúela en datos de mercado en lugar de en su salario anterior. Una respuesta modelo para un perfil senior sería esta: «He contrastado las bandas para un backend senior con Java, Kubernetes y experiencia en sistemas de alta concurrencia en Madrid, y se mueven entre 55.000 y 68.000 € brutos anuales. Mi objetivo se sitúa entre 58.000 y 65.000 € en doce pagas, con flexibilidad según el resto del paquete: teletrabajo, retribución flexible, presupuesto de formación y, sobre todo, si el puesto incluye guardias y cómo se compensan. Sé que el convenio estatal de consultoría fija mínimos bastante por debajo del mercado real, así que hablo de la banda efectiva del sector. ¿Cuál es el rango previsto para esta posición?». Como referencia orientativa del mercado español, un perfil junior se mueve entre 24.000 y 30.000 €, un perfil con tres a cinco años entre 36.000 y 48.000 €, un senior entre 50.000 y 68.000 € y un tech lead o staff entre 70.000 y 85.000 €, con Madrid y Barcelona entre un 10 y un 20 % por encima del resto del país. Indique siempre importes brutos anuales y aclare el número de pagas; y si le presionan para dar la cifra primero, es legítimo devolver la pregunta una vez antes de comprometerse.

FAQ

Preguntas frecuentes

Lo habitual son entre tres y cinco fases: una primera entrevista con Recursos Humanos de treinta minutos sobre expectativas, disponibilidad y salario; una prueba técnica, que puede ser un ejercicio para casa de unas cuatro horas o una sesión de código en vivo; una entrevista técnica con el equipo, con preguntas de SQL, concurrencia y diseño de sistemas; y una conversación final con el responsable o con negocio. En consultoría se añade con frecuencia una entrevista con el cliente final antes de la incorporación.

Negocie el alcance con naturalidad. Es razonable dedicar entre tres y cinco horas; por encima de eso, proponga entregar una versión acotada con las decisiones documentadas en un archivo breve, o sustituirla por una sesión de emparejamiento. Si ya dispone de un repositorio propio equivalente, ofrézcalo. Una empresa que exige veinte horas no remuneradas está indicando algo relevante sobre cómo trata el tiempo de sus profesionales.

Bastante menor que en el mercado estadounidense. Salvo en las oficinas españolas de grandes tecnológicas internacionales, lo más frecuente es una prueba aplicada: construir un pequeño servicio con su API, sus pruebas y su base de datos, o depurar código existente. Dedique el tiempo de preparación a SQL, concurrencia, diseño de APIs y modelado de datos antes que a resolver problemas de estructuras de datos abstractas.

Con honestidad y con un puente. Diga qué nivel real tiene, relacione la tecnología con algo equivalente que sí conoce y explique cómo la aprendería. Por ejemplo: no he trabajado con RabbitMQ en producción, pero sí con Kafka durante tres años, y sé que la diferencia principal está en el modelo de encolado y en la gestión de reintentos y colas de mensajes fallidos. Inventar experiencia es el error más fácil de detectar en la entrevista técnica y el más difícil de recuperar.

El teletrabajo, en la primera conversación con Recursos Humanos, porque condiciona todo el proceso y en España está regulado por la Ley 10/2021, que exige acuerdo escrito y compensación de gastos. Las guardias, en la entrevista con el equipo técnico: pregunte por la frecuencia de la rotación, el volumen de avisos nocturnos del último trimestre y cómo se retribuyen. Es una pregunta profesional que además revela mucho sobre la salud real de los sistemas.

Sí, y conviene hacerlo antes de firmar. Pregunte qué convenio aplica (el estatal de consultoría y tecnologías de la información es el más común en el sector), en qué grupo profesional le encuadran, cuántas pagas incluye la retribución, cuál es la duración del periodo de prueba y si existe jornada intensiva en verano. Son datos que determinan condiciones reales y que ninguna empresa seria tendrá inconveniente en detallar.

¿Todo listo para triunfar en su entrevista?

Cree su CV

Relacionados

Puestos relacionados

Consultor ERP

Tecnología

Ingeniero de Software

Tecnología

Desarrollador Frontend

Tecnología

Desarrollador Full Stack

Tecnología

Científico de Datos

Tecnología

Analista de Datos

Tecnología