Así que actualmente estoy buscando un nuevo puesto como desarrollador front-end. Conozco JavaScript muy bien y puedo hablar poéticamente sobre cierres, currículum, herencia de prototipos, patrones de diseño, rendimiento de aplicaciones y arquitectura general de front-end. Pero aún así termino bombardeando entrevistas de trabajo. (Para su información, la mayoría de los trabajos para los que estoy entrevistando son para construir SPA con algún tipo de marco MVC)
Por lo general, las pruebas de codificación son pequeños fragmentos de código de cosas que nunca encuentro profesionalmente. Como escribir una función para resolver algún tipo de problema matemático. Además de la incomodidad inherente de tratar de codificar mientras sostienes el teléfono con una mano y haces que un extraño vea tu pantalla y vea cada personaje que escribes, simplemente no veo estas cosas en el mundo real.
¿Es un conjunto de habilidades serias que me falta o los entrevistadores me hacen preguntas irrelevantes? Supongo que debería trabajar en mi programación funcional y algoritmos, pero no he encontrado muchos buenos recursos en la web (o en forma impresa) ¿alguna sugerencia?
fuente
Respuestas:
Escribir código es solo una parte del proceso de la entrevista.
En realidad, resolver el problema lógico es solo una parte de la tarea de escritura de código.
Los entrevistadores quieren asegurarse de que:
Puedes escribir código. Muchos candidatos con diez años de experiencia profesional en un idioma no pueden escribir ningún código, y esta prueba está destinada a rechazar a esos candidatos.
Piensa en un problema antes de escribir el código. Muchos saltan a sus teclados, escriben decenas de líneas de código y luego descubren que no han entendido el problema original, porque no se tomaron el tiempo para pensarlo.
Puedes adaptarte cuando escribes código. Digamos que encontró una solución, pero cuando comenzó a implementarla, parecía que su primera idea no era la mejor; ¿puedes cambiar rápidamente a uno mejor y eventualmente refactorizar el código que escribiste?
Esto también significa que tales entrevistas deberían ser más interactivas . En lugar de escribir con una mano, compre un kit de manos libres o llame a través de Skype y use auriculares. Escriba mientras escribe en el trabajo, mientras comenta y explica lo que hace: de repente se volverá mucho menos incómodo.
¿Has hecho programación de pares? En caso afirmativo, la situación de la entrevista es muy similar, excepto que el entrevistador puede no darle su opinión, y usted no le pide que cambie de teclado con usted cuando haya terminado.
Aquí hay algunos ejemplos de un problema puramente matemático y cómo muestra las habilidades no matemáticas de un desarrollador.
Ejemplo 1: ejercicio de codificación simple
Aquí, el entrevistador quiere que piense lo más rápido posible, encuentre la solución y la implemente rápidamente. Tal ejercicio no está relacionado con lo que hacen los desarrolladores reales y está mucho más cerca de lo que puedes encontrar al hacer un título de CS, pero a los entrevistadores les gusta este tipo de cosas, así que hagámoslo. Además, la limitación de tiempo hace que sea imposible realizar pruebas automáticas, por lo que el entrevistador probablemente no espera esto de usted.
“La descripción del algoritmo me hace pensar en la recursividad. La segunda regla lleva a la siguiente función recursiva.
"Para finalizar la recursión, agregaremos los casos especiales reemplazando el cuerpo de la
fibonacci
función"."Hecho."
Conclusión
Como dije, dicho ejercicio no tiene relación alguna con el trabajo real de un desarrollador. ¿Lo hace sin sentido? En realidad no, porque al menos, muestra que la persona:
Es capaz de pensar en un problema. Algunos candidatos se perderán por completo y, bajo estrés, tomarán más del tiempo asignado solo para pensar en una posible forma de abordar el problema.
Conoce la recursividad o puede sortear la recursividad a través de un bucle ordinario. Más tarde, el entrevistador puede preguntar si había formas de usar / no usar la recursividad, y cuáles son los beneficios / inconvenientes de la recursividad.
Conoce los conceptos básicos del lenguaje de programación. No importa si la persona lo usó
switch
, una cláusula de protección, un condicional o un diccionario : dependiendo de los antecedentes, diferentes candidatos elegirán diferentes herramientas para lograr lo mismo.Se mantiene enfocado en el problema, sin aportar elementos como pruebas unitarias, escalabilidad o rendimiento. Luego, el entrevistador puede preguntar por qué, en términos de desempeño, la función anterior es terrible, esperando que el candidato explique qué se debe hacer para llevar el desempeño a un nivel razonable.
Ejemplo 2: preguntas difíciles
Ahora, tenemos una restricción interesante que muestra que al entrevistador realmente no le importa la capacidad del candidato para resolver problemas, sino su habilidad para adivinar qué formas son más rápidas que otras.
Esas preguntas difíciles generalmente invitan a respuestas difíciles. Aquí, dada la limitación de tiempo, no hay forma de hacer implementaciones múltiples, compararlas, perfilar la más rápida y ofrecer una solución óptima.
En cambio, ¿qué pasa con:
"Permítanme Google" Primeros números de Fibonacci "... Esto parece prometedor. Con una expresión regular
simple(que sería un oxímoron), podemos construir una lista de valores separados por comas "."Finalmente, el programa en sí mismo".
Conclusión
Las preguntas difíciles invitan a respuestas difíciles. No seas heroico, y no comiences a comparar y perfilar cuando solo tienes tres minutos. Piense en formas inteligentes de resolver el problema mientras usa su experiencia. Mi experiencia me da una pista de que usar un mapa puede ser más rápido que calcular el número. Puede estar equivocado, pero este intento debe esperarse dada la limitación de tiempo.
Conocer sus herramientas también ayuda y es una parte esencial de las habilidades del desarrollador: sin conocer las expresiones regulares, pasaría los tres minutos asignados buscando en Google una lista separada por comas, o comenzaría a escribir un analizador que construya la matriz que necesito.
Recuerde, un buen desarrollador no es aquel que comienza a codificar de inmediato, sino que sabe cómo evitar la codificación cuando hay una mejor oportunidad disponible. Algunos entrevistadores no dudarán en darle tareas que parecen codificar, pero que casi no requieren ningún código.
Ejemplo 3: desarrollo completo de aplicaciones
Empecemos.
“La secuencia de ejemplo es muy útil, ya que me permitirá tener un montón de pruebas unitarias para asegurar que mi implementación no se vea completamente mal. En general, uso Mocha para node.js o QUnit para JavaScript del lado del cliente, pero aquí, en aras de la simplicidad, simplemente arrojaré un montón de funciones de prueba ".
“Comienzo creando
index.htm
yfib.js
archivos. Luego, llenoindex.htm
con un código realmente minimalista y no compatible con W3C (podemos volver a esto más adelante si también está interesado en mis habilidades de HTML) "."Ahora escribamos un código que llame a la función de generador de Fibonacci y muestre los resultados".
“Es hora de ejecutar el código por primera vez y ... no funciona. No pasa nada. ¿Por qué?"
“Bien, me he olvidado
fibonacci.init();
al final. Lo agregué, y aún así, no sucede nada, mientras que al menos debería mostrar el mensaje en la consola. Espera, cierto, no lo esonclick
, peroclick
; Uso JQuery con tanta frecuencia que empiezo a olvidar los nombres de los eventos en JavaScript simple "."Agreguemos algunas pruebas".
"Comparar matrices puede ser complicado, así que solo copie y pegue el
Array.prototype.equals
código de esta respuesta "."Ahora que ejecutamos la aplicación, muestra:"
“La prueba falló, lo cual era muy esperado, dada nuestra implementación real (
return [1, 2, 3];
) de la secuencia de Fibonacci. Es hora de cambiar esto "."A partir de la declaración original, la secuencia de Fibonacci comienza
[0, 1]
, por lo que secompute
convierte en:""Esto hace posible pasar la primera prueba, y ahora podemos escribir la segunda".
"Falla, así que volvemos
compute
y lo modificamos"."Ahora, ambas pruebas pasan, y es hora de pasar a casos sin límite".
“Las tres pruebas pasan ahora, excepto que el resultado no parece correcto para longitudes más grandes como 100. Para obtener esos resultados correctos, deberíamos haber usado una biblioteca de precisión arbitraria . También hay cosas para mejorar. Por ejemplo, las convenciones de nomenclatura son a veces demasiado malas (¿qué es
fib
?). El código JavaScript relacionado con HTML también debe ir a un objeto diferente, así como también al código de prueba. Además, no he probadocompute(0)
y no he verificado las entradas ".Conclusión
Al recorrer el ejemplo, puede ver la interacción esperada durante una entrevista. No todo fue fácil (cometí varios errores al principio que me llevaron a una situación vergonzosa en la que no pasa nada cuando ejecuto la aplicación), y el enfoque original fue poco convincente si tenemos que soportar una gran longitud de secuencia, pero he logrado para mostrar que:
compute(0)
que fallarán, pero no importa para la demostración).Esto es exactamente lo que un entrevistador debe esperar de usted.
fuente