Conheço muito bem o JavaScript, mas bombardeio entrevistas de codificação [fechado]

33

Atualmente, estou em busca de uma nova posição como desenvolvedor front-end. Conheço JavaScript muito bem e posso falar poeticamente sobre fechamentos, currying, herança prototípica, padrões de design, desempenho de aplicativos e arquitetura geral de front-end. Mas ainda assim acabo bombardeando entrevistas de emprego. (FYI, a maioria dos trabalhos que estou entrevistando são para a construção de SPAs com algum tipo de estrutura MVC)

Normalmente, os testes de codificação são pequenos trechos de código de coisas que eu nunca vi profissionalmente. Como escrever uma função para resolver algum tipo de problema de matemática. Além do constrangimento inerente de tentar codificar enquanto segura o telefone em uma mão e fazer com que um estranho veja sua tela e assista a todos os caracteres digitados, eu normalmente não vejo esse tipo de coisa no mundo real.

Esse é um conjunto sério de habilidades que me falta ou os entrevistadores estão me fazendo perguntas irrelevantes. Eu acho que devo trabalhar na minha programação funcional e algoritmos, mas não encontrei muitos bons recursos na web (ou na impressão) alguma sugestão?

Mike Fisher
fonte
4
Experimente o Project Euler para algumas amostras.
Peter K.
11
E conseguiu um kit mãos-livres para o seu telefone?
AakashM
Por que você está fazendo um teste de codificação no seu telefone? Espera-se que você trabalhe dessa maneira quando conseguir o emprego?
Burhan Ali
2
@BurhanAli, o telefone é para conversar, e isso é padrão para a 1ª etapa da entrevista.
greenoldman
3
Sim, acho que hoje em dia alguns dos testes sceen são uma treta completa. Eu desprezo especialmente os testes de "levar para casa", onde eles dizem que algo pode ser feito em uma hora, mas, na realidade, levaria meio dia ou mais para fazer o certo. Eu me recuso a fazer isso imediatamente. Você está realmente no capricho do entrevistador. Alguns deles pensam em bons testes que avaliam as habilidades do mundo real. Outros entrevistadores não sabem o que diabos estão fazendo e têm suas próprias agendas e inseguranças pessoais.
Ringo

Respostas:

52

Escrever código é apenas uma parte do processo de entrevista.

Realmente, resolver o problema lógico é apenas uma parte da tarefa de escrita de código.

Os entrevistadores querem ter certeza de que:

  • Você pode escrever código. Muitos candidatos com dez anos de experiência profissional em um idioma não conseguem escrever nenhum código, e este teste visa rejeitar esses candidatos.

  • Você pensa em um problema antes de escrever o código. Muitos pulavam para os teclados, escreviam dezenas de linhas de código e depois descobriam que não entendiam o problema original, porque não demoraram a pensar nisso.

  • Você é capaz de se adaptar ao escrever código. Digamos que você encontrou uma solução, mas quando você começou a implementá-la, parecia que sua primeira ideia não era a melhor; você pode mudar rapidamente para um melhor, eventualmente refatorando o código que escreveu?

Isso também significa que essas entrevistas devem ser mais interativas . Em vez de digitar com uma mão, compre um kit viva-voz ou ligue pelo Skype e use um fone de ouvido. Digite enquanto digita no trabalho, enquanto comenta e explica o que você faz: de repente se tornará muito menos complicado.

Você já fez a programação em pares? Se sim, a situação da entrevista é muito semelhante, exceto que o entrevistador pode não lhe dar sua opinião e você não pede que ele troque de teclado quando terminar.

Aqui estão alguns exemplos de um problema puramente matemático e como ele mostra habilidades não matemáticas de um desenvolvedor.

Exemplo 1: exercício simples de codificação

Você precisa implementar a calculadora de números de Fibonacci em JavaScript. Você deve poder alterar o índice. A sequência de Fibonacci segue essas regras:

  1. Os dois primeiros números da sequência são 0 e 1,
  2. Cada número subseqüente é a soma dos dois anteriores.

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

Você tem três minutos.

Aqui, o entrevistador deseja que você pense o mais rápido possível, encontre a solução e implemente-a rapidamente. Esse exercício não tem relação com o que os desenvolvedores reais fazem e está muito mais próximo do que você pode encontrar ao fazer um diploma em CS, mas os entrevistadores gostam desse tipo de coisa, então vamos fazê-lo. Além disso, a restrição de tempo impossibilita a realização de testes automatizados; portanto, o entrevistador provavelmente não espera isso de você.

“A descrição do algoritmo me faz pensar em recursão. A segunda regra leva à seguinte função recursiva. ”

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

console.log(fibonacci(10));

"Para encerrar a recursão, adicionaremos os casos especiais, substituindo o corpo da fibonaccifunção."

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

"Feito."

Conclusão

Como eu disse, esse exercício não tem nenhuma relação com o trabalho real de um desenvolvedor. Isso torna sem sentido? Na verdade não, porque pelo menos mostra que a pessoa:

  • É capaz de pensar em um problema. Alguns candidatos ficarão totalmente perdidos e estressados ​​levarão mais do que o tempo alocado apenas para pensar em uma possível maneira de abordar o problema.

  • Conhece a recursão ou é capaz de contornar a recursão através de um loop comum. Posteriormente, o entrevistador pode perguntar se havia maneiras de usar / não usar a recursão e quais são os benefícios / desvantagens da recursão.

  • Conhece o básico da linguagem de programação. Não importa se a pessoa usou switch, uma cláusula de guarda, um condicional ou um dicionário : dependendo do histórico, diferentes candidatos escolherão ferramentas diferentes para realizar a mesma coisa.

  • Mantém o foco no problema, sem trazer coisas como testes de unidade, escalabilidade ou desempenho. O entrevistador pode então perguntar por que, em termos de desempenho, a função acima é terrível, esperando que o candidato explique o que deve ser feito para elevar o desempenho a um nível razoável.

Exemplo 2: perguntas complicadas

Você precisa implementar a calculadora de números de Fibonacci em JavaScript. Deve ser o mais rápido possível. Você deve poder alterar o índice que varia de 0 a 100. A sequência de Fibonacci segue essas regras:

  1. Os dois primeiros números da sequência são 0 e 1,
  2. Cada número subseqüente é a soma dos dois anteriores.

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

Você tem três minutos.

Agora, temos uma restrição interessante que mostra que o entrevistador realmente não se importa com a capacidade do candidato em resolver problemas, mas com a capacidade de adivinhar quais os caminhos mais rápidos que os outros.

Essas perguntas complicadas geralmente convidam respostas complicadas. Aqui, dada a restrição de tempo, não há como fazer várias implementações, compará-las, fazer o perfil da mais rápida e fornecer uma solução ideal.

Em vez disso, o que dizer de:

"Deixe-me pesquisar no Google" Primeiros números de Fibonacci "... Isso parece promissor. Com uma expressão regular simples (isso seria um oxímoro), podemos criar uma lista de valores separados por vírgula. ”

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

"Finalmente, o próprio programa."

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));

Conclusão

Perguntas complicadas convidam respostas complicadas. Não seja heróico e não comece a fazer benchmarking e criação de perfis quando você tiver apenas três minutos. Pense em maneiras inteligentes de resolver o problema enquanto usa sua experiência. Minha experiência me dá uma dica de que usar um mapa pode ser mais rápido do que calcular o número. Pode estar errado, mas essa tentativa deve ser esperada, devido à restrição de tempo.

Conhecer suas ferramentas também ajuda e é uma parte essencial das habilidades do desenvolvedor: sem conhecer expressões regulares, eu gastaria os três minutos pesquisados ​​em busca de uma lista separada por vírgulas ou começaria a escrever um analisador que criará a matriz de que preciso.

Lembre-se de que um bom desenvolvedor não é aquele que começa a codificar imediatamente, mas sabe como evitar a codificação quando uma oportunidade melhor está disponível. Alguns entrevistadores não hesitarão em atribuir tarefas que se parecem com codificações, mas que quase não exigem código.

Exemplo 3: Desenvolvimento Completo de Aplicativos

Você precisa implementar a sequência de Fibonacci no JavaScript. O comprimento da sequência é determinado durante a execução do programa. A sequência segue essas regras:

  1. Os dois primeiros números da sequência são 0 e 1,
  2. Cada número subseqüente é a soma dos dois anteriores.

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

O aplicativo deve ser apresentado como uma página da web, permitindo ao usuário especificar o comprimento da sequência através de um campo de entrada.

Você tem uma hora.

Vamos começar.

“A sequência de exemplo é muito útil, pois permitirá que eu faça vários testes de unidade para garantir que minha implementação não pareça completamente errada. Em geral, eu uso o Mocha para node.js ou QUnit para JavaScript do cliente, mas aqui, por uma questão de simplicidade, jogarei várias funções de teste. ”

“Eu começar por criar index.htme fib.jsarquivos. Então, preencho um index.htmcódigo realmente minimalista e não compatível com o W3C (podemos voltar a isso mais tarde, se você também estiver interessado em minhas habilidades em 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>

"Vamos agora escrever um código que chamará a função de gerador de Fibonacci e mostrará os 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
    };
}());

“É hora de executar o código pela primeira vez e ... não funciona. Nada acontece. Por quê?"

“OK, eu esqueci fibonacci.init();o final. Eu adicionei e, ainda assim, nada acontece, embora deva ao menos exibir a mensagem no console. Espere, certo, não é onclick, mas click; Uso o JQuery com tanta frequência que começo a esquecer os nomes dos eventos em JavaScript simples. ”

"Vamos adicionar alguns testes."

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 matrizes pode ser complicado, então apenas copio e colo o Array.prototype.equalscódigo desta resposta ."

"Agora que executamos o aplicativo, ele exibe:"

O real [1, 2, 3] é diferente do esperado [0].

“O teste falhou, o que era altamente esperado, dada a nossa implementação real ( return [1, 2, 3];) da sequência de Fibonacci. Está na hora de mudar isso.

"A partir da declaração original, a sequência de Fibonacci começa [0, 1]e computepassa a ser:"

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

"Isso possibilita a aprovação no primeiro teste, e agora podemos escrever o nosso segundo."

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

"Como falha, voltamos a computemodificá-lo."

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

"Agora, os dois testes são aprovados e é hora de mudar para casos não-extremos".

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;
};

“Todos os três testes passam agora, exceto que o resultado não parece correto para comprimentos maiores, como 100. Para obter esses resultados corretamente, deveríamos ter usado uma biblioteca de precisão arbitrária . Também há coisas a melhorar. Por exemplo, às vezes as convenções de nomenclatura são muito ruins (o que é fib?). O código JavaScript relacionado ao HTML também deve ir para um objeto diferente, além de testar o código. Além disso, não testei compute(0)e não verifiquei as entradas. ”

Conclusão

Ao seguir o exemplo, você pode ver a interação esperada durante uma entrevista. Nem tudo foi tranquilo (cometi vários erros no início, o que me levou a uma situação embaraçosa em que nada acontece quando executo o aplicativo), e a abordagem original era ruim se precisarmos suportar um grande comprimento de sequência, mas consegui para mostrar que:

  • Eu posso lidar com diferentes problemas,
  • Eu uso o desenvolvimento orientado a testes, a sequência de Fibonacci é uma excelente oportunidade para isso,
  • Copio e colo o código quando a fonte é confiável e escrevê-lo do zero parece extremamente complicado e propenso a erros,
  • Não confio demais em bibliotecas como JQuery,
  • Escolhi o escopo certo: como o entrevistador deseja verificar minhas habilidades em JavaScript, não perderei tempo escrevendo HTML perfeito e limpo: não gastar tempo aqui torna possível gastar mais tempo escrevendo testes de unidade,
  • Eu sei quando terminar e digo que terminei, tendo em mente que muitas coisas não são perfeitas (como as compute(0)que falharão, mas isso não importa para a demonstração).

É exatamente isso que um entrevistador deve esperar de você.

Arseni Mourzenko
fonte