A pergunta de quebra-cabeça mais difícil de todos os tempos

O(a) senhor(a) já foi a uma entrevista para um trabalho de programação em que lhe fizeram uma daquelas perguntas de quebra-cabeça de entrevista? Eu fiz. A que recebi foi:

Quanto da sua marca favorita de refrigerante é consumida neste estado?

E não, a resposta correta não é quem se importa, a menos que o que não lhe interesse seja conseguir o emprego para o qual o senhor está sendo entrevistado. Na época, eu não sabia, mas essa é uma pergunta de Fermi. (Para evitar spoilers, a resposta pode ser encontrada em uma postagem anterior no blog.)

As perguntas do tipo quebra-cabeça estavam na moda nas entrevistas de programação nos anos 90 e no início dos anos 2000. Isso está documentado no livro Como o senhor moveria o Monte Fuji? com ênfase específica nas práticas de contratação da Microsoft.

Como o senhor moveria o Monte Fuji? Microsoft's Cult of the Puzzle - Como a empresa mais inteligente do mundo seleciona os pensadores mais criativos.

É prudente estudar perguntas comuns de quebra-cabeças de entrevistas se o senhor sabe que fará uma entrevista em uma empresa que faz esse tipo de pergunta. E se o senhor acha que é um craque em programar perguntas de quebra-cabeça, eu o desafio a apontar seu enorme cérebro para isso, a pergunta de quebra-cabeça de entrevista mais difícil de todos os tempos:

Cem prisioneiros estão trancados em uma sala com três piratas, um dos quais será condenado pela manhã. Cada prisioneiro tem 10 garrafas de vinho, uma das quais foi envenenada; e cada pirata tem 12 moedas, uma das quais é falsa e pesa mais ou menos que uma moeda verdadeira. Na sala, há um único interruptor, que o prisioneiro pode deixar como está ou acionar. Antes de serem conduzidos às salas, todos os prisioneiros são obrigados a usar um chapéu vermelho ou azul; eles podem ver os chapéus dos outros prisioneiros, mas não os seus próprios. Enquanto isso, um número primo de seis dígitos de macacos se multiplica até que seus dígitos se invertam e, em seguida, todos precisam atravessar um rio usando uma canoa que comporta no máximo dois macacos por vez. Mas metade dos macacos sempre mente e a outra metade sempre diz a verdade. Dado que o N-ésimo prisioneiro sabe que um dos macacos não sabe que um pirata não sabe o produto de dois números entre 1 e 100, sem saber se o N+1-ésimo prisioneiro acionou ou não o interruptor em seu quarto depois de determinar qual garrafa de vinho foi envenenada e qual é a cor de seu chapéu, qual é a solução para esse quebra-cabeça?

Em outras palavras, Odeio perguntas de quebra-cabeça.*

Também não sou um grande fã daquelas perguntas abstratas impossíveis, por exemplo, “quantos optometristas existem em Seattle?”, mas suponho que isso seja uma questão de gosto. Se for absolutamente necessário, pelo menos faça uma pergunta impossível que tenha alguma relevância para um problema que seus clientes reais possam encontrar. Simplesmente não consigo reunir nenhum entusiasmo para quebra-cabeças arbitrários completamente aleatórios diante de tantos problemas reais do mundo real.

E sim, fui totalmente reprovado nessa entrevista. O que foi decepcionante, porque era um trabalho legal.

Não é isso minha proposta para entrevistar programadores foi mais popular, embora eu ache que ela é muito melhor.

Tenho minha própria teoria sobre a maneira ideal de entrevistar desenvolvedores: pedir ao candidato que faça uma apresentação de 10 minutos para sua equipe sobre algo em que ele tenha trabalhado. Acho que esse é um indicador de sucesso muito melhor do que uma entrevista tradicional. O senhor saberá rapidamente:

  • Essa pessoa é apaixonada pelo que está fazendo?
  • Ela consegue se comunicar com eficiência com um grupo pequeno?
  • Eles têm um bom controle sobre sua área de especialização?
  • Sua equipe gostaria de trabalhar com essa pessoa?

O senhor certamente gostaria de complementar esse tipo de entrevista com alguma prática real de programação, para ter certeza de que o candidato não está falando besteira, embora eu tenha certeza de que não é possível fazer uma apresentação técnica para um punhado de colegas se o senhor realmente não tiver ideia do que está falando. (E se o senhor consegue, já deveria ser CEO de uma startup).

O que estou otimizando aqui é a capacidade de comunicar. A maioria dos programadores, uma vez que passa o nível de competência do FizzBuzzsão suficientemente decentes. Mas as habilidades de codificação não são suficientes. Para passar de bom a ótimo, o senhor deve ser capaz de se comunicar de forma eficaz: com seus colegas de equipe, seu gerente, os usuários e, por fim, com o mundo.

Minha esposa e eu acabamos de passar cinco dias no hospital por causa do o nascimento de nosso primeiro filho. Durante nossa estada, fomos atendidos por uma série de enfermeiras diferentes, pelo menos duas enfermeiras diferentes todos os dias, às vezes mais, à medida que avançávamos para diferentes áreas do hospital e durante as trocas de turno diárias. A qualidade do atendimento nesse hospital em particular é geralmente bastante alta, mas ficamos perplexos com a disparidade de atendimento entre os pior enfermeiras e o melhor enfermeiras. Depois de alguns dias, finalmente descobri a característica comum. as piores enfermeiras eram invariavelmente as piores comunicadoras! O fato de essas enfermeiras não conseguirem se comunicar de forma eficaz se comunicar conosco:

  • por que eles precisavam fazer algo
  • quais eram as opções
  • oferecer orientação
  • solucionar nossos problemas

Isso significava que eles acabavam se sentindo como processualistas rígidos e inflexíveis que não se importavam ou tinham que apelar constantemente para a autoridade. É claro que isso não era verdade. Tenho certeza de que elas eram enfermeiras registradas perfeitamente competentes. Mas, na ausência de uma comunicação razoável, com certeza parecia dessa forma. Para ser justo, essas enfermeiras eram frequentemente (mas nem sempre!) falantes não nativos de inglês.

A contratação é difícil nas melhores condições. Mas um processo de entrevista que se baseia muito em perguntas de quebra-cabeça é arriscado. É claro que o senhor pode acabar com programadores capazes de resolver (ou memorizar, eu acho) as perguntas de quebra-cabeça mais complicadas que lhe forem feitas. Mas será que o senhor não está comunicar efetivamente essas soluções para o restante da equipe? também é importante? Para muitos programadores, isso é a parte mais difícil do quebra-cabeça.

* embora eu espere que os aficionados por esse estilo consigam identificar todas as perguntas clássicas de quebra-cabeça de entrevista representadas aqui.