Quelle est la meilleure question d'entrevue C ++? [fermé]

28

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 la suivante: pouvez-vous appeler "supprimer ceci"; à l'intérieur d'une fonction membre? (J'ai mis cela sous forme de lien afin que vous puissiez y réfléchir en premier, puis allez à la meilleure question d'entrevue C ++ - jamais! Pour voir la bonne réponse.)

Je ne pose pas cette question 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.

David Thielen
la source

Réponses:

8

Je leur demanderais pourquoi la fonction membre virtuelle ne peut pas être utilisée avec un modèle en C ++. Bien sûr, il n'y a que peu de personnes capables de répondre immédiatement à la question. 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 :(

Summerlight
la source
3
@summerlight: Je mélange des fonctions et des modèles de membres virtuels et rien de mal ne s'est produit jusqu'à présent ... Je crains donc de ne pas avoir compris ce que vous vouliez dire. Vous voulez m'éclairer :)?
Matthieu M.
2
Cette réponse est presque mais pas tout à fait correcte. Vous ne pouvez pas avoir de fonctions de membre virtuel de modèle, mais vous pouvez avoir des fonctions de membre virtuel d'une classe de modèle.
catphive
1
@summerlight: ah j'ai compris! Question amusante oui, apparaît souvent;)
Matthieu M.
2
@nikie: C'est une fonction membre virtuelle dans la classe modèle - pas une fonction membre modèle virtuel comme template <typename T> virtual void doSomethingWithGenericTypeT (T arg);
Summerlight
2
@summerlight: Vous auriez dû inclure cet exemple dans votre message. Je n'avais aucune idée de ce que tu voulais dire jusqu'à présent. Bonne question, cependant, maintenant que je le comprends ;-)
nikie
57

La meilleure question d'entrevue C ++ serait un problème de programmation, pas une question de quiz.

Steven Evers
la source
D'accord. Ne posez pas de questions sur la syntaxe qui peut être recherchée sur Google. Au lieu de cela, demandez au candidat d'écrire une fonction facile (mais pas triviale), de préférence quelque chose que vous avez écrit dans votre propre code à un moment donné.
chrisaycock
4
Même quelque chose d'aussi simple que «écrire une fonction pour inverser une chaîne» peut vous en dire beaucoup sur un programmeur expert: utilise CString-t char*-il std::string,,, etc .; renvoient-ils une nouvelle chaîne ou inversent-ils en place; font-ils une boucle manuelle sur les caractères ou appellent-ils une fonction de bibliothèque? Et bien sûr, s'ils ne peuvent pas faire quelque chose de simple comme inverser une chaîne, cela vous en dit beaucoup aussi! Il y a aussi beaucoup de questions de suivi, comme ça marche avec Unicode, ça marche avec UTF-8, etc.
Gabe
16
@Ernelli: C ++ n'a jamais vraiment décollé? Sérieusement?
Steven Evers
1
@Gabe - bon point. Par exemple, faire un modèle en place à l'envers avec un paramètre de politique ne serait pas très général, ou (probablement la politique plutôt la fonction) assez complexe, en ce qui concerne les chaînes d'octets variables par caractère. Je ne sais pas s'il n'y a pas d'optimisation prématurée (créer une nouvelle chaîne parce qu'il est plus facile d'être général) ou d'agilité (ne vous inquiétez pas de ce cas jusqu'à ce qu'il se produise, et l'inverse en place n'est pas plus difficile, peut-être un peu plus facile, pour les chaînes de caractères à largeur fixe) gagnerait.
Steve314
1
@Ernelli - vous oubliez wchar_t et std :: wstring et les significations différentes sur Windows / Unix
Martin Beckett
32

Je leur demanderais ce qu'ils aiment à propos de C ++ 0x. À partir de cela, je pouvais les «scinder» en divers stéréotypes:

  • super old school, utilise des compilateurs C ++ pour compiler du code C
  • vieille école, peur (ou ne voit aucun intérêt à) STL, n'a pas suivi les changements
  • aime lambdas, aime STL obtenir plus rapidement des références rvalue, grand fan RAII, chaud à utiliser shared_ptr, unique_ptr etc.
  • est amer car tout le code boost écrit au cours des dernières années devra être adapté pour utiliser des équivalents C ++ 0x
  • métaprogrammeur de modèle fou qui fait exploser ma tête tout en répondant à une question relativement courte

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 permet d'obtenir rapidement beaucoup d'informations, c'est mon gagnant.

Kate Gregory
la source
1
+1 pour une bonne question directrice qui encourage beaucoup de discussions autour du sujet.
Gary Rowe
8
Vous avez oublié la catégorie de personnes qui n'ont aucune idée de ce qu'est C ++ 0x. Je suppose que ce serait plus une réponse, et correspondrait aux deux premiers types.
Fast Fish
1
@Fast Fish, oui, les gens qui sont comme C ++ 0-whatnow? sera généralement l'une des deux premières catégories, et éclairera généralement cela dans leur réponse.
Kate Gregory
28

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. Retourne 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. Selon vous, quel est le problème avec lequel un sept aurait du mal à travailler?

Et boum , 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 en sait un peu plus sur 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 devriez poser des questions qui ont à voir avec des choses réelles 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 ++.

Eric Lippert
la source
3
Je vais commencer à utiliser celui-ci: OK, vous avez donc huit ans. Quel est le problème avec lequel vous pensez qu'un sept aurait du mal à travailler?
David Thielen
10
Une autre bonne question ici: que pourrait faire un neuf avec lequel vous auriez du mal?
David Thornley
C'est tellement génial que c'est incroyable.
UpAndAdam
14

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 ont trébuché. 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.

Gary Rowe
la source
1
Gary Rowe: Bien que j'aime cet exemple (la première fois que je l'ai vu). Cela m'attriste que les gens ne voient pas cela assez rapidement, et encore moins ne le savent pas.
Orbling
2
Quand j'étais chez Microsoft, j'ai commencé à demander aux candidats de faire un insert dans une liste chaînée. Pourquoi? Parce qu'environ 80% ne pouvaient pas le faire. Incroyable ...
David Thielen
43
Ce n'est pas nécessairement une boucle infinie. Vous invoquez ici un comportement indéfini (x est modifié deux fois sans point de séquence intermédiaire). En fait, avec mon compilateur particulier, gcc (Debian 4.3.2-1.1) 4.3.2 sur mon arc particulier (x86) , il ne se terminent.
Logan Capaldo
2
@Logan +1 pour avoir mentionné les points de séquence. Vous obtiendriez une deuxième interview à coup sûr ;-)
Gary Rowe
4
C'est une très bonne question d'entrevue car elle indique au candidat si cela vaut la peine de revenir pour une autre entrevue ;-). Si l'entrevue pense vraiment que le code entraîne une boucle infinie (et que l'intervieweur est censé être techniquement compétent), le candidat peut sans risque manquer l'occasion.
CB Bailey
8

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 ou non le C ++.

Dima
la source
4
dépend de leurs antécédents, n'a jamais rencontré quelqu'un avec une expérience matérielle qui ne comprenait pas les pointeurs mais certains qui n'avaient pas vraiment d'encapsulation ou de polymorphisme
jk.
7

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 delete, car je leur ai demandé des techniques pour éviter d'avoir à écrire deletecomplètement.)

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.

sbi
la source
7

Parlez-moi du constructeur de copie.

fredoverflow
la source
2
+1. Celui-ci élimine les candidats incompétents en cinq secondes.
Nemanja Trifunovic
6

Je crois que je leur demanderais ce qu’ils savent d’autre, ou plus probablement je leur poserais une question dans quelque chose de très 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.

Orbling
la source
6

La meilleure question pour un grand développeur C ++ est "Dites-moi les raisons pour lesquelles nous ne devrions PAS utiliser C ++?"

avance
la source
4

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 ponctuelle n'exercera que la connaissance de quelqu'un d'une petite partie de la langue et risque de négliger sa connaissance d'autres aspects de la langue.

sashang
la source
3

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 la POO et du 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.

mohaps
la source
1

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.

Paul
la source
1

Comment implémentez-vous les fonctions virtuelles en C ++, expliquez un scénario réel.

user616
la source
1

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.

Kaz Dragon
la source
1

Je pense que je demande leur opinion de la conception, disons, std::string. Je voudrais aussi leur demander s'ils ont utilisé d' autres modèles (par exemple, MFC / ATL CString, wxStringetc.) et en supposant qu'ils ont, demandez - leur de comparer et contraster les dessins.

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 la façon dont ils pensent, comment ils conçoivent le code, la mesure dans laquelle ils apprécient le pragmatisme par rapport à la pureté théorique, etc.

Jerry Coffin
la source