Desenvolvimento - C#

Sendo bem-sucedido em processos de seleção na área de TI: você faz a coisa certa? (Parte III)

Dicas preciosas baseadas na experiência prática para transformar sua entrevista de emprego em sucesso.

por Andre Furtado



Esta é a terceira e última parte da série de artigos “Sendo bem-sucedido em processos de seleção na área de TI: você faz a coisa certa?”. Na primeira parte, discutimos como preparar o espírito e o curriculum vitae (CV). Na segunda parte, foi vez de detalharmos como enfrentar entrevistas por e-mail e telefone. Nesta terceira parte, por fim, estarei focado naquele que é o ponto crítico e decisivo de todo e qualquer processo de recrutamento: a entrevista presencial.

Detalhando o processo

Nas grandes empresas de TI (Google, Microsoft, British Telecom, etc.), uma entrevista presencial é uma verdadeira maratona, ocupando um turno inteiro (uma manhã ou tarde). A entrevista, na verdade, é dividida em várias sub-entrevistas seguidas (cerca de 4 ou 5), cada uma durando de 45 minutos a uma hora.

Existem boas chances de você participar simultaneamente da maratona de entrevistas junto a outros candidatos (novamente, uns 4 ou 5), que são entrevistados pelos recrutadores em um esquema de rodízio. Diz-se que, quanto mais sub-entrevistas você fizer, mais os recrutadores estão interessados em você. A princípio, é provável que candidatos dispensados após a terceira sub-entrevista não tenham despertado o interesse da equipe de entrevistadores.

Os cuidados básicos para uma entrevista presencial são óbvios: checar antecipadamente o horário e o local de sua entrevista. Informe-se antecipadamente sobre o tempo que leva do hotel para o local, pois esse é um péssimo momento para atrasos, que podem impactar no cronograma da entrevista assim como nas impressões iniciais que recrutadores terão de você.

Por outro lado, chegar excessivamente cedo à entrevista pode não ser interessante. Os recrutadores talvez ainda estejam ajustando o ambiente de entrevistas e acertando os detalhes finais entre si, sendo sua presença antecipada uma preocupação a mais para eles. Recomendo que você chegue 15 minutos antes ao local, até mesmo para bater um papo com os demais candidatos e espantar um pouco do nervosismo.

Em tempo: não considere os outros candidatos como concorrentes! No processo de recrutamento das grandes empresas, geralmente, cada candidato compete contra si mesmo, e não com os demais. Se todos forem bem-sucedidos, é bem provável que todos sejam selecionados. Aproveite o momento para conhecer pessoas novas e ampliar seu networking!

Observe, entretanto, as normas estabelecidas pelos recrutadores em relação a conversas com outros candidatos nos intervalos das sub-entrevistas. É bem provável que não seja permitido conversar sobre o que está sendo perguntado durante o processo. Além disso, pode ser exigido que vocês conversem entre si apenas em inglês (de modo que os recrutadores possam ter ciência do que está se passando).

Outro ponto bastante importante é se informar qual o dress code da entrevista (isto é, qual a roupa apropriada para a ocasião). Isso pode parecer óbvio ou desnecessário, mas o fato é que diferentes empresas de TI possuem diferentes dress codes, ainda mais se consideramos o assunto no âmbito internacional.

Por exemplo, enquanto Microsoft e Google adotam uma linha mais casual (camisa de botão, sem calça social), empresas mais tradicionais, como a British Telecom, praticam o velho terno e gravata. Estar destoando (inclusive dos demais candidatos) em algum desses ambientes pode lhe deixar desconfortável para a entrevista e/ou passar uma impressão estranha.

Por fim, um cuidado fundamental é uma boa noite de sono, para manter a mente fresca no dia seguinte, assim como dar uma lida completa e final no seu CV no dia anterior, se capacitando para responder a qualquer pergunta mais específica sobre algum detalhe do mesmo.

Uma boa notícia é que muito do que você já fez para se preparar para a entrevista telefônica será útil para a entrevista presencial. De fato, entrevistas presenciais possuem muitos elementos em comum com uma entrevista telefônica:

· Perguntas clássicas de RH, como:

o “Por que você quer trabalhar na <Google/Microsoft/etc.>?”

o “Fale sobre um projeto no qual você enfrentou um problema difícil mas foi bem-sucedido”

· Charadas (ou puzzles), como:

o Você é apresentado a um jarro com X bolas azuis, Y verdes, W brancas e Z amarelas. Quantas bolas você precisa tirar, sem olhá-las, para garantir que irá pegar pelo menos duas da mesma cor?

o 10 jarros estão cheios de pílulas, todas pesando 10 gramas, à exceção das pílulas de um certo jarro, que pesam 9 gramas. Encontre esse jarro com apenas uma única pesagem.

· Bate-bola que vai ficando cada vez mais técnico, como:

o “Como você explicaria o Excel para sua avó?”

o “Compare C++ com C#”

o “Discuta o padrão de projeto dependency injection

Diversos exemplos de perguntas pertencendo às três categorias acima, assim como dicas e sugestões de como resolvê-las, foram apresentados previamente na segunda parte desta série artigos. Dessa forma, focarei o restante deste artigo na quarta e última categoria de perguntas: os problemas técnicos mais elaborados, que precisam ser resolvidos na presença do entrevistador.

Antes disso, entretanto, gostaria de enfatizar uma sugestão: talvez seja interessante criar um documento contendo perguntas e respostas pertencentes às três categorias apresentadas acima. Leia-o todos os dias antes da entrevista. Ensaiar as respostas através de um documento desse tipo pode garantir que você desenrole mais tranqüilo as respostas na hora em que isso for perguntado para valer.

Resolvendo problemas técnicos mais complexos

Você pode se preparar de diferentes maneiras para resolver os problemas técnicos mais complexos de uma entrevista presencial. Livros específicos para entrevistas presenciais em TI (como Programming Interviews Exposed e o How Would You Move Mount Fuji?) são de fato úteis. Da mesma forma, você se surpreenderá com a quantidade de informação que já existe online sobre isso, como aqui, aqui, aqui, aqui, aqui, aqui, aqui, aqui, aqui e aqui.

Em especial, não se limite apenas a ler os exercícios e suas respostas presentes nos sites e livros. Treine por conta própria e tente resolver você mesmo. Não se decepcione se você não conseguir solucionar tudo de primeira, o mais importante é como você resolve os problemas, e não chegar ao resultado correto. Falarei mais sobre isso adiante.

Cabe ressaltar, entretanto, que nenhum livro ou recurso na internet é milagroso. Se você possui uma base fraca, por exemplo, em orientação a objetos, algoritmos e estruturas de dados, é importante trabalhar esses conceitos antes de partir para os problemas. Se você for um programador Java ou C#, um cuidado especial é relembrar os conhecimentos em C/C++.

Pois bem, o que faz a diferença na resolução de problemas técnicos mais complexos em uma entrevista presencial? Antes de responder, vamos checar alguns exemplos de problemas desse tipo:

· Implemente a função a seguir contemplando restrições de espaço e tempo: RemoveChars(char[] originalString, char[] charsToBeRemoved).

· Implemente a função CountBits(int x), que retorna o numero de bits de x iguais a 1.

· Escreva uma função para rotacionar um bitmap em 90 graus, de modo in place (isto é, sem precisar alocar memória adicional).

· Implemente um algoritmo para remontar a tabela FAT de um disco.

· Implemente um gerenciador de heap (funções malloc e free), focando a discussão nas estruturas de dados a serem utilizadas, abordagens de implementação e trade-off entre elas.

· Dada uma arvore binária e dois nós dessa árvore, implemente um algoritmo que encontra o primeiro pai comum a ambos.

· Percorra uma árvore com algoritmos pre-order, in-order e post-order.

· Implemente ordenação em um array com <quicksort/mergesort/etc.>.

· Implemente a função memcpy.

· Implemente a função atof (que converte de string para float).

· Dada uma lista ligada, troque os elementos de índice par pelos de índice ímpar.

· Dada uma lista ligada, remova os elementos cujos índices são múltiplos de 3.

· Remova os elementos duplicados de um vetor ordenado.

· Implemente uma classe para armazenar números inteiros de tamanhos infinitos.

· Implemente um algoritmo para identificar se uma string é um palíndromo.

· Escreva uma função para encontrar a maior e a menor palavra de uma string.

· Implemente um algoritmo in place para inverter uma string.

· Implemente um algoritmo in place para inverter as strings dentro de uma frase.

· Dada duas listas ligadas, realize o merge entre elas.

O primeiro passo em busca da resolução de tais problemas é não se assustar caso um problema aparente ter um nível de complexidade acima do que você estaria preparado. Pode ser o caso, inclusive, do entrevistador ter lhe passado o enunciado com alguma informação faltando, que seria fundamental para um melhor entendimento do problema.

Na verdade, aí está a primeira grande dica: pergunte tudo o que possa lhe ajudar a entender o problema antes de escrever qualquer linha de código! Mostrar que você tem a preocupação de entender perfeitamente o que lhe foi proposto é uma virtude apreciada pelos entrevistadores.

Por exemplo, no penúltimo problema apresentado na lista acima (inversão in place de strings dentro de uma frase), perguntar quais são os caracteres separadores de palavras (como vírgulas, hífens ou espaços em branco) pode contar pontos a seu favor. Outro exemplo seria questionar se as listas ligadas do último problema apresentado acima (merge de listas) já estariam ordenadas, o que facilitaria sua vida na aplicação de um algoritmo similar ao mergesort. Ou então questionar se você precisaria criar uma terceira lista para armazenar a resposta ou se a resposta pode ser uma das listas de input modificada.

Outra dica é diagramar o problema proposto. Escreva exemplos de input/output da questão, faça rabiscos e outros desenhos que possam lhe ajudar a abstrair melhor o problema e entender sua essência. “Pensar alto” em todos os momentos da resolução do problema, falando e explicando ao entrevistador o que passa por sua cabeça, é uma dica extremamente valiosa. Isso permite a você expor sua linha de raciocínio gradualmente ao entrevistador, o que é um bom momento para fazer um pouco de marketing sobre suas habilidades.

Por exemplo, você pode afirmar que “uma maneira simples de resolver esse problema é utilizando recursão, embora isso possa impactar na performance do algoritmo devido às mudanças de contexto ocasionadas pelas chamadas recursivas assim como ocupar a memória mais do que o desejado”. Dessa forma, o entrevistador pode ter uma noção mais clara de seus conhecimentos (no caso, ele saberá que você entende minimamente os trade-offs de um algoritmo recursivo). Adicionalmente, e o que é mais importante, o seu “pensar alto” permite que o entrevistador lhe auxilie quando você não estiver conseguindo progredir em seu raciocínio.

Quando você estiver preparado para implementar a resposta (que geralmente é feita em pseudo-código baseado em C++, Java ou C#), considere a conseqüência de cada linha de (pseudo-)código que você escrever. Em vez de “vomitar código” para apenas depois analisar seus efeitos, procure checar o impacto de suas linhas de código passo a passo, sem que o entrevistador precise interferir ou lhe chamar a atenção para eventuais conseqüências do novo código introduzido. Aliás, vale lembrar que isso é uma boa prática de programação, seja a programação para uma entrevista ou não.

Ao final, é interessante provar que seu código está correto, testando-o com diferentes variações de input. Percorra o código com os valores informados para checar não apenas se o resultado desejado é obtido, mas também se o algoritmo implementado se comporta como esperado. Saber como testar o próprio código é outra virtude bastante apreciada.

Questões que exigem sua criatividade como testador também são comumente apresentadas. No nível menos técnico, o entrevistador pode lhe perguntar como você testaria objetos cotidianos, como um papel, um copo ou um browser. A idéia aqui é ser o mais criativo possível, apresentando a maior quantidade de casos de teste que vier à sua cabeça. No caso do copo, por exemplo, algumas opções seriam questionar se o copo é fácil de pegar, de lavar, de ver o líquido que está dentro dele, se ele é inodoro, etc.

Outras questões de teste podem surgir após a apresentação de uma questão técnica qualquer. Por exemplo, o entrevistador pode pedir para você implementar uma busca em um array ordenado e, em seguida, definir casos de teste para esse problema. Em outro exemplo (ocorrido durante minha entrevista para a Microsoft), o entrevistador solicitou que eu implementasse uma função para encontrar o primeiro caractere repetido de uma string, com restrições de espaço e performance. Em seguida, pediu que eu criasse casos de teste para o problema.

Preocupe-se nesse momento não apenas em testar a funcionalidade do seu código, mas também atacar questões como segurança, performance de tempo/espaço e qualquer combinação de valores de entrada que possa fazer o código dar algum erro, como valores nulos, zerados, fora do intervalo permitido ou justamente na fronteira desse intervalo (“valores-limite”).

Alguns problemas podem ser bastante criativos e mais longos de serem explicados, como o seguinte: Você precisa implementar a inteligência de dois robôs, que irão pousar em um mundo unidimensional e discreto (uma régua). Seus pára-quedas ficam no lugar onde eles pousam. Sua tarefa é fazer os robôs se encontrarem, programando-os através das seguintes instruções, cada uma levando 1 segundo para ser executada:

· StepLeft

· StepRight

· If parachute GOTO <label>

· GOTO <label>

Não se assuste com a quantidade de informações apresentadas no enunciado. Você verá que com as perguntas certas e um pouco de calma, será até mesmo bastante divertido resolver tais problemas.

Por fim, nunca é demais lembrar: durante a entrevista presencial, assim como na entrevista por telefone, o Inglês pode ser um desafio adicional. Entretanto, não hesite em pedir cordialmente para o entrevistador repetir ou falar mais devagar caso você não entenda alguma coisa.

Dinâmicas de grupo

Algumas empresas podem adotar, como parte de seu processo de recrutamento, dinâmicas de grupo. Essas consistem em um problema ou desafio que deve ser resolvido coletivamente por todos os candidatos, em um esforço conjunto.

Um exemplo de desafio proposto em uma dinâmica de grupo, passado a você e demais entrevistados, seria: uma empresa pretende lançar um novo jogo no mercado. Tal jogo deve ser jogado online pelos jogadores e em turnos, isto é, cada jogador terá sua vez. Vocês devem bolar, em conjunto, um jogo que satisfaça essas restrições e que seja o mais inovador possível.

Os candidatos devem resolver o desafio em um tempo fixo (por exemplo, 15 minutos) aos olhos dos entrevistadores, mas geralmente não podem interagir com esses últimos durante a resolução. Os entrevistadores, nesse momento, estarão observando o comportamento dos candidatos e anotando suas impressões sobre os mesmos.

Uma dica básica que eu ofereço para atuar em dinâmicas de grupo é inspirar-se em programas como o The Apprentice (“O Aprendiz”). As habilidades avaliadas pelos entrevistadores em dinâmicas de grupo em processos de seleção são similares aos critérios de aprovação/eliminação de candidatos usados nesses reality shows.

Uma das principais habilidades é a proatividade e capacidade de liderança. Não tenha medo de participar, de tentar conduzir a equipe à luz, ou até mesmo de errar. Não se iniba ou sinta vergonha. Se você ficar quieto no seu canto, calado, não tenha dúvida de que os entrevistadores não anotarão impressões muito positivas sobre você. Torne-se um líder implícito, pelo respeito, participando com sugestões criativas e que mostrem como seu conhecimento técnico e habilidades de comunicação são úteis para a solução do desafio proposto.

Entretanto, cuidado para não se impor em excesso. Saber ouvir os demais e trabalhar em equipe, em dinâmicas como essas, é essencial. Diante de algum impasse, é bem-visto propor soluções democráticas, como uma votação, ou ainda uma análise de custo-benefício para melhor avaliar as opções apresentadas.

Mais do que tudo, procure manter o foco da equipe no tempo restante e na objetividade. É melhor finalizar o desafio com um alguma resposta ou solução, mesmo não sendo perfeita ou 100% completa, do que ver o tempo acabar e nada ter sido proposto de fato pela equipe.

Por fim, lembre-se: as dinâmicas são exercícios coletivos, em que todos ganham ou todos perdem. Sempre busque em suas ações maximizar os resultados da equipe em relação ao desafio. Porém, invista em atitudes que, unindo o útil ao agradável, façam um pouco de marketing pessoal, revelando aos entrevistadores algumas das suas virtudes e habilidades.

Considerações finais

Existe a chance do entrevistador lhe perguntar sobre sua expectativa salarial em entrevistas presenciais. Dessa forma, é interessante ir para a entrevista já sabendo dos valores que o mercado pratica para posições de trabalho similares à desejada. O ideal nesses casos é nunca citar para o entrevistador um valor específico, e sim um intervalo de valores, o que pode dar margem a uma melhor negociação. O livro Programming Interviews Exposed oferece mais detalhes sobre o assunto.

Tão importante quanto responder as perguntas dos entrevistadores é também saber fazer perguntas, não só para sanar dúvidas sobre a empresa e a posição de trabalho aplicada, como também para mostrar interesse. Geralmente, os entrevistadores reservam um tempo ao final da entrevista apenas para que você esclareça dúvidas com eles. Assim, é interessante, antes da entrevista, informar-se sobre a empresa, sua posição de trabalho, sobre a equipe para a qual você está aplicando, etc. Leve suas dúvidas sobre quaisquer desses itens para o momento da entrevista.

Por fim, a última e mais importante dica de toda esta série de artigos é: seja você mesmo! Não queria projetar uma imagem de alguém que você não é; não corra o risco de soar artificial. Embora seja necessário trabalhar o seu próprio marketing no momento da entrevista, como vimos ao longo deste artigo, ser autêntico e espontâneo ainda são os elementos-chave para transmitir segurança, manter a calma e deixar todo o seu conhecimento e preparação fluírem naturalmente nesse momento que é o mais importante de um processo de seleção profissional.

Em meu blog antigo no The Spoke, relatei em mais detalhes cada etapa dos processos de recrutamento pelos quais passei. Se você procurar pelos arquivos a partir de junho de 2006, encontrará bastante coisa interessante sobre o assunto. Em especial, destaco o relato completo de minha experiência quando entrevistado pela Microsoft Corp.

Em meu novo blog no Live Spaces, apresento eventualmente dicas mais pontuais sobre processos de seleção em empresas de TI, assim como novidades de empresas que estão recrutando atualmente e experiências de trabalho nas mesmas. Aguardo sua visita!

No mais, boa entrevista, boa sorte e um feliz novo emprego!

Andre Furtado

Andre Furtado - Engenheiro de software e consultor do projeto Partec-MyTV, doutorando, mestre e bacharel em Ciência da Computação pela UFPE, Microsoft Student Partner, Certified MSF Practitioner, MCP, Certified IBM-DB2 Specialist, SCJP 1.4, um dos líderes do grupo de usuários Sharp Shooters .NET e campeão mundial das competições Imagine Cup 2005 e 2007.