Il semble qu'il y ait une énorme différence entre ce que j'attends d'une personne qui a étudié la programmation pendant quelques années à l'université et ce que l'on sait réellement.
Je n'ai pas l'impression de poser des questions trop compliquées lors des entretiens. Certaines de mes questions habituelles sont:
Quelle est la différence entre un type de référence et un type de valeur?
S'il semble que l'interviewé ne comprenne pas vraiment sa propre réponse, ou s'il ne connaît pas la terminologie que j'utilise, j'entre dans les détails en lui demandant de m'expliquer ce qui se passe quand j'écris int i = 0; dans une méthode, qu'en est-il de l'objet o = 0, objet o = new MyClass (), etc ...
Fondamentalement, je fais tout ce que je peux pour inciter l'interviewé à me parler de la pile d'appels, du tas, etc., et j'essaie de rester dans les concepts d'angnostique linguistique. Si l'interviewé me dit qu'il a fait beaucoup de C, ou C ++, ou c #, je plonge plus profondément dans le langage spécifique, et peut-être dans les détails d'implémentation.
Si nécessaire, je demande à l'interviewé ce qu'est une pile d'appels ou où sont stockés les arguments passés à une fonction dans le langage impératif de son choix.
la plupart des personnes interrogées n'ont aucune idée de ce qu'est une pile d'appels, encore moins des considérations de boxe, etc.
Quelle est la différence entre une classe abstraite et une interface. Dans quels cas devez-vous utiliser l'un sur l'autre?
Habituellement, je leur demande également d'imaginer la conception d'une petite bibliothèque avec un cas d'utilisation visant à utiliser un héritage et des usines abstraites
La plupart des personnes interrogées n'ont aucune idée de ce que pourrait être le véritable objectif de l'héritage. Ils connaissent généralement certains mots clés (virtuel, remplacement, etc.), mais ne savent pas vraiment quand les utiliser, sans parler d'expliquer ce qu'est une table virtuelle.
Même si je sélectionne les CV au préalable, même pour les personnes ayant 5 ans d'expérience dans des projets réels impliquant des architectures complexes, je dirais que moins de 25% de toutes mes personnes interrogées peuvent répondre correctement à ces deux questions. Et quand je dis correctement, je ne veux pas dire «en profondeur» ... juste pour avoir une idée approximative de ce qu'est le concept.
En ce qui concerne les juniors, je suis content d'embaucher quelqu'un qui ne sait pas très bien organiser son temps, ou quelqu'un qui n'est pas habitué aux processus de construction industrielle par exemple, mais j'ai le sentiment que si l'on n'a pas entendu le mot " callstack "après quelques années d'études en informatique, il est soit stupide, soit démotivé, ou a choisi son université de façon très imprudente.
Pensez-vous que je suis trop extrémiste ici? Est-il courant d'apprendre ces concepts de base après avoir terminé ses études universitaires? Connaissez-vous des gens qui ne les connaissaient pas et qui sont devenus de très bons ingénieurs logiciels après quelques années? Et pensez-vous que mon entreprise pourrait avoir du mal à attirer des personnes talentueuses, ou rencontrez-vous le même genre de problèmes avec votre propre processus d'embauche?
Éditer. en ce qui concerne le «type immédiat», ce n'était qu'une traduction littérale du français vers l'anglais, comme nous faisons habituellement nos interviews en français. Je l'ai corrigé dans ma question. Mais encore, je pense que vous comprenez tous parfaitement ce que je voulais dire, ce qui fait mon point, non?
Réponses:
La terminologie est une chute courante dans une situation d'entrevue.
Vous posez à la personne interrogée une question en utilisant une terminologie qui signifie quelque chose pour vous, mais la personne interrogée peut la connaître par un terme différent, ou peut simplement connaître la théorie générique sans application à des langues ou des environnements spécifiques. Des malentendus s'ensuivent. Aucune des parties n'est heureuse.
En fait, il s'avère que l'interviewé comprend parfaitement que certaines valeurs peuvent être stockées directement dans un registre et que d'autres font référence à un morceau de mémoire ailleurs, mais parce que vous posez la question dans un domaine spécifique, le point de ce que vous demandez, et ce que vous voulez que l'interviewé vous dise, ne passe pas vraiment.
Peut-être que vous rencontrez beaucoup de situations où l'interviewé clique soudainement et dit `` Oh - c'est de cela que vous parlez '' - puis explique de manière assez adéquate.
C'est un équilibre difficile parce que les programmeurs fraîchement sortis de l'université ne vont pas avoir l'expérience diversifiée que le développement du monde réel dans un environnement d'équipe leur donne. Pendant ce temps, les développeurs expérimentés ne se souviendront souvent pas (ou ne seront même pas intéressés) de tout ce qu'ils ont appris à l'université parce que cela n'est tout simplement pas pertinent pour leur utilisation quotidienne.
Ces deux types de personnes (eh oui - c'est la personne interrogée et l'intervieweur) besoin d'apprendre à communiquer avec l'autre avant de pouvoir en apprendre davantage sur les uns des autres. Il incombe à la personne ayant la plus grande expérience (l'intervieweur) de veiller à ce que cela se produise.
Sans parler du fait que certaines personnes souffrent d'une défaillance complète de la mémoire lors des entretiens. Moi-même inclus. Je me souviens d'avoir été invité à écrire un programme en C et je n'ai pas pu me souvenir du symbole utilisé pour accéder à un membre à partir d'un pointeur (->) et j'ai dû demander à quelqu'un. Ce n'était même pas pour mon premier emploi. Boy a ce moment me tourmente depuis 15 ans :-)
À mon avis, la capacité de communiquer, de résoudre les problèmes de manière efficace et complète est beaucoup plus utile; ramasser les choses rapidement; faire preuve d'une attitude positive et positive; bien interagir avec d'autres personnes et d'autres valeurs fondamentales.
N'abandonnez pas les personnes interrogées car elles ne savent pas ce qu'est un type immédiat. Passez.
la source
Vous demandez des connaissances spécifiques à une langue et les termes que vous utilisez ne sont pas identiques à 100% dans toutes les langues. Pour ma part, je n'ai aucune idée de ce qu'est un "type immédiat".
En outre, considérez que les choses enseignées dans une université ne consistent pas à lancer du code standard dans X, mais à avoir appris beaucoup de concepts sous-jacents et vu divers paradigmes de programmation. En d'autres termes, cela ressemble beaucoup à un permis de conduire - même si vous connaissez la théorie de base, vous avez encore besoin de beaucoup de pratique.
la source
"J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends." (Et, à mon avis, la compréhension conduit à une meilleure rétention de la mémoire.)
En termes simples, un diplômé récent n'a pas beaucoup d'expérience, donc comme quelqu'un d'autre l'a fait remarquer, il n'aura pas beaucoup plus que le strict minimum de connaissances, quelle que soit sa langue «choisie».
Je suis allé dans un collège spécialement conçu pour rationaliser l'apprentissage de la majeure choisie (ainsi, par exemple, vous n'auriez pas de littérature historique si vous étiez un major CS; le plus proche de la littérature historique est la science-fiction), et tout droit sorti de l'université, je n'aurais pas pu vous dire quelle interface était encore moins sa différence avec une classe abstraite, bien que nous ayons appris l'abstraction (et les interfaces abondent en .Net, la technologie que j'ai apprise). Nous avons peut-être abordé les interfaces, mais elles se sont perdues dans toutes les autres choses que nous devions savoir pour réussir la classe. Ce n'est que lors de mon premier emploi à la sortie de l'université que j'ai découvert les interfaces, en particulier de manière significative.
Vous avez mentionné avoir fait des entrevues en français, ce qui montre clairement que nous sommes dans différents pays, donc votre kilométrage peut varier, mais ici aux États-Unis, les collèges accusent un retard notoire en matière de technologie. Par conséquent, à moins que vous n'ayez affaire aux langages matures (C / C ++, COBOL, etc.), il est également très probable que ce que vous utilisez même depuis des années ne soit pas disponible dans la version sur laquelle les étudiants ont appris. Par exemple, .Net 3.0 a introduit Entity Framework, WPF, WCF et une foule d'autres choses sympas, mais même mon école était toujours bloquée sur .Net 1.1 et 2.0 (ce qui signifiait être bloqué avec ADO.NET et ne même pas apprendre sur Object - Cartographie relationnelle). Une école qui utilise PHP peut être bloquée sur (non-OOP) PHP 4.
Gardez également à l'esprit qu'un étudiant doit prendre une tonne d'informations qui ne sont souvent utilisées que pendant une courte période. Les concepts "avancés", comme l'abstraction, sont souvent enseignés vers la fin du cours, où l'élève peut n'avoir qu'une semaine ou deux pour jouer avec, tout en luttant avec les autres cours qu'il doit suivre, et éventuellement sur haut d'un emploi à temps partiel ou à temps plein. Combinez tous ces éléments ensemble et c'est une merveille que la personne puisse se souvenir de quoi que ce soit , encore moins garder les choses bien droites.
Aux États-Unis, au moins, un diplômé récent est souvent supposé ne rien savoir au-delà des bases génériques (la différence entre passer par la valeur et passer par la référence, peut-être), car il est entendu que la théorie générique et la résolution de problèmes sont la partie principale de l'école, sans apprendre les tenants et aboutissants d'une langue donnée.
Je recommande d'utiliser les questions que vous vous posez davantage pour évaluer ce dont vous aurez besoin pour les enseigner / les ré-enseigner (rappelez-vous, il est tout à fait possible qu'ils n'aient tout simplement pas appris le terme que vous essayez d'utiliser, même si vous pensez que c'est omniprésent), par opposition à la question de savoir si la personne interrogée est «sans valeur» ou non. Combinez cela avec une évaluation de leur volonté d'apprendre et de leurs compétences générales en résolution de problèmes (sérieusement, donnez-leur une énigme à résoudre et voyez comment ils s'y prennent), et vous pouvez très bien avoir une future rockstar que vous peut avoir disparu parce qu'ils ne savaient pas ce que vous vouliez dire par «pile d'appels».
la source
Vous avez un certain nombre de vues étroites et vous les supposez implicitement.
À ma connaissance, il n'y a pas d'université où les gens étudient la programmation pendant quelques années. Les universités proposent des cours d'informatique, dont la programmation est un aspect.
Règle générale: si Lisp peut se passer de la distinction, ce n'est que de l'encombrement;)
Parler des concepts linguistiques-agnostiques est une bonne idée. Cependant, ni le tas ni la pile ne sont indépendants de la langue.
Toutes ces langues ont des spécifications. L'implémentation n'est pas définie par le langage. C et C ++ peuvent être compilés de manière croisée à l'aide de LLVM pour s'exécuter sur Flash Player ou tout autre runtime JavaScript. Cela rend vos hypothèses sur l'allocation de tas et de pile nulles.
Avec C #, c'est à peu près la même chose. C # est JIT avant exécution avec beaucoup d'optimisation, ce qui peut être fait. Les variables locales, qui sont capturées par des fermetures, finiront par se retrouver sur le tas, au lieu de la pile, tandis que l'analyse d'échappement permet de stocker des objets de portée locale (qui devraient normalement aller dans le tas) pour être stockés dans la pile. Une allocation correcte des registres réduira également considérablement le besoin d'allocation de pile.
Que demanderiez-vous à quelqu'un qui n'a qu'une vaste expérience en programmation avec Haskell? : P
L'idée de base derrière l'autoboxing est que les primitives peuvent également être traitées comme des objets (ou au moins des valeurs dont le type peut être découvert au moment de l'exécution). En ce qui concerne cette abstraction, il existe trois types de langues:
Je ne vois pas pourquoi les gens ne devraient pas utiliser des langues de catégorie 1 (en fait, c'est une bonne idée). Je ne vois pas pourquoi les gens qui utilisent des langues de catégorie 2 devraient vraiment s'embêter. Et je pense que tous ceux qui utilisent un langage de catégorie 3, c'est-à-dire celui où une caractéristique sémantique de base est simplement cassée, utilisent le mauvais langage.
Maintenant, cela est très subjectif et dépend vraiment de la langue. C ++ n'a pas d'interfaces. Objective-C n'a pas de classes abstraites. Je dirais que toute langue qui a les deux a un grand besoin de refonte. De nombreux langages modernes utilisent des traits, des mixins, des catégories, des rôles et des constructions similaires pour fournir des solutions beaucoup plus propres pour la réutilisation de code que l'héritage d'implémentations partielles. De toute façon, les langages basés sur des prototypes n'ont pas de classes.
En fin de compte, c'est un sujet difficile et contesté. Une entrevue n'est pas le bon endroit pour résoudre cette question et je ne dirais vraiment à personne qui postule pour un poste junior de ne pas me donner une bonne réponse.
Il existe un certain nombre de langages orientés objet, qui n'utilisent pas l'héritage ou les vtables classiques.
Mon conseil:
Ce qui est important, c'est que vous compreniez comment ces faits simples et isolés peuvent être appliqués à l'ingénierie de solutions flexibles et maintenables à des problèmes complexes.
Pour arriver à la vraie question:
Toutes les entreprises ont des problèmes pour attirer des personnes compétentes, sauf peut-être les grands acteurs. C'est parce qu'il y en a peu. Et en raison de l'hypothèse, cette université rend les gens habiles. Ce n'est pas le cas. Cela les rend bien informés (en supposant que l'étudiant et l'université tiennent leur part du marché). L'expérience est ce qui rend les gens habiles.
Il y en a quelques-uns qui ont acquis de l'expérience avant d'entrer à l'université et qui continuent de le faire pendant leurs études. Parce qu'ils aiment la programmation et parce qu'ils apprennent une nouvelle idée pendant un cours, ils essaieront de voir comment ils peuvent l'utiliser, la première chose qu'ils rentreront chez eux. C'est le genre de personnes que vous aimeriez embaucher. Mais il y en a peu.
C'est la passion pour la programmation et l'amélioration de soi et sa poursuite qui rendent les programmeurs bons. À l'heure.
Je pense, ce que vous devez comprendre, c'est que malheureusement la plupart des gens entreront et quitteront l'université sans expérience de programmation suffisante.
Dans le même temps, notre industrie a grandement besoin de programmeurs expérimentés. Par conséquent, je pense que c'est la mission de notre industrie d'essayer réellement d'intervenir. Et vous devez choisir avec soin, car vous devrez investir beaucoup d'énergie et vous ne voulez pas que cela soit gaspillé.
Considérez cela comme l'embauche d'un sang frais pour devenir un pilote pour votre équipe de course: Un bon pilote a une compréhension suffisante de la mécanique pour tirer le meilleur parti de sa voiture, mais cette connaissance à elle seule est inutile (ce n'est même pas beaucoup de tête début). Ce que vous cherchez, c'est quelqu'un qui veut travailler dur pour sa propre amélioration et bien avec votre équipe.
la source
Quel que soit le terme "type immédiat" dont je n'ai aucune idée (type de valeur? OK, je n'étais pas sûr, merci pour la mise à jour), je pense que vous avez raison sur vos questions et que vous n'êtes absolument pas extrémiste. Ce sont des questions auxquelles on peut répondre si l’on sort de l’école. Pourtant, je ne licencierai pas les candidats immédiatement, il y en a encore qui peuvent avoir du potentiel car ils veulent apprendre.
Pour continuer avec l'analogie du permis de conduire: certaines personnes ne se soucient pas de ce qui se passe quand ils insèrent la clé (ou poussent le bouton "démarrer"). Ils le font et conduisent. Cela ne signifie pas non plus qu'ils ne valent rien, mais qu'il leur faudra du temps pour atteindre la célébrité ;-)
Juste une remarque personnelle sur le grade / diplôme: je travaille actuellement avec des personnes ayant une formation en biochimie et industrielle qui ont quelques années d'expérience dans le domaine informatique et aussi des gars "expérimentés" avec une formation en CS, et devinez qui sont les plus compétents sur le fonctionnement du moteur du véhicule? Ouais, ce ne sont pas les gars qui ont étudié le CS! Je constate donc simplement que le diplôme n'a pas toujours d'importance!
la source
Je ne pose généralement pas de questions spécifiques sur la terminologie ou les définitions lors des entretiens. Comme d'autres réponses l'ont noté, les gens ont des termes différents pour différents concepts et bien qu'ils puissent comprendre conceptuellement le sujet, ils peuvent ne pas être en mesure de vous le transmettre.
Avec Juniors, je me concentre intensément sur leurs stages ou projets scolaires. Je pose des questions sur des questions à leur sujet, je les laisse articuler des réponses, puis je commence à approfondir leur implication réelle dans le projet, ce qu'ils ont appris, ce qu'ils ont ressenti.
Généralement, si la personne était en lourd dans le projet, elle ne peut généralement pas me donner de réponses satisfaisantes, donc c'est généralement assez facile à dire. Faites juste attention à ne pas confondre nerveux et introverti avec désintéressé et non impliqué.
Être en mesure de déterminer le bon candidat timide et introverti est un peu difficile, mais la culture dans laquelle je travaille ne serait pas bonne pour un développeur introverti et timide, donc s'il ne peut pas avoir une conversation détaillée et productive avec moi, ne conviennent pas.
la source
C'est très injuste. Lorsque vous êtes étudiant, tout ce que vous pouvez faire est de choisir l'université la mieux classée dans laquelle vous obtiendrez vos notes, ou peut-être celle qui vous permet de jouer avec des chiens robotiques jouant au football. Rien de plus. Vous ne pouvez évaluer un cursus universitaire qu'après l'avoir fait, puis partir et travailler dans l'industrie pendant quelques années et construire des projets non triviaux.
Même si vous avez affiché une énorme enseigne au néon sur chacun de ces cours en disant "NOUS N'ENSEIGNONS PAS LA PILE D'APPELS", alors qu'attendez-vous que les élèves fassent à ce sujet? Passer des mois à le rechercher afin qu'ils puissent réellement comprendre ce que cela signifie et combien ils en auraient besoin d'un qui l'enseigne? Pour chaque cours avec chaque combinaison de signes?
Les gens ne peuvent pas choisir leur éducation de façon réaliste.
la source
Lorsque j'interroge de nouveaux diplômés, je m'en tiens aux sujets énumérés dans leur CV. S'ils utilisaient Java, je leur poserai des questions sur Java. S'ils ont utilisé Blub, je passe une demi-heure à lire à propos de Blub et je leur pose des questions à ce sujet. Mais je demande toujours en utilisant les mots-clés de la langue. Si c'est Java, je vais poser des questions sur "étend" et "implémente" mais pas "sous-classe" et "hérite". Je m'attends à ce que les nouveaux diplômés soient capables de parler du code qu'ils ont écrit, de pouvoir résoudre un problème de programmation simple et d'avoir une compréhension des structures de données de base (tables de hachage et arbres).
la source
En tant que directeur qui a conçu le processus d'entrevue, je peux vous expliquer ce que notre entreprise attend des nouveaux diplômés: j'attends des gens qui peuvent lire la documentation et appliquer les connaissances. Ainsi, nous avons quelques tâches très pratiques que nous leur demandons d'effectuer. Ce sont des tâches de codage simples, pas beaucoup plus difficiles que votre exercice moyen en classe (les "bons" développeurs expérimentés peuvent le supprimer en 15 minutes environ). Le candidat reçoit un poste de travail avec accès à Internet, un compilateur (dans notre cas visual studio) et des fichiers d'aide.
S'ils ne peuvent pas écrire de code dans ces conditions, ils ne sont pas pris en considération pour la location. Aussi simple que cela. L'excuse «bien je ne connais pas la langue» ne m'a jamais vraiment plu car chaque candidat qui vient interviewer sait qu'il y aura un test, il connaît les langues et les outils que nous utilisons à l'avance. Vous pouvez télécharger Visual Studio Express à la maison et faire quelques notions de base avant d'entrer et de passer le test d'entrée de gamme, ceux qui ne dérangent pas ... enfin c'est ce que j'appelle un drapeau rouge.
la source