Entrevista Backend: 37 Preguntas y Respuestas
Tiempo de lectura: 13.31 minutos
Lo que encontrarás en este artículo
Las entrevistas técnicas pueden ser intimidantes, ¡pero también gratificantes!
Especialmente cuando se trata de una entrevista para una posición backend.
¿Por qué es importante este artículo?
- Elegir al candidato adecuado para una posición backend es esencial para el éxito de una compañía, por lo que es crucial hacer las preguntas adecuadas.
- Por otro lado, si estás preparándote para una entrevista backend, querrás asegurarte de responder adecuadamente a las preguntas.
Estás de buena suerte:
Puedes prepararte para tu próxima entrevista backend, revisando la siguiente lista de 37 preguntas y respuestas, que he recopilado para ti.
Comenzaremos con preguntas generales y luego pasaremos a preguntas más específicas, sobre frameworks, escalabilidad y seguridad, para que te sientas seguro al tener tu entrevista.
¿Qué es un desarrollador Backend?
Los desarrolladores backend son responsables de las tecnologías y aplicaciones de lado del servidor.
Trabajan estrechamente con los desarrolladores front-end para asegurar que los datos se transmitan adecuadamente entre cliente y servidor.
Para tener éxito en este rol, los desarrolladores backend deben tener un sólido conocimiento de lenguajes de programación y frameworks de lado del servidor, bases de datos y, almacenamiento en caché.
- Los lenguajes de programación backend más populares son Node.js, Python y PHP.
- Sin embargo, muchos otros lenguajes, como Ruby, Java y .NET, también se utilizan para el desarrollo backend.
Al entrevistar a un desarrollador backend, lo principal es:
- Asegurar que tiene un sólido conocimiento de al menos una tecnología de lado del servidor, y que puede comunicarse eficazmente con los desarrolladores front-end.
- Evaluar su experiencia, respecto a qué lenguajes de programación y bases de datos ha usado, y qué tanto conoce sobre buenas prácticas de programación.
A continuación te presento 37 preguntas importantes para una entrevista backend.
Están organizadas por secciones. Empecemos por las más generales.
37 Preguntas y respuestas para una Entrevista Backend
Preguntas generales
1. Explica el propósito del backend.
El backend, también conocido como el lado del servidor, es el software que impulsa un sitio web o aplicación, detrás de escenas.
Es responsable de almacenar y organizar datos, gestionar las solicitudes de los usuarios, y entregar contenido al frontend.
Debido a que el código frontend se ejecuta de lado del cliente, y puede modificarse fácilmente, la mayor responsabilidad en temas de seguridad depende del backend.
Por eso es importante conocer la diferencia entre frontend y backend.
2. ¿Cuál es el flujo de trabajo típico para implementar una nueva característica en el backend?
Los workflows para implementar características en el backend pueden variar dependiendo de la empresa y su stack tecnológico.
Sin embargo, un flujo de trabajo típico empieza por:
- discutir la nueva feature con las partes interesadas (stakeholders),
- diseñar y prototipar la nueva característica,
- escribir el código correspondiente, y
- realizar pruebas de Control de Calidad (QA).
En la mayoría de los casos, el desarrollador backend trabajará con el desarrollador frontend para asegurar que los datos se transmitan correctamente entre cliente y servidor.
También es esencial asegurar que las nuevas características sean compatibles con versiones anteriores de la aplicación.
3. Explica la esencia de los principios DRY
y DIE
.
El principio DRY (Don't Repeat Yourself) es un principio de desarrollo de software que establece que los desarrolladores no deben duplicar código.
El código duplicado puede provocar problemas de mantenimiento porque los cambios deben realizarse en varios lugares.
El principio DIE (Duplication Is Evil) es muy similar al principio DRY, pero va un paso más allá al afirmar que incluso pequeñas cantidades de duplicación son inadecuadas y deben evitarse.
4. ¿Qué es un servidor web?
Un servidor web es una computadora que almacena y entrega páginas web.
- Cuando escribes una URL en tu navegador, el navegador contacta al servidor web y solicita la página.
- El servidor web resuelve la petición y envía la página de vuelta al navegador.
- El navegador muestra la página en tu pantalla, realizando peticiones adicionales según sea necesario.
Apache y NGINX son los servidores web más populares, utilizados en conjunto con aplicaciones backend.
Los servidores web también pueden alojar y devolver recursos estáticos, como imágenes y videos, o documentos para descargar.
5. ¿Cuál es la diferencia entre una solicitud GET y una POST?
Una solicitud GET recupera datos de un servidor, mientras que una solicitud POST envía datos a un servidor, para que sean registrados o ejecuten alguna acción.
Decimos entonces que GET es idempotente porque sólo lee, sin causar cambios. POST, por otro lado, no lo es.
Usualmente:
- En una solicitud GET, los parámetros se pasan en la URL (esto se conoce como query parameters).
- En una solicitud POST, los parámetros se pasan en el cuerpo de la solicitud.
Nota: es posible enviar un body en un GET request, o usar query parameters para solicitudes POST, pero no es recomendable, sobretodo si estás siguiendo estándares REST.
6. ¿Cuándo usarías el almacenamiento en caché?
El almacenamiento en caché se usa frecuentemente para mejorar el rendimiento de una aplicación.
Por ejemplo, la información accedida con frecuencia desde una base de datos puede ser almacenada en caché para evitar consultas innecesarias.
7. ¿Cómo seleccionarías una estrategia de caché (por ejemplo, LRU, FIFO)?
Seleccionar una estrategia de caché depende de las necesidades específicas de la aplicación.
Por ejemplo:
-
LRU, Least Recently Used (Menos Usado Recientemente), es una buena opción para aplicaciones donde los datos accedidos con frecuencia son propensos a ser consultados nuevamente.
-
FIFO, First In, First Out (Primero en Entrar, Primero en Salir), es una buena opción para una aplicación donde los datos caducan después de un tiempo determinado.
8. ¿Cuáles son algunos problemas comunes con los ORM?
Las siglas ORM significan Object–relational mapping.
Y algunos problemas que pueden ocurrir con los ORM (cuando no son usados correctamente) son:
- degradación del rendimiento,
- mapeo incorrecto de datos y,
- dificultad para manejar consultas complejas.
9. ¿Cuándo deberías usar la programación asíncrona?
La programación asíncrona se usa frecuentemente para mejorar el rendimiento de una aplicación que realiza múltiples operaciones.
Por ejemplo, si una aplicación necesita realizar muchas consultas a su base de datos, ya sea de lectura o escritura, es conveniente usar programación asíncrona para no bloquear el hilo principal (main thread).
10. ¿Cuál es la diferencia entre promesas y callbacks?
- Una promesa es un objeto que representa el resultado de una operación asíncrona.
- Un callback es una función que se invoca cuando una operación asíncrona se completa.
11. ¿Qué es un closure?
Un closure es una función que accede a variables "externas", es decir que están ubicadas en otro ámbito, incluso después que la función principal se haya cerrado.
Si un callback depende de variables que están fuera de su ámbito, es además un closure.
12. ¿Cuál es la diferencia entre una Clase y una Interfaz en Java?
- Una clase es un plano o molde para crear instancias (objetos),
- mientras que una interfaz es un contrato que define los métodos que una clase debe implementar.
13. ¿Qué es la integración continua?
Continuous Integration (CI) es una práctica de desarrollo de software en la que los desarrolladores hacen merge continuamente de sus cambios de código sobre un repositorio principal.
La CI ayuda a garantizar que la base de código siempre esté al día y no haya conflictos entre las diferentes ramas.
Idealmente, como parte de esta práctica, se realizarán las validaciones adecuadas para asegurar que el código que se está integrando sea consistente, estable y seguro.
14. ¿Qué es un kit de desarrollo de software (SDK)?
Un software development kit (SDK) es un conjunto de herramientas que ayuda a los desarrolladores a construir aplicaciones de software.
Típicamente incluye un compilador, depurador y otras utilidades.
Como ejemplos, tenemos:
- el Java Development Kit (JDK), y el
- Python Software Development Kit (SDK).
15. ¿Cuáles son las diferencias entre client-side rendering vs. server-side rendering?
Existen ventajas y desventajas al decidir entre renderizar del lado del cliente y renderizar del lado del servidor.
La renderización del lado del cliente hoy en día no es tan compleja de configurar si se usan frameworks frontend como Vue, React, Angular, o Svelte para crear single page applications.
Solía ser una tarea tediosa años atrás al usar sólo JavaScript nativo, o bibliotecas como jQuery.
Básicamente, el código JavaScript se ejecuta en el dispositivo cliente y genera el HTML que finalmente termina mostrándose al usuario, en su navegador web.
La renderización del lado del cliente suele ser más lenta porque la aplicación necesita descargar todos los recursos necesarios antes de comenzar a renderizar.
La renderización del lado del servidor es importante por temas de SEO cuando se está desarrollando una SPA (single page application).
Si se trata de multi-page applications, la renderización del lado del servidor es típicamente más fácil de configurar, porque la gran mayoría de lenguajes de programación generan HTML sin complicaciones.
La renderización del lado del servidor suele ser más rápida porque el HTML se genera en el servidor (usualmente se guarda en caché) y se envía lista al cliente.
Si desarrollamos una SPA con SSR, entonces tenemos lo mejor de ambos enfoques:
- Una página interactiva que se actualiza de lado del cliente rápidamente.
- Y con una carga inicial rápida, ya que el servidor entrega un primer HTML renderizado.
Por favor, ten en cuenta que estas compensaciones dependen de los requerimientos de cada aplicación web.
16. ¿Qué son las high-order functions? ¿Por qué son útiles?
Las high-order functions son funciones que reciben otras funciones como argumentos.
Estas funciones ayudan a abstraer patrones comunes de código, y hacen posible lo que conoces como programación funcional.
Por ejemplo, en JavaScript tenemos map
, filter
, sort
, que son funciones que aceptan a otras funciones como argumento.
17. ¿Qué es un microservicio?
Un microservicio es un componente independiente (y pequeño) de una aplicación más extensa.
Cada microservicio se enfoca en una funcionalidad y puede ser desplegado independientemente.
- Los microservicios se construyen para ser usados por aplicaciones más grandes y complejas,
- ya que que son fáciles de mantener y escalar.
Uno de los beneficios de usar microservicios es que pueden estar escritos en diferentes lenguajes de programación y desplegados en diferentes servidores.
Ejemplos comunes de microservicios incluyen:
- autenticación de usuario,
- procesamiento de pagos, y
- manipulación de imágenes.
Preguntas sobre APIs
18. ¿Cómo diseñarías una API?
Al diseñar una API, es importante empezar analizando las necesidades de los desarrolladores que la requieren y van a utilizar.
La API debe ser fácil de usar y estar bien documentada.
Es fundamental considerar la seguridad de la API y asegurar que solo los usuarios autorizados puedan acceder a los recursos correspondientes.
Además, la API debe poder manejar un gran número de solicitudes sin sobrecargar el servidor.
19. ¿Cuál es la diferencia entre una API RESTful y una API SOAP?
- Las API RESTful están diseñadas para ser fáciles de usar y estar bien documentadas. Utilizan un conjunto estándar de reglas, que permiten familiarizarse con ellas rápidamente.
- Por otro lado, las API SOAP definen un protocólo de comunicación más rígido y por tanto se considera que esto agrega un nivel adicional de seguridad. Sin embargo, son más complejas de aprender y usar.
SOAP siempre devuelve XML como respuesta. REST es más flexible y soporta múltiples formatos (usualmente se usa JSON, pero no está limitado a ello).
Si quieres extenderte un poco más, vemos que tienen cosas en común:
- Ambos utilizan HTTP, el protocolo estandarizado de Internet, para intercambiar información.
- Ambos son compatibles con SSL/TLS para una comunicación segura y cifrada.
20. ¿Cómo manejas los errores al realizar llamadas a una API?
Al consultar una API, es importante atender los errores de manera consistente, según los códigos de respuesta.
Por ejemplo, si una API devuelve un error 404, lo recomendable es mostrar un mensaje al usuario diciendo que los datos no se pudieron encontrar.
Sin embargo, debemos tener en cuenta que un usuario podría estar usando una conexión a internet lenta, o quedarse desconectado. Si la solicitud no consigue realizarse, de igual forma debemos informar al usuario.
Preguntas sobre Bases de datos
21. ¿Qué es una base de datos?
Una base de datos es un lugar donde se almacena información.
Las aplicaciones backend utilizan bases de datos para almacenar y recuperar datos, como información de usuario o datos de una aplicación.
Existen muchos tipos de bases de datos, pero las más utilizadas por las aplicaciones backend son las bases de datos relacionales, como MySQL, PostgreSQL y Oracle.
Las bases de datos suelen ser gestionadas por un sistema de gestión de bases de datos (DBMS), que proporciona una interfaz para que los administradores gestionen los datos.
Algunas aplicaciones backend también utilizan bases de datos NoSQL, que son no relacionales y a menudo más escalables que las bases de datos relacionales.
22. ¿Cómo optimizarías una base de datos existente?
Para mantener una base de datos optimizada, es importante realizar periódicamente tareas de mantenimiento, como indexar nuevos datos, o eliminar datos antiguos que ya no se necesitan.
Es crucial monitorear el rendimiento de la base de datos, y asegurar que pueda manejar la carga de trabajo de la aplicación.
23. ¿Cuál es la diferencia entre una base de datos relacional y una no relacional?
- Las bases de datos relacionales almacenan datos en tablas y utilizan claves primarias para identificar cada fila. Mantienen los datos consistentes en función a las relaciones establecidas.
- Las bases de datos no relacionales almacenan datos en documentos y utilizan object IDs para identificar cada registro. Son más flexibles y generalmente más rápidas debido a que realizan menos validaciones.
24. ¿Cómo consultar datos de una base de datos MongoDB?
MongoDB utiliza un lenguaje de consulta llamado MongoDB Query Language
(MQL).
Podemos utilizar el método find()
para consultar datos de una base de datos MongoDB.
Este método toma un conjunto de parámetros que especifican los criterios de la consulta.
Por ejemplo, para encontrar todos los documentos en la colección users
que tengan como name
el valor "Juan", usaríamos la siguiente query:
db.users.find({"name": "Juan"})
25. ¿Cuáles son algunos beneficios de usar una base de datos NoSQL?
Las bases de datos NoSQL tienen algunas ventajas sobre las bases de datos relacionales:
- Generalmente son más escalables y más fáciles de gestionar.
- Son más flexibles porque no exigen un esquema estricto para los datos.
Sin embargo, las bases de datos NoSQL pueden ser más difíciles de consultar, y a menudo no proporcionan el mismo nivel de consistencia que las bases de datos relacionales.
26. ¿Cómo normalizarías datos en una base de datos relacional?
Para normalizar datos en una base de datos relacional, crearía tablas separadas para cada tipo de entidad y usaría claves foráneas para relacionar las tablas.
Por ejemplo, si tuviera una tabla "usuarios" y una tabla "órdenes", usaría una clave foránea para vincular cada orden con el usuario que la creó, modificó, eliminó, etcétera.
Preguntas sobre Escalabilidad
27.1. ¿Cómo diseñarías un sistema de software para que sea escalable?
Para conseguir escalabilidad en un software, es importante considerar las necesidades de la aplicación.
Por ejemplo, si la aplicación necesita manejar muchos usuarios concurrentes, y se cuenta con muchas funcionalidades, podemos usar una arquitectura basada en microservicios.
Esta arquitectura permite que cada componente del sistema se escale de forma independiente.
También podemos usar un message queue, o cola de mensajes, para desacoplar los componentes del sistema. Esto permitirá que cada componente se escale de forma independiente sin afectar el rendimiento de los otros componentes.
27.2. ¿Cuáles son algunos problemas comunes de escalabilidad? ¿Cómo pueden abordarse?
Algunos problemas comunes incluyen bajo performance, pérdida de datos y tiempo de inactividad.
Podemos abordar estos problemas utilizando diversas técnicas, como almacenamiento en caché, fragmentación (sharding) y replicación.
Es crucial tener una arquitectura bien diseñada que pueda atender adecuadamente aumentos repentinos en el nivel de tráfico / carga de trabajo.
28. Escalar hacia afuera vs. escalar hacia arriba: ¿en qué se diferencian? ¿Cuándo aplicar uno u otro?
Scale out y scale up son 2 enfoques diferentes para aumentar la capacidad o el rendimiento de un sistema.
Escalar hacia afuera implica agregar componentes adicionales al sistema, mientras que escalar hacia arriba implica hacer que las características existentes sean más potentes.
¿Cuándo usar uno y cuándo el otro?
-
Escalar hacia afuera (o de manera horizontal) suele ser el enfoque preferido cuando se trata de aplicaciones web u otros sistemas altamente paralelizables, ya que permite aumentos casi lineales en la capacidad.
-
Escalar hacia arriba (o de manera vertical) puede ser más apropiado al trabajar con sistemas obsoletos o aquellos que no son eficientemente paralelizables.
Preguntas sobre Seguridad
29. ¿Cuáles son algunos riesgos de seguridad comunes al construir una aplicación web?
Algunos riesgos incluyen:
- inyección SQL,
- cross-site scripting (XSS), y
- cross-site request forgery (CSRF).
La inyección SQL es un tipo de ataque donde se inyecta código malicioso en una declaración SQL, lo que resulta en la ejecución de acciones no deseadas.
Los ataques XSS ocurren cuando se inserta código malicioso en una página web, lo que resulta en la ejecución de acciones no intencionadas.
Los ataques CSRF ocurren cuando un usuario malintencionado engaña a una víctima para que envíe una solicitud que realiza una actividad no deseada, como cambiar su contraseña o transferir fondos.
30. ¿Cómo implementarías autenticación y autorización en un nuevo proyecto?
Hay muchas formas de implementar autenticación y autorización en un nuevo proyecto.
Una forma sería usar un servicio de terceros existente, como Auth0 u Okta.
Otra forma sería implementar una solución propia, utilizando tokens de seguridad como JSON Web Tokens (JWTs) o una tecnología similar.
- Necesitamos una página de inicio de sesión donde los usuarios puedan ingresar sus credenciales.
- Una vez verificadas las credenciales del usuario, generamos un JWT y lo enviamos de vuelta al usuario.
- El usuario luego enviará el JWT con cada solicitud que requiera de autenticación.
La autorización consiste en verificar si el usuario tiene los permisos correctos para acceder a un recurso en particular.
Una forma de hacerlo es crear roles y asignar roles a cada usuario. Así podemos verificar los permisos del usuario al atender cada solicitud.
31. ¿Cuál es la diferencia entre una cookie y una sesión?
- Una cookie es un pequeño fragmento de datos almacenado en el navegador del usuario.
- Una sesión es una estructura de datos en el servidor que contiene información sobre la sesión actual del usuario.
Las cookies almacenan información como el ID del usuario, la preferencia de idioma u otras preferencias a nivel de dispositivo.
Las sesiones almacenan información de una serie de solicitudes, como el carrito de compras del usuario u otra información que debe persistir mientras exista la sesión del usuario.
Aquí puedes aprender más sobre qué son las cookies y sesiones, con ejemplos.
Preguntas sobre Testing
32. ¿Cómo realizarías pruebas unitarias para una nueva feature?
Para esto necesitamos escribir una prueba que cubra la funcionalidad de la nueva feature.
Como se trata de una prueba unitaria, debemos probar sólo una unidad de código:
- Para esto es importante mantener nuestro código bien organizado.
- Debemos aislar esta nueva prueba unitaria de cualquier otro código en el sistema.
Una vez escrita la prueba, debemos ejecutarla y verificar que pase.
- Si la prueba falla, procedemos a depurar el código y encontrar la causa del fallo.
- Una vez encontrada la causa, debemos corregir el código y volver a ejecutar la prueba.
Si la prueba pasa, hemos confirmado que la nueva feature funciona como se espera.
Nota: podemos escribir tantas pruebas unitarias como sea necesario, para probar una feature.
33. ¿Cómo integrarías pruebas en tu flujo de trabajo?
Para esto necesitamos crear un testing environment (entorno de prueba) que refleje el entorno de producción lo más fielmente posible.
Necesitamos configurar este entorno con todas las dependencias y datos necesarios, para que se encuentre operativo.
Luego ya podemos empezar a escribir pruebas que cubran la funcionalidad del sistema.
- Estas pruebas deben ejecutarse automáticamente cada vez que se envíe nuevo código al repositorio.
- Si alguna de las pruebas falla, la compilación debe marcarse como fallida y los desarrolladores deben ser notificados.
También debemoss ejecutar estas pruebas antes de cada lanzamiento. Esto garantizará que toda la funcionalidad esté trabajando como se espera y que no haya regresiones.
34. ¿Cuáles son algunos pasos para performance testing?
- Identificar las áreas críticas de la aplicación que necesitan ser probadas.
- Crear casos de prueba que ejerciten esas áreas de la aplicación.
- Ejecutar los casos de prueba y recopilar datos sobre el rendimiento de la aplicación.
- Analizar los datos e identificar cualquier área de mejora.
35. ¿Por qué se escriben las pruebas de TDD antes del código?
Test-Driven Development (Desarrollo Guiado por Pruebas), es una metodología de desarrollo en la que se escriben pruebas antes del código.
La idea detrás de TDD es que al escribir pruebas primero, los desarrolladores pueden asegurarse de que su código cumpla con los requisitos.
Además, TDD puede ayudar a encontrar errores temprano y evitar que se introduzcan en el código.
Sin embargo, TDD puede consumir tiempo, y requiere una buena comprensión de los principios de testing.
Preguntas sobre Deployment
36. ¿Cómo desplegarías una nueva versión de una aplicación?
Hay muchas formas de desplegar una nueva versión de una aplicación.
- Una forma sería usar una herramienta (como Ansible o Chef) para automatizar el proceso.
- Otra forma sería ejecutar los scripts necesarios en cada servidor manualmente.
Al utilizar herramientas, es importante actualizar los archivos de configuración y ejecutar la herramienta. Este proceso despliega el nuevo código en todos los servidores del entorno.
Si se hace el despliegue manualmente, debemos iniciar sesión en cada servidor y ejecutar los scripts necesarios para actualizar el código en cada uno de ellos.
Una vez que se despliega el nuevo código, podemos probar la aplicación para asegurar que todo funcione como se espera.
37. ¿Cómo revertirías un despliegue fallido?
- Si un despliegue falla, podemos revertir los cambios y solucionar el problema.
- Una vez que se soluciona el problema, podemos volver a desplegar el código.
Para revertir un despliegue fallido, necesitamos deshacer cualquier cambio realizado durante el despliegue.
Este proceso puede incluir revertir cambios de código, reiniciar servicios, o revertir cambios en la base de datos.
Éxitos en tu Próxima Entrevista
Estas son excelentes preguntas y respuestas, que debes repasar si te estás preparando para llevar a cabo una entrevista backend.
Para estar completamente preparado, estudia también algoritmos, estructuras de datos y patrones de diseño de software.