Si vous pouviez poser une question à un programmeur C++ pour mesurer ses compétences en C++, quelle serait-elle?
Je pense que la meilleure question est: Pouvez-vous appeler "supprimer ceci;" à l'intérieur d'une fonction membre? (Je mets cela en tant que lien afin que vous puissiez y réfléchir en premier, puis allez à La meilleure question d'entrevue C++ - Jamais! pour voir le bonne réponse.)
Je ne demande pas cela parce que je m'attends à ce que la plupart des gens connaissent la réponse. S'ils le faisaient, ce ne serait pas une question aussi utile. Je demande s'ils peuvent trouver leur chemin vers la bonne réponse et comment ils le font.
Je leur demanderais pourquoi la fonction de membre virtuel ne peut pas être utilisée avec un modèle en C++. Bien sûr, seules quelques personnes peuvent réellement répondre à la question immédiatement. Mais si une personne interrogée comprend correctement les mécanismes de base de C++ (comment le modèle fonctionne en C++, comment la fonction virtuelle est implémentée, comment le compilateur et l'éditeur de liens génèrent un exécutable à partir du code source, etc.), vous pouvez obtenir une réponse avec une étape par étape appropriée. étape des questions directrices.
Ajouté: La fonction membre virtuel modèle dans cette réponse signifie la fonction modèle qui est la fonction membre virtuelle d'une classe - pas une fonction membre régulière dans la classe modèle. Désolé pour la confusion :(
La meilleure question d'entrevue C++ serait un problème de programmation, pas une question de quiz.
Je leur demanderais ce qu'ils aiment à propos de C++ 0x. À partir de cela, je pouvais les "scinder" en divers stéréotypes:
Il y a de fortes chances que certains de ces seaux soient parfaits pour vous et que certains soient "merci d'être venus". En tant que question qui vous donne beaucoup d'informations rapidement, c'est mon gagnant.
Je suis quelque peu perplexe quant à la raison pour laquelle "pouvez-vous supprimer cela?" est considérée comme une question intéressante. Quiconque a écrit du code COM en C++ sait que la toute première chose que vous apprenez le premier jour de la programmation COM de base est de savoir comment utiliser "supprimer ceci" correctement. Je suppose qu'il pourrait être utile de déterminer si, par exemple, quelqu'un ment sur son curriculum vitae au sujet d'avoir écrit des programmes COM, mais en tant que question générale C++, si quelqu'un ne peut pas y répondre immédiatement, alors il ne va pas être un bon choix pour mon équipe.
Quoi qu'il en soit, si votre objectif est de poser une question qui mesure les compétences C++, alors choisir une question n'est pas la bonne solution. Retournez-le. La bonne question à poser est:
Sur une échelle de un à dix, à quel point êtes-vous un bon programmeur C++?
Ce n'est pas la question qui vous donne la réponse que vous souhaitez. Tout le monde dit "huit" malgré tout. La question qui vous donne la réponse que vous souhaitez est:
OK, vous avez donc huit ans. Quel est le problème avec lequel vous pensez qu'un sept aurait du mal à travailler?
Et boom, maintenant vous les avez. Si le candidat pense que "quelque chose à voir avec la récursivité" ou "quand utiliser un destructeur virtuel" est le genre de chose avec laquelle un sept a du mal, alors vous savez qu'il connaît un peu la récursivité ou les destructeurs ou quoi que ce soit , et que leurs connaissances ne vont pas beaucoup plus loin que cela.
Cela devrait vous donner un bien meilleur étalonnage que de poser une question triviale. Si vous deviez me forcer à poser une bonne question unique sur un fait concernant le C++, je demanderais probablement quelque chose comme "comment concevriez-vous l'analyseur sémantique et le générateur de code pour la partie d'un compilateur C++ qui traite des méthodes virtuelles appelé dans un destructeur de classe de base? " Vous devez poser des questions qui ont trait à de vraies choses sur lesquelles vous travaillez et sur lesquelles le candidat est susceptible de travailler. C'est un problème sur lequel j'ai dû travailler une fois, et je pense que cela donnerait un assez bon aperçu de la façon dont une personne conçoit des analyseurs sémantiques et des générateurs de code, ainsi que sa connaissance du C++.
Juste pour le plaisir, j'ai eu des programmeurs C++ titubant avec ce petit bébé:
Pourquoi cela se déroule-t-il dans une boucle infinie (et oui, il est tapé correctement)?
int x=0;
while (x<3) {
x = x++;
}
C'est étonnant de voir combien de personnes se sont déclenchées. Bien sûr, je ne peux plus l'utiliser après son apparition sur Stack Overflow . Marmonner ... marmonner ...
(Pour obtenir la bonne réponse, lisez les aveux et lisez certainement les commentaires)
Question bonus ajoutée
Il y a le FizzBuzz classique de tous les temps (comme présenté dans le désormais célèbre article Coding Horror ). Je ne l'ai jamais utilisé dans une interview moi-même, mais après l'avoir jeté autour de l'équipe de développement un déjeuner, les résultats étaient ... euh ... étonnamment précis.
Confession
J'ai été rattrapé par la réponse standard "x ++ renvoie la valeur d'origine". Cependant, la bonne réponse est que le comportement n'est pas défini en raison de points de séquence. Personne n'a jamais mentionné de points de séquence dans toutes les fois où j'ai utilisé ceci jusqu'à ce que je le poste ici.
J'ai été éduqué et je tiens à remercier sincèrement tous ceux qui ont pris le temps de commenter.
La première chose à poser est une simple question sur les pointeurs. J'ai été étonné de voir combien de personnes qui prétendent connaître le C++ ou, pire encore, le C, sont incapables d'y répondre. Ensuite, je poserais une question simple sur les fonctions virtuelles. Cette combinaison vous indique très rapidement si la personne connaît réellement le C++.
Parlez-moi du constructeur de copie.
Cela dépend beaucoup du type de C++ écrit dans votre entreprise. (Quand j'ai dû embaucher des programmeurs C++, je n'ai jamais posé de questions sur delete
, car je leur ai posé des questions sur les techniques pour éviter d'avoir à écrire delete
au total.)
Idéalement, vous souhaitez embaucher des personnes qui écrivent du code au-dessus du niveau de ce que votre équipe écrit actuellement, mais pas trop haut au-dessus, sauf si vous souhaitez combiner cela avec la formation de l'équipe pour l'amener à un niveau supérieur.
La meilleure question pour un grand développeur C++ est "Dites-moi les raisons pour lesquelles nous devrions PAS utiliser C++?"
Je crois que je leur demanderais ce qu’ils savent d’autre, ou plus probablement je leur poserais une question dans quelque chose de tout à fait différent.
Beaucoup trop de codeurs C++ qui ont peu d'expérience des autres langages. Une expérience étroite est généralement restrictive.
Je ne pense pas qu'il y ait une meilleure question C++. C++ est un langage tellement volumineux, et avec C++ 0X il a grandi, que vous pouvez être fort dans un certain sous-domaine du langage et pas peu sur une autre partie du langage. Une question "à un coup" n'exercera la connaissance d'une personne que sur une petite partie de la langue et risque de négliger sa connaissance d'autres aspects de la langue.
Il y a un tas sur StackOverflow. J'en partagerai quelques-uns:
https://stackoverflow.com/questions/2428404/tricky-interview-question-for-c
https://stackoverflow.com/questions/50447/favorite-c-interview-question
https://stackoverflow.com/questions/4269838/interview-question
https://stackoverflow.com/questions/2532102/can-a-pointer-ever-point-to-itself
https://stackoverflow.com/questions/3055141/interview-question-about-virtual-functions-in-c
Ma question préférée à poser est simple:
a) Avez-vous commencé avec C, puis basculé vers C++?
b) Si oui, quelles ont été les premières choses que vous avez apprises à faire différemment?
Cette réponse me donne généralement une idée de la façon dont le programmeur aborde le C++ et sa compréhension de OOP et C++ en général.
il n'y a pas de bonne ou de mauvaise réponse ici, mais c'est généralement un excellent moyen de savoir d'où vient le candidat.
Comment implémentez-vous les fonctions virtuelles en C++, expliquez un scénario réel.
Pour le moment, je dirais: "Comment feriez-vous pour implémenter un constructeur de déplacement pour un conteneur?"
Ma justification est que, parce que les constructeurs de mouvements sont une caractéristique de la norme suivante et non de la norme actuelle, la réponse du candidat indiquera si le développeur en question poursuit activement ses connaissances de son langage ou s'il s'en tient simplement aux astuces qu'il connaît.
Je pense que je demanderais leur avis sur la conception de, disons, std::string
. Je leur demanderais également s'ils ont utilisé d'autres conceptions (par exemple, MFC/ATL CString
, wxString
, etc.) et en supposant qu'ils l'aient fait, demandez-leur de comparer et de contraster les conceptions.
Les chaînes sont assez largement utilisées pour que presque toute personne ayant une réelle expérience de C++ ait utilisé au moins un ou deux des éléments ci-dessus. Presque toutes les conceptions incarnent certains compromis entre la pureté théorique et l'utilisation pratique. Certains peuvent très bien fonctionner, mais seulement s'ils sont utilisés exactement comme prévu, tandis que d'autres échangent une plus grande polyvalence pour une maladresse possible. En bref, presque tous ceux qui ont une expérience réelle devraient être en mesure d'exprimer des opinions significatives sur leurs conceptions et ces opinions devraient vous en dire assez sur leur façon de penser, comment ils code de conception, la mesure dans laquelle ils valorisent le pragmatisme par rapport à la pureté théorique, etc.
Je présenterais en fait à la personne un peu de code d'un autre langage de programmation qui était orienté objet et de préférence pas sur la liste des langages qu'elle connaît. Le code doit représenter une tâche simple effectuée dans cette langue.
Le but de cela ne serait pas de déterminer leur connaissance du C++ mais de savoir dans quelle mesure ils comprennent la programmation. Lorsque vous comprenez les concepts de base de la programmation, vous pouvez résoudre des problèmes.