Sé JavaScript muy bien, pero bombardeo entrevistas de codificación [cerrado]

33

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?

Mike Fisher
fuente
44
Pruebe el Proyecto Euler para algunas muestras.
Peter K.
11
¿Y obtener un kit de manos libres para su teléfono?
AakashM
¿Por qué estás haciendo una prueba de codificación en tu teléfono? ¿Se espera que trabajes de esa manera cuando consigas el trabajo?
Burhan Ali
2
@BurhanAli, el teléfono es para hablar, y esto es estándar para la primera etapa de la entrevista.
greenoldman
3
Sí, creo que algunas de las pruebas de sceen hoy en día son una mierda completa. Especialmente desprecio las pruebas de "llevar a casa", donde te dicen que se puede hacer algo en una hora, pero en realidad tomaría medio día o más para hacerlo bien. Me niego a hacer eso directamente. Estás realmente a gusto del entrevistador. Algunos de ellos piensan buenas pruebas que evalúan las habilidades del mundo real. Otros entrevistadores no saben qué demonios están haciendo y tienen sus propias agendas e inseguridades personales.
Ringo

Respuestas:

52

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

Debe implementar la calculadora de números de Fibonacci en JavaScript. Debería poder cambiar el índice. La secuencia de Fibonacci sigue esas reglas:

  1. Los dos primeros números de la secuencia son 0 y 1,
  2. Cada número subsiguiente es la suma de los dos anteriores.

Ejemplo: F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, F 10 = 55.

Tienes tres minutos

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.

var fibonacci = function (n) {
    return fibonacci(n - 2) + fibonacci(n - 1);
};

console.log(fibonacci(10));

"Para finalizar la recursión, agregaremos los casos especiales reemplazando el cuerpo de la fibonaccifunción".

switch (n) {
    case 0: return 0;
    case 1: return 1;
    default: return fibonacci(n - 2) + fibonacci(n - 1);
}

"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

Debe implementar la calculadora de números de Fibonacci en JavaScript. Debería ser lo más rápido posible. Debería poder cambiar el índice de 0 a 100. La secuencia de Fibonacci sigue esas reglas:

  1. Los dos primeros números de la secuencia son 0 y 1,
  2. Cada número subsiguiente es la suma de los dos anteriores.

Ejemplo: F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, F 10 = 55.

Tienes tres minutos

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 ".

sed -e "s;\([0-9]*\) \([0-9]*\);'\2',;g" fbncc10.txt | tr '\n' ' '

"Finalmente, el programa en sí mismo".

var map = ['0', '1', '1', '2', '3', '5', '8', '13', '21', '34', '55', '89', '144', '233', '377', '610', '987', '1597', '2584', '4181', '6765', '10946', '17711', '28657', '46368', '75025', '121393', '196418', '317811', '514229', '832040', '1346269', '2178309', '3524578', '5702887', '9227465', '14930352', '24157817', '39088169', '63245986', '102334155', '165580141', '267914296', '433494437', '701408733', '1134903170', '1836311903', '2971215073', '4807526976', '7778742049', '12586269025', '20365011074', '32951280099', '53316291173', '86267571272', '139583862445', '225851433717', '365435296162', '591286729879', '956722026041', '1548008755920', '2504730781961', '4052739537881', '6557470319842', '10610209857723', '17167680177565', '27777890035288', '44945570212853', '72723460248141', '117669030460994', '190392490709135', '308061521170129', '498454011879264', '806515533049393', '1304969544928657', '2111485077978050', '3416454622906707', '5527939700884757', '8944394323791464', '14472334024676221', '23416728348467685', '37889062373143906', '61305790721611591', '99194853094755497', '160500643816367088', '259695496911122585', '420196140727489673', '679891637638612258', '1100087778366101931', '1779979416004714189', '2880067194370816120', '4660046610375530309', '7540113804746346429', '12200160415121876738', '19740274219868223167', '31940434634990099905', '51680708854858323072', '83621143489848422977', '135301852344706746049', '218922995834555169026', '354224848179261915075'];

var fibonacci = function (n) {
    return map[n];
};

console.log(fibonacci(10));

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

Necesita implementar la secuencia de Fibonacci en JavaScript. La longitud de la secuencia se determina durante la ejecución del programa. La secuencia sigue esas reglas:

  1. Los dos primeros números de la secuencia son 0 y 1,
  2. Cada número subsiguiente es la suma de los dos anteriores.

Ejemplo: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89.

La aplicación debe presentarse como una página web, permitiendo al usuario especificar la longitud de la secuencia a través de un campo de entrada.

Tienes una hora

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.htmy fib.jsarchivos. Luego, lleno index.htmcon 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) ".

<label>Length</label> <input id="length" value="15" />
<input id="compute" type="button" value="Compute" />
<div id="result" style="font-weight:bold;"></div>
<div id="tests"></div>
<script src="fib.js"></script>

"Ahora escribamos un código que llame a la función de generador de Fibonacci y muestre los resultados".

fibonacci = (function () {
    var compute,
        init;

    compute = function (length) {
        // TODO: Implement Fibonacci sequence.
        return [1, 2, 3];
    };

    init = function () {
        var button = document.getElementById('compute');
        button.addEventListener('onclick', function () {
            var length = parseInt(document.getElementById('length').value, 10),
                result;

            console.log(
                'Computing Fibonacci sequence of length ' + length + '.'
            );

            result = compute(length);
            document.getElementById('result').innerText = result.join(', ');
        });
    };

    return {
        compute: compute,
        init: init
    };
}());

“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 es onclick, pero click; Uso JQuery con tanta frecuencia que empiezo a olvidar los nombres de los eventos en JavaScript simple ".

"Agreguemos algunas pruebas".

ensureAreEqual = function (expected, actual) {
    var testResultsContainer = document.getElementById('tests');
    testResultsContainer.innerText += (expected.equals(actual) ?
            '.' :
            ('Actual [' + actual.join(', ') + '] is different from ' +
             'expected [' + expected.join(', ') + '].'));
};

test = function () {
    ensureAreEqual([0], compute(1));
};

"Comparar matrices puede ser complicado, así que solo copie y pegue el Array.prototype.equalscódigo de esta respuesta ".

"Ahora que ejecutamos la aplicación, muestra:"

El real [1, 2, 3] es diferente del esperado [0].

“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 se computeconvierte en:"

compute = function (length) {
    var fib = [0];
    return fib;
};

"Esto hace posible pasar la primera prueba, y ahora podemos escribir la segunda".

ensureAreEqual([0, 1], compute(2));

"Falla, así que volvemos computey lo modificamos".

compute = function (length) {
    var fib = [0, 1];
    return length === 1 ? [0] : fib;
};

"Ahora, ambas pruebas pasan, y es hora de pasar a casos sin límite".

compute = function (length) {
    var fib = [0, 1],
        i,
        next,
        current = 1,
        previous = 0;

    for (i = 2; i < length; i += 1) {
        next = current + previous;
        previous = current;
        current = next;
        fib.push(next);
    }

    return length === 1 ? [0] : fib;
};

“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 probado compute(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:

  • Puedo manejar diferentes problemas,
  • Uso el desarrollo basado en pruebas, la secuencia de Fibonacci es una excelente oportunidad para esto,
  • Copio y pego el código cuando la fuente es confiable y escribirlo desde cero parece abrumadoramente complicado y propenso a errores,
  • No confío demasiado en bibliotecas como JQuery,
  • Elegí el alcance correcto: dado que el entrevistador quiere verificar mis habilidades de JavaScript, no perderé tiempo escribiendo HTML perfecto y limpio: no pasar tiempo aquí hace posible pasar más tiempo escribiendo pruebas unitarias,
  • Sé cuándo terminar y decir que he terminado, aunque tengo en cuenta que un montón de cosas no son perfectas (como las compute(0)que fallarán, pero no importa para la demostración).

Esto es exactamente lo que un entrevistador debe esperar de usted.

Arseni Mourzenko
fuente