¿Qué es una entrevista técnica? - Parte 2
Venimos de la primera parte donde comentamos unos rasgos principales de una entrevista técnica. Recordad que en esta serie nos estamos centrando en las entrevistas técnicas que intentan ser proyectos “realistas” de desarrollo. No estamos hablando de leetcodes o algoritmia, sino de tareas que normalmente realizamos en casa y entregamos. Se suele hacer pair-programming y comentar la solución.
Analizando una técnica
Muchas veces hay que ponerse en la piel del entrevistador para comprender qué está buscando. Es lo que os voy a exponer en esta segunda parte. Vamos a analizar un pequeño trozo de código, que se puede realizar en un par de horas, y lo evaluaremos basándonos en la parte 1.
¿Qué tenemos que mirar en una prueba?
Paso 1: Funciona
Para verificar esto estaría bien tener unos tests. Una Github Action que haga Build y Test es una manera rápida para mí de ver que has hecho el esfuerzo en hacer mi trabajo fácil. Depende del proyecto, la manera de ejecutarlo en local debe ser obvia. Voy a hacer un git clone, y me gustaría hacer un “run” o “test” mediante Maven, Gradle, Go, Cargo, NPM… Imagina que soy tu compañero y te tengo que hacer una Code Review; no debería llevarme más de un minuto.
Paso 2: Resuelve el ejercicio
Una vez haya visto que todo tu código se ejecuta, miraré los tests y comprobaré que estás verificando la funcionalidad y los requerimientos que te he pedido. Seguramente aún no haya visto ni el código ni me importa en qué lenguaje o stack está hecho tu ejercicio. Miraré lo que los tests hacen porque el objetivo de los tests es el siguiente:
- Primero, documentar el código para tus compañeros, es decir, podría ser yo que te he pedido un MVP de una funcionalidad.
- Segundo, comprobar que las funcionalidades y requerimientos que has implementado funcionan.
- Tercero, realizar un contrato de los requerimientos. Llamamos a esto tests de integración o funcionales.
Y os puede sorprender, pero la gran mayoría de gente no pasa el Paso 1, y muchísimos fallan en el Paso 2. Si he revisado 100 pruebas, os aseguro que en 97 de ellas no he mirado código más allá de los tests ni me ha hecho falta.
Idealmente, me gustaría tener algún tipo de test de integración o e2e. Según la prueba, pueden ser difíciles, pues ponme en el README 3 o 4 comandos que pueda copiar y ejecutar en mi terminal para comprobar que tu solución resuelve el ejercicio. No pasa nada. Si puedes hacerme un docker-compose que me levante todo y solo tenga que ejecutar un bash, genial. Mucho mejor si me lo pones en una Github Action. Como podéis observar, gran parte del trabajo de ingeniería se basa en hacer la vida fácil a nuestros compañeros.
No quiero suspenderte, entiendo que quizás no has tenido diez mil horas y no has podido automatizarme todo... Te pido y valoro que hayas hecho el esfuerzo de comprobar que las cosas funcionaran fácilmente para mi, gracias.
Paso 3: Tu solución
Si cumples con los requerimientos anteriores, por primera vez me miraré tu código para ver cómo lo has resuelto. Hay gente que hace barbaridades para que los tests pasen… y eso no es resolver el ejercicio. Espero no llorar demasiado. Fijaos que en el último paso es donde tú has pasado la mayor parte del tiempo. En cambio, yo como evaluador pasaré unos 15 minutos… si llego. Y si toco algo de tu código quizás sea para añadir algún test que creo que te puede fallar. Fijaos que en optimizar el último paso, la revisión del código, es donde la gente se pasa la mayor parte del tiempo haciendo sobreingeniería y picando auténticas locuras que han leído en un libro con la portada azul de DDD, o un libro sobre lambdas de FP (Programación Funcional) con la portada roja. No me vas a impresionar con un código que seguramente no voy a mirar. Me vas a impresionar si tu código es fácil de entender y resuelve lo que te he pedido.
Fijaos también que si la prueba ha sido bien diseñada y tú has hecho unos buenos tests, realmente me da bastante igual tu código. Se pueden dar dos casos:
- Si es una posición de junior y funciona, ya has aprobado.
- Si es una posición que requiere más capacidad técnica, la prueba tendrá condiciones (como usar HTTPS y autenticación, por ejemplo) que habrás tenido que testear. Si no las has hecho, no pasarás la prueba. Si las has hecho, leer el punto anterior.
Así que si, si hay algo que no has testeado por falta de tiempo y esta implementado y funciona documentadlo. Y si, si me tienes que poner un e2e que sea correr tu programa y hacer un curl pónmelo en el README. No pasa nada, no restara puntos.
Paso 4: Opcional
Entonces, para qué cojones voy a mirar tu código? Aquí es donde desarrollé en la parte 1 que pasado un nivel de capacidad técnica básico, se buscan otras características en una prueba. No entraremos en detalle.
Cómo preparar una prueba
He pensado que una FAQ puede ser la siguiente cuestión: Si te doy tantos detalles de lo que quiero y cómo lo voy a evaluar, la prueba no será muy fácil? Si solo miras que funcione y los tests, no pasará la prueba mucha gente? Creo que cualquiera que se ha dedicado a revisar pruebas o hacer entrevistas os puede decir que os equivocáis. De hecho, la gente suele ser muy permisiva y candidatos que no deberían pasar la primera fase suelen llegar a fases finales… una pérdida de tiempo para todos.
Como ya sabemos, toda entrevista y prueba funciona en DOS direcciones:
- El nivel de dificultad se calibra con los requerimientos.
- El nivel de los candidatos se calibra con el salario ofrecido.
Conclusión
Ponerse en los pies del entrevistador es muy importante antes de realizar una prueba. La persona que nos está entrevistando es nuestro futuro compañero. Y así es como se debe pensar durante toda entrevista con cualquier persona que hables. Queremos trabajar con esa persona? Es esa persona capaz? Como hago la evaluación por parte de mi futuro compañero fácil? Si no tienes empatía, no tienes modales, te suda el tiempo del entrevistador… tampoco te vamos a querer en nuestro equipo. Y lo mismo podemos decir, si el entrevistador es un gandul. No quieres trabajar ahí.
Si no entrevistáis aún a nadie para practicar porque no forma parte de vuestro rol como ingeniero en vuestras empresas, os recomiendo evaluar código de la manera que os explico arriba como ejercicio un par de veces y realizar unas cuantas pruebas.
Para ello, qué mejor que irnos a la “crème de la crème” del desarrollo de software hispano? Empezaremos con nuestros amigos de CodelyTV. He elegido uno de sus proyectos en Java que utilizan como ejemplo de super buenas practicas para sus alumnos. Aquí tenéis el código en Github: CodelyTV/java-ddd-example
Lo vemos en #2