Costumo fazer uma entrevista técnica a cada quinze dias. Vou passar a publicar o roteiro das entrevistas aqui, começando por uma fiz na semana passada para o cargo de Desenvolvedor Sênior de uma empresa de apostas da Irlanda. Na empresa não ganha dinheiro diretamente com as apostas, mas sim com um algoritmo que gera as estatísticas (rates) para os possíveis resultados de um jogo, inclusive quando ele está em andamento. Uma das principais ocupações lá é a manipulação de grandes arquivos textos, com dados desconhecidos e que necessitam de um rigoroso controle de memória.
Algumas das perguntas que me foram feitas durante a entrevista, que durou quase uma hora e meia, estão listadas abaixo.
Arquitetura e padrões
- O que é RestAPI? O que faz uma API ser REST?
- Quais são os princípios SOLID? Você concorda com todos eles? Se você tivesse que escolher apenas um deles para seguir, qual seria?
- Quais os design patterns da Gang of Four você conhece? Explique o pattern decorator e dê um exemplo prático de quando ele pode ser usado.
- Dê um exemplo de quando você utilizaria um banco de dados NoSQL ao invés de um banco transacional
C#
- O que é Injeção de Dependência (dependency injection)? Quais são as principais vantagem do seu uso? Você vê desvantagens neste tipo de abordagem? Quais os frameworks de Injeção de Dependência que você conhece/já trabalhou?
- O que é o Garbage Collection e como ele funciona?
- Do que trata a classe IDisposable? Cite um exemplo de quando se deve implementá-la.
- O Linq (Language-Integrated Query) pode ser usado em quais fontes de dados (data sources)?
- O que são tipos anônimos (anonymous type)?
- Qual a diferença entre value type e reference type? Um objeto do tipo value type é armazenado na mémoria heap ou na stack?
- O que são tipos dinâmicos (dynamic type)?
- Por que um string é imutável? Se ela não fosse, quais seriam as consequências?
- Diferencie threads de tasks.
Comentários sobre a questão envolvendo Princípios SOLID
Como pode ser visto não há nada de muito surpreendente nas perguntas, com exeção da questão sobre os princípios SOLID. Não a questão para explicar os princípios, esta é recorrente. Tão recorrente que, eu diria, está presente na maioria absoluta das entrevistas. O que surpreendeu foram as duas questões que se seguiram a partir dela.
Você concorda com todos eles? Respodi que sim, mas com restrições. Na verdade acho que o princípio open-close que diz que “as entidades devem ser abertas (open) para extensão mas fechadas (close) para alterações” pode ser quebrado quando a nova funcionalidade estiver diretamente relacionada com o que faz a classe em questão.
Por exempo, imagine que você possui uma classe que valida um conjunto de dados contendo datas e números. Depois de algum tempo, uma nova regra surge e é preciso também passar a validar se um determinado campo string possui apenas os valores válidos (por exemplo, a lista de estados brasileiros). Esta validação deveria estar em uma nova classe? Não, então o princípio open-close foi quebrado.
Se você tivesse que escolher apenas um deles para seguir, qual seria? Eu disse que a resposta óbvia aqui seria o primeiro deles (responsabilidade única – single responsability), mas que eu optaria pelo princípio de substituição de Liskov (Liskov Substitution), que diz que “se S é um subtipo de T, então os objetos do tipo T”devem poder ser substituídos pelos objetos de tipo S sem que seja necessário alterar as propriedades do programa”.
O motivo da escolha dele é que para não violá-lo as abastrações precisam ser muito bem estruturadas, ou seja, a arquitetura do software precisa ser muito bem pensada. Além disto, provavelmente será preciso usar injeção de dependência, que está diretamente correlacionado com outro princípio do SOLID: Inversão de Dependência – Dependency Inversion, o que significa que minhas classes terão baixo acoplamento, sendo assim fáceis de serem mantidas.
Roteiro de Entrevista | ||
País: Irlanda | Cargo: Desenvolvedor Sênior |
Ramo de negócio da empresa: Apostas |