Ya lo sé, no es fácil llegar a un lugar bajo tu propio pie para ser juzgado, vas a un sitio para que algunas personas que no conoces dictaminen que tan buenas son tus capacidades y habilidades. Eso nos ha dicho nuestra mente cuando vamos a una entrevista, porque solo tienes una oportunidad (o dos) para demostrar todo lo que has alcanzado a lo largo de los años de tu carrera.
Antes que nada, confía en ti, en tus conocimientos y tus habilidades, si has llegado hasta aquí es porque eres bueno, antes de convencer a nadie de lo que vales, primero convéncete a ti mismo.
Prepararte para una entrevista técnica no es tan difícil, solo necesitas organizar tus conocimientos, y este es mi objetivo con este post, ayudarte a organizar todo lo que ya sabes para qué puedas expresarlo.
Regla de Oro:
Nunca bajo ningún concepto debes mentir, jamás digas que sabes algo que no sabes, solo para obtener ese trabajo, imagina que mientes bien y te dan el trabajo, ¿entonces que harías?. Te aseguro que no tendrás tiempo de aprender en el camino, además si no sabes algo ¡Está bien! En el mundo tech hay demasiada, pero demasiada información, es imposible que lo sepamos todo, mejor decir: “no sé”, aunque eso provoque que te descarten al final tú quieres un trabajo donde estés bien y no uno donde pases demasiado estrés, ¿por qué te irías a meter tú solo a la boca del lobo?. Cuando no sepas algo, también puedes decir: aún no tengo esa competencia, pero me encantaría tener la oportunidad de aprenderlo.
Y es que si no sabes algo no pasa nada, estoy 100% segura que llegará el trabajo en el que encajes a la perfección, porque allá afuera hay mucho, pero mucho trabajo para nosotros, buscan de todo tipo de perfiles, así que nada, Tu tranqui.
Intentaré dar una idea de lo que podrías responder, pero realmente eso lo tienes que pensar tú, aplicarlo a tu realidad, por eso es importante que te prepares con antelación.
GENERAL
Lo primero que te dirán será algo más o menos así:
Bien pues, ¿Cuéntame acerca de tu experiencia?.
Y tú tendrás que hacer un resumen de tu perfil, así que haz un resumen de tu trayectoria, céntrate en las tecnologías que más dominas, adorna muy bien tus habilidades, trata de abarcar tooodos tus conocimientos de manera resumida, porque luego tendrás que hablar más en detalle de cada uno, de momento Keep it simple pero guapo.
Pues bien entremos en materia, aquí vas a tener que escribir todo aquello que sabes, pero como sabes muchas cosas hay que hacer más fragmentos y detallar un pelín más, estas son algunas de las categorías que debes organizar y anotar con lo que has trabajado.
● Patrones de arquitectura.
● Lenguajes de programación.
● Servicios web.
● Seguridad y Autenticación.
● Pruebas Unitarias, integración y aceptación.
● Integración continúa.
● Principio y patrones de diseño.
● Cache.
● Base de datos y ORM.
● Software de mensajeria.
Estas respuestas son basadas a mi experiencia, espero que te sirva de guía para puedas ajustarlas a la tuya.
=================== LAS TEORICAS ======================
¿Cuál crees que es el propósito de un desarrollador backend?
Como el nombre lo indica se trata de algo que no se ve, que está tras bambalinas, es quien se encarga de diseñar la solución a la lógica de negocio mediante una aplicación a la que se puede acceder por medio de llamadas a su servicio.
¿Con que frameworks y lenguajes de programación has trabajado?
Aquí te dejo lo más usado, ya te sitúas en él te corresponde:
╔═══════════════╦════════════╦══════════════════════════════════════════╗
║Framework ║ Languaje ║ IDE (Algunos) ║
╠═══════════════╬════════════╬══════════════════════════════════════════╣
║ Asp .Net Core ║ C# ║Visual Studio ║
║.Net Framework ║ C# ║Visual Studio ║
║Express JS, Koa║ NodeJS ║Komodo, Visual Studio Code, NetBeans, ATOM║
║Spring Boot ║ Java ║NetBeans, Eclipse, IntelliJ ║
║Django, Flask ║ Python ║Komodo, ATOM, Eclipse, IDLE ║
║Cake PHP ║ PHP ║Komodo, NetBeans, PhpStorm ║
║Ruby on Rails ║ Ruby ║Komodo, RubyMine ║
╚═══════════════╩════════════╩══════════════════════════════════════════╝
¿Diferencia entre SOAP y Rest?
SOAP es un protocolo de intercambio de datos, este tiene un contrato de comunicación con el cliente, para el cual usa WSDL(es un lenguaje basado en XML para describir web services).
Rest es una arquitectura que usa el protocolo HTTP, se accede por medo de URI y no existe contrato con el cliente.
¿Diferencia entre API y Web service?
Ambos facilitan la transferencia de información, es decir que el API es una evolución de un web service, podemos concluir que todos los servicios web son API, pero no todas las API son servicios web.
Con el web service los datos son enviado a través de XML exclusivamente, pero API permite muchos más, como JSON, XML, ficheros, etc. Además API se accede por medio de URI que están formada por los verbos de HTTP (Get, Delete,Post, Put)
¿Cuándo usarías programación asíncrona?
La usaría para mejorar el rendimiento de mi aplicación, por ejemplo, si necesito acceder a muchas consultas porque así evitaría bloquear el hilo principal de ejecución.
¿Diferencia entre promesa y callback?
La promesa es objeto resultante de una operación asíncrona, el callback es una función que se invoca cuando se completa la operación asíncrona.
¿Diferencia entre interfaz y clase abstracta?
La clase abstracta puede heredar de una sola clase, además de propiedades puede tener métodos definidos con su implementación, mientras que la interfaz puede extender varias interfaces a la vez y definir métodos abstractos sin su implementación.
¿Qué es un microservicio?
Es un módulo o componente pequeño que tiene su propia funcionalidad y que puede implementarse de manera independiente, se usan para fraccionar o modular aplicaciones muy grandes, la ventaja que puede escribirse los diferentes lenguajes de programación y se puede implementar en diferentes servidores.
¿Qué es un patrón de diseño y cuales has usado?
Los patrones de diseño proponen una solución reutilizable para el software podríamos decir que son unas plantillas, de las cuales se reparten en 3 categorías
· Patrones creacionales
· Patrones estructurales
· Patrones de comportamiento
Aquí ya comentas con los que has trabajado, si no conoces alguno, te recomiendo que te sumerjas en el mundo de los patrones porque no solo te ayudaran a escribir mejor código, sino que ya tendrás esa competencia en tu curriculum, está casi siempre es un requisito.
¿Conoces la diferencia entre cookies y sesión?
Ambas permiten almacenar información, la sesión se guarda de lado del servidor y se destruye cuando cierras el navegador mientras que la cookie se guarda lado del cliente y esa información permanece ahí hasta que tu decidas borrar esa cookie, podemos concluir que las sesiones son mas seguras que las cookies.
¿Qué es inyección de dependencias?
Es una técnica que ayuda a resolver Inversión de dependencias, esto es básicamente poder acceder a cualquier servicio inyectándolo en el constructor de la clase que vaya a utilizar este servicio, la clase que lo consume no necesita saber cómo está hecho, solo quiere pedirlo y usarlo.
¿Conoces los principios SOLID?
Son un conjunto de reglas de buenas practicas para garantizar código limpio, SOLID es acrónimo de: Single Responsability, Open/Close, Liskov, Interaface Segregagtion y Dependency Inversion.
Cuando contestes que si a esta pregunta, el entrevistador intentará ahondar en el tema, así que si tienes estos conceptos claros no te será difícil abordar está pregunta, y sino, te recomiendo que estudies estos principios y los empieces a aplicar en tu desarrollo, porque este requisito lo encontraras en casi todas las Job Descriptions.
¿Dónde pondrías los logs?
En los puntos más claves de mi aplicación, no queremos escribir absolutamente todo, pero si lo mas importante y yo elegiría:
· En las requests y responses de mis peticiones.
· En peticiones que manejas grandes cantidades de información, para verificar el tiempo de ejecución y rendimiento.
· En las autenticaciones y autorizaciones.
· Donde se encuentra las reglas de validación de la lógica de negocio.
· Y por supuesto en las excepciones cuando ocurren errores.
¿Implementas algún tipo de pruebas en tu código?
Si, para cada método nuevo, o su modificación es indispensable realizar pruebas unitarias para probar casos concretos, y luego test de integración en el cual juntamos varias partes de código no para probar casos concretos sino para probar como se comporta un flujo determinado, si necesitamos comprobar cosas contra la base de datos, con pruebas de módulos contra otros módulos, luego las pruebas del sistemas, que estas se encarga el Product Owner y cuando todo la ido bien, se involucra al cliente para hacer una prueba de aceptación.
¿Cómo mejorarías el rendimiento de tu aplicación?
Antes que nada seria identificar donde se encuentra ese bajo rendimiento, y dependiendo de eso podríamos implementar:
· Cachaer la información que consume más recursos.
· Usa un pool de conexiones.
· Considera hacer paginación para poner límite en las respuestas del endpoint.
· Mejorar las queries, utilizando JOINS en lugar de hacer dos queries separadas.
· Usa programación asíncrona para escribir los logs.
¿Cómo manejarías los errores de tu aplicación?
Usando Try-Catch con moderación y estratégicamente, únicamente para manejar errores, no para usarlo como la lógica del programa.
Utilizarlos para situaciones en las que se anticipa que algo puede salir mal, y que podria estar completamente fuera de tu control.
Ademas es importante crear nuestros propios tipos de excepciones, y por supuesto agregando en los catch de excepciones los logs para asegurarnos que todos los errores quedan registrados.
¿Cómo garantizas la seguridad de tu API?
· Para empezar la API debe ser HTTPS (Certificado SSL)
· Agregar autenticación (Inicio de sesión) y autorización (Verificar a que tiene acceso asignando un rol) a cada endpoint.
· Usar Json Web Token (JWT), porque esa sesión se le da un tiempo de expiración.
· No poner información sensible en la URL.
· Valida tus parámetros de entrada.
¿Qué controlador de versiones has usado y cuál sería el workflow que usas?
Aquí puede mencionar el controlador de versiones que usas, los más populares son:
╔═══════════════╗
║MAS USADOS ║
╠═══════════════╣
║ git ║
║ svn ║
║ tfs ║
║ vsts ║
╚═══════════════╝
Y acerca del flujo pues esto es mas o menos estándar, casi la mayoría sigue este workflow, que seria:
Cuando tienes una tarea/feature crear una rama a partir de Develop, cuando ya has terminado, hacer un merge request para alguien del equipo valide tus cambios, cuando este todo ok, te actualizas tu rama feature con los cambios de Develop (actualizada) para que cuando existan conflictos los resuelvas en tu rama y no en develop.
Cuando tus cambios están ya develop y has probado la nueva funcionalidad entonces se crear la rama Release, esta se publica en el entorno de preproducción, y si todo ok, entonces se hace el merge con master.
Si surge un problema en producción se crea rama Hotfix que parte directamente de rama Master.
¿Has trabajado con Entity Framework, y cuál ha sido tu experiencia?
Entity framework es el encargado de mapear la base de datos a objetos, soporta diferente tipo de base de datos SQL como Sql Server, MySql, PostgreSql y hasta MongoDB (No sql), Para hacer las consultas de base de datos utiliza LINQ, además para el mapeo utiliza CodeFirst o EF Designer.
============= LAS BASADAS EN TU EXPERIENCIA===============
¿Has utilizado alguna metodología ágil y cuál ha sido el flujo que has seguido?
Metodologías agiles son un conjunto de practicas enfocadas en la entrega rápida de software de alta calidad, por ejemplo:
╔═════════════════════════════╗
║ XP o Programación Extrema ║
║ Agile ║
║ Kanban ║
║ Scrum ║
║ FDD ║
╚═════════════════════════════╝
En algunas empresas encontraras una combinación de todo, es importante que dediques tiempo a estructurar tu experiencia para que puedas darla a conocer de manera clara, sea cual sea la metodología que has usado en tu equipo.
¿Podrías describir como estaba diseñado el proyecto más completo en el que has trabajo?
Esta pregunta es común en las entrevistas técnicas, así que toma tu tiempo para poder dar a conocer el ecosistema del proyecto que elijas comentar, por ejemplo:
· La función principal de ese proyecto.
· La autenticación y autorización de ese proyecto.
· El tipo de arquitectura con la que estaba construido, ya sea Capas, Hexagonal, Spaghetti.
· Tipo de metodologías aplicadas, por ejemplo: DDD, CORS, Event Sourcing, etc.
· Si se conectaba con otros sistemas.
· El modelo de base de datos, etc.
Esto es una idea de como podrías empezar a describir el proyecto, puede que esto haga que haya más preguntas por parte del entrevistador.
¿Cuál ha sido el aporte más importante en el último proyecto?
Si al instante no se te viene nada a la cabeza, has memoria, trata de destacar una feature que hayas resuelto que sea grande y que haya mejorado el sistema, estoy segura que has participado en el desarrollo de una funcionalidad, microservicio, interfaz, etc. que ha mejorado el sistema, proyecto, web, en la que has aportado tus conocimientos.
¿Cuál ha sido el reto más grande al que te has enfrentado en el último proyecto?
Aquí puedes mencionar varias cosas como, por ejemplo:
· Si has tenido que aprender alguna tecnología en tiempo record para poder dar solución a un requerimiento.
· Si has tenido tiempos muy ajustado, pero aun así se ha cumplido el deadline. Y eso requirió esfuerzo extra para lograrlo.
· También puede ser que te has tenido que enfrentar a mala comunicación del equipo.
· O alguna plataforma que ha cambiado continuamente y no ha permitido la estabilización.
¿Cómo te mantienes actualizados tus conocimientos?
Primero que nada, estar al pendiente de cuales son las competencias más buscadas o valoradas, y luego ya decides como adquieres ese conocimiento, ya se estudiando cursos online, maestría, y por supuesto los miles de tutoriales que hay en YouTube.
CONCLUSION
Gracias por haber llegado hasta aquí, en serio espero que esto te sirva como guía para tu próxima entrevista.
Y antes de dejar de teclear, quiero darte un tip de una de mis mejores amigas, es una genia por hacer lo que te voy a decir, ¿has escuchado ese dicho de que la práctica hace al maestro? Pues bien, ella hace muchas entrevistas, aplica a varios puestos para saber cómo están las competencias y que es lo último que piden, entonces al hacer varias entrevistas, pues entrenas! y te vas volviendo experto, porque seguro que eres un buen desarrollador, pero además adquirirás la habilidad de dar buenas entrevistas, ósea que, si quieres aplicar a un lugar que te gusta mucho, pero mucho, intenta antes practicar. 😉
-Kim M.