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?
fonte
Respostas:
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
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. ”
"Para encerrar a recursão, adicionaremos os casos especiais, substituindo o corpo da
fibonacci
função.""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
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. ”"Finalmente, o próprio programa."
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
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.htm
efib.js
arquivos. Então, preencho umindex.htm
có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). ”"Vamos agora escrever um código que chamará a função de gerador de Fibonacci e mostrará os resultados."
“É 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
, masclick
; Uso o JQuery com tanta frequência que começo a esquecer os nomes dos eventos em JavaScript simples. ”"Vamos adicionar alguns testes."
"Comparar matrizes pode ser complicado, então apenas copio e colo o
Array.prototype.equals
código desta resposta .""Agora que executamos o aplicativo, ele exibe:"
“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]
ecompute
passa a ser:""Isso possibilita a aprovação no primeiro teste, e agora podemos escrever o nosso segundo."
"Como falha, voltamos a
compute
modificá-lo.""Agora, os dois testes são aprovados e é hora de mudar para casos não-extremos".
“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 testeicompute(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:
compute(0)
que falharão, mas isso não importa para a demonstração).É exatamente isso que um entrevistador deve esperar de você.
fonte