Lendo este site e SO, eu já vi muitas histórias de perguntas e respostas de entrevistas dizendo que um candidato tinha que implementar uma lista vinculada do zero. Normalmente, este é um exercício "fácil" para programar candidatos a funções, como escrever o FizzBuzz. A idéia é que, se o candidato não puder fazer isso, ele não poderá programar e deve ser rejeitado quase imediatamente.
No entanto, não posso deixar de pensar que isso pode ser uma prática ruim pelos seguintes motivos:
- Linguagens modernas de nível superior, como C # e Python, usam nativamente listas extensivamente; escrever seu próprio objeto de lista vinculada seria necessário apenas em circunstâncias incomuns e, mesmo assim, provavelmente desaconselhado.
- Linguagens de nível inferior, como C ++, têm bibliotecas padrão com iteradores / contêineres e objetos de lista.
- À luz dos dois primeiros pontos, os codificadores podem levar anos sem sequer pensar em implementar uma lista (vinculada, duplamente vinculada etc.). Alguns podem nem mesmo ver essas coisas desde os tempos de faculdade.
- O poder da computação também não é o fator de anos atrás; portanto, a eficiência via ponteiros não é o problema 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 memorizados e cuspidos de volta, sem realmente indicar a verdadeira competência do candidato.
Devo dizer que usar uma lista vinculada para levar a perguntas / discussões em aberto sobre a capacidade de resolver problemas / pensamento crítico dos candidatos é provavelmente uma prática de entrevista realmente boa. De qualquer maneira, um entrevistador pode realmente ver como é o candidato e como ele acha que é massivamente benéfico.
Eu acho que essa abordagem binária de "nenhum código de lista vinculada, nenhum trabalho" para programadores que trabalham em um aplicativo de desktop ou web está um pouco desatualizada. Também pode ser bastante prejudicial; um candidato que não se lembra de como trabalhar adequadamente com o cabeçalho de uma lista pode ser um excelente programador e colega de trabalho e se perder na mistura. Pensamentos?
EDIT : Existem muitos (bons) comentários sugerindo que se essa é uma pergunta boa ou ruim a ser feita depende do contexto do trabalho. Concordo plenamente, então deixe-me reformular esta pergunta: implementar uma lista vinculada é uma pergunta comum de entrevista para uma ampla gama de tarefas de codificação, semelhante a perguntas como o FizzBuzz ou a criação de uma função recursiva para calcular fatoriais. Essa pergunta tem utilidade suficiente para ser usada comumente na avaliação de candidatos de programação em geral? Ou deveria ser considerada uma pergunta ruim, exceto para os cargos "Desenvolvedor sênior, Equipe de listas vinculadas incorporadas"?
fonte
Respostas:
Se responder à pergunta lhe diz o que você quer saber sobre um candidato, é uma boa pergunta para uma entrevista. Se não lhe diz isso, é uma pergunta ruim.
Perguntas fáceis como o FizzBuzz servem a um propósito específico. Se um candidato não pode codificar o FizzBuzz, ele simplesmente não pode codificar e você pode encerrar a entrevista mais cedo. Eu classificaria a implementação de uma lista vinculada apenas um pouco mais difícil, mas ele pode iniciar uma conversa sobre estruturas de dados em geral que revelará muito.
Lembre-se de que nenhuma pergunta da entrevista lhe dirá tudo o que você deseja saber. Você realmente precisa ter um grupo de perguntas pronto. 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ê fizer uma pergunta e ela acertar, ainda não sabe o que mais eles fazem ou não.
Em relação à sua edição:
Eu acho que é uma boa pergunta de propósito geral que poderia ser usada para avaliar praticamente qualquer candidato a programação. Ele 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 consiga implementar uma lista vinculada do zero, talvez eles possam explicar como o usaram 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".
fonte
Perdi os empregos puramente porque minha mente ficou em branco com quebra-cabeças simples como esse. Eu também fiz brilhantemente esses quebra-cabeças em outras entrevistas - sei como implementar uma lista vinculada 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 perdi empregos, devo pensar que eles perderam minha atenção.
Então, sim, acho que é uma prática questionável, na melhor das hipóteses, mas eu entendo. Também considerei a possibilidade de que não é culpa da pergunta, mas do questionador, por torná-la 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 abordando problemas de codificação e de processo. Se eles podem trazer amostras de código, fantástico.
fonte
É preciso definir o tipo de trabalho de programação. Se você está no negócio de desenvolver compiladores e algoritmos, perguntas sobre essas coisas devem ser esperadas. Se você está em aplicativos do tipo de linha de negócios e espera que o candidato faça aplicativos CRUD, pode ser que o conhecimento do conceito (sem escrever um programa) seja suficiente. Hoje, o conhecimento das diferentes tecnologias necessárias para realizar o trabalho especialmente no tipo de aplicativos LOB substitui a necessidade de algoritmos puros.
fonte
Minha resposta é "Depende". Eu faria essa pergunta se um candidato listasse C ou C ++ em seu currículo. Pedir para implementar uma lista vinculada é um bom teste para o entendimento de ponteiros, que é absolutamente essencial para um programador de C ou C ++.
Por outro lado, se um candidato não alegar conhecer C ou C ++, eu não pediria que ele implementasse uma lista vinculada, mas 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 final da lista? Inserir um elemento no meio da lista? Quando você usaria uma lista em oposição a uma matriz? Estes são conceitos fundamentais da estrutura de dados que, IMHO, todo programador deve conhecer.
fonte
Eu não consideraria uma pergunta ruim para uma entrevista. Muita compreensão e programação da estrutura de dados começam com um bom entendimento das Listas Vinculadas. Dito isto, existem algumas advertências:
1) É uma pergunta do tipo fizz-buzz. Você está apenas validando algo muito básico: a pessoa entende uma lista vinculada? Peça e siga em frente.
2) Há um desafio com as listas vinculadas de que os idiomas que são mais adequados para mostrar sua compreensão dos conceitos de lista vinculada (por exemplo, C) podem não ser iguais aos idiomas com os quais eles trabalharão no trabalho. Você pode demonstrar entendimento básico 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 diz a mesma coisa sobre o entendimento de um candidato como pedir para fazer em C. Se o trabalho estiver em torno de Java, também está faltando um pouco.
3) Com isso em mente e os desafios gerais da "programação do quadro branco", ao fazer esse tipo de pergunta, eu aceitaria pseudocódigo ou diagramas, desde que demonstrem a compreensão dos princípios básicos. Não peço que as pessoas escrevam código em um quadro branco que seja sintático e logicamente perfeito, especialmente se puderem se virar e identificar problemas lógicos quando solicitados a analisá-lo novamente. YMMV.
fonte
Quando eu estava dando entrevistas, muitas vezes me pediam implementações de listas vinculadas e alguns algoritmos centrados em listas vinculadas. Eu resolvi a maioria deles, e alguns deles exigiram que eu exercitasse meus neurônios um pouco.
Se alguma vez eu estava fazendo uma entrevista, procuraria algum tipo de implementação de lista vinculada, não para testar o quão boa é uma pessoa na codificação, mas para verificar quanta atenção uma pessoa presta aos detalhes. Qualquer um pode escrever uma lista vinculada, mas é nos casos de fronteira que até alguns bons programadores falham. Não pergunte a ele:
Write a code for linked list in C/C++
. Peça que ele escreva uma lista vinculada genérica em C (não em C ++) etc.Torça o problema e coloque outras condições na lista vinculada, e você terá uma boa pergunta a fazer. Algumas pessoas são obrigadas a cometer erros então.
fonte
void
ponteiros existem apenas para isso ... :) O primeiro link que encontrei no google para "lista vinculada genérica em c" foi: daniweb.com/software-development/c/threads/109260 e outro foi a entrevista técnica .com /… Eu pensei que todos sabiam disso!void
ponteiros não é genérica, mas apenas geral a qualquer momento. Eles podem conter qualquer tipo de coisa e até misturar tudo o que quiserem - e exatamente isso faz com que não seja genérico para mim. É como usar o tipo baseobject
em linguagens orientadas a objeto ...Nos meus 10 anos de programação profissional (e por mais dez anos como hobby), acho que nunca precisei implementar uma lista vinculada. Se alguém me pediu para fazer isso durante uma entrevista, eu poderia contestar perguntando se isso é algo que farei regularmente no trabalho.
Com certeza, há quase certamente são empregos lá fora, onde você vai precisar para escrever implementações mais ou menos-sala limpa de algoritmos comumente conhecidos - como implementar uma lista ligada a partir do zero. Mas para a maioria dos trabalhos de programação, que valor específico tem para a empresa que um candidato possa fazê-lo durante uma entrevista? É realmente tão importante nesse cenário que o candidato forneça uma implementação perfeita que lide com casos extremos corretamente, relate falhas de acordo com a prática comum no idioma ou na estrutura, e assim por diante? Ou você pode ignorar isso e, em vez disso, se concentrar em como eles realmente abordam um problema com o qual talvez não tenham sido confrontados em 10 a 20 anos?
Quando entrevistei para o meu trabalho atual, tive muito pouca experiência com a pilha de tecnologia em uso na empresa. Agora, alguns anos depois, eu regularmente recebo colegas e faço 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 - argumentando com isso, constatou-se que não havia implicações nesse caso específico). Também não precisava de uma implementação de lista vinculada totalmente nova.
Faça perguntas relevantes para o trabalho ao qual o candidato provavelmente será designadoe tente ter uma idéia de como eles se sentem ao adquirir novos conhecimentos. Como eles descobririam o significado de alguma sintaxe obscura que nunca viram? (Se você é uma loja C, por exemplo, pode tentar uma pergunta que envolva trigramas.) Para uma posição de programação, eles leem ou contribuem regularmente para fóruns como o Stack Overflow? Se lhes pedissem para executar alguma tarefa em uma linguagem ou estrutura de programação com a qual eles têm pouca ou nenhuma experiência (por exemplo, se você é principalmente uma loja Java, e o Clojure ou o .NET?), Como eles abordariam o problema? Talvez retire um bug real do seu rastreador de erros (pode até ser um que já foi resolvido há muito tempo) e pergunte a eles 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 o caso de negócios e tiver uma boa atitude em relação à aprendizagem de coisas novas, esse provavelmente é um indicador de ajuste muito melhor para essa posição específica do que ser capaz de fornecer respostas prontas para perguntas conhecidas, sejam elas as perguntas são sobre o FizzBuzz, listas vinculadas ou outra coisa. Mostre como o candidato se encaixa na equipe e eu acho que você está em um terreno bastante seguro.
fonte
É 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. Eles pensam que o fato de ter formado um modelo mental consistente para ponteiros se correlaciona com a proficiência na linguagem, entendendo o que acontece em algum nível (abstrato) da máquina e a capacidade de abstrair em geral.
Não estou dizendo que essa seria necessariamente a melhor medida, mas apenas que há alguma correlação.
fonte
Você começa dizendo que são perguntas "geniais", mas depois ressalta que as pessoas não serão capazes de fazê-las. Estou confuso.
Aqui está como eu penso sobre isso:
Eu acho que isso faz com que sejam boas perguntas. Se você está preocupado com eles estudando para a entrevista, jogue uma lista. Peça que escrevam circularmente e perguntem qual é o tempo de execução assintótico de sua implementação. Ou eles escrevem outra estrutura de dados comum e / ou rápida ... Uma árvore de pesquisa binária? Uma fila (FIFO)? Uma pilha (FILO)? Uma
O(n)
fila de prioridade ingênua ( )? Conheço muitas pessoas que pensam que um BST éO(log n)
apenas porque é uma árvore .Se você está procurando alguém que vai trabalhar no metal, e precisa de uma muito sólida base em estruturas de dados ... estas podem até ser muito trivial demais para os candidatos que você está olhando para contratar.
Isso pressupõe, é claro, que você deseja um desenvolvedor que tenha o básico / fundamentos das estruturas de dados e que sua posição se beneficie desses fundamentos. Se você quiser alguém que possa reunir uma página asp em segundos, faça uma entrevista para isso. O ponto não é escolher uma pergunta para entrevista, porque todo mundo faz, mas escolher uma que mede as habilidades que você está procurando. Pessoalmente, acho que as perguntas sobre estruturas de dados são boas, lista vinculada ou não.
fonte
Não, absolutamente não. Dependendo de como é redigido, o que ele dirá varia de "este candidato sabe como criar uma lista vinculada" a "este candidato pode programar uma lista vinculada no idioma X". Se você solicitar um pseudocódigo, ele tenderá mais para o primeiro. Se você solicitar uma implementação em uma linguagem específica, entenderá melhor a linguagem (especialmente em C e C ++, onde é possível lidar com ponteiros, referências e estruturas).
Eu chegaria ao ponto de dizer que não é possível avaliar todos os candidatos usando as mesmas perguntas. Você precisa adaptar as perguntas da entrevista para avaliar as habilidades que procura na posição.
Se a pessoa estiver em posição de escrever código, eu pensaria em incluir uma questão de algoritmo e / ou estrutura de dados, desde que fosse relevante para a posição. Eu tentaria escolher algo que poderia ter sido discutido ou usado antes. Eu também focaria 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 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 (como um
ArrayList
versus um,LinkedList
por exemplo).fonte
Não acho que um trabalho regular de programação deva ser uma pergunta que elimine um candidato. Mas é bom ver se você está lidando com um programador realmente sênior ou com alguém que apenas codifica formulários de macacos há muitos anos. E mesmo assim, não deve ser um critério fundamental para a escolha de um programador. Talvez seja um ótimo programador com memória insuficiente e não leia as palavras "lista vinculada" há anos (ou não se lembre do nome), mas ainda possa fazer bons aplicativos.
Então, como alguns disseram, se vai ser um trabalho que precisa trabalhar com lista vinculada e muitos algoritmos sofisticados, etc. então ok. É que, para os dados de entrada usuais em um formulário, validar e mostrar é meio inútil e injusto.
fonte
Penso que este é um mau exemplo de uma pergunta de entrevista, mas por um motivo diferente. Uma lista vinculada é um conceito tão simples que saber o que é é saber como implementá-la. Se a pessoa não sabe o que é uma lista vinculada, é necessário explicar como ela funciona e, ao fazer isso, você fornece a resposta sem descobrir nada sobre se ela sabe ou não resolver problemas . Portanto, a pergunta é redutível para "você já sabe o que é uma lista vinculada e como ela funciona?", O que não diz nada útil sobre a adequação deles como programador.
fonte
Escrever uma implementação de lista vinculada é uma boa pergunta para entrevista, porque revelará muito sobre a maneira de codificar o 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 uma ou sabe quando usá-la.
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 simplesmente começa a cortar feliz?
Ele lida com casos extremos? Que tal remover o último nó da lista vinculada? E se alguém tentar adicionar uma referência à própria lista vinculada à lista vinculada e excluir a coisa toda?
Ele lida com exceções? Cada linguagem de programação possui suas próprias convenções para lidar com exceções: em Java, você espera que um LinkedList gere uma NoSuchElementException quando você faz um getFirst () em uma lista vazia. Outros idiomas podem retornar indefinidos, -1 ou uma constante.
fonte