Eficácia do FizzBuzz e além [fechado]

38

Como parte do processo de entrevista, solicitamos inicialmente aos candidatos que façam 'FizzBuzz' hoje em dia a porcentagem de candidatos que podem responder corretamente ao FizzBuzz aumentou dramaticamente - isso pode ser devido à sua popularidade na web.

Cerca de um ano atrás, como segunda pergunta, começamos a fazer uma pergunta muito semelhante ao FizzBuzz original. A pergunta foi projetada para ser tão simples quanto o FizzBuzz original e também para avaliar uma capacidade específica do candidato, especificamente a capacidade de ordenar e priorizar de maneira significativa e lógica um conjunto de "regras de negócios" fornecidas em alguns ordem arbitrária. O texto da pergunta inicialmente parece um pouco ambíguo, o que pode dificultar para os falantes de inglês não nativos, mas se o pensamento puder ser resolvido corretamente - também oferece ao candidato a oportunidade de fazer perguntas para esclarecimento, o que é sempre bom. .

Consideramos isso uma habilidade muito importante para ter como desenvolvedor, pois o desenvolvimento de software geralmente é baseado em requisitos funcionais derivados de nenhuma ordem específica ao longo do tempo, que podem colocar restrições e condições em outras áreas do software sem indicar explicitamente e é o trabalho do desenvolvedor astuto de, no mínimo, investigar possíveis problemas e conflitos com relação à implementação.

O que descobrimos foi que pouco mais de 65% dos candidatos (tamanho da amostra de 38) que passaram no FizzBuzz falharam completamente no FizzBuzz v2.0 Normalmente, esses candidatos seriam detectados mais tarde no processo, mas parece ser uma boa maneira de detectar eles desde o início.

Minha pergunta não é se o FizzBuzz está desatualizado ou não, mas quais fatores podem estar contribuindo para que um número tão alto de candidatos falhe na pergunta do FizzBuzz v2.

  • A pergunta é ambígua demais?
  • O estresse de um ambiente de entrevista diminui a capacidade de pensar criticamente a ponto de não ser capaz de concluir uma tarefa tão trivial?

Questão:

Escreva uma rotina em sua linguagem de programação favorita que terá uma lista de seqüências de caracteres como entrada e, para cada sequência da lista, siga um destes procedimentos:

  1. Imprimir apenas Fizz se a sequência contiver a letra A
  2. Imprimir apenas o Google Buzz se a sequência contiver a letra B
  3. Imprimir apenas o BuzzBuzz se a sequência contiver A e B
  4. Imprima apenas o FizzFizz se a sequência não contiver A e B
  5. Imprima apenas o FizzBuzz se a sequência contiver apenas um A e apenas um B

Algumas perguntas típicas feitas pelos candidatos são:

  • Deve ser sensível a maiúsculas?
  • "Contém A e B" significa que A deve vir antes de B
  • O que deve ser impresso se nenhum dos pontos for atendido?
  • O que deve acontecer se mais de uma condição puder ser atendida?

Descobrimos que a esmagadora maioria dos candidatos que concluíram a pergunta com sucesso, não fez absolutamente nada, apenas fez como fez no FizzBuzz.

Gradeinar Pfeffernüsse
fonte
26
Deixe a pergunta um pouco ambígua. Dessa forma, você pode ver quais clientes em potencial têm bom senso para solicitar esclarecimentos (o que por si só é essencial para o desenvolvimento).
Thomas Eding 11/01
17
A resposta correta é que o desenvolvedor em potencial diga ao BA para "corrigir esses terríveis requisitos".
precisa saber é o seguinte
7
Personalizar o FizzBuzz é uma boa ideia para filtrar os candidatos que pesquisaram a solução no Google. Nem é necessário torná-lo mais difícil. Na verdade, duvido que o FizzBuzz original fosse usado literalmente por todas as empresas do planeta. É apenas preguiça por parte de uma empresa não personalizá-la. Eles já estão cientes do problema (candidatos à programação com zero habilidades de programação) e ainda assim não conseguem implementar um teste que tal candidato - com boas habilidades no Google - não poderia passar? WTF?
Viliam Búr
13
@ GradeinarPfeffernüsse Como os candidatos que não fizeram perguntas fizeram o teste com sucesso? É impossível porque os requisitos são contraditórios; sem esclarecimentos, este exercício simplesmente não pode ser feito!
Andres F.
6
@MSalters Você não pode assumir que lex specialis é o que o autor do requisito queria, porque não é uma suposição razoável no mundo real. Portanto, este exercício não pode ser concluído sem fazer perguntas sobre as aparentes contradições. Alguém que completou o teste sem fazer perguntas simplesmente entendeu errado.
Andres F.

Respostas:

31

Ele tem o potencial de ser um teste muito melhor que o FIZZBUZZ, mas se você tem algum conceito de resposta correta, é o pior teste do mundo. Esses testes têm muito pouco valor em entrevistas para começar.

Se um candidato responder "Corretamente" sem fazer uma pergunta, então você tem um problema de que a seleção de candidatos selecionará o tipo errado de programador - ele não consegue identificar requisitos ambíguos ou é incapaz de compreender que a maioria das pessoas não pode escrever requisitos inequívocos . Não importa se o programa é tecnicamente perfeito em todos os aspectos, é provável que ele seja o tipo de cara que fornecerá software com um "Eu não me importo, não é o que você queria, foi o que você pediu".

A parte do teste aqui é a ordem de prioridade das regras. Você não o especifica. A entrada "ABC" pode imprimir o Fizz, Buzz, BuzzBuzz ou FizzBuzz - qualquer um deles está correto

O candidato que eu pegaria é aquele que acertou (na maioria das vezes), mas fez muitas perguntas e, idealmente, fez muita "brincadeira" no quadro branco.

Por exemplo, eu exploraria minha compreensão desses requisitos, fornecendo uma série de exemplos de textos e perguntando o que você esperava que fosse impresso e por quê. - A discussão no meu exemplo de exemplo "ABC" deve levar a alguns elementos úteis para você.

Assim como o FIZZBUZZ, o resultado desse teste é tão bom quanto as suas observações sobre como o resultado foi obtido - o resultado é irrelevante.

Eu o ajustaria um pouco - apenas para torná-lo mais interessante - retire o 'único'. Está coberto na linha acima ("imprima um dos seguintes") e veja quantas pessoas perguntam sobre isso. Se o candidato perder o "único" e você tiver tempo, aponte-o e veja o que acontece. Se ele lida com o "único", remova-o do requisito e faça com que eles alterem o código.

mattnz
fonte
16
Parece-me que o OP está tentando fazer muito com este teste. O FizzBuzz é um teste rápido para mostrar que o candidato pode escrever pelo menos algo no código. Isso parece estar tentando fazer isso e também tentando ver como os candidatos projetam processos com requisitos ambíguos.
jk.
6
+1 em "Esses testes têm muito pouco valor em entrevistas para começar". E se eu pudesse marcar com +1 novamente para "Não importa se o programa é tecnicamente perfeito em todos os aspectos, é provável que ele seja o tipo de cara que fornecerá software com um" Eu não me importo, não é o que você desejado, foi o que você pediu "."
Shivan Dragon
7
Todos vocês que consideram esses testes inúteis estão tentando fazer muito com eles ... O FizzBuzz e seus colegas existem apenas para um propósito: eliminar os 90% dos candidatos que não sabem programar .
Robert Harvey
@RobertHarvey: Exceto pelo fato de haver pessoas que podem programar, mas a certa altura teriam dificuldades com o FizzBuzz por vários motivos. (eu sendo um deles).
James P. Wright
3
@ JamesP.Wright negativos negativos são um problema para o entrevistado e não para o entrevistador. Desde que o número de falsos positivos seja baixo o suficiente, um teste como o FizzBuzz pode ser útil para os entrevistadores.
jk.
27

A palavra "apenas" nos seus requisitos cria uma contradição em todas as perguntas.

Assim, sua pergunta testa a coleta de requisitos sob pressão, tem certeza de que deseja testar essa combinação de habilidades?

Se você quiser testar a coleta de requisitos, sugiro que faça UMA das perguntas ambíguas. Se você deseja substituir o FizzBuzz, remova a ambiguidade.

A priorização de regras de negócios só pode ser feita com conhecimento específico do domínio - a menos que você inclua algum contexto simples para o que está fazendo (talvez sejam cupons a serem resgatados por vários valores), não há base para o desenvolvedor tomar sua própria decisão.

Mas exigir que alguém peça esclarecimentos onde isso tem um risco significativo de resultados indesejáveis, talvez não seja a melhor maneira de avaliar suas habilidades em reconhecer os limites de seus conhecimentos. Eles podem achar que é mais seguro adivinhar e errar, do que salientar que você é incompetente em escrever requisitos ou se nenhum dos entrevistadores é desenvolvedor, sendo rotulado como tendo uma atitude ruim.

jmoreno
fonte
6
Deseja realmente contratar alguém que não esclareça requisitos pouco claros porque tem medo de incomodar alguém fazendo perguntas?
Hans-Peter Störr 15/01
2
@hstoerr, talvez não, mas uma entrevista é uma situação razoavelmente pressionada.
A. Gilfrin
3
@hstoerr: o problema é que não há resposta certa, mas há definitivamente uma resposta errada - seja lá o que o entrevistador não gostar. Você deseja que o entrevistado faça perguntas, outro pode querer que ele exerça julgamento, e outro pode não ver nenhuma ambiguidade e considerar a pergunta como incapaz de entender instruções simples. Considere pelo ponto de vista de alguém que foi informado que a resposta é a dada pela "grande maioria" que não faz perguntas e responde da mesma maneira. Você então tem pessoas que entendem, pessoas que entendem com ajuda e pessoas que não entendem.
jmoreno
16

Descobrimos que a esmagadora maioria dos candidatos que concluíram a pergunta com sucesso, não fez absolutamente nada, apenas fez como fez no FizzBuzz.

Com a ambiguidade dos requisitos, não é possível concluir a versão 2.0 corretamente sem fazer perguntas.

Pieter B
fonte
2
+1… como está, os requisitos são mutuamente contraditórios; portanto, pelo menos algum tipo de tie-break deve ser especificado.
Konrad Rudolph
4
Curiosamente, as regras deram um senso de ordem (de casos genéricos a casos especiais) e eu quase instintivamente decidi fazê-lo na ordem inversa. Se eu estiver nesse teste, não sentiria a ambiguidade, mas seguiria meu instinto.
Codism
4
Infelizmente, o seu instinto como programador pode ser exatamente o oposto do que o usuário queria.
21413 Stefan
@ Stefan: para uma extensão, não há fim no esclarecimento. Todo mundo para de raciocinar em algum momento com base em um conjunto de fatores como experiência, bom senso e etc. Mesmo que você possa esclarecer o requisito por enquanto, como garantir que eles não mudem amanhã? Então, para mim, sobre o requisito original, sim, é sensato o suficiente e vou implementá-lo em cinco minutos.
Codism
1
@KonradRudolph: a menos que você escolha interpretar o bit sobre "um dos seguintes" para significar que não importa qual. Ao pensar nisso, eu posso realmente ver isso como uma resposta aceitável. Você nem precisa codificar os outros, é apenas um teste para ver se você pode executar algum deles. Afinal, não há realmente um caso de negócios a ser feito para uma solução em detrimento de outra, é uma pergunta de entrevista que, em última análise, é menos útil do que o padrão reverter uma pergunta de sequência.
jmoreno
4

Se você deseja remover qualquer ambiguidade, pode alterar os requisitos para:

Escreva uma rotina em sua linguagem de programação favorita que terá uma lista de seqüências de caracteres como entrada e, para cada sequência da lista, faça o seguinte:

  1. Imprima "Fizz" se a string contiver o caractere '$' e não contiver '?'.
  2. Imprima "Buzz" se a sequência contiver o caractere '?' e não contém '$'.
  3. Imprima "FizzBuzz" se a string contiver exatamente um '$' e exatamente um '?'.
  4. Imprima "BuzzBuzz" se a string contiver exatamente um '$' e mais de um '?'.
  5. Imprima "BuzzBuzz" se a string contiver exatamente um '?' e mais de um '$'.
  6. Imprima "FizzFizz" se a string não contiver '$' e não contiver '?'.
Thomas Eding
fonte
3

A pergunta é ambígua demais?

Sim, a pergunta é ambígua demais para ser respondida sem esclarecimentos. No entanto, uma regra adicional informando que, nos casos em que várias regras se aplicam, seu programa deve escolher a coisa mais específica e remover a ambiguidade.

O estresse de um ambiente de entrevista diminui a capacidade de pensar criticamente a ponto de não ser capaz de concluir uma tarefa tão trivial?

É mais provável uma indicação do candidato "amontoando" o FizzBuzz: estressado ou não, o programa é muito simples.

Eu acho que o FizzBuzz modificado não é comparável ao original, porque sua solução ideal é diferente: embora uma cadeia if-then-elsepermaneça aceitável, acho que uma solução baseada em tabela é mais apropriada para este problema:

static string[,] FB = new string[3,3] {
    {"FizzFizz", "Buzz", "Buzz"}
,   {"Fizz", "FizzBuzz", "BuzzBuzz"}
,   {"Fizz", "BuzzBuzz", "BuzzBuzz"}
};
static string FizzBuzz(string str) {
    return FB[
        Math.Min(str.Count(c => c == 'a'), 2)
    ,   Math.Min(str.Count(c => c == 'b'), 2)
    ];
}

O tamanho do espaço problemático 3x3não é 2x2, portanto, ele é mapeado para uma tabela muito mais facilmente do que o FizzBuzz original. Na verdade, acho mais difícil entender uma solução baseada em tabela para o problema original do FizzBuzz .

private static string[] FB = new[] {"{0}", "Fizz", "Buzz", "BizzBuzz"};
public static void Main() {
    for (var i = 1 ; i <= 100 ; i++) {
        Console.WriteLine(FB[(i%5==0?2:0)+(i%3==0?1:0)], i);
    }
}
dasblinkenlight
fonte
2

Duas coisas aqui:

  1. sim, acho que a maioria das pessoas apenas pesquisou no Google e depois tropeçou quando tentou expandi-lo
  2. Confira: http://dave.fayr.am/posts/2012-10-4-finding-fizzbuzz.html Explica bem como você pode resolver o efervescente buzz usando abstrações apropriadas.
AndreasScheinert
fonte
Só que ele nunca chega ao nível certo de abstração. Ele chega mais perto das mônadas, mas acho que é um pouco complicado demais. Uma lista simples de chave / valor, com uma condicional direta no final, é fácil de fazer em praticamente qualquer idioma mais complexo que o BrainFuck.
jmoreno
2

Descobrimos que a esmagadora maioria dos candidatos que concluíram a pergunta com sucesso, não fez absolutamente nada, apenas fez como fez no FizzBuzz.

Eu já vi processos de entrevistas que incentivam os programadores a pensar em voz alta e fazer perguntas para ver seu processo de pensamento. Eu gosto mais desse processo.

Eu li este fizzbuzz v2.0 e perguntei sobre os requisitos # 3 e # 5 lá. Não conheço outras pessoas, mas acho que, na engenharia, não quero ambiguidade, por isso faço perguntas. Porque mais tarde (codificado e tudo), não quero descobrir que tive que fazer uma suposição e estava errado.

mythicalprogrammer
fonte
É claro que a técnica "pensar em voz alta" só é útil se você estiver procurando por programadores que preferem "pensar em voz alta". Isso elimina a esmagadora maioria dos programadores e, sem dúvida, apenas deixa principalmente os programadores que são mais adequados como gerentes do que os programadores. Afinal, pensar em velocidades "elétricas" no cérebro é muito mais rápido do que pensar na velocidade "mecânica" de falar.
Dunk
2

Talvez a maneira mais fácil de evitar a ambiguidade seja mostrar alguns exemplos:

"A" retorna "Fizz" "aAbA" retorna "Fizz" "B" retorna "Buzz" "aBbB" retorna "Buzz" "AB" retorna "FizzBuzz" "ABaabb" retorna "BuzzBuzz" "" retorna "FizzFizz" "ab "retorna" FizzFizz "

SnoopDougieDoug
fonte
1
Um bom candidato começaria com algumas sequências de teste e resultados esperados e depois falaria sobre testes de unidade ou apenas reescreveria os requisitos de maneira mais formal e menos ambígua. Eles então conversavam sobre a importância de requisitos claros e como os erros de requisitos podem ter ordens de magnitude mais caras para corrigir do que erros de implementação.
John Lyon
2

Em vez de dar a um candidato requisitos contraditórios / pouco claros, basta perguntar como ele lida com essas situações. Caso contrário, você estará parecendo incompetente ou, pior, colocando pessoas competentes na traição traiçoeira de "como obtenho as respostas de que preciso sem implicar que essa pergunta da entrevista ou a pessoa que a pergunta seja estúpida?"

De qualquer maneira, é irritante como todos. As entrevistas são um processo de correspondência e, com isso, quero dizer uma via de mão dupla. Perguntas diretas e clareza de intenção são muito mais importantes do que colocar o candidato em uma panela de pressão, a IMO. O FizzBuzz é um bom exemplo de pergunta de codificação, porque é curta e agradável. Não o reutilize diretamente. Escreva perguntas simples como essa que seguem esse modelo.

Mas, para o FFS, não fique esperto e esconda o teste real atrás de outro teste. Basta perguntar às pessoas como elas lidam com o maldito problema. Um desenvolvedor experiente terá lidado com requisitos ambíguos repetidamente e ficará encantado em contar suas estratégias. Você pode até aprender alguma coisa.

E não suponha que todo mundo queira usar um quadro branco ou tenha um período de caligrafia confortável. Alguns de nós estão digitando desde os 12 anos (muito obrigado à Space Quest). Não consigo nem pensar direito com uma caneta ou marcador na mão. São 20 e 13, o que há com os quadros brancos? Quando as pessoas me entregam caneta e papel e me pedem para fazer um teste de código, é difícil reprimir uma risada.

Erik Reppen
fonte
1

Eu acho que é uma boa pergunta para entrevista. Os requisitos não são claros, exatamente como na realidade são. Você verifica se o candidato é inteligente o suficiente para perceber isso (mesmo sob estresse), que ele / ela não tem medo de fazer as perguntas que julga necessárias e é capaz de colocar os requisitos em uma estrutura sensata. E conta um pouco sobre suas habilidades de programação, embora você também deva apresentar alguns problemas mais complicados, contendo recursão e ponteiros, pois esse problema é muito fácil.

No entanto, eu me preocupo um pouco com os candidatos "bem-sucedidos" que não fazem perguntas. Eu tentaria descobrir se eles perceberam que você pode aplicar até 4 das regras em alguns casos e se não há nada na pergunta que resolva essa ambiguidade, e peça que eles expliquem como eles lidaram com isso. Talvez sua pergunta não seja ambígua o suficiente para forçá-los a perguntar, ou talvez você deva pedir que eles pensem em voz alta.

BTW: Acho estranho que você esteja falando de uma "solução correta". Se você formular a pergunta dessa maneira, é legítimo imprimir "Fizz", "Buzz", "BuzzBuzz" ou "FizzBuzz" se você receber "AB". Portanto, IMHO qualquer solução sem perguntas é claramente errada.

Hans-Peter Störr
fonte