Question d'origine
J'ai déjà réalisé quelques interviews pour mon entreprise, principalement des informaticiens pour des postes de développeur mais aussi des testeurs et chefs de projets. Maintenant, je dois combler un poste vacant dans notre groupe de recherche au sein du département R&D (note latérale: «recherche» signifie que nous essayons de résoudre des problèmes dans notre domaine professionnel / niche de marché en utilisant des logiciels dans des projets de recherche avec des universités, d'autres entreprises, des centres de recherche et les organisations d'utilisateurs finaux. Ce n'est pas de la recherche en informatique, nous n'allons pas résoudre le problème P = NP).
Maintenant, nous avons invité un gars titulaire d'une maîtrise en chimie (avec beaucoup de physique dans son CV aussi), qui n'a jamais suivi de cours d'informatique. J'ai déjà parlé avec lui environ une demi-heure lors des journées de carrière d'une université locale et il ne fait aucun doute que le gars est intelligent. Ses notes sont également excellentes et il a obtenu son diplôme avec distinction. Pour son BSc, il avait besoin de s'enseigner lui-même la programmation en Mathematica et m'a dit de manière crédible qu'il aimait beaucoup la programmation. Il a également résolu un problème de chimie physique que je ne comprends probablement pas en utilisant son propre logiciel, implémenté dans Mathematica, pour sa thèse de maîtrise. Il comprend une interface graphique et une taille notable de 8 000 LoC. Il semble être très attiré par ce que nous faisons au sein de notre groupe de recherche et pour être honnête, il est assez difficile pour une PME comme nous d'avoir de bonnes personnes. Je suis également très intéressé à l'embaucher, car il pourrait m'aider à rédiger des propositions de projet, des rapports, des présentations, etc. Il conviendrait probablement aussi à notre équipe.
La seule question qui reste est: comment puis-je vérifier s'il obtiendra les compétences en programmation dont il a besoin pour faire l'implémentation de logiciels dans nos projets, car ce sera une partie importante du travail?
Bien sûr, je vais lui demander ce que c'est, cela le fascine dans la programmation. Je vais également demander comment il a procédé à l'écriture de son logiciel de sciences naturelles et comment il l'a structuré. Je vais lui demander comment il a réussi à obtenir les compétences et les informations sur le développement logiciel dont il avait besoin. Mais est-ce que je pourrais demander plus? Quelque chose de plus concret peut-être? Dois-je lui demander d'expliquer sa solution Mathematica?
Pour être clair: je ne recherche pas de connaissances dans une langue ou une technologie particulière. Nous sommes une boutique .NET dans le développement de produits mais je veux avoir un choix libre pour nos projets de recherche. Je m'intéresse donc à la méta-compétence d'être capable d'apprendre tout ce qui est réellement nécessaire.
J'espère que cette question peut être résolue et non ouverte car j'aime vraiment savoir s'il existe un moyen par défaut de vérifier la capacité à acquérir d' autres compétences en programmation sur le tas. Si quelque chose n'est pas clair pour vous, veuillez me faire quelques commentaires et laissez-moi améliorer ma question.
Mise à jour pour refléter les réponses données jusqu'au 2011-12-01
Quelle réponse j'ai acceptée et pourquoi
Merci à tous pour vos réponses, la plupart d'entre elles sont très utiles, j'ai donc beaucoup voté! Bien que la réponse de Tom Squires ait obtenu le plus de votes, je vais accepter la réponse donnée par le prince Goulash . Bien sûr , Tom est objectivement correcte, mais la réponse du prince est un peu plus utile pour moi et je revérifié la FAQ que c'est le critère d'accepter une réponse.
Ce que je vais lui demander pendant l'entretien
Je vais le laisser expliquer quelques tâches simples comme l'exemple dans The Camel Has Two Humps mentionné par Chris Burt-Brown
Je lui demanderai d'expliquer quelques flux de contrôle plus avancés, peut-être dans une notation graphique.
Je vais vérifier sa compréhension de la récursivité en utilisant un exemple mathématique.
Je vais le laisser expliquer un algorithme de son choix en langage naturel.
Je vais lui laisser expliquer sa solution Mathematica, en particulier je lui demanderai son modèle de procédure, l'utilisation des outils, la structuration du code et des logiciels en général ainsi que les différentes couches d'abstraction.
Pour vérifier sa motivation, je vais lui demander sa fascination pour le développement de logiciels.
Je lui demanderai s'il est au courant de ce qu'il devra apprendre sur le développement de logiciels d'entreprise. Surtout, je veux transformer la discussion en direction du travail en équipe, de la programmation en binôme, du TDD, car je m'attends à ce qu'il ne sache pas grand-chose à ce sujet après avoir travaillé seul sur son MSc.
On dirait que ça va être une longue interview;)
Mise à jour après l'interview 2011-12-09
Encore merci à tous pour vos bonnes réponses. Il a réussi l'entretien avec brio. Je n'ai jamais été plus satisfait d'un candidat. Sa solution Mathematica semble assez bien structurée. Il a été en mesure d'expliquer où il utilisait des fonctions d'ordre supérieur, bien qu'il ne sache pas que celles-ci sont désignées comme ceci. Il a répondu à mes questions de récursivité basées sur les mathématiques ainsi qu'à des affectations simples et des choses sur le flux de contrôle de The Camel Has Two Humps. Quand il expliquait certains algorithmes, j'ai beaucoup appris sur l'adaptation non linéaire;) Il a également dit honnêtement qu'il ne pouvait bien sûr pas garantir qu'il serait en mesure d'apprendre des choses sur le développement de logiciels professionnels qu'il ne connaissait pas jusqu'à présent. Mais il a vraisemblablement déclaré qu'il était toujours bon dans l'apprentissage de nouveaux concepts - même par lui-même - et qu'il était vraiment intéressé par le développement de logiciels. Il a également demandé que la pile technologique du projet, à laquelle il serait appliqué en premier, puisse l'examiner chez lui. Il était également curieux de la programmation en binôme et du travail d'équipe. J'espère maintenant que le contrat de travail sera conclu.
Réponses:
Je suis très partisan ici parce que j'ai commencé en tant que développeur de logiciels il y a quelques années avec un doctorat en physique, mais très peu d'expérience en codage (équivalant à un cours de premier cycle sur Fortran). Cela dépend clairement du type de logiciel que vous développez, mais je pense que les compétences en codage sont très faciles à acquérir par quiconque possède des compétences scientifiques / en résolution de problèmes à moitié décentes. Je n'entends pas cela comme une insulte aux programmeurs à vie qui ont étudié l'informatique: bien sûr, il y a des aspects techniques qui nécessitent une formation sérieuse pour maîtriser (par exemple, le multi-threading et l'architecture de très bas niveau), mais je suppose que c'est pas le poste que vous essayez de combler.
Pour mon entretien technique pour mon poste actuel, j'ai été confronté à un problème mathématique assez complexe et j'ai demandé de concevoir un programme pour le résoudre. L'accent était mis sur l'écriture d'un algorithme qui, une fois implémenté, résoudrait le problème. Je pouvais écrire une réponse en utilisant uniquement des mots pour décrire ma solution, mais j'étais autorisé à écrire du code dans la langue de mon choix si je le souhaitais. Le test portait davantage sur la capacité de résolution de problèmes et si j'étais capable de "penser comme un programmeur". Évidemment, s'il y avait des candidats de capacité égale et que l'un avait une expérience de codage plus directe, il se serait imposé, mais cela me semble assez juste.
L'essentiel est: examiner le candidat pour les compétences pour lesquelles vous l'embauchez, pas pour les idéaux que vous espérez qu'il atteindra.
la source
Tu ne peux pas . Il est impossible de tester avec précision une compétence qu'il n'a pas encore. Vous devez faire un jugement sur la base de son intelligence et de son attitude. Cela va finalement toujours être un risque.
D'après mon expérience personnelle, je peux dire qu'il est très possible de passer de la science à la programmation. Ils se résument tous deux à utiliser votre cerveau pour résoudre des énigmes complexes.
la source
Je n'ai pas de sources secondaires vérifiant ce document, donc je ne peux pas le garantir, mais:
Le chameau a deux bosses
http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf
la source
Comment puis-je vérifier s'il obtiendra les compétences en programmation dont il a besoin?
C'est très simple. Donnez-lui les compétences.
Maintenant, ce n'est pas une réponse très satisfaisante, mais permettez-moi de développer.
Je suis venu en programmation après avoir fait 3 ans en génie civil. C'est une formation assez solide en physique appliquée et en mathématiques. Ce n'est pas le calcul théorique qu'un diplôme CS donnerait, mais ça vaut quelque chose. Ce que j'ai tiré de l'expérience en ingénierie, c'est une solide expérience en résolution de problèmes . Quiconque a une formation en mathématiques apprécie déjà le concept d' élégance lorsqu'il parle d'une solution à un problème. Ils ont déjà reçu une formation en refactorisation depuis qu'ils ont passé du temps à prendre six pages de poulet à gratter et à le convertir en une élégante épreuve d'une demi-page à soumettre.
Quiconque a étudié la physique a développé une approche intuitive pour concocter une solution à partir de cadres de base.
Et qu'est-ce que la programmation en dehors de ces compétences? - Langage, idiome, modèles et cadres. Ce sont faciles à enseigner. C'est la résolution de problèmes que vous ne pouvez pas. Si vous êtes en mesure de fournir des instructions dans ces domaines, vous vous retrouverez avec un bon développeur.
La question devient alors "combien de temps pouvez-vous attendre qu'il se mette au courant?"
tl; dr; Vous pouvez enseigner la dactylographie. Vous ne pouvez pas enseigner intelligemment.
la source
J'ai un BSc en science des matériaux mais j'ai travaillé toute ma carrière dans le développement de logiciels.
Je dirais que votre candidat n'aura probablement pas de problèmes avec la programmation de base et les algorithmes, mais quand il s'agit d'exigences de type plus "ingénierie", il peut avoir besoin de conseils. J'entends par là bien structurer son code, ne pas avoir 500 fonctions de ligne, tester efficacement, concevoir pour l'efficacité ...
La plupart de cela peut être enseigné, mais vous voudrez peut-être concevoir des questions pour vérifier cela.
la source
Il me semble que le candidat sait déjà programmer, étant donné qu'il pourrait ne pas avoir autant d'expérience en tant que développeur dédié, mais qu'il a un projet démontrable qu'il a terminé et qui nécessitait une quantité de travail non triviale. En tant que tel, vous pourriez être en mesure d'interviewer le candidat de la même manière que vous le feriez pour un développeur qui utilise une langue différente de celle que vous utilisez, à savoir:
Le langage utilisé par Mathematica est assez avancé et quelqu'un qui sait bien écrire des logiciels pour Mathematica devrait être assez compétent dans d'autres domaines, donc se concentrer sur cette expérience et l'utiliser comme base pour coder l'expérience pourrait être un bon moyen d'aborder l'entretien.
la source
S'exprimant en tant que diplômé en génie aérospatial devenu programmeur, il est certainement possible de passer des sciences naturelles à la programmation. Cependant, soyez averti, être capable de résoudre des problèmes ne correspond pas toujours à la capacité d'écrire du code. Vous semblez vous en rendre compte et c'est une bonne chose.
Pour moi, les concepts les plus importants pour s'assurer qu'il saisit sont le flux de contrôle et la récursivité (et la boucle en général comme sous-ensemble de cela). Avant d'embaucher un candidat, même quelqu'un qui est clairement très intelligent doit être sûr de pouvoir écrire un algorithme de mots simples pour résoudre les problèmes. Assurez-vous qu'il peut prendre cet algorithme de mots simples et le transformer au moins en pseudo-code. Vous pouvez même sonder pour voir s'il peut au moins comprendre le concept de polymorphisme, bien que je ne sois pas sûr que ce soit la connaissance requise dans cette circonstance.
Méfiez-vous également de la capacité de résoudre des problèmes scientifiques dans Mathematica / MatLab / Tout ce qui ne signifie pas qu'il peut écrire du bon code. Cela signifie simplement qu'il est capable d'appliquer des principes de programmation de base (parfois extrêmement basiques), généralement des instructions if / else. Apprendre à être un bon programmeur nécessitera généralement un engagement personnel et patronal envers quelqu'un à ce stade. Attention: j'ai rencontré des gens très intelligents qui étaient / sont de bons ingénieurs qui ne pouvaient pas programmer leur sortie d'un sac en papier et honnêtement, ne pouvaient pas comprendre les bases du langage de base.
Expérience personnelle
Je suis diplômé de l'école avec un diplôme d'ingénieur et un peu d'expérience en programmation à mon actif. J'avais travaillé avec une très petite quantité de C, pas mal de MatLab et des accès VB +. Il m'a fallu environ 3 mois d'études pour devenir vraiment utile en tant que programmeur dans une boutique VB.NET. Il m'a fallu encore 9 mois pour devenir pleinement compétent. Cependant, je peux, avec un certain degré de confiance, dire que mes compétences en résolution de problèmes sont supérieures à 99% des autres programmeurs que j'ai rencontrés dans mon travail. Mes employeurs m'ont toujours considéré comme l'un de leurs atouts les plus précieux.
Conclusion
C'est une proposition de risque / récompense, mais souvent, le fait d'engager quelqu'un qui a les compétences de résolution de problèmes peut être payant à long terme tant qu'il est capable d'apprendre les concepts de programmation et que vous êtes tous deux prêts à investir du temps pour étendre sa programmation connaissance. Cependant, je crois fermement qu'il doit posséder au moins une compréhension de base des principes fondamentaux de la programmation avant de lui offrir un emploi. D'après mon expérience, une fois que vous êtes à ce stade, vous pouvez aller beaucoup plus loin avec.
la source
Je commencerais par quelques questions et notions de base sur les algorithmes pour voir s'il est dans la logique des algorithmes et de la programmation. S'il est capable de comprendre ce qu'est un algorithme, il peut éventuellement développer les compétences nécessaires pour faire des choses concrètes par la suite.
la source
Honnêtement, je suis à peu près sûr que vous n'obtiendrez pas cette information lors d'une entrevue d'une ou deux heures. Donnez-lui une tâche de programmation en C # (quelque chose de pas trop technique) et une ou deux semaines à résoudre. Cela devrait être assez de temps pour apprendre les bases du langage pour quelqu'un qui a déjà appris la programmation avec Mathematica. Ensuite, faites un examen du code avec lui et décidez de cette base.
la source
Vous pourriez regarder les pratiques de programmation dans un environnement scientifique? (sur Stack Overflow) pour avoir une idée de ce à quoi ressemble la culture de programmation des sciences naturelles. De cette façon, vous êtes en mesure de comparer sa préparation à celle de ses pairs.
D'ailleurs, vous pourriez lui demander de décrire les pratiques de programmation auxquelles il est habitué afin de savoir s'il est conscient qu'il existe d'autres façons de le faire .
Il y a beaucoup de "bons programmeurs" dans mon entreprise dont la qualification est capable de tenir suffisamment d'état dans leur tête pour concocter du code de travail, mais dont le travail a tendance à être non structuré et difficile à maintenir. En général, ils peuvent être enseignés, mais ... ils doivent être enseignés.
la source
Un autre département où je travaille utilise une variation de notre test standard. La première tâche consiste à inverser les mots d'une chaîne en place. Ensuite, utilisez ce code pour inverser l'ordre des mots dans la chaîne, toujours en place. Au lieu d'utiliser un langage de programmation, ils ont le candidat qui conçoit les algorithmes sur papier et les exécute à l'aide d'une carte Scrabble.
la source
Je demanderais de décrire (en utilisant le langage naturel) un algorithme pour calculer quelque chose à partir de la physique. Quelque chose d'un peu plus compliqué qu'une simple formule, puis je demanderais comment verrait-il son calcul encapsulé dans des objets (pas besoin de connaissances OOP, vous pourriez expliquer ce que vous attendez d'un objet). De cette façon, vous pouvez voir sa pensée logique. Ceci est plus important que toute compétence en programmation.
la source
Tout d'abord, ils sont probablement assez intelligents, alors dans le pire des cas, ils peuvent apprendre à être un bon programmeur avec des conseils. Cependant, si vous en avez besoin pour vous lancer et être un programmeur décent dès le départ, demandez-leur d'envoyer un exemple de code qu'ils ont écrit.
S'agit-il d'une ou de deux fonctions polyvalentes géantes ou ont-elles encapsulé des fonctionnalités aux niveaux d'abstraction appropriés? Les nombres magiques sont-ils codés en dur partout? Le code est-il SEC? Ont-ils donné aux variables des noms raisonnables ou tout est-il une abréviation indéchiffrable ou une variable à une seule lettre? Pouvez-vous principalement suivre la logique de leur code? Comprennent-ils les bases OO?
Demandez ce qu'ils utilisent pour le contrôle de version (git / hg / svn / cvs / bzr, etc.). Ont-ils déjà profilé du code ou utilisé un débogueur, et si oui, lesquels ou quelle est leur stratégie de débogage générique?
S'ils échouent à ce test et que vous avez besoin d'un bon codeur dès le départ, sautez cette personne. Sinon, embauchez-les, suggérez-leur de lire des livres de génie logiciel (par exemple, Code complet) en plus des livres génériques de programmation / CS.
(Pour mémoire, je suis également physicien devenu programmeur.)
la source
Comme il est encore dans une université ou a récemment terminé ses études, il a l'habitude d'étudier. Faites-lui lire et comprendre le livre Design Patterns et après (ou pendant) un mois, discutez en profondeur avec lui sur les sujets. (Je pense que) cela peut vous en dire beaucoup sur ses capacités (non seulement les plus dures (celles-là aussi), mais aussi comment il gère la compréhension de nouveaux concepts, la compréhension de leur utilisation, les avantages et les inconvénients, etc.). Mais cela vous coûtera un mois.
la source