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 é?
Respostas:
A terminologia é uma queda comum em uma situação de entrevista.
Você faz uma pergunta ao entrevistado usando terminologia que significa algo para você, mas o entrevistado pode conhecê-lo por um termo diferente ou apenas conhecer a teoria genérica sem aplicar a idiomas ou ambientes específicos. Mal-entendidos se seguem. Nenhuma das partes é feliz.
Na verdade, o entrevistado entende perfeitamente que alguns valores podem ser armazenados diretamente em um registro e outros referenciam um pedaço de memória em outro lugar, mas porque você faz a pergunta em um domínio específico, o ponto do que você está perguntando e o que você deseja que o entrevistado fale sobre você realmente não se entende.
Talvez você tenha muitas situações em que o entrevistado clica repentinamente e diz 'Ah - é disso que você está falando' - e depois explica de maneira bastante adequada.
É um equilíbrio difícil, porque os programadores recém-saídos da universidade não terão a experiência diversificada que o desenvolvimento do mundo real em um ambiente de equipe lhes proporciona. Enquanto isso, desenvolvedores experientes geralmente não se lembram (ou até se interessam) de tudo o que aprenderam na universidade porque é simplesmente irrelevante para o uso diário.
Estes dois tipos de pessoas (sim - que é o entrevistado eo entrevistador) necessidade de aprender a se comunicar com o outro antes que você pode aprender sobre o outro. O ônus recai sobre a pessoa com maior experiência (o entrevistador) para garantir que isso aconteça.
Sem mencionar o fato de que algumas pessoas obtêm falha de memória completa nas entrevistas. Eu mesmo incluído. Lembro que me pediram para escrever um programa em C e não consegui lembrar o símbolo usado para acessar um membro a partir de um ponteiro (->) e tive que perguntar a alguém. Não foi nem para o meu primeiro emprego. Rapaz tem esse momento me atormentou nos últimos 15 anos :-)
Muito mais útil, na minha opinião, é a capacidade de se comunicar, ser capaz de resolver problemas de maneira eficiente e completa; pegar as coisas rapidamente; mostrar atitude aguçada positiva; interagir bem com outras pessoas e outros valores fundamentais.
Não desista dos entrevistados porque eles não sabem o que é um tipo imediato. Ir em frente.
fonte
Você está solicitando conhecimento específico do idioma e os termos que você usa não são usados 100% iguais em todos os idiomas. Eu - por exemplo - não tenho idéia do que é um "tipo imediato".
Além disso, considere que as coisas ensinadas em uma universidade não são como criar código padrão no X, mas aprender muitos conceitos subjacentes e observar vários paradigmas de programação. Em outras palavras, é muito parecido com uma carteira de motorista - embora você conheça a teoria básica, ainda precisa de muita prática real.
fonte
"Eu ouço e esqueço. Vejo e lembro. Entendo." (E, na minha opinião, o entendimento leva a uma melhor retenção de memória.)
Simplificando, um graduado recente não tem muita experiência; portanto, como alguém observou, eles não terão muito mais do que o mínimo de conhecimento, independentemente de qual seja o idioma "escolhido".
Fui a uma faculdade que foi projetada especificamente para otimizar o aprendizado sobre a especialização escolhida (por exemplo, você não teria Literatura Histórica se fosse graduado em Ciências da Computação; o mais próximo que conseguiria de Literatura Histórica é Ficção Científica) e Quando terminei a faculdade, não teria sido capaz de dizer qual era a interface e muito menos a diferença para uma aula abstrata, embora tenhamos aprendido sobre abstração (e as interfaces são abundantes no .Net, a tecnologia que aprendi). Podemos ter tocado nas interfaces, mas ela se perdeu em todas as outras coisas que precisávamos saber para passar na aula. Não foi até o meu primeiro emprego fora da faculdade que eu aprendi sobre interfaces, particularmente de qualquer maneira significativa.
Você mencionou fazer entrevistas em francês, o que torna óbvio que estamos em países diferentes, portanto sua milhagem pode variar, mas aqui nos EUA as faculdades estão notoriamente atrasadas no que diz respeito à tecnologia. Portanto, a menos que você esteja lidando com idiomas maduros (C / C ++, COBOL etc.), também é bem provável que o que você esteja usando há anos não esteja disponível na versão em que os alunos aprenderam. Por exemplo, o .Net 3.0 introduziu o Entity Framework, o WPF, o WCF e uma série de outras coisas interessantes, mas até minha escola ainda estava presa no .Net 1.1 e 2.0 (o que significava estar presa ao ADO.NET e nem mesmo aprender sobre Objeto Mapeamento Relacional). Uma escola que usa PHP pode ficar presa no PHP (não OOP) 4.
Lembre-se também de que um aluno precisa coletar uma tonelada de informações que geralmente são usadas apenas por um curto período de tempo. Conceitos "avançados", como abstração, geralmente são ensinados no final da aula, onde o aluno pode ter apenas uma semana para brincar com ele, enquanto enfrenta as outras aulas que ele / ela tem que frequentar e, possivelmente, parte superior de um trabalho de meio período ou período integral. Combine tudo isso e é uma maravilha que a pessoa possa se lembrar de qualquer coisa , muito menos manter tudo reto.
Nos EUA, pelo menos, muitas vezes se supõe que um graduado recente não saiba nada além do básico genérico (talvez a diferença entre passar por valor e passar por referência), porque se entende que a teoria genérica e a solução de problemas são a parte principal de escola, não aprendendo os meandros de um determinado idioma.
Eu recomendo usar as perguntas que você teve mais como um indicador do que você precisará ensinar / re-ensinar (lembre-se, é perfeitamente possível que elas simplesmente não tenham aprendido o termo que você está tentando usar, mesmo se você acha que é onipresente), ao contrário de o entrevistado ser ou não "inútil". Combine isso com a avaliação de como eles estão dispostos a aprender e como são suas habilidades gerais de resolução de problemas (sério, dê a eles um enigma para resolver e ver como eles o fazem), e você pode muito bem ter uma futura estrela do rock que você pode ter passado despercebido porque eles não sabiam o que você queria dizer com "pilha de chamadas".
fonte
Você tem várias visualizações estreitas e as assume implicitamente.
Que eu saiba, não há universidade, onde as pessoas estudam programação por alguns anos. As universidades oferecem cursos de ciência da computação, dos quais a programação é um aspecto.
Regra prática: se o Lisp pode fazer sem a distinção, é apenas desorganização;)
Falar sobre conceitos independentes de linguagem é uma boa ideia. Nem a pilha nem a pilha são independentes de idioma.
Todos esses idiomas têm especificações. A implementação é indefinida pelo idioma. C e C ++ podem ser compilados de forma cruzada usando o LLVM para executar no Flash Player ou em qualquer tempo de execução JavaScript. Isso faz com que suas suposições sobre alocação de pilha e pilha sejam anuladas.
Com o C #, é praticamente o mesmo. O C # é JITed antes da execução com muita otimização, o que pode ser feito. Variáveis locais, que são capturadas por fechamentos, acabam acabando no heap, em vez da pilha, enquanto a análise de escape permite armazenar objetos locais do escopo (que normalmente devem ir para o heap) para serem armazenados na pilha. A alocação adequada de registros também reduzirá bastante a necessidade de alocação de pilha.
O que você perguntaria a alguém que possui apenas uma vasta experiência em programação com Haskell? : P
A idéia básica por trás do autoboxing é que as primitivas também podem ser tratadas como objetos (ou pelo menos valores que tipo podem ser descobertos em tempo de execução). Em relação a essa abstração, existem três tipos de idiomas:
Não vejo por que as pessoas não deveriam usar idiomas da categoria 1 (na verdade, é uma boa ideia). Não vejo por que as pessoas que usam idiomas da categoria 2 realmente se incomodam. E acho que todo mundo que usa uma linguagem da categoria 3, ou seja, aquela em que um recurso semântico principal é simplesmente quebrado, está usando a linguagem errada.
Agora isso é altamente subjetivo e realmente depende do idioma. C ++ não possui interfaces. Objective-C não tem classes abstratas. Eu argumentaria que qualquer linguagem que possua ambas as necessidades precisa ser redesenhada. Muitas linguagens modernas usam características, mixins, categorias, funções e construções semelhantes para fornecer soluções muito mais limpas para reutilização de código do que a herança de implementações parciais. Linguagens baseadas em protótipo não têm classes de qualquer maneira.
Em última análise, este é um assunto difícil e contestado. Uma entrevista dificilmente é o lugar certo para resolver essa questão e eu realmente não diria que alguém se candidatando a uma posição júnior por não me dar uma boa resposta.
Existem várias linguagens orientadas a objetos que não usam herança ou vtables clássicas.
Meu conselho:
O importante é entender como esses fatos simples e isolados podem ser aplicados à engenharia de soluções flexíveis e sustentáveis para problemas complexos.
Para chegar à pergunta real:
Todas as empresas têm problemas para atrair pessoas habilidosas, exceto talvez os grandes players. Isso é porque há alguns deles. E por causa do pressuposto de que a universidade torna as pessoas hábeis. Não faz. Isso os torna conhecedores (supondo que o aluno e a universidade sustentem sua parte na barganha). Experiência é o que torna as pessoas hábeis.
Alguns já adquiriram experiência antes de ingressar na universidade e o fazem durante os estudos. Porque eles gostam de programar e porque, quando aprendem alguma idéia nova durante um curso, tentam ver como podem usá-la, a primeira coisa que voltam para casa. Esse é o tipo de pessoa que você gostaria de contratar. Mas há alguns deles.
É a paixão pela programação e o auto-aperfeiçoamento e sua busca que torna os programadores bons. Em tempo.
Eu acho que o que você deve perceber é que, infelizmente, a maioria das pessoas entra e sai da universidade sem experiência em programação suficiente.
Ao mesmo tempo, nossa indústria precisa muito de programadores experientes. Portanto, acredito que é a missão da nossa indústria realmente tentar intervir. E entrevistando candidatos para cargos juniores, o que você está procurando realisticamente são pessoas dispostas a aprender e melhorar. E você deve escolher com cuidado, porque precisará investir muita energia e não quer que isso seja desperdiçado.
Pense nisso como contratar um sangue novo para se tornar um piloto para sua equipe de corrida: um bom piloto tem um conhecimento suficiente da mecânica para fazer o melhor uso possível do carro, mas esse conhecimento por si só não serve para nada (não é nem um pouco cabeça) começar). O que você está procurando é alguém disposto a trabalhar duro em seu próprio aprimoramento e bem com sua equipe.
fonte
Independentemente do termo "tipo imediato" do qual eu não tenho idéia (tipo de valor? OK, não tinha certeza, obrigado pela atualização), acho que você está certo sobre suas perguntas e totalmente não é extremista. Estas são perguntas respondíveis se alguém estiver saindo da escola. Ainda assim, não vou demitir os candidatos imediatamente, ainda há alguns que podem ter potencial porque querem aprender.
Para continuar com a analogia da carteira de motorista: algumas pessoas não se importam com o que acontece quando inserem a chave (ou pressionam o botão "Iniciar"). Eles apenas fazem isso e dirigem. Isso não significa que eles também não valem nada, apenas que levará tempo para chegar ao estrelato ;-)
Apenas uma observação pessoal sobre o grau / diploma: Atualmente, estou trabalhando com pessoas com formação em bioquímica e industrial que têm alguns anos de experiência no campo de TI e também com alguns "experientes" com formação em CS, e acho que são os mais conhecedores sobre como o motor do veículo funciona? Sim, não são os caras que estudaram CS! Então, estou apenas experimentando o fato de que o diploma nem sempre importa!
fonte
Geralmente, não faço perguntas específicas sobre terminologia ou definições durante as entrevistas. Como outras respostas observaram, as pessoas têm termos diferentes para conceitos diferentes e, embora possam entender conceitualmente o assunto, podem não ser capazes de transmitir isso a você.
Com os juniores, estou intensamente focado em seus estágios ou projetos escolares. Faço perguntas sobre perguntas sobre eles, deixo-os articular respostas e depois começo a mergulhar mais fundo no envolvimento real no projeto, no que aprenderam e no que sentiram.
Geralmente, se a pessoa era de peso morto no projeto, ela geralmente não pode me dar respostas satisfatórias, por isso é geralmente fácil de dizer. Apenas tome cuidado para não confundir nervoso e introvertido por desinteressado e não envolvido.
Ser capaz de determinar o bom candidato que é tímido e introvertido é um pouco difícil, mas a cultura em que trabalho não seria boa para um desenvolvedor introvertido e tímido, portanto, se eles não conseguirem manter uma conversa produtiva e detalhada comigo, eles não são um bom ajuste.
fonte
Isso é muito injusto. Quando você é estudante, tudo o que você pode fazer é escolher a universidade mais bem classificada em que suas notas o levarão, ou talvez aquela que anuncia que permite que você brinque com cães robóticos que jogam futebol. Nada mais. Você só pode avaliar um curso universitário depois de o ter feito, depois desaparecer e trabalhar na indústria por alguns anos e construir alguns projetos não triviais.
Mesmo se você exibisse um enorme letreiro de néon em todos os cursos dizendo "NÃO ENSINAMOS A PILHA DE CHAMADA", o que você espera que os alunos façam a respeito? Passe meses pesquisando para que eles possam realmente entender o que isso significa e quanto eles precisariam de alguém que o ensinasse? Para todo curso com toda combinação de sinais?
As pessoas não escolhem sua educação, realisticamente.
fonte
Ao entrevistar os recém-formados, mantenho os tópicos listados em seu currículo. Se eles usassem Java, eu perguntarei a eles sobre Java. Se eles usaram o Blub, passo meia hora lendo sobre o Blub e pergunto sobre isso. Mas eu sempre pergunto usando as palavras-chave do idioma. Se for Java, perguntarei sobre "estende" e "implementa", mas não "subclasse" e "herda". Eu espero que os novos graduados possam falar sobre algum código que eles escreveram, sejam capazes de resolver um simples problema de programação e tenham uma noção das estruturas básicas de dados (tabelas de hash e árvores).
fonte
Como diretor que projetou o processo de entrevista, posso lhe informar o que nossa empresa espera dos novos graduados: espero pessoas que possam ler a documentação e aplicar conhecimentos. Portanto, temos algumas tarefas muito práticas que pedimos que realizem. Essas são tarefas simples de codificação, não muito mais difíceis do que o exercício médio da turma da faculdade (desenvolvedores "bons" experientes podem eliminá-lo em cerca de 15 minutos). O candidato recebe uma estação de trabalho com acesso à Internet, um compilador (no nosso caso, o visual studio) e arquivos de ajuda.
Se eles não puderem escrever código nessas condições, não serão considerados como contratados. Simples assim. A desculpa "bem, eu não conheço o idioma" nunca chegou a mim, porque todo candidato que vem aqui entrevistar sabe que haverá um teste, eles conhecem os idiomas e as ferramentas que usamos no início. Você pode baixar o visual studio express em casa e fazer algumas noções básicas antes de entrar e passar no teste de nível básico, aqueles que não se incomodam ... bem, é isso que eu chamo de bandeira vermelha.
fonte