Em uma entrevista, é melhor codificar uma solução de força bruta para uma pergunta difícil ou passar a entrevista examinando a pergunta com cuidado? [fechadas]


14

Às vezes, as perguntas da entrevista são difíceis, se o entrevistador pretende que elas sejam ou não. Pode-se optar por usar o tempo limitado da entrevista para codificar uma solução feia, ineficiente e de força bruta ou gastar o tempo compreendendo todos os aspectos do problema com o entrevistador.

Por exemplo, o Problema 91 no Projeto Euler pode ser resolvido por uma solução de força bruta não tão difícil de calcular todos os triângulos possíveis, escrever um teste isRightTriangle () e exibir todos os triângulos que passam no teste em um conjunto. Mas os dois pares de coordenadas X / Y fazem dessa uma solução O (x ^ 4) com um alto valor constante. Um amigo e eu acabamos de encontrar uma solução muito mais elegante e eficiente, mas nós dois passamos três horas nela e desenhamos dezenas de diagramas, testamos várias fórmulas, examinamos várias abordagens etc.

Nem toda pergunta da entrevista é justa. Além disso, o que é fácil para uma pessoa pode ser difícil para outra. Se alguém luta com uma pergunta, você ficaria mais impressionado com uma solução feia de força bruta que funciona? Ou excelente compreensão de problemas e caminho para uma solução elegante, mas nenhuma solução codificada? Existe uma regra como depois de 20 minutos, você deve começar a codificar, não importa o quê?


10
Pergunte se eles querem uma solução de força bruta ou uma solução diferenciada.
Robert Harvey

Se eles quisessem uma solução de força não bruta, teriam feito uma pergunta que não pode ser resolvida pela força bruta em primeiro lugar.
minusSeven

Respostas:


9

Antes de tudo, uma pergunta que leva dois desenvolvedores experientes três horas para otimizar elegantemente é uma má escolha para uma pergunta de entrevista. Se você perguntar, não deve esperar respostas perfeitas.

Por outro lado, às vezes você aprende mais sobre alguém ao fazê-lo atingir seus limites. É por isso que muitos cursos universitários aumentam a dificuldade e depois avaliam na curva. Se todos obtiverem 100% de pontuação em cada exame, você estará deixando muito aprendizado em potencial.

Meu candidato ideal provavelmente faria primeiro o cálculo da complexidade, diria "Oh, são apenas 6 milhões de iterações, o que não vai demorar muito tempo" e depois escreveria rapidamente a solução de força bruta. Em seguida, discutiam abordagens que poderiam adotar para otimizá-lo, sem necessariamente implementá-las, a menos que o entrevistador pedisse.

Em parte, isso ocorre porque muitos dos problemas do tipo euler do projeto que surgem no mundo real são problemas únicos que você precisa resolver uma vez e depois esquece. Quero saber que alguém contratado poderá reconhecer um algoritmo de força bruta que leva 2 minutos para escrever e 10 minutos para executar é mais eficiente do que um algoritmo que leva 3 horas para escrever e 10 segundos para executar, se você precisar apenas para executá-lo uma vez.


Ótima resposta. Caleb trouxe o conceito de força bruta, primeiro e depois otimizar, mas a sua é a única resposta que sugere fornecer o motivo pelo qual uma solução de força bruta é aceitável nesse caso: "São apenas 6 milhões de iterações, o que não será necessário. muito longo." Isso é apenas ouro. Muito obrigado!
GlenPeterson

14

Como gerente de contratação, se estou lhe pedindo para resolver um problema com o código bem na minha frente, não estou fazendo tanto para ver o código em si (embora seja importante), mas para saber como e por que você fez o que fez. Uma dessas coisas que você pode fazer não é codificar e, em vez disso, me interrogar sobre os aspectos do próprio problema, para resolvê-lo melhor. Isso é significativo para mim e, geralmente, mais significativo do que a solução apresentada no código. No entanto, não é assim que todo mundo faz, nem é o que todo mundo quer ver (e, de fato, raramente peço às pessoas que codifiquem em um ambiente de entrevista, mas coloco problemas na mesa e conversamos através deles e, às vezes, o pseudocódigo surge , o que é tão bom para mim ).

Você está certo que nem todas as perguntas da entrevista são justas, e o que é fácil para alguém é difícil para outra, naquele ambiente e com essas restrições, e é por isso que as entrevistas que entendem que normalmente não estão procurando a solução de código (embora , novamente, isso desempenha um papel importante), mas sim o processo de solução .

"Existe uma regra que, após 20 minutos, você deve começar a codificar, não importa o quê?" Eu responderia isso dizendo que, dentro de um período muito curto de reflexão sobre o problema, você deveria pelo menos estar fazendo algo - fazendo mais perguntas, esboçando uma estrutura para uma solução ou dizendo que simplesmente não pode fazê-lo / não sei por onde começar.

Se eu colocasse um problema difícil na sua frente e a solução que você forneceu - dadas as restrições de tempo e o que você tem - fosse bruta e feia, eu faria uma série de perguntas sobre por que esse era o caso, e o que mudaria para algo mais elegante: mais informações? mais tempo? um ambiente diferente? Ser autoconsciente e estar em contato com o porquê do que você fez e o que não fez e ser capaz de explicá-lo racionalmente é uma grande estrela de ouro no meu livro, mas esses são os tipos de desenvolvedores que eu olhe para. Portanto, "excelente compreensão de problemas e caminhos para uma solução elegante" também funcionariam para mim, mas não para todos.


6
Mais um milhão por "Ter consciência de si e estar em contato com o porquê do que você fez e o que não fez e ser capaz de explicá-lo racionalmente é uma grande estrela de ouro em meu livro" . A quantidade de pessoas que, quando perguntadas "Por quê?", Apenas fundam e não podem responder é inacreditável. Ao contratar, eu quase sempre prefiro ensinar alguém a codificar quem pode pensar por si mesmo do que contratar alguém que pode codificar, mas não consegue pensar.
21713 Ben

Obrigado. Isso é perspicaz. Minha tendência no trabalho é analisar antes de tocar no teclado. Mas, sob a pressão de uma entrevista, quero desesperadamente mostrar uma solução programmers.stackexchange.com/questions/178075/… Sua resposta fornece um bom exemplo para lembrar.
GlenPeterson

4

Eu gostaria dos dois, mas eles podem exibir um "código que simplesmente funciona" em uma solução e, em seguida, possivelmente discutir possíveis soluções para aprimoramento em um ou outro problema.

Se você pedir a alguém para escrever um código e ele só quiser falar sobre possíveis soluções com código zero, isso seria uma preocupação.

Como você disse, alguém pode ter problemas com o problema específico por qualquer motivo, mas você precisa aprender como eles resolvem o problema. Eles podem ter sorte e já ouviram falar de uma solução para um problema semelhante. Acontece.

Observe alguém escrever código suficiente e discuti-lo, e você pode descobrir se eles são adequados para o trabalho.


1
Acho que também gostaria de saber por que a solução de força bruta pode ser um problema, como na pergunta acima.
Christopher Creutzig 16/03/2013

@ChristopherCreutzig - Presumi que seria difícil oferecer melhorias sem pelo menos sugerir os problemas com a solução atual.
JeffO 17/03

Verdade. Acho que vou arranhar isso.
Christopher Creutzig

3

Existe uma regra como depois de 20 minutos, você deve começar a codificar, não importa o quê?

Não, mas se você passar 20 minutos analisando o problema antes de começar a trabalhar, provavelmente já está com problemas. Um empregador que faz uma pergunta como a que você citou está mais interessado em como você aborda um problema, mas, se for perguntado como um problema de codificação, também vai querer ver algum código. Converse com eles através do seu processo de pensamento ...

Bem, a abordagem óbvia aqui é a força bruta. Se eu tivesse uma maneira de reconhecer um triângulo retângulo, dados os três vértices, poderia percorrer todas as combinações de dois pontos e a origem procurando triângulos retângulos. Isso não deve ser difícil - eu posso escrever uma função que use o Teorema de Pitágoras para identificar triângulos retângulos. Para facilitar, também escreverei uma função que determina a distância entre dois pontos usando a fórmula da distância ...

A escrita dessas funções deve levar cerca de três minutos. Agora, apenas alguns minutos para a pergunta, você já demonstrou que se lembra da geometria básica e que realmente sabe escrever código. Também oferece a você algo para falar:

Portanto, obviamente, poderíamos colocar a isRightTriangle(p1, p2, p3)função no meio de quatro forloops e iterar sobre todas as opções possíveis para cada um dos dois pontos variáveis. Vamos ver ... o problema pede o número de triângulos retos, incluindo a origem em uma grade de 50x50, portanto, usar o método da força bruta nos faz verificar 50 possibilidades para cada coordenada de cada ponto. São 50 ^ 4 verificações ... Tenho certeza de que podemos fazer melhor, mas o código é óbvio, então deixe-me escrever isso ...

Então agora você escreve uma função que usa forloops aninhados e a isRightTriangle()função que você acabou de escrever. Você resolveu o problema, mas também deixou o entrevistador ver para onde está indo. Se o objetivo deles era apenas ver que você pode escrever código, eles podem pedir para você parar. Provavelmente, eles ficam felizes em conversar com alguém que sabe o que estão fazendo e querem ver até onde você leva isso. Então você continua ...

Enquanto eu escrevia, ocorreu-me que podemos tirar proveito da simetria. Podemos refletir qualquer triângulo retângulo em torno da linha de 45 °; portanto, se optarmos por marcar um dos pontos apenas em um lado dessa linha, podemos apenas contar os triângulos retângulos que encontrarmos duas vezes ... uma vez para o triângulo e outra vez por sua reflexão. Isso reduz pela metade o número de cheques. Além disso, olhando agora, estamos pegando uma raiz quadrada para encontrar a distância entre dois pontos, mas depois a quadramos novamente em isRightTriangle()...

E assim por diante. Novamente, eles geralmente não querem ver uma solução perfeita, querem ver como você chega a uma solução. Seu processo de pensamento não precisa ser parecido com o descrito acima - apenas ter a confiança necessária para pensar em voz alta contará muito. Não se preocupe, se você cometer um erro - diga "hmmm, acho que saí dos trilhos aqui - deixe-me voltar um passo ..."


1
Resposta muito boa. Eu particularmente gosto de: "Tenho certeza de que podemos fazer melhor, mas o código é óbvio, então deixe-me escrever isso ..."
GlenPeterson

3

Como gerente, se eu pedir para você codificar como teste, estou mais interessado em:

  • Se você pode escrever código
  • Seu estilo de codificação
  • O algoritmo que você selecionou
  • A tentativa indica que você entendeu o problema
  • Se eu realmente gosto de uma tecnologia específica, você demonstrou que mais ou menos a conhece.

O primeiro item pode parecer louco, mas você ficaria surpreso ...

Estilo de codificação - com isso, não quero dizer apenas onde você coloca o aparelho, mas coisas como:

  • Você escolheu composição ou herança para resolver esse problema? Por quê?
  • Para esse valor, por que você optou por usar uma enumeração vs. uma sequência vs. uma int (ou qualquer permutação que se aplique)
  • Você usou propriedades, campos ou métodos get / set para esse valor? Por quê?
  • Como você lidou com o estado em suas aulas?
  • Você entende como herança, interfaces e lambdas funcionam?
  • Você entende as convenções de parâmetros do idioma (o que é por ref vs por valor?)
  • Você sabe escrever testes de unidade?

Aqui está o que eu realmente não me importo:

  • Que ele compila (assumindo que eu lhe dei o bloco de notas e nenhum compilador)
  • Que você sabia pela memória a ordem desses 2 parâmetros nessa única função
  • Que você pode recitar uma string de conexão do SQL Server ou Oracle de cor
  • Que você possa codificar perfeitamente enquanto estou de pé por cima do seu ombro, observando todos os erros.

Com toda a honestidade, nunca fui muito fã de testes de codificação - exceto como uma ferramenta para analisar o estilo.


1
Também não sou muito fã de testes de codificação. Os problemas do Project Euler são quebra-cabeças interessantes e uma ótima maneira de desenvolver habilidades de resolução de problemas. Mas se você está escrevendo aplicativos CRUD, é melhor saber se um candidato sabe escrever boas consultas de banco de dados ou, se você está no mundo .NET como eu, como usar corretamente coisas como MVC, WCF, WPF e LINQ.
jfrankcarr

1
Eu acrescentaria a esse comentário que nem a semântica importa, em vez de entender que tipo de problemas essas coisas resolvem e quando e onde elas importam e quaisquer desvantagens que carregam.
Rig

@jfrankcarr - como você determina se alguém pode escrever sql sem um teste de algum tipo?
21413 JeffO

1
@ JeffO - eu geralmente gosto de fazer isso conversando sobre isso com base em seu currículo ou em cenários comuns. Por exemplo, "Você usou variáveis ​​de tabela ou tabelas temporárias em suas consultas?" ou "Como você integrou consultas de dados herdados ao design do seu novo aplicativo?" Posso recorrer a testes se estiver contratando um programador júnior recém-saído da escola, mas prefiro a abordagem de conversação aberta.
jfrankcarr

1

Nesse caso, o caminho para uma solução elegante é melhor do que uma solução pior, mas completa. Ambos os casos são bons. É absolutamente bom ter escrito um código de pus demonstrando que você entende o problema e como pretende resolvê-lo, mesmo que não tenha tempo para codificar o programa.


1

Acho que você está fazendo uma pergunta para a qual não há realmente resposta, muito menos uma resposta "certa". A razão pela qual digo isso é que depende inteiramente do que a pessoa que faz a pergunta valoriza.

É possível que o entrevistador seja um pragmático incondicional que esteja realmente procurando ver que você conseguirá algo funcionando rapidamente e, em seguida, otimizará como uma atividade de menor prioridade se tiver tempo restante. É igualmente possível que o entrevistador esteja fazendo sua melhor impressão sobre as práticas de contratação do Google e não esteja interessado em nada, exceto no algoritmo mais sexy e elegante, e tome isso como um sinal de fraqueza de que você já colocou as palavras "bruto" e " force "dentro de 5 palavras uma da outra. Também é possível que o entrevistador tenha pesquisado no Google "perguntas da entrevista" e encontrado esse problema na internet 5 minutos antes de você entrar e não tenha idéia do que ele quer.

Em todos os casos, sua melhor aposta é provavelmente pedir esclarecimentos, se você não puder inferir, com base em informações de contexto, o que o entrevistador deseja. Você está certo de que nem todas as perguntas da entrevista são justas e, de fato, nem todas são boas ou mesmo perguntas que fazem sentido. Uma entrevista é uma atividade inerentemente reducionista, muito parecida com "namoro rápido", onde você passa uma hora ou duas com alguém e os dois estão tentando adivinhar, com base nessa hora, se trabalharão bem juntos pela próxima vez. 5 anos ou não. Examinado dessa perspectiva, espero que fique mais claro por que digo que realmente não há resposta para sua pergunta sobre uma 'regra'.

Alguém está fazendo uma pergunta que eles acham que lhe dará uma visão da sua competência e se encaixará na equipe deles. Você deve examinar a equipe deles, o que sabe sobre eles, a personalidade do entrevistador e dezenas de outros fatores, e adivinhar quais respostas, abordagem e processo eles provavelmente valorizariam. Pessoalmente, eu diria que você deve abordá-lo da maneira que achar melhor. Se eles não concordarem com você, pode não ter sido bom de qualquer maneira - é mais fácil descobrir isso mais cedo ou mais tarde.


0

Os entrevistadores solicitarão que você melhore sua solução de qualquer maneira.

E a abordagem "solução de força bruta primeiro" tem uma vantagem indiscutível: se você não conseguir encontrar uma solução ideal, ainda terá algo concluído para mostrá-las.


1
"Os entrevistadores solicitarão que você melhore sua solução de qualquer maneira." Parece uma aposta para mim.
Craige 16/03/2013

1
@ Craig: Na verdade não. Mas se eles não trazem isso à tona. Digamos que esta seja uma solução de força bruta e que com a análise possa ser melhorada.
Martin York
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.