Não vou à sua entrevista de teste algorítmico.

Publicado: Última actualização:
Teste algorítmico Tomasz Nurkiewicz

Como é que uma pessoa média contrata um alfaiate de primeira linha? Eles pedem aos candidatos para lhes mostrar o que costuraram até agora, talvez até lhes peça para coserem algo rapidamente. Então eles observarão os resultados, observando como eles operam bem a máquina de costura, a organização do local de trabalho, e avaliarão a atenção do alfaiate aos detalhes. Eles estão desperdiçando muito tecido ou simplesmente não estão fazendo um bom trabalho?

Como é que os desenvolvedores de software contratam alfaiate de primeira linha? Bem, provavelmente seria algo como isto; "Isto é um quadro branco. Por favor, desenhe a diferença entre um nó de Ghiordes e Senneh. Derivar o comprimento do fio em função da área de superfície do tecido".

Honestamente, acredito que um alfaiate de primeira linha deveria saber a diferença, mas o que estamos realmente verificando aqui? Você quer um casaco elegante ou uma equação elegante em um quadro branco?

A minha experiência com uma empresa de pesquisa e um banco de investimento

Deixe-me partilhar algumas experiências que tive enquanto era entrevistado em duas grandes empresas. A primeira vendeu anúncios ocasionalmente entrelaçados com resultados reais de pesquisa orgânica e a outra foi um grande banco empresarial. Na primeira, eu gastei várias horas para encontrar soluções para tarefas algorítmicas não triviais. A segunda era semelhante, mas descrevi os meus algoritmos por telefone a uma pessoa sentada do outro lado do Atlântico...e ficou ainda mais estranho.

Tweet de teste algorítmico

Na empresa de busca, eu estava procurando o sufixo mais longo de uma lista ligada que fez... algo. Francamente, eu não me lembro de muito. Tal como não me lembro da última vez que usei uma lista vinculada. Sim, eu entendo como é diferente de um array - implicações de desempenho, casos de uso diferentes, etc. Acontece que também sei disso porque esta pergunta é feita em cada maldita entrevista! Mas no trabalho real, eu simplesmente nunca tive a oportunidade de tirar proveito disso. Havia também uma questão relacionada com o equilíbrio ou atravessar uma árvore de uma forma bizarra. Honestamente, não foi uma experiência muito memorável. Na verdade, achei que seria honesto da minha parte dizer que conhecia este exercício de antemão. Não de um livro sobre algoritmos, mas de um guia sobre como ser contratado nesta empresa em particular. Mais sobre isso mais tarde.

No banco de investimentos, primeiro me pediram para gerar todas as permutações possíveis de uma lista de elementos. Tenha em mente que tudo isto aconteceu através de um telefonema transcontinental. OK, só por diversão, imagino fazer-me este tipo de pergunta. Aqui estão as respostas possíveis que eu esperava, do pior para o melhor:

  • Procure uma solução na Internet, diga que é sua e pense que não ouço o teclado a tocar
  • Recite uma solução de memória, linha por linha, porque você se preparou como louco, e felizmente você por acaso conheceu a solução do topo da sua cabeça. E não muito mais do que isso.
  • Código imperativo e convoluto que itera sobre a entrada. Preferencialmente usando variáveis como i, j, k
  • Solução limpa e recorrente, porque o candidato percebeu que este problema pode ser decomposto.
  • Fique enojado com o código escrito à mão, procure um pouco mais e encontre uma biblioteca que faça exatamente isso (por exemplo Colecções2 da Goiaba)
Testes de algoritmos de quadro branco

A sério, provavelmente estás à procura de um novo colega de equipa. Preferes ver um pedido com um código elegante e recorrente ou uma única chamada de biblioteca? Uma batalha de bibliotecas testada por milhões de desenvolvedores, baseada em Donald Knuth's".A Arte da Programação Informática“? Também levei algum tempo para encontrar uma biblioteca, enquanto que os laços aninhados e feitos à mão estão por toda a parte na Internet. Que tipo de atitude estás à procura? Memorizar e copiar cegamente o código da Internet, ou realmente fazer a pesquisa para encontrar soluções comprovadas em batalha?

Outro exercício que me foi dado exigiu que baralhasse aleatoriamente uma matriz tendo apenas uma moeda aleatória à minha disposição. Este é um problema interessante por direito próprio, embora não esteja totalmente relacionado com as condições de trabalho. De alguma forma, eu inventei um algoritmo (e foi bastante agradável), mas, depois de alguns meses, tudo que eu estava fazendo era passar um pedaço de XML de um lado do banco para o outro. Centenas de transformações mundanas por segundo e, a propósito, todas as grandes linguagens tem apoio de baralhamento: [1], [2], [3], [4]ou um pacote [5].

Perguntas da entrevista de teste algorítmico: a banalidade do recrutamento

Tendo uma licenciatura em Ciências da Computação, não acho os testes algorítmicos intimidatórios ou inúteis. Na verdade é bem o oposto, eles são ótimos para exercitar seu cérebro, como resolver sudoku ou jogar bridge. Eu assisti a várias competições algorítmicas (por exemplo Advento do Código) e sempre os achou agradáveis. Mas esse é apenas o meu hobby, você pode preferir estudar DDD ou SQL avançado. E não tenho a certeza se os algoritmos puros e as estruturas de dados são um ajuste particularmente bom para a maioria dos processos de recrutamento. Eles verificam as habilidades analíticas abstratas de um candidato, bem como CS e matemática sólida (que são ambos traços importantes na engenharia de software), mas eles falham em capturar outros traços importantes ou são muito convolutos para serem conclusivos.

Hoje em dia, a maior parte do trabalho em TI requer a costura de APIs e frameworks. Nós somos mais como alfaiates do que produtores de tecido. A proficiência algorítmica é útil ao dimensionar uma única característica do seu sistema, mas uma experiência mais focada em sistemas distribuídos provavelmente irá levá-lo mais longe. Por exemplo, conhecer a teoria dos gráficos ou funções discretas é valioso. No entanto, a experiência prática com uma grande rede de bases de dados replicadas ou a compreensão do porquê de algumas funções de hash estarem comprometidas tem um impacto muito maior no seu trabalho diário.

Testes de algoritmos de quadro branco

De facto, compreender o que é a recorrência é essencial. Tal como saber porquê. HashMap é tão rápido em Java. Mas entendendo porque Dicionário é ainda mais rápido no C# é o próximo nível. Dica: layout de memória, algo sem relação com a complexidade computacional teórica. Entretanto, muitos acreditam que fazer perguntas puramente algorítmicas é a maneira mais simples de encontrar desenvolvedores excepcionais e bem treinados. Tal crença é muito romântica, mas muitas vezes extremamente ingénua. Basta ver quantos livros o estão a ajudar a ter sucesso especificamente nas (famosamente algorítmicas) entrevistas do Google. Eles não estão ensinando os fundamentos da CS, eles mal explicam como resolver aulas específicas de problemas ao estilo do Google.

A classificação é uma das perguntas algorítmicas (ab)mais comumente usadas na entrevista. Saber como Quicksort obras é valioso, ainda que, por exemplo, o Java não o usou durante quase uma década. Entender o que é O(nlogn) também pode vir a ser útil. Mas muito mais frequentemente não foi a complexidade algorítmica que fez com que meu sistema parasse. Em vez disso, foi um problema N+1 - algo que eu continuei a encontrar da maneira mais difícil, mas que mal foi tocado durante a minha educação em CS. Se você não consegue resistir à necessidade de perguntar sobre a classificação, pelo menos discuta o que significa para um algoritmo ser estável. É muito provável que você use um algoritmo rápido e pronto. Estável vs. instável é muito provavelmente a sua única preocupação. Dica: a ordenação em Java é estável, em C# não é.

Testes de algoritmos de quadro branco

Tenha em mente que as perguntas algorítmicas são ótimas, se é realmente o que você precisa diariamente. Os peritos em aprendizagem de máquinas precisam de compreender o que descida de declive é, e isso requer um fundo de Matemática substancial. Além disso, estatísticas, pesquisa, computação gráfica e desenvolvimento de jogos tendem a exigir uma certa quantidade de conhecimentos de CS. Caso contrário, use sabiamente o seu horário de recrutamento e faça as perguntas certas.

Uma melhor abordagem para uma teste algorítmico: desenhar e trabalhar em conjunto

Entrevistei toneladas de pessoas durante a minha carreira, considero isto parte do meu trabalho, especialmente em cargos mais altos. Muitas das entrevistas foram esquecidas, mas ocasionalmente os candidatos ficaram extremamente satisfeitos, apesar de não terem conseguido o emprego. Isto constrói uma grande relação e uma marca para a sua empresa. Como eu criei uma experiência tão boa?

  • Prefere a solução de problemas da vida real. Desenhe uma arquitetura parecida com o Twitter ou escale um site parecido com o Instagram - exercícios como esse são muito mais agradáveis do que encontrar o caminho mais curto ou o palíndromo mais longo.
  • Prefere a programação de pares ao invés de esboços de quadro branco. Ver como funciona um candidato, como ele ou ela navega no código, procura respostas, aproxima-se de obstáculos - isto deve dizer-lhe muito. Trabalhar em conjunto também reduz o stress e torna o processo mais humano.
  • Prefira uma base de código existente a um editor vazio. Adoramos projetos greenfield, mas modificar uma base de código existente é muito mais próximo de um trabalho real.
  • Prefira os testes ao código de produção puro. A codificação é ótima, mas um candidato procura ou desenvolve testes junto com a implementação? Esse aspecto é quase universalmente negligenciado durante um teste algorítmico.
Teste de Algoritmo

Lembre-se que trabalhar juntos não requer uma reunião no local. O compartilhamento de telas e a colaboração em tempo real são hoje em dia bastante perfeitos, também com DevSkiller.

Sumário

Não há nada de errado com perguntas algorítmicas durante uma entrevista de emprego. Esta é uma parte importante do nosso campo. No entanto, dado o pouco tempo que você tem para recrutar, há maneiras mais sábias de escolher o seu próximo melhor engenheiro. Exercendo habilidades reais, você garante que um candidato é ótimo no que você realmente precisa. Além disso, isto reduz o stress e melhora a percepção do candidato sobre a sua empresa.

Partilhar correio

Saiba mais sobre a contratação de tecnologia

Subscreva o nosso Centro de Aprendizagem para obter informações úteis directamente na sua caixa de entrada.

Verificar e desenvolver as habilidades de codificação sem problemas.

Veja os produtos DevSkiller em ação.

Certificações de segurança e conformidade. Certificamo-nos de que os seus dados estão seguros e protegidos.

Logotipo DevSkiller Logotipo TalentBoost Logotipo TalentScore