O mercado de trabalho para desenvolvedores de software está aquecido. Essa é uma ótima notícia para os programadores, mas torna o processo de entrevista desafiador para os possíveis empregadores. Recentemente, um leitor me escreveu expressando sua preocupação com o processo de entrevista:
O senhor menciona a necessidade de Vertigo uma amostra de código, depois uma triagem por telefone e, em seguida, um teste prático no. Temos um processo muito semelhante, mas, de alguma forma, uma grande porcentagem dos candidatos que chegam ao teste prático é muito ruim e deveria ter sido eliminada na etapa 1 ou 2. A relação sinal/ruído é terrível. É muito caro passar tanto tempo fazendo entrevistas presenciais com pessoas que, em geral, não deveriam ser desenvolvedores. Estou curioso para saber o quanto o senhor pode esclarecer sobre as especificidades de suas exigências em relação aos candidatos. Que parte do processo é mais eficaz para separar a nata, como e por quê?
É muito caro errar a tela do telefone— uma enorme perda de tempo para todos os envolvidos.
O melhor artigo sobre telas de telefone que o senhor encontrará é o de Steve Yegge Five Essential Phone-Screen Questions (Cinco perguntas essenciais sobre a tela do telefone), outro presente que Steve nos deu da sua passagem pela Amazon.
Steve começa observando dois erros críticos que os selecionadores por telefone devem fazer o possível para evitar:
- Não deixe que o candidato conduza a entrevista. O entrevistador deve falar a maior parte do tempo, conduzindo a conversa até que o candidato tenha certeza de que sabe as respostas às perguntas (ou tenha desistido).
- Cuidado com os pôneis de um truque só. Os candidatos que só conhecem uma linguagem ou um ambiente de programação específico e protestam contra a ignorância total de todo o resto são um grande sinal de alerta.
O objetivo da entrevista por telefone não é que o candidato fique falando sobre o que já fez. O entrevistador deve tirá-lo um pouco de sua zona de conforto e perguntar-lhe relacionadas perguntas sobre coisas que o senhor nunca viu ou fez antes. O ideal é que o senhor queira saber como essa pessoa reagirá quando se deparar com algo novo, como o senhor base de código.
Em um esforço para simplificar a vida dos selecionadores por telefone, elaborei esta lista de cinco perguntas essenciais que o senhor precisa fazer durante uma triagem de SDE. Elas não garantem que o seu candidato será ótimo, mas ajudarão a eliminar um grande número de candidatos que estão escapando do nosso processo atualmente.
1) Codificação. O candidato deve escrever um código simples, com sintaxe correta, em C, C++ ou Java.
2) Design de OO. O candidato deve definir conceitos básicos de OO e criar classes para modelar um problema simples.
3) Scripting e regexes. O candidato deve descrever como encontrar os números de telefone em 50.000 páginas HTML.
4) Estruturas de dados. O candidato deve demonstrar conhecimento básico das estruturas de dados mais comuns.
5) Bits e bytes. O candidato deve responder a perguntas simples sobre bits, bytes e números binários.
Por favor, entenda: o que estou procurando aqui é um vácuo total em uma dessas áreas. Não há problema se eles se esforçarem um pouco e depois descobrirem. Não há problema se precisarem de algumas dicas ou estímulos menores. Não me importo se estiverem enferrujados ou lentos. O que o senhor está procurando são candidatos que não tenham nenhuma noção ou estejam terrivelmente confusos sobre a área em questão.
É claro que o senhor vai querer modificar esse processo para refletir a realidade de sua loja, portanto, eu o incentivo a leia o artigo completo. Mas Steve fornece alguns exemplos para que o senhor possa começar:
Codificação
Escreva uma função para reverter uma string.
Escreva uma função para calcular o enésimo número de fibonacci.
Imprimir a tabela de multiplicação da escola primária até 12×12.
Escreva uma função que some números inteiros de um arquivo de texto, um int por linha.
Escreva uma função para imprimir os números ímpares de 1 a 99.
Encontre o maior valor int em uma matriz int.
Formatar um valor RGB (três números de 1 byte) como uma cadeia hexadecimal de 6 dígitos.
Bons candidatos para o problema de codificação são comprovadamente simples, com loops básicos ou recursão e talvez um pouco de saída formatada ou E/S de arquivo. Tudo o que queremos saber é se eles realmente sabem programar ou não. O artigo de Steve é anterior a ele, mas eu seria negligente se não mencionasse o Why Can’t Programmers… Programar? aqui. O problema do FizzBuzz é bastante semelhante, e é chocante a frequência com que os entrevistados não conseguem fazer isso. É um pouco difícil de compreender, como um motorista de caminhão em potencial que, de alguma forma, não consegue encontrar o pedal do acelerador ou mudar as marchas.
Programação orientada a objetos
Crie um baralho de cartas que possa ser usado em diferentes aplicativos de jogos de cartas.
Modele o reino animal como um sistema de classes, para uso em um programa de zoológico virtual.
Crie um projeto de classe para representar um sistema de arquivos.
Projetar uma representação OO para modelar HTML.
Não estamos dizendo nada sobre os prós e contras do design de OO aqui, nem estamos pedindo um design de OO abrangente e de baixo nível. Essas perguntas servem para determinar se os candidatos estão familiarizados com os princípios básicos de OO e, o que é mais importante, se o candidato pode produzir uma solução de OO que pareça razoável. Estamos procurando entender os princípios básicos, conforme descrito em Entrevista sobre o Monopólio.
Scripting e expressões regulares
No ano passado, minha equipe precisou remover todos os números de telefone de 50.000 modelos de páginas da Web da Amazon, pois muitos dos números não estavam mais em serviço, e também queríamos encaminhar todos os contatos dos clientes por meio de uma única página.
Digamos que o senhor faça parte da minha equipe e que tenhamos que identificar as páginas com prováveis números de telefone dos EUA. Para simplificar um pouco o problema, suponha que tenhamos 50.000 arquivos HTML em uma árvore de diretórios Unix, em um diretório chamado “/website”. Temos dois dias para enviar uma lista dos caminhos dos arquivos para a equipe editorial. O senhor precisa me fornecer uma lista dos arquivos .html nessa árvore de diretórios que parecem conter números de telefone nos dois formatos a seguir: (xxx) xxx-xxxx e xxx-xxx-xxxx.
Como o senhor resolveria esse problema? Lembre-se de que nossa equipe tem um cronograma curto (2 dias).
Esse é um problema interessante. Steve diz que de 25% a 35% de todos os candidatos a engenheiro de desenvolvimento de software não conseguem resolver esse problema, mesmo com muitas dicas e durante toda a hora da entrevista. O que estamos procurando é uma relutância geral em reinventar a roda e alguma familiaridade com linguagens de script e expressões regulares. Para mim, essa pergunta indica se um desenvolvedor passará dias fazendo um trabalho de programação que ele poderia ter evitado facilmente com, talvez, uma rápida pesquisa na Web e algum código já existente.
Estruturas de dados
Quais são algumas estruturas de dados realmente comuns, por exemplo, em
java.util
?
Quando o senhor usaria uma lista vinculada em vez de um vetor?
O senhor pode implementar um mapa com uma árvore? E com uma lista?
Como o senhor imprime os nós de uma árvore em ordem de nível (ou seja, primeiro nível, depois segundo nível, depois terceiro nível etc.)?
Qual é o pior desempenho de inserção de uma hashtable? De uma árvore binária?
Quais são algumas opções para implementar uma fila de prioridade?
O candidato deve ser capaz de demonstrar um entendimento básico das estruturas de dados mais comuns. Mais especificamente, as grandes, como matrizes, vetores, listas vinculadas, hashtables, árvores e gráficos. Ele também deve conhecer os fundamentos da complexidade algorítmica “big-O”: constante, logarítmica, linear, polinomial, exponencial e fatorial. Se não souberem, isso é um grande sinal de alerta.
Bits e Bytes
Diga-me como testar se o bit de ordem mais alta está definido em um byte.
Escreva uma função para contar todos os bits em um valor int; por exemplo, a função com a assinaturaint countBits(int x)
Descreva uma função que receba um valor int e retorne verdadeiro se o padrão de bits desse valor int for o mesmo se for invertido (ou seja, se for um palíndromo); por exemploboolean isPalindrome(int x)
Como diz Steve, “Os computadores não têm dez dedos, eles têm um. Portanto, as pessoas precisam saber essas coisas.” O senhor não deveria ser tratado com um silêncio desconfortável depois de perguntar a um candidato o que é 2^16; é um número especial. Ele deve saber. Da mesma forma, eles devem conhecer os fundamentos de AND, OR, NOT e XOR – e como um AND bit a bit difere de um AND lógico. O senhor pode até perguntar sobre signed versus unsigned e por que as operações de bit-shifting podem ser importantes. O senhor deve ser capaz de explicar por que a velha piada de programador “por que os programadores acham que 31 de outubro e 25 de dezembro são o mesmo dia?” é engraçada.
Fazer uma triagem completa e detalhada do telefone dá muito trabalho. Mas vale a pena. Cada candidato eliminado pela triagem telefônica economiza pelo menos 8 horas-homem de tempo que seriam desperdiçadas por todos em um teste prático. Cada vez que um candidato não qualificado chega ao teste prático, o senhor deve se perguntar… como poderíamos ter eliminado esse candidato na triagem telefônica?