Parece que há uma enorme discrepância entre o que eu espero de alguém que estudou programação por alguns anos na universidade e o que realmente sabemos.
Não sinto que estou fazendo perguntas complicadas em entrevistas. Algumas das minhas perguntas habituais são:
Qual é a diferença entre um tipo de referência e um tipo de valor?
Se parece que o entrevistado realmente não entende sua própria resposta, ou se ele não conhece a terminologia que estou usando, entro em mais detalhes pedindo que ele me explique o que acontece quando escrevo int i = 0; em um método, o que acontece com o objeto o = 0, objeto o = new MyClass (), etc ...
Basicamente, faço tudo o que posso para convencer o entrevistado a me falar sobre a pilha de chamadas, a pilha etc., e tento permanecer nos conceitos agnósticos da linguagem. Se o entrevistado me disser que fez muito C, ou C ++, ou c #, eu me aprofundarei na linguagem específica e, possivelmente, nos detalhes da implementação.
Se necessário, pergunto ao entrevistado o que é uma pilha de chamadas ou onde são armazenados os argumentos passados para uma função na linguagem imperativa de sua escolha.
a maioria dos entrevistados não tem idéia do que é uma pilha de chamadas, quanto mais considerações sobre boxe etc.
Qual é a diferença entre uma classe abstrata e uma interface. Em quais casos você deve usar um sobre o outro?
Normalmente, também peço que imaginem o design de uma pequena biblioteca com um caso de uso que visa usar alguma herança e algumas fábricas abstratas
A maioria dos entrevistados não tem idéia do real propósito da herança. Eles geralmente conhecem algumas palavras-chave (virtuais, substituem etc.), mas não sabem quando usá-las, muito menos explicam o que é uma tabela virtual.
Mesmo que eu analise os currículos de antemão, mesmo para pessoas com 5 anos de experiência em projetos da vida real envolvendo arquiteturas complexas, eu diria que menos de 25% de todos os meus entrevistados podem responder adequadamente a essas duas perguntas. E quando digo corretamente, não quero dizer 'aprofundado' ... apenas para ter uma idéia aproximada do que é o conceito.
Em relação aos juniores, estou bem em contratar alguém que não sabe organizar muito bem seu tempo, ou alguém que não está acostumado a processos de construção industrial, por exemplo, mas tenho a sensação de que, se alguém não ouviu a palavra " depois de alguns anos estudando Ciência da Computação, ele é estúpido ou desmotivado ou escolheu sua universidade de maneira imprudente.
Você acha que eu sou muito extremista aqui? É comum aprender esses conceitos básicos depois de concluir a universidade? Você conhece pessoas que não estavam familiarizadas com isso e se tornaram muito bons engenheiros de software depois de alguns anos? E você acha que minha empresa pode ter um problema em atrair pessoas talentosas ou você enfrenta o mesmo tipo de problema em seu próprio processo de contratação?
Editar. em relação ao "tipo imediato", era apenas uma tradução literal do francês para o inglês, como costumamos fazer nossas entrevistas em francês. Eu o corrigi na minha pergunta. Mas ainda assim, acho que todos vocês entendem perfeitamente o que eu quis dizer, o que meio que faz o meu ponto de vista, não é?