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:
- Os dois primeiros números da sequência são 0 e 1,
- 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 fibonacci
funçã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:
- Os dois primeiros números da sequência são 0 e 1,
- 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:
- Os dois primeiros números da sequência são 0 e 1,
- 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.htm
e fib.js
arquivos. Então, preencho um index.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). ”
<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.equals
có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 compute
passa 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 compute
modificá-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ê.