Espera un momento ...
¿Te gustaría llevar mi curso de Laravel, gratis?
Sólo debes ingresar tus datos:
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?
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.
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é.
Al entrevistar a un desarrollador backend, lo principal es:
A continuación te presento 37 preguntas importantes para una entrevista backend.
Están organizadas por secciones. Empecemos por las más generales.
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.
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:
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.
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.
Un servidor web es una computadora que almacena y entrega páginas web.
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.
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:
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.
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.
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.
Las siglas ORM significan Object–relational mapping.
Y algunos problemas que pueden ocurrir con los ORM (cuando no son usados correctamente) son:
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).
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.
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.
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:
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:
Por favor, ten en cuenta que estas compensaciones dependen de los requerimientos de cada aplicación web.
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.
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.
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:
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.
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:
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.
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.
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.
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"})
Las bases de datos NoSQL tienen algunas ventajas sobre las bases de datos relacionales:
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.
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.
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.
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.
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.
Algunos riesgos incluyen:
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.
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.
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.
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.
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:
Una vez escrita la prueba, debemos ejecutarla y verificar que pase.
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.
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.
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.
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.
Hay muchas formas de desplegar una nueva versión de una aplicación.
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.
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.
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.
Comparte este post si te fue de ayuda 🙂.
Regístrate
Accede a todos los cursos, y resuelve todas tus dudas.
Cursos Recomendados
Aprende Laravel desde cero y desarrolla aplicaciones web reales, en tiempo récord, de la mano de Laravel.
Iniciar cursoActualiza tus proyectos desde cualquier versión hasta la última versión estable de Laravel.
Iniciar cursoDesarrollemos un Messenger! Aprende sobre Channels, Queues, Vuex, JWT, Sesiones, BootstrapVue y mucho más.
Iniciar cursoEspera un momento ...
¿Te gustaría llevar mi curso de Laravel, gratis?
Sólo debes ingresar tus datos: