Pergunta original
Eu já fiz algumas entrevistas para a minha empresa, principalmente cientistas da computação para cargos de desenvolvedor, mas também alguns testadores e gerentes de projeto. Agora tenho que preencher uma vaga em nosso grupo de pesquisa no departamento de P&D (observação: "pesquisa" significa que tentamos resolver problemas em nosso domínio profissional / nicho de mercado usando software em projetos de pesquisa em conjunto com universidades, outras empresas, centros de pesquisa e organizações de usuários finais.Não é pesquisa em ciência da computação; não vamos resolver o problema P = NP).
Agora convidamos um cara com um mestrado em química (com muita física em seu currículo também), que nunca teve nenhuma aula de ciência da computação. Eu já conversei com ele cerca de meia hora nos dias de carreira de uma universidade local e não há dúvida de que o cara é inteligente. Também suas notas são excelentes e ele se formou com distinção. Para seu bacharelado, ele precisava aprender a programar no Mathematica e me disse que gostava muito de programar. Ele também resolveu um problema de físico-química que eu provavelmente não entendo usando seu próprio software, implementado no Mathematica, para sua tese de mestrado. Inclui uma GUI e um tamanho notável de 8.000 LoC. Ele parece estar muito atraído pelo que estamos fazendo em nosso grupo de pesquisa e, para ser honesto, é bastante difícil para uma PME como nós conseguir pessoas boas. Também estou muito interessado em contratá-lo, pois ele poderia me ajudar a escrever propostas de projetos, relatórios, fazer apresentações e assim por diante. Ele provavelmente se encaixaria em nossa equipe também.
A única pergunta que resta é: como posso verificar se ele obterá as habilidades de programação necessárias para implementar o software em nossos projetos, pois isso será uma parte significativa do trabalho?
É claro que vou perguntar a ele o que é, o que o fascina sobre programação. Também perguntarei como ele começou a escrever seu software de ciências naturais e como ele o estruturou. Perguntarei como ele conseguiu obter as habilidades e informações sobre desenvolvimento de software de que precisava. Mas há algo mais que eu poderia perguntar? Algo mais concreto, talvez? Devo pedir que ele explique sua solução Mathematica?
Para ser claro: não estou procurando conhecimento em um determinado idioma ou pilha de tecnologia. Somos uma loja .NET em desenvolvimento de produtos, mas quero ter uma escolha livre para nossos projetos de pesquisa. Então, eu estou interessado na meta-competência ser capaz de aprender o que é realmente necessário.
Espero que esta pergunta seja respondida e não seja aberta, pois realmente gosto de saber se existe uma maneira padrão de verificar a capacidade de obter mais habilidades de programação no trabalho. Se algo não estiver claro para você, faça-me alguns comentários e deixe-me melhorar minha pergunta.
Atualização para refletir as respostas dadas até 01/12/2011
Qual resposta eu aceitei e por que
Obrigado a todos por suas respostas, a maioria delas é bastante útil, então eu votei muito! Embora a resposta de Tom Squires tenha mais votos, vou aceitar a resposta dada pelo príncipe Goulash . É claro que Tom está objetivamente correto, mas a resposta de Prince é apenas mais útil para mim e verifiquei duas vezes o FAQ de que este é o critério para aceitar uma resposta.
O que vou perguntar durante a entrevista
Vou deixá-lo explicar algumas tarefas simples, como o exemplo em O Camelo Tem Duas Corcovas, mencionado por Chris Burt-Brown
Pedirei a ele para explicar alguns fluxos de controle mais avançados, talvez em uma notação gráfica.
Vou verificar seu entendimento de recursão usando um exemplo de matemática.
Vou deixá-lo explicar um algoritmo de sua escolha na linguagem natural.
Deixarei que ele explique sua solução Mathematica, em particular solicitarei seu modelo de procedimento, uso de ferramentas, estruturação de código e software em geral, bem como diferentes camadas de abstração.
Para verificar sua motivação, pedirei seu fascínio pelo desenvolvimento de software.
Vou perguntar se ele está ciente do que precisará aprender sobre o desenvolvimento de software corporativo. Especialmente, quero transformar a discussão na direção de trabalhar em equipes, programação em pares, TDD, já que espero que ele não saiba muito sobre isso depois de trabalhar sozinho no mestrado.
Parece que vai ser uma longa entrevista;)
Atualização após a entrevista 09/12/2011
Mais uma vez obrigado a todos por suas boas respostas. Ele passou na entrevista com cores voadoras. Eu nunca fiquei tão satisfeito com um candidato. Sua solução Mathematica parece estar bem estruturada. Ele foi capaz de explicar onde usava funções de ordem superior, embora não soubesse que essas são referidas dessa maneira. Ele respondeu minhas perguntas de recursão baseadas em matemática, bem como tarefas simples e fluxo de controle do The Camel Has Two Humps. Quando ele estava explicando alguns algoritmos, aprendi muito sobre ajuste não linear;) Ele também disse honestamente que é claro que não pode garantir que será capaz de aprender coisas sobre desenvolvimento profissional de software que ele não conhece até agora. Mas ele acredita que sempre foi bom em aprender novos conceitos - mesmo por ele mesmo - e está realmente interessado no desenvolvimento de software. Ele também pediu para a pilha de tecnologia do projeto, a qual ele seria aplicado primeiro, para dar uma olhada em casa. Ele também estava curioso sobre a programação em pares e o trabalho em equipe. Agora espero que o contrato de trabalho seja concluído.
Respostas:
Sou muito tendencioso aqui porque comecei como desenvolvedor de software há alguns anos com um doutorado em física, mas com pouquíssima experiência em codificação (equivalente a um curso de graduação em Fortran). Claramente, depende do tipo de software que você está desenvolvendo, mas minha opinião é de que as habilidades de codificação são muito fáceis de serem aprendidas por qualquer pessoa com habilidades científicas / de resolução de problemas meio decentes. Não pretendo isso como um insulto aos programadores ao longo da vida que estudaram ciência da computação: é claro que existem aspectos técnicos que exigem treinamento sério para serem dominados (por exemplo, arquitetura multiencadeada e de nível muito baixo), mas presumo que seja não é a posição que você está tentando preencher.
Na minha entrevista técnica para minha posição atual, fui confrontado com um problema matemático razoavelmente complexo e fui solicitado a criar um programa para resolvê-lo. A ênfase estava na escrita de um algoritmo que, uma vez implementado, resolveria o problema. Eu poderia escrever uma resposta usando apenas palavras para descrever minha solução, mas me foi permitido escrever algum código em um idioma de minha escolha, se assim o desejasse. O teste foi mais sobre a capacidade de resolução de problemas e se eu era capaz de "pensar como um programador". Obviamente, se houvesse candidatos com a mesma habilidade e alguém tivesse mais experiência direta em codificação, ele teria saído por cima, mas isso parece justo o suficiente para mim.
A linha inferior é: examine o candidato para as habilidades pelas quais você o está contratando, não para os ideais que você espera que ele atinja.
fonte
Você não pode . É impossível testar com precisão uma habilidade que ele ainda não possui. Você tem que fazer um julgamento com base em sua inteligência e atitude. Em última análise, sempre será um risco.
Por experiência pessoal, posso dizer que é muito possível fazer a transição da ciência para a programação. Ambos basicamente se resumem a usar seu cérebro para resolver quebra-cabeças complexos.
fonte
Não tenho fontes secundárias para verificar este documento, portanto não posso atestá-lo, mas:
O camelo tem duas saliências
http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf
fonte
Como posso verificar se ele obterá as habilidades de programação de que precisa?
É muito simples. Dê a ele as habilidades.
Agora, essa não é uma resposta muito satisfatória, mas deixe-me elaborar.
Eu vim para programação depois de fazer 3 anos em Engenharia Civil. Essa é uma sólida formação em física aplicada e matemática. Não é a matemática teórica que um diploma de CS daria, mas vale alguma coisa. O que tirei da experiência em engenharia foi uma sólida formação na solução de problemas . Qualquer pessoa com formação em matemática já aprecia o conceito de elegância ao falar sobre uma solução para um problema. Eles já têm uma educação em refatoração desde que gastaram tempo tirando seis páginas de raspadinha e convertendo-a em uma elegante prova de meia página para envio.
Quem estudou física desenvolveu uma abordagem intuitiva para juntar uma solução a partir de estruturas básicas.
E o que é programação fora dessas habilidades? - Linguagem, Idioma, Padrões e Frameworks. Estes são fáceis de ensinar. É a solução de problemas que você não pode. Se você for capaz de fornecer instruções nessas áreas, terá um bom desenvolvedor.
A pergunta então se torna "Quanto tempo você pode esperar que ele se apresse?"
tl; dr; Você pode ensinar a digitar. Você não pode ensinar de maneira inteligente.
fonte
Sou bacharel em Ciência dos Materiais, mas trabalhei toda a minha carreira em desenvolvimento de software.
Eu sugeriria que seu candidato provavelmente não terá problemas com a programação e os algoritmos básicos, mas quando se trata de requisitos do tipo "engenharia", ele pode precisar de alguma orientação. Com isso, quero dizer estruturar bem seu código, não ter 500 funções de linha, testar efetivamente, projetar para obter eficiência ...
Muito disso pode ser ensinado, mas você pode elaborar algumas perguntas para esclarecer isso.
fonte
Parece-me que o candidato já sabe programar, desde que ele não tenha tanta experiência como desenvolvedor dedicado, mas eles têm um projeto demonstrável que concluíram que exigia uma quantidade não trivial de trabalho. Dessa forma, você poderá entrevistar o candidato da mesma maneira que faria com um desenvolvedor que usa um idioma diferente daquele que você compra, a saber:
A linguagem que o Mathematica usa é bastante avançada e alguém que é bom em escrever software para o Mathematica deve ser bastante competente em outras áreas, portanto, focar nessa experiência e usá-la como base para a experiência de codificação pode ser uma boa maneira de abordar a entrevista.
fonte
Falando como um graduado em Engenharia Aeroespacial que se tornou programador, certamente é possível dar o salto das ciências naturais para a programação. No entanto, esteja avisado: a capacidade de resolver problemas nem sempre se correlaciona com a capacidade de escrever código. Você parece perceber isso e isso é uma coisa boa.
Para mim, os conceitos mais importantes para garantir que ele compreenda são o controle de fluxo e recursão (e o loop em geral como um subconjunto disso). Antes de contratar um candidato, mesmo alguém claramente muito inteligente tenha certeza de que pode escrever um algoritmo de palavras simples para resolver problemas. Certifique-se de que ele possa pegar o algoritmo de palavras simples e transformá-lo pelo menos em pseudo-código. Você pode até tentar ver se ele consegue entender pelo menos o conceito de polimorfismo, embora não tenha certeza de que esse seja o conhecimento necessário nessa circunstância.
Também tenha cuidado com a capacidade de resolver problemas científicos no Mathematica / MatLab / Whatever, o que não significa que ele possa escrever um bom código. Significa apenas que ele é capaz de aplicar princípios básicos de programação (às vezes extremamente básicos), geralmente declarações if / else. Aprender a ser um bom programador geralmente exige um compromisso pessoal e do empregador com alguém nesse estágio. Aviso: Conheci pessoas muito inteligentes que eram / são bons engenheiros que não conseguiam sair de um saco de papel e, honestamente, não conseguiam entender os fundamentos básicos da linguagem.
Experiência pessoal
Eu me formei na escola com um diploma de engenharia e um pouco de experiência em programação. Eu havia trabalhado com uma quantidade muito pequena de C, bastante MatLab e alguns VB + Access. Demorei cerca de 3 meses estudando para me tornar realmente útil como programador em uma loja VB.NET. Levei mais nove meses para me tornar totalmente proficiente. No entanto, posso, com um bom grau de confiança, dizer que minhas habilidades de resolução de problemas são superiores a 99% dos outros programadores que conheci em meu trabalho. Meus empregadores sempre me consideraram um de seus ativos mais valiosos.
Conclusão
É uma proposta de risco / recompensa, mas muitas vezes a contratação de alguém com habilidades puras de resolução de problemas pode render a longo prazo, desde que seja capaz de aprender os conceitos de programação e que ambos estejam dispostos a investir tempo na expansão da programação dele. conhecimento. No entanto, acredito firmemente que ele deve possuir pelo menos um entendimento básico dos fundamentos da programação antes que você lhe ofereça um emprego. Na minha experiência, uma vez que você está nesse ponto, pode ir muito além.
fonte
Eu começaria com algumas perguntas e conceitos básicos sobre algoritmos para ver se ele está dentro da lógica dos algoritmos e da programação. Se ele é capaz de entender o que é um algoritmo, ele pode eventualmente desenvolver as habilidades necessárias para fazer coisas concretas posteriormente.
fonte
Honestamente, tenho certeza de que você não obterá essas informações em uma entrevista de uma ou duas horas. Dê a ele uma tarefa de programação em C # (algo não muito técnico) e uma ou duas semanas para resolver. Isso deve ser tempo suficiente para aprender o básico da linguagem para alguém que já tenha aprendido a programar com o Mathematica. Em seguida, faça uma revisão de código com ele e decida sobre essa base.
fonte
Você pode consultar Práticas para programação em um ambiente científico? (no Stack Overflow) para ter uma idéia de como é a cultura de programação das ciências naturais. Dessa forma, você está em posição de comparar a preparação dele com a de seus colegas.
Nesse caso, você pode pedir que ele descreva as práticas de programação com as quais está acostumado, a fim de descobrir se está ciente de que existem outras maneiras de fazê-lo .
Existem muitos "bons programadores" em minha empresa, cuja qualificação é capaz de manter um estado suficiente na cabeça para juntar algum código funcional, mas cujo trabalho tende a ser desestruturado e difícil de manter. Geralmente eles podem ser ensinados, mas ... eles têm que ser ensinados.
fonte
Outro departamento em que trabalho utiliza uma variação em nosso teste padrão. A primeira tarefa é inverter as palavras em uma string no lugar. Em seguida, use esse código para reverter a ordem das palavras na sequência, ainda no lugar. Em vez de usar uma linguagem de programação, o candidato deve projetar os algoritmos no papel e executá-los usando uma placa Scrabble.
fonte
Eu pediria para descrever (usando linguagem natural) um algoritmo para calcular algo da física. Algo um pouco mais complicado que uma fórmula simples e então eu perguntaria como ele veria o cálculo dele encapsulado em objetos (não há necessidade de conhecimento de OOP, você poderia explicar qual é a sua expectativa de um objeto). Desta forma, você pode ver o seu pensamento lógico. Isso é mais importante do que qualquer habilidade de programação.
fonte
Primeiro, eles são provavelmente muito inteligentes; portanto, no pior cenário, podem aprender a ser um bom programador com orientações. No entanto, se você precisar deles e se tornar um programador decente desde o início, peça que eles enviem algum código de amostra que eles escreveram.
É uma ou duas funções multifuncionais gigantes ou elas encapsulam a funcionalidade nos níveis apropriados de abstração? Os números mágicos são codificados por toda parte? O código está SECO? Eles deram nomes razoáveis às variáveis ou é tudo uma abreviação indecifrável ou variável de letra única? Você pode principalmente seguir a lógica do código deles? Eles entendem o básico sobre OO?
Pergunte o que eles usam para o controle de versão (git / hg / svn / cvs / bzr, etc.). Eles já criaram um perfil de código ou usaram um depurador e, em caso afirmativo, quais ou qual é a estratégia de depuração genérica?
Se eles falharem nesse teste e você precisar de um bom codificador desde o início, pule essa pessoa. Caso contrário, contrate-os, sugira que leiam alguns livros de engenharia de software (por exemplo, Code Complete) além de livros genéricos de programação / CS.
(Para constar, também sou cientista físico que virou programador.)
fonte
Como ele ainda está na universidade ou apenas recentemente terminou, ele está acostumado a estudar. Faça com que ele leia e compreenda o livro Design Patterns e depois (ou durante) de um mês, converse com ele sobre os tópicos. (Acho que) isso pode lhe dizer muito sobre as habilidades dele (não apenas as difíceis (também)), mas também como ele lida com a apreensão de novos conceitos, a compreensão do uso deles, os prós e os contras etc.). Mas custará um mês.
fonte