Devo dar a resposta a um exercício de codificação de entrevista com falha? [fechadas]

14

Tivemos um candidato a uma entrevista de nível sênior com falha na nuance da pergunta do FizzBuzz 1 2

Quero dizer, realmente, totalmente, completamente, falhei a pergunta - nem sequer perto. Eu mesmo o treinei para pensar sobre usando um loop e que 3 e 5 foram realmente que vale a pena considerar como casos especiais.

Ele estragou tudo.

Apenas para fins de QA, dei a mesma pergunta para três colegas de equipe; deu-lhes 5 minutos; e depois voltou para coletar seu pseudo-código. Todos eles acertaram e não viram a pergunta antes. Dois perguntaram qual era o truque ...

Em um exercício lógico diferente, o candidato mostrou alguma compreensão de alguns dos recursos disponíveis na linguagem que ele escolheu usar (C #). Então não é como se ele tivesse nunca escrito uma linha de código. Mas a sua lógica ainda fede.

Minha pergunta é se devo ou não ter dado a ele a resposta para as questões lógicas.

Ele sabia que ele os surpreendeu e reconheceu isso mais tarde na entrevista.
Por outro lado, ele nunca pediu a resposta ou o que eu esperava ver.

Eu sei que exercícios de codificação podem ser usados para definir candidatos para falhas (novamente, veja o segundo link acima). E eu realmente tentei ajudá-lo em casa para responder ao cerne da questão. Mas este foi um candidato de nível sênior e Fizz-Buzz é, francamente, ridiculamente fácil, mesmo após a contabilização de nervosismo entrevista.

Eu senti que deveria ter mostrado a ele uma maneira de resolver o problema para que ele pudesse pelo menos aprender com a experiência. Mas novamente, ele não perguntou.

Qual é o caminho certo para lidar com essa situação?

1 Ok, esse não é o link para a pergunta FizzBuzz, mas é uma boa discussão sobre o FSEBuzz e links para os vários aspectos dele.

2 Para ajudar a esclarecer, esta é a nuance do Fizz-Buzz que pedi e é de Primeiro problema do Projeto Euler . Impressão substituta Fizz | Buzz para somar os números e você tem a mesma questão fundamental.
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Write a function that finds the sum of all the multiples of 3 or 5 below 1000.

3 Esta questão atraiu mais atenção do que eu esperava, e agradeço todas as respostas. Algumas das respostas posteriores realmente chegaram ao cerne da minha pergunta, então eu permitirei que a comunidade revise e vote antes de atribuir a "resposta".

4 Eu selecionei a resposta com base nos votos da comunidade naquele momento. E acho que a resposta de Yannis é apropriada para entrevistas com novos desenvolvedores. Eu acho que a resposta coletiva focando na falta de pedir a resposta também está correta.

    
por GlenH7 14.11.2012 / 05:35
fonte

9 respostas

15

A maioria das minhas entrevistas foi com estudantes procurando por um cargo de estágio, e na maioria das vezes eles erraram com exercícios simples (?). Eu queria uma maneira fácil e amigável de comunicar seus erros, e o que eu criei foi bastante simples: eu mesmo resolvi os exercícios e mostrei a eles minhas soluções depois que eles terminaram com os deles.

Eu tive algumas discussões extremamente interessantes e reveladoras com candidatos que começaram comparando nossas diferentes abordagens para resolver o mesmo problema. Depois de um tempo, eu até mesmo antecipei alguns dos erros, apenas verificando em qual escola o candidato estava participando (alguns "professores" são ... idiotas). E, bem, nos poucos casos em que um candidato não conseguiu encontrar nenhuma solução, eu já tinha dado a eles um para a próxima vez.

    
por 14.11.2012 / 06:04
fonte
15

Dando a resposta

Eu ia dizer que se o candidato não estivesse interessado o suficiente para perguntar, eu não perderia o fôlego, mas A resposta do @Yannis_Rizos é muito melhor.

As entrevistas são bem rápidas. Eu sei que muitas vezes procuro as coisas por dias depois de uma entrevista.

Pessoas que não conseguem codificar o FizzBuzz Classic

Eu imagino que um grande ponto de discórdia é estar ciente do operador%. Você esperaria que alguém pudesse pensar em comparar (myInt / 3) == (myDouble / 3.0) , mas talvez com o estresse de uma entrevista ... Ainda assim, o FizzBuzz Classic força uma abordagem de força bruta, colocando-a na categoria dos problemas de algoritmo mais fáceis de resolver. Como uma dica, você já tentou pedir às pessoas que codifiquem "Fizz" apenas por meio crédito e talvez adicionem "Buzz" mais tarde como um aprimoramento?

Acho que a resposta final para sua pergunta é que é muito difícil encontrar bons candidatos.

Perguntas da entrevista em geral

Eu sempre achei mais fácil e produtivo pedir aos candidatos que descrevessem o último projeto de programação que eles estavam entusiasmados. Eu tive 100% de sucesso com essa questão, o que significa que as pessoas que falaram animadamente sobre um projeto de programação e puderam responder perguntas técnicas sobre isso foram ótimos contratados e aqueles que não puderam, não foram. Isso tem os bons efeitos colaterais de colocar o candidato à vontade e incentivar discussões abertas. Com esta pergunta, o candidato irá, na verdade, dizer-lhe para que é mais adequado.

Talvez em um think tank as perguntas sobre algoritmos também sejam necessárias, mas eu as abandonei em favor da questão do "projeto favorito".

Soma (filho) do FizzBuzz

A sua pergunta de entrevista não é equivalente ao FizzBuzz:

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Write a function that finds the sum of all the multiples of 3 or 5 below 1000.

Onde o FizzBuzz Classic força você a passar por iterações n (para imprimir cada número ou Fizz / Buzz), seu problema pode ser feito em n / 5 + < em> n / 3 + n / 15 iterações, ou até mesmo nenhuma iteração - um cálculo direto de ponto fixo é possível. O programa a seguir compara esses três métodos:

public static void main(String[] args) {
  long n = Long.valueOf(args[0]).longValue();
  long sum = 0;
  long ms = System.currentTimeMillis();
  // Brute force method  Performance: cn
  for (long i = 1; i <= n; i++) {
    if ((i % 3) == 0) { sum += i;
    } else if ((i % 5) == 0) { sum += i; }
  }
  System.out.print("Brute force sum:    " + sum);
  System.out.println(" time: " + (System.currentTimeMillis() - ms));
  ms = System.currentTimeMillis();

  // Second solution: iterate through only numbers we are
  // interested in.  Performance: c * (n/3 + n/5 + n/15)
  // We counted multiples of 15 twice, so subtract one of them
  sum = countSum(n, 3) + countSum(n, 5) - countSum(n, 15);
  System.out.print("Only multiples sum: " + sum);
  System.out.println(" time: " + (System.currentTimeMillis() - ms));
  ms = System.currentTimeMillis();

  // Third solution: Use high school algebra.  Performance: c
  sum = sumSeries(n, 3) + sumSeries(n, 5) - sumSeries(n, 15);
  System.out.print("Sum of series:      " + sum);
  System.out.println(" time: " + (System.currentTimeMillis() - ms));
}

// Iteravely sum all multiples of skip
private static long countSum(long n, long skip) {
  long skipTotal = skip;
  long grandTotal = 0;
  while (skipTotal <= n) {
    grandTotal += skipTotal; skipTotal += skip;
  }
  return grandTotal;
}

// Thanks to @Caleb for pointing this out!  High school algebra
// tells us that the sum of a series is: (n * (a1 + an)) / 2
// where a1 is the first term and an is the nth term.  E.g. The
// sum of a series of 3 is: (n/3 * (3 + n - (n % 3))) / 2
// Since we are thinking about performance here, we'll shift
// right one instead of dividing by 2 for style points.  ;-D
private static long sumSeries(long n, long skip) {
  return (n/skip * (skip + n - (n % skip))) >> 1;
}

Saída (soma de FizzBuzz < 1000):

$JDK_HOME/bin/java FizzBuzzNot 999
Brute force sum:    233168 time: 0
Only multiples sum: 233168 time: 0
Sum of series:      233168 time: 0

Com um n maior para comparação de desempenho:

$JDK_HOME/bin/java FizzBuzzNot 1000000000
Brute force sum:    233333334166666668 time: 4744
Only multiples sum: 233333334166666668 time: 818
Sum of series:      233333334166666668 time: 0

Nota para aqueles que menosprezaram isso como fora do tópico

O ponto de apresentar uma solução para essa questão é mostrar que, enquanto a solução de força bruta para Sum of FizzBuzz é semelhante ao FizzBuzz Classic, soluções melhores para o problema Sum estão disponíveis, tornando-se um problema fundamentalmente diferente. A soma do FizzBuzz é extremamente complicada se você não se lembra da fórmula adequada para a soma de uma série, ou não percebe que isso se aplica ao passar por 3 ou 5.

Se você re-derivar a fórmula para a soma de uma série dividindo a série ao meio, invertendo uma metade e juntando-as, você obtém (n + 1) (n / 2) o que pode levar você caminho realmente confuso no que diz respeito à divisão de números inteiros e aos remanescentes truncados. A (n (a1 + an)) / 2 versão desta fórmula é absolutamente crítica para uma resposta simples para todos os valores de n.

    
por 12.04.2017 / 09:31
fonte
8

I felt like I should have shown him a way of solving the problem so that he could at least learn from the experience. But again, he didn't ask. What's the right way to handle that situation?

Eu não me importo para que nível a entrevista é, nem mesmo se é uma questão de nível "FizzBuzz" ou uma pergunta avançada. Se você perguntar a um candidato para resolver uma questão, e eles não podem, mas nem se incomodam em pedir a resposta certa , então eles não valem o seu tempo. Como no mundo você poderia ser tão intelectualmente preguiçoso?

E mesmo que você fede totalmente como programador e esteja apenas tentando se tornar um trabalho, por que você não seria, pelo menos, tão pragmático a ponto de obter a resposta certa agora, para que você saiba disso pela próxima vez? entrevista?

Portanto, não, você não deve "dar" a resposta, mas você deve esperar que o candidato insista em ouvir a resposta certa depois que ela falhar. Se não o fizerem, é uma enorme bandeira vermelha no meu livro.

Se alguém explodisse o FizzBuzz em uma entrevista de Dev em nível júnior porque eles não conseguiam se lembrar do operador de módulo e simplesmente não conseguiam seguir em frente sem ele, mas eles se apaixonaram por refazer o mesmo uma vez que você explicou resposta certa, ou pelo menos falando o código certo com você, então é quase tão bom quanto responder corretamente.

    
por 14.11.2012 / 14:50
fonte
4

Eu digitei fizzbuzz enquanto estava no telefone com o entrevistador durante uma pré-tela. Isso é algo que, mesmo que ninguém tenha ouvido falar, você deve ser capaz de se remendar após um semestre de trabalho, mas definitivamente depois de adquirir o status de "senior".

Não há realmente nenhuma recuperação por não conseguir fazer isso. É um desses incômodos necessários que você precisa para sair do caminho apenas no caso.

Eu diria que faz sentido apresentar como uma pré-tela para que você não perca tempo de todos ao trazê-los para uma entrevista no site.

    
por 14.11.2012 / 06:05
fonte
4

I even coached him through to thinking about using a loop and that 3 and 5 were really worth considering as special cases.

Seria interessante saber o que você acha que é a resposta "correta" para sua pergunta FizzBuzz-ish. De onde eu sento, um bom (em C) escrito à letra da sua pergunta é:

int f(void) {
    // sum the multiples of 3 and of 5 and subtract multiples of 15 so we don't count them twice
    return ((1000/3)/2)*(999+3) + ((1000/5)/2)*(995+5) - ((1000/15)/2)*(990+15);
}

Um melhor pode ser:

Por que diabos você escreveria um programa para fazer isso quando você pode calcular diretamente?

O ponto é que há mais de uma maneira de eliminar um gato, e o fato de que o candidato em questão não começou imediatamente a escrever for loops e mod operadores não significa que ele seja estúpido. Se você quer saber o que o candidato sabe, discuta o problema - descubra o que ele está pensando. Se ele estiver preso ou confuso, descubra onde e por quê. Ele pode te levar a uma abordagem que você nunca considerou.

My question is whether or not I should have given him the answer to the logic questions.

Como entrevistador, não é o seu lugar ensinar uma lição ao candidato . Se eles realmente não sabem escrever código, não há absolutamente nenhuma necessidade de constrangê-los, insistindo em quanto eles não sabem. Se eles estiverem interessados o suficiente para perguntar, então, por todos os meios, sinta-se à vontade para compartilhar. Caso contrário, termine a entrevista, agradeça pelo tempo e passe para o próximo candidato.

    
por 15.11.2012 / 00:49
fonte
2

Seu "problema" é que você é um ser humano empático, por isso é difícil ver alguém lutando com um problema para o qual você sabe a resposta (isso também é um problema se você executar estudos de usabilidade). Do ponto de vista de deveres como entrevistador, você não é obrigado a ensinar ao entrevistado como programar ou resolver problemas, ou a solução para um problema que você pergunta.

Quando você treina um entrevistado, não é para que ele possa obter a resposta certa. É para que você possa ver se eles realmente não podem resolver o problema ou se eles ficaram presos a um ou dois erros ou mal-entendidos.

Então, se você quiser dar ao entrevistado a solução após o fato, você está fazendo isso apenas por si mesmo. Em geral, prefiro usar esse tempo para permitir que o entrevistado tente outro problema. Mas um programador "sênior" que não pode responder ao FizzBuzz provavelmente está fora da lista. Se você decidir dar soluções, certifique-se de não se enganar pensando que a entrevista foi melhor do que aconteceu (se você se acha pensando, "ele não conseguiu resolver o problema, mas quando eu expliquei, ele entendeu bem", então você está em um caminho perigoso).

E sim, eu tenho sido um entrevistado que estava em sua cabeça e não conseguia nem mesmo fazer a primeira tentativa de resolver um problema de entrevista. Isso simplesmente significava que eu precisava aprender muito mais para buscar um emprego nesse campo.

    
por 14.11.2012 / 22:27
fonte
2

Obter a resposta certa não é a parte importante deste teste. O que você está medindo é a abordagem de alguém para a solução de problemas, como eles se envolvem com a pergunta, qualquer coisa criativa ou interessante que surja ao longo do caminho; esse tipo de coisa. Mesmo que recebam a resposta errada, ainda podem ser viáveis por esses critérios.

OK, não saber o operador mod é indesculpável, e pelas métricas que eu dei este candidato parece ainda ser um write-off, mas eu não acredito que apenas dando a resposta certa para este candidato vai seja de qualquer benefício.

Isso se resume à sua opinião pessoal daqui. Você quer dar feedback a uma entrevista para ajudar o candidato a fazer melhor em futuras entrevistas (e para que futuros entrevistadores não tenham que sofrer com o que você acabou de passar)? Se assim for, coloque seu feedback nos termos que acabei de descrever: diga-lhes que não é apenas a resposta certa, mas como eles trabalham para chegar à resposta é um fator crítico.

    
por 15.11.2012 / 03:23
fonte
2

I felt like I should have shown him a way of solving the problem so that he could at least learn from the experience. But again, he didn't ask. What's the right way to handle that situation?

Do jeito que eu vejo, não há situação para lidar. Supondo que você tenha rejeitado sua inscrição, a falta de interesse aparente do candidato não é algo que você precise se preocupar.

De fato, mesmo que ele tenha perguntado, você não deve uma explicação. E se você conversar com o pessoal de RH sobre isso, eles poderão informá-lo que discussões adicionais com o candidato não são aconselháveis por motivos legais.

Também é importante notar que o problema do FizzBuzz tem diferentes "melhores" respostas dependendo de como você o pergunta. Se você pedir a solução "mais simples" e a solução "mais eficiente", as melhores respostas serão radicalmente diferentes. E isso pode colorir o seu julgamento injustamente ... se você não tiver certeza da maneira que você fez a pergunta. (Por outro lado, um candidato bom / experiente teria a previsão de esclarecer isso antes de começar a codificar ...)

    
por 15.11.2012 / 07:23
fonte
2

Para responder à sua pergunta, não, eu não daria a resposta. Se a pessoa quiser ser um engenheiro de software melhor, ela encontrará a resposta. Se você lhes der uma resposta, estará roubando essa oportunidade.

A questão mais relevante é quando você pode se considerar um desenvolvedor sênior? Isso varia entre organizações e países. Por exemplo, uma empresa com quem trabalhei era Engenheiros de Software com 5 anos de experiência como seniors. Não houve ênfase na qualidade da experiência, apenas o comprimento.

Até chegarmos a um padrão que categorize todos os engenheiros de software, independentemente do idioma deles, ficamos com o indivíduo decidindo o nível de suas habilidades. E continuaremos a ouvir falar de "engenheiros seniores" que não passaram no teste de habilidades mais rudimentar.

Algumas semanas atrás, a pergunta foi feita "Quando deveria você se considera um desenvolvedor sênior ". Também escrevi uma postagem no blog sobre o tópico.

    
por 14.11.2012 / 17:31
fonte

Tags