É prática de entrevista ruim ter candidatos escrevendo uma implementação de lista vinculada? [fechadas]

43

Lendo este site e, por isso, vi muitas histórias de perguntas e respostas de entrevistas dizendo que um candidato precisava implementar uma lista vinculada do zero. Normalmente, este é um exercício de "gimme" para programar candidatos como escrever o FizzBuzz. A ideia é que, se o candidato não puder fazer isso, ele não poderá programar e deverá ser rejeitado quase que imediatamente.

No entanto, não posso deixar de pensar que esta poderia ser uma prática ruim pelas seguintes razões:

  • Linguagens modernas de nível superior, como C # e Python, usam listas extensivamente; escrever seu próprio objeto de lista vinculada só seria necessário em circunstâncias incomuns e, mesmo assim, provavelmente mal aconselhado.
  • Idiomas de nível inferior, como o C ++, possuem bibliotecas padrão com iteradores / contêineres e objetos de lista.
  • À luz dos dois primeiros pontos, os codificadores podem passar anos sem sequer pensar em implementar uma lista (vinculada, duplamente vinculada, etc). Alguns podem nem mesmo ver essas coisas desde os tempos da faculdade.
  • O poder computacional também não é o fator que foi há anos, então a eficiência através de ponteiros não é a questão que costumava ser (em geral).
  • Uma simples pesquisa na Web de algo como "exemplo de lista vinculada" traria muitos exemplos de código que poderiam ser simplesmente memorizados e cuspidos de volta, não indicando realmente a verdadeira competência do candidato.

Devo dizer que usar uma lista vinculada para levar a perguntas / discussões abertas sobre as habilidades de resolução de problemas / raciocínio dos candidatos provavelmente é uma boa prática de entrevista. De qualquer forma, um entrevistador pode realmente ver como é um candidato e como ele acha que é extremamente benéfico.

Acho que essa abordagem binária de "nenhum código de lista vinculada, nenhum trabalho" para programadores trabalhando em um aplicativo da Web ou de desktop está um pouco desatualizada. Também poderia ser bastante prejudicial; um candidato que não consegue lembrar como trabalhar adequadamente com o chefe de uma lista pode ser um excelente codificador e colega de trabalho e se perder na mistura. Pensamentos?

EDIT : Existem muitos (bons) comentários sugerindo que se esta é uma pergunta boa ou ruim a ser feita depende do contexto do trabalho. Eu concordo strongmente, então deixe-me reformular essa pergunta: Implementar uma lista vinculada é uma questão comum de entrevista para uma ampla gama de trabalhos de codificação, semelhante a perguntas como FizzBuzz ou escrever uma função recursiva para calcular fatoriais. Esta pergunta tem utilidade suficiente para ser usada comumente para avaliar candidatos de programação? Ou deveria ser considerada uma pergunta ruim, exceto para as posições de "Desenvolvedor Sênior, Equipe de Listas Vinculadas Incorporadas"?

    
por joshin4colours 11.01.2012 / 18:29
fonte

13 respostas

52

Se responder a pergunta lhe disser o que você quer saber sobre um candidato, então é uma boa pergunta para a entrevista. Se não te disser isso, é uma má pergunta.

Perguntas fáceis como o FizzBuzz servem a um propósito específico. Se um candidato não puder codificar o FizzBuzz, ele simplesmente não poderá codificar e você poderá encerrar a entrevista com antecedência. Eu classificaria a implementação de uma lista vinculada apenas um pouco mais difícil, mas ela pode iniciar uma conversa sobre estruturas de dados em geral que revelará muito.

Lembre-se de que nenhuma pergunta sobre entrevista lhe dirá tudo o que você quer saber. Você realmente precisa ter um grupo de perguntas prontas. Você deve fazer perguntas em uma sequência, do mais fácil ao mais difícil, para encontrar o limite do que o candidato sabe. Se você faz uma pergunta e eles pregam, você ainda não sabe o que mais eles sabem ou não sabem.

Em relação à sua edição:

Does this question have enough utility to be used commonly for evaluating programming candidates across the board? Or should considered a bad question to ask except for "Senior Developer, Embedded Linked Lists Team" positions?

Eu acho que é uma boa pergunta de propósito geral que poderia ser usada para avaliar praticamente qualquer candidato à programação. Só precisa fazer parte de um grupo maior de perguntas. Seria um bom quebra-gelo para muitos tipos de posição (mesmo que o candidato não pudesse implementar uma lista encadeada do zero, talvez eles pudessem explicar como eles usaram um antes e quais são as principais funções), ou o início de uma longa sequência de perguntas mais avançadas para a posição "Desenvolvedor Sênior, Equipe de Listas Vinculadas Incorporadas".

    
por 11.01.2012 / 19:27
fonte
34

Eu perdi meus trabalhos simplesmente porque minha mente estava vazia em quebra-cabeças simples como esse. Eu também fiz brilhantemente em tais enigmas em outras entrevistas - eu sei como implementar uma lista ligada em um ambiente sem pressão. Eu nunca tive uma reclamação sobre minhas habilidades de alguém com quem trabalhei, então talvez eu não deva pensar que eu perdi meus empregos, eu acho que eles perderam meus cargos.

Então, sim, acho que é uma prática questionável na melhor das hipóteses, mas eu entendo isso. Eu também considerei a possibilidade de que não é culpa da questão, mas do questionador, por fazer disso uma situação de alta pressão.

Pessoalmente, prefiro fazer perguntas abertas sobre um problema que o candidato já resolveu - recentemente, se possível, e cobrindo problemas de codificação e de processo. Se eles podem trazer amostras de código, fantástico.

    
por 11.01.2012 / 18:39
fonte
25

É preciso definir o tipo de trabalho de programação. Se você está no ramo de desenvolver compiladores e algoritmos, perguntas sobre essas coisas devem ser esperadas. Se você está em aplicações de tipo de linha de negócios e espera que o candidato faça aplicações CRUD, então, pode ser que o conhecimento do conceito (sem escrever um programa) seja suficiente. Hoje, o conhecimento das diferentes tecnologias necessárias para executar o trabalho especialmente no tipo de aplicativos LOB substitui a necessidade de algoritmos puros.

    
por 11.01.2012 / 18:46
fonte
9

Minha resposta é "Depende". Eu perguntaria se um candidato listou C ou C ++ em seu currículo. Pedir para implementar uma lista encadeada é um bom teste para o entendimento de ponteiros, o que é absolutamente essencial para um programador C ou C ++.

Por outro lado, se um candidato não pretender conhecer C ou C ++, eu não pedirei a ele para implementar uma lista vinculada, mas eu consideraria fazer perguntas sobre isso. Explique em alto nível como uma lista vinculada funciona. Qual é a complexidade de adicionar um elemento ao cabeçalho da lista? O rabo da lista? Inserindo um elemento no meio da lista? Quando você usaria uma lista em vez de uma matriz? Estes são conceitos fundamentais da estrutura de dados que, IMHO, todo programador deve saber.

    
por 11.01.2012 / 20:19
fonte
7

Eu não consideraria uma pergunta ruim para a entrevista. Um monte de compreensão e programação da estrutura de dados começa com uma compreensão muito boa das Listas Vinculadas. Dito isto, existem algumas ressalvas:

1) É uma pergunta do tipo fizz-buzz. Você está apenas validando algo muito básico: a pessoa entende uma lista vinculada. Pergunte e siga em frente.

2) Existe o desafio com listas vinculadas de que os idiomas que são altamente adequados para mostrar sua compreensão de conceitos de lista vinculada (por exemplo, C) podem não ser o mesmo que o idioma com o qual eles trabalharão no trabalho. Você pode demonstrar compreensão básica em qualquer idioma com estruturas, é claro, mas pedir a um candidato para reimplementar uma lista vinculada em Erlang sem usar [] não é o mesmo desafio e não lhe dirá a mesma coisa sobre o entendimento de um candidato como pedir-lhes para fazê-lo em C. Pedindo-lhes para fazê-lo em C, se o trabalho é em torno de Java também está faltando um pouco o ponto.

3) Com isso em mente e os desafios gerais da "programação de quadro branco", ao fazer esse tipo de pergunta, eu aceitaria pseudocódigo ou diagramas, desde que demonstrassem compreensão dos princípios centrais. Não peço às pessoas que escrevam código em um quadro branco sintático e logicamente perfeito, especialmente se puderem se virar e identificar problemas lógicos quando forem solicitados a consultá-lo novamente. YMMV.

    
por 11.01.2012 / 19:06
fonte
6

Quando eu estava dando entrevistas, muitas vezes me pediam implementações de listas vinculadas e alguns algoritmos centralizados em listas vinculadas. Eu resolvi a maioria deles, e alguns deles exigiram que eu exercitasse um pouco meus neurônios.

Se eu fosse entrevistar algum dia, eu iria para algum tipo de implementação de lista vinculada, não para testar o quão bom uma pessoa é na codificação, mas para verificar quanta atenção uma pessoa presta aos detalhes. Qualquer um pode escrever uma lista encadeada, mas são os casos de fronteira em que até mesmo alguns bons programadores falham. Não pergunte a ele: Write a code for linked list in C/C++ . Peça a ele para escrever uma lista vinculada genérica em C (não em C ++), etc.

Torça o problema e coloque algumas outras condições na lista vinculada, e você terá uma boa pergunta a fazer. Algumas pessoas são obrigadas a cometer erros então.

    
por 11.01.2012 / 18:45
fonte
5

Nos meus cerca de 10 anos até agora programados profissionalmente (e cerca de outros dez anos como hobby), eu não acho que precisei implementar uma lista vinculada. Se alguém me pedir para fazer isso durante uma entrevista, eu posso responder perguntando se isso é algo que eu farei regularmente no trabalho.

Certamente, há quase certamente trabalhos por aí onde você precisará precisar escrever implementações de algoritmos mais conhecidos - como implementar uma lista vinculada do zero. Mas para a maioria dos trabalhos de programação, que valor específico tem para a empresa que um candidato pode fazer durante uma entrevista? É realmente tão importante em tal configuração que o candidato forneça uma implementação perfeita que lide com casos de borda corretamente, relate falhas de acordo com a prática comum na linguagem ou estrutura, e assim por diante? Ou você pode ignorar isso e, em vez disso, focar em como eles realmente abordam um problema que talvez não tenham enfrentado em 10-20 anos?

Quando eu entrevistei para o meu trabalho atual, eu tinha muito pouca experiência com a pilha de tecnologia em uso na empresa. Agora, alguns anos depois, eu regularmente colegas vêm até mim e fazem perguntas não apenas sobre os produtos, a implementação deles, e os padrões implementados por eles, mas também sobre problemas de programação muito mais gerais (ontem mesmo me perguntaram o que as implicações eram de uma dependência circular em uma restrição padrão no SQL Server no contexto de uma tabela específica e seu uso em nosso caso - raciocinando por meio dela, descobriu-se que não havia implicações nesse caso particular). Também não precisei de uma nova implementação de lista vinculada para isso.

Faça perguntas que sejam relevantes para o trabalho para o qual o candidato provavelmente será designado e tente ter uma ideia de como se sente sobre a aquisição de novos conhecimentos. Como eles iriam descobrir o significado de alguma sintaxe obscura que eles nunca viram? (Se você é uma loja C, por exemplo, você pode tentar uma pergunta envolvendo trigramas.) Para uma posição de programação, eles regularmente leem ou contribuem para fóruns como o Stack Overflow? Se eles foram solicitados a realizar alguma tarefa em uma linguagem de programação ou framework, eles têm pouca ou nenhuma experiência com (digamos, se você é basicamente uma loja Java, e Clojure ou .NET?), Como eles abordariam o problema? Talvez pegue um bug real do seu rastreador de bugs (pode até ser um bug há muito tempo resolvido) e pergunte como eles, em termos gerais, abordariam a solução, e esteja pronto para explicar as partes relevantes do produto em questão.

Se o candidato puder lidar com tipos de problemas relevantes para casos de negócios e tiver uma boa atitude em relação a aprender coisas novas, provavelmente será um indicador muito melhor de ajuste para essa posição específica do que ser capaz de fornecer respostas enlatadas a perguntas bem conhecidas, sejam essas perguntas sobre o FizzBuzz, listas vinculadas ou qualquer outra coisa. Jogue o quão bem o candidato se encaixa com a equipe e eu acho que você está em terreno bastante seguro.

    
por 12.01.2012 / 10:20
fonte
4

É claro que a maioria das pessoas nunca precisaria implementar uma lista vinculada, mas, para implementá-las do zero, provavelmente será necessário manipular os ponteiros corretamente. A idéia é que ter formado um modelo mental consistente para os ponteiros se correlaciona com a proficiência linguística, entendendo o que acontece em algum nível de máquina (abstrato) e a capacidade de abstrair em geral.

Eu não estou dizendo que isso seria necessariamente a melhor medida, mas apenas que há alguma correlação.

    
por 11.01.2012 / 18:44
fonte
4

Você começa dizendo que eles são 'me dê' perguntas, mas então você aponta que as pessoas, compreensivelmente, não serão capazes de fazê-las. Estou confuso.

Veja como penso:

  • Raramente há a necessidade de escrever uma, como você diz, para que as pessoas se esqueçam facilmente.
  • Eles não são incrivelmente difíceis de escrever.
  • Os conceitos usados para escrevê-los podem ser considerados fundamentais.
  • Eles são usados com muita frequência (mesmo que você não saiba).

Acho que isso faz com que boas perguntas sejam feitas. Se você está preocupado com o pré-estudo para a entrevista, inclua uma lista. Peça-lhes que escrevam circular e perguntem qual é o tempo de execução assintótico de sua implementação. Ou peça-lhes que escrevam outra estrutura de dados comum e / ou rápida ... Uma árvore de busca binária? Uma fila (FIFO)? Uma pilha (FILO)? Uma fila de prioridade ingênua ( O(n) )? Muitas pessoas que eu conheço pensam que um BST é O(log n) só porque é uma árvore .

Se você está procurando alguém que trabalhe no metal e precise de uma base sólida em estruturas de dados, elas podem ser até mesmo distantes. trivial para os candidatos que você está procurando contratar.

Isso pressupõe, é claro, que você deseje que um desenvolvedor que tenha o básico / fundamentos de estruturas de dados e sua posição se beneficie desses fundamentos. Se você quiser alguém que possa juntar uma página asp em segundos, faça uma entrevista para isso. O ponto não é escolher uma pergunta da entrevista, porque todo mundo faz, mas escolher uma que mede as habilidades que você está procurando. Pessoalmente, acho que as questões de estruturas de dados são boas, lista vinculada ou não.

    
por 11.01.2012 / 19:54
fonte
3

Does this question have enough utility to be used commonly for evaluating programming candidates across the board?

Não, absolutamente não. Dependendo de como é formulado, o que ele dirá variará de "este candidato sabe como criar uma lista vinculada" a "este candidato pode programar uma lista vinculada na linguagem X". Se você pedir por um pseudocódigo, tenderá mais para o primeiro. Se você solicitar uma implementação em um idioma específico, você entenderá melhor o idioma (especialmente com C e C ++, onde poderá lidar com ponteiros, referências e estruturas).

Eu até chego a dizer que não é possível avaliar todos os candidatos usando as mesmas perguntas. Você precisa adaptar suas perguntas da entrevista para avaliar as habilidades que você está procurando na posição.

Se a pessoa estiver em posição de escrever código, eu pensaria em incluir um algoritmo e / ou uma questão de estrutura de dados, desde que fosse relevante para a posição. Eu tentaria escolher algo que pudesse ter sido discutido ou usado antes. Eu também me concentro em outras coisas além da implementação dos referidos algoritmos e estruturas de dados, como o tempo de execução e o consumo de memória (coisas como a notação big-O). Esses conceitos são relevantes não apenas para criar a estrutura de dados, mas também para escolher qual implementação é mais adequada (por exemplo, ArrayList versus LinkedList ).

    
por 11.01.2012 / 19:50
fonte
3

Eu não acho que para um trabalho de programação regular deve ser uma questão que elimina um candidato. Mas é uma boa idéia para ver se você está lidando com um programador realmente sênior ou com alguém que tem sido apenas um macaco codificando formulários por muitos anos. E mesmo assim, não deve ser um critério fundamental para escolher um programador. Talvez seja um ótimo programador com memória ruim e não tenha lido as palavras "lista vinculada" em anos (ou não se lembra do nome), mas ainda pode fazer bons aplicativos.

Então, como alguns disseram, se vai ser um trabalho que precisa trabalhar com uma lista vinculada e muitos algoritmos sofisticados, etc. então ok. É se para os dados de entrada usuais em um formulário, validar e mostrar é meio inútil e injusto.

    
por 12.01.2012 / 10:37
fonte
2

Acho que este é um mau exemplo de uma questão de entrevista, mas por um motivo diferente. Uma lista encadeada é um conceito tão simples que saber o que é saber como implementá-la. Se a pessoa não sabe o que é uma lista encadeada, então você tem que explicar como ela funciona, e ao fazê-lo você dá a resposta sem descobrir nada sobre se eles sabem ou não como resolver problemas . Portanto, a questão é redutível a "você já sabe o que é uma lista vinculada e como ela funciona?", O que não lhe diz nada útil sobre sua adequação como programador.

    
por 11.01.2012 / 18:50
fonte
2

Escrever uma implementação de lista vinculada é uma boa pergunta para a entrevista, porque ela revelará muito sobre o modo de codificação do candidato:

  • Ele sabe o que é uma API? Ele pode usar o código de outras pessoas? Ele pode escrever código para que outras pessoas possam usá-lo?

  • Ele sabe o que é uma lista vinculada? Ele conhece Coleções, Estruturas de Dados, Algoritmos?

Se ele nem sabe quais métodos uma Lista vinculada deve oferecer, você sabe que ele provavelmente nunca usou um, ou sabe quando usar um.

  • Como ele lida com o problema? Ele começa com uma análise primeiro, uma pequena especificação, alguns testes de antemão? Ou ele apenas começa a cortar alegremente?

  • Ele lida com casos de borda? E quanto a remover o último nó da lista vinculada? E se alguém tentar adicionar uma referência à própria lista vinculada à lista de links e excluir a coisa toda?

  • Ele lida com exceções? Cada linguagem de programação tem suas próprias convenções para manipular exceções: em Java, você esperará que um LinkedList lance um NoSuchElementException quando fizer um getFirst () em uma lista vazia. Outras linguagens podem retornar indefinido, -1 ou uma constante.

por 12.01.2012 / 08:36
fonte