En lisant ce site et SO, j'ai vu beaucoup d'histoires de questions d'entrevue et de réponses disant qu'un candidat devait mettre en place une liste chaînée à partir de zéro. En général, c’est un exercice de "gimme" pour les candidats à un rôle de programmation, comme écrire FizzBuzz. L'idée est que si le candidat ne peut pas faire cela, il ne peut pas programmer et devrait être rejeté presque immédiatement.
Cependant, je ne peux pas m'empêcher de penser que cela pourrait être une mauvaise pratique pour les raisons suivantes:
- Les langages modernes de niveau supérieur tels que C # et Python utilisent nativement les listes de manière intensive; écrire votre propre objet lié à une liste de liens ne serait requis que dans des circonstances inhabituelles et même alors probablement peu judicieux.
- Les langages de niveau inférieur tels que C ++ ont des bibliothèques standard avec des objets et des conteneurs de listes / itérateurs.
- À la lumière des deux premiers points, les codeurs peuvent passer des années sans même penser à mettre en place eux-mêmes une liste (liée, double liaison, etc.). Certains peuvent même pas vraiment voir de telles choses depuis le collège.
- La puissance de calcul n’est pas non plus le facteur qu’elle était il ya des années, de sorte que l’efficacité au moyen de pointeurs n’est plus le problème qu’elle était (en général).
- Une simple recherche sur le Web sur quelque chose du genre "exemple de liste chaînée" ferait apparaître de nombreux exemples de code qui pourraient simplement être mémorisés et rediffusés, sans indiquer vraiment la véritable compétence du demandeur.
Je devrais dire que l'utilisation d'une liste chaînée pour mener à des questions ouvertes / discussions sur les capacités des candidats à la résolution de problèmes / à la pensée critique est probablement une très bonne pratique d'entretien. De toute façon, un intervieweur peut vraiment voir à quoi ressemble un candidat et en quoi son opinion est extrêmement bénéfique.
Je pense que cette approche binaire "pas de code de liste lié, pas de travail" pour les programmeurs travaillant sur une application de bureau ou Web est un peu dépassée. Cela pourrait aussi être très dangereux; un candidat qui ne sait pas comment travailler correctement avec le tête de liste peut être par ailleurs un excellent codeur et collègue et se perdre dans le mélange. Pensées?
EDIT : Il y a beaucoup de (bons) commentaires qui suggèrent que le fait de poser cette question soit bon ou mauvais dépend du contexte du travail. Je suis tout à fait d’accord, alors permettez-moi de reformuler cette question: La mise en œuvre d’une liste chaînée est une question d’entrevue courante pour un large éventail d’emplois de codage, similaire aux questions telles que FizzBuzz ou l’écriture d’une fonction récursive pour le calcul des factoriels. Cette question est-elle suffisamment utile pour être utilisée couramment pour évaluer les candidats à la programmation dans l’ensemble? Ou devrait-on considérer une mauvaise question à poser, à l’exception des postes de "Développeur senior, Équipe de listes chaînées incorporées"?
la source
Réponses:
Si répondre à la question vous dit ce que vous voulez savoir sur un candidat, c'est une bonne question pour l'entretien. Si ça ne vous dit pas ça, c'est une mauvaise question.
Des questions simples comme FizzBuzz ont un objectif spécifique. Si un candidat ne peut pas coder FizzBuzz, il ne peut tout simplement pas coder et vous pouvez mettre fin à l'entretien plus tôt. Je dirais que l'implémentation d'une liste chaînée est légèrement plus difficile, mais cela peut déclencher une conversation sur les structures de données en général qui en révélera beaucoup.
Rappelez-vous simplement qu'aucune question d'entrevue ne vous dira tout ce que vous voulez savoir. Vous devez vraiment avoir un groupe de questions prêt. Vous devez poser les questions dans l'ordre, du plus facile au plus difficile, afin de pouvoir déterminer les limites de ce que le candidat sait. Si vous posez une question et qu’ils y répondent, vous ne savez toujours pas quoi d’autre ils savent ou ne savent pas.
En ce qui concerne votre édition:
Je pense que c'est une bonne question d'ordre général qui pourrait être utilisée pour évaluer pratiquement n'importe quel candidat à la programmation. Cela doit simplement faire partie d'un groupe plus vaste de questions. Ce serait un bon moyen de briser la glace pour de nombreux types de poste (même si le candidat ne peut pas mettre en place une liste chaînée à partir de rien, il peut peut-être expliquer comment il l’a déjà utilisée et quelles sont les fonctions clés), ou le début de la liste. une longue séquence de questions plus avancées pour le poste "Développeur senior, équipe de listes chaînées incorporées".
la source
J'ai raté des emplois uniquement parce que mon esprit était masqué par de simples énigmes comme celle-ci. J'ai également brillamment travaillé sur de tels casse-tête dans d'autres interviews - je sais comment mettre en place une liste chaînée dans un environnement sans pression. Je n'ai jamais eu à me plaindre de mes capacités de la part de quelqu'un avec qui j'ai travaillé, alors peut-être que je ne devrais pas penser que j'ai manqué un emploi, je devrais penser qu'ils m'ont manqué.
Alors oui, je pense que c'est au mieux une pratique discutable, mais je la comprends. J'ai également envisagé la possibilité que ce ne soit pas la faute de la question, mais le questionneur, pour en faire une situation de haute pression.
Personnellement, je préfère poser des questions ouvertes sur un problème que le candidat a déjà résolu - récemment, si possible, et couvrant à la fois des problèmes de codage et de processus. S'ils peuvent apporter des échantillons de code, c'est fantastique.
la source
Il faut définir le type de travail de programmation. Si vous développez des compilateurs et des algorithmes, vous devez vous poser des questions à ce sujet. Si vous êtes dans des applications de type métier et que vous vous attendez à ce que le candidat fasse des applications CRUD, la connaissance du concept (sans avoir à écrire un programme) peut alors être suffisante. Aujourd'hui, la connaissance des différentes technologies requises pour effectuer le travail spécialement dans les applications de type métier remplace le besoin d'algorithmes soignés.
la source
Ma réponse est "ça dépend". Je voudrais poser cette question si un candidat a inscrit C ou C ++ sur son CV. Demander l’implémentation d’une liste chaînée constitue un bon test pour comprendre les pointeurs, ce qui est absolument essentiel pour un programmeur C ou C ++.
Par contre, si un candidat ne prétend pas connaître le C ou C ++, je ne lui demanderais pas de mettre en place une liste chaînée, mais j’envisagerais de poser des questions à ce sujet. Expliquez à un niveau élevé comment fonctionne une liste chaînée. Quelle est la complexité d'ajouter un élément à la tête de la liste? La queue de la liste? Insérer un élément au milieu de la liste? Quand utiliseriez-vous une liste plutôt qu'un tableau? Ce sont des concepts fondamentaux de structure de données que, à mon humble avis, tout programmeur devrait connaître.
la source
Je ne considérerais pas cela comme une mauvaise question d’entrevue. Une bonne partie de la compréhension de la structure de données et de la programmation commence par une très bonne compréhension des listes chaînées. Cela dit, il y a des mises en garde:
1) C'est une question de type fizz-buzz. Vous ne faites que valider quelque chose de très fondamental: la personne comprend-elle une liste chaînée? Demandez-le et passez à autre chose.
2) Les listes chaînées posent un problème: les langues qui sont parfaitement adaptées pour montrer votre compréhension des concepts de liste chaînée (par exemple, C) peuvent ne pas être identiques à la langue avec laquelle elles travailleront. Vous pouvez démontrer une compréhension de base dans n'importe quelle langue avec des structures, bien sûr, mais demander à un candidat de réimplémenter une liste chaînée dans Erlang sans utiliser [] n'est pas le même défi et ne vous dira pas la même chose à propos de la compréhension du candidat. en leur demandant de le faire en C. Leur demander de le faire en C si le travail est autour de Java manque également quelque peu.
3) Dans cet esprit et face aux défis généraux de la "programmation par tableau blanc", si je posais ce type de question, j'accepterais les pseudocodes ou les diagrammes, à condition qu'ils démontrent une compréhension des principes fondamentaux. Je ne demande pas aux gens d'écrire du code sur un tableau blanc qui est syntaxiquement et logiquement parfait, en particulier s'ils peuvent ensuite se retourner et identifier les problèmes logiques lorsqu'ils sont invités à le relire. YMMV.
la source
Lorsque je donnais des interviews, on me demandait souvent des implémentations de listes chaînées et certains algorithmes centrés sur des listes chaînées. J'ai résolu la plupart d'entre eux, et certains d'entre eux m'ont demandé d'exercer un peu mes neurones.
Si je passais un entretien, je choisirais une implémentation de la liste chaînée, non pas pour tester la qualité de la codification, mais pour vérifier le degré d'attention accordée aux détails par une personne. Tout le monde peut écrire une liste chaînée, mais ce ne sont pas tous les bons programmeurs qui échouent. Ne lui demandez pas:
Write a code for linked list in C/C++
. Demandez-lui d'écrire une liste générique de liens en C (pas C ++), etc.Tournez le problème et mettez d'autres conditions sur la liste des liens, et vous aurez une bonne question à poser. Certaines personnes sont alors tenues de faire des erreurs.
la source
void
pointeurs n'étaient là que pour ça ... :) Le premier lien que j'ai trouvé sur Google pour "liste générique liée en c" était: daniweb.com/software-development/c/threads/109260 et un autre était un entretien technique. .com /… Je pensais que tout le monde le savait!void
pointeurs n'est pas générique, mais juste générale pour tout moment. Ils peuvent contenir n'importe quel type de contenu et même les mélanger comme bon leur semble, ce qui le rend non générique pour moi. C'est comme utiliser le type de baseobject
dans les langages orientés objet…Au cours de mes 10 années environ de programmation professionnelle (et environ 10 ans en tant que passe-temps), je ne pense pas avoir jamais eu besoin de mettre en place une liste chaînée. Si quelqu'un me demandait de le faire lors d'une entrevue, je pourrais peut-être par contre demander si c'est quelque chose que je ferais régulièrement au travail.
Bien sûr, il y a certainement des emplois là où vous aurez besoin d'écrire des implémentations plus ou moins d'algorithmes cleanroom communément connus - comme mettre en œuvre une liste chaînée à partir de zéro. Mais pour la plupart des emplois en programmation, quelle valeur spécifique a-t-il pour l'entreprise qu'un candidat peut le faire pendant une interview? Est-il vraiment si important dans un tel contexte que le candidat fournisse une mise en œuvre parfaite, qui gère correctement les cas critiques, signale les échecs selon les pratiques courantes dans le langage ou le cadre, etc.? Ou pouvez-vous oublier cela et vous concentrer sur la façon dont ils abordent réellement un problème auquel ils ne sont peut-être pas confrontés depuis 10 ou 20 ans?
Lorsque j'ai interviewé pour mon poste actuel, j'avais très peu d'expérience de la pile technologique utilisée dans l'entreprise. Quelques années plus tard, des collègues viennent régulièrement me voir et me posent des questions non seulement sur les produits, leur mise en oeuvre et les normes qu’ils appliquent, mais aussi sur des problèmes de programmation beaucoup plus généraux (on me demandait hier seulement les implications impliquaient une dépendance circulaire dans une contrainte par défaut dans SQL Server dans le contexte d'une table particulière et son utilisation dans notre cas - en raisonnant à travers elle, il s'est avéré qu'il n'y avait aucune implication dans ce cas particulier). Je n'ai pas eu besoin non plus d'une nouvelle implémentation de liste chaînée pour cela.
Posez des questions pertinentes pour le travail que le candidat est susceptible d’être affectéet essayez de vous faire une idée de ce qu’ils pensent de la collecte de nouvelles connaissances. Comment pourraient-ils s'y prendre pour comprendre le sens d'une obscure syntaxe qu'ils n'ont jamais vue? (Si vous êtes un magasin C, par exemple, vous pouvez alors essayer une question impliquant des trigrammes.) Pour un poste de programmation, lisent-ils ou contribuent-ils régulièrement à des forums tels que Stack Overflow? Si on leur demandait d'exécuter certaines tâches dans un langage ou un cadre de programmation avec lequel ils avaient peu ou pas d'expérience (disons, si vous êtes principalement un magasin Java, qu'en est-il de Clojure ou .NET?), Comment aborderont-ils le problème? Peut-être prenez-vous un véritable bogue dans votre traqueur de bogues (il pourrait même en être un qui a été résolu depuis longtemps) et demandez-leur comment, en termes généraux, le résoudre, et soyez prêt à expliquer les parties pertinentes du produit en question.
Si le candidat est capable de gérer des types de problèmes pertinents pour les affaires et a une bonne attitude vis-à-vis de l’apprentissage de nouvelles choses, c’est probablement un bien meilleur indicateur de son aptitude à occuper ce poste que de pouvoir fournir des réponses précises aux questions bien connues, à savoir: les questions portent sur FizzBuzz, des listes chaînées ou autre chose. Indiquez à quel point le candidat s’intègre bien dans l’équipe et je penserais que vous êtes sur un terrain relativement sûr.
la source
Bien sûr, la plupart des gens n'auraient jamais besoin d'implémenter une liste chaînée, mais pour les implémenter à partir de zéro, il faudra probablement gérer les pointeurs correctement. Leur idée est alors qu'avoir formé un modèle mental cohérent pour les pointeurs est en corrélation avec la maîtrise de la langue, la compréhension de ce qui se passe à un niveau de machine (abstrait) et la capacité d'abstraction en général.
Je ne dis pas que ce serait nécessairement la meilleure mesure, mais seulement qu'il existe une certaine corrélation.
la source
Vous commencez par dire qu’il s’agit de questions «donne-moi», mais ensuite, vous indiquez que les gens ne pourront naturellement pas les poser. Je suis confus.
Voici comment j'y pense:
Je pense que cela fait de bonnes questions à poser. Si vous craignez qu'ils ne se préparent à l'entrevue, lancez-en une liste. Demandez-leur de l'écrire et demandez-leur quelle est la durée asymptotique de leur mise en œuvre. Ou demandez-leur d'écrire une autre structure de données commune et / ou rapide ... Un arbre de recherche binaire? Une file d'attente (FIFO)? Une pile (FILO)? Une
O(n)
file d'attente prioritaire naïve ( )? Beaucoup de gens que je connais pensent qu'une BST, c'estO(log n)
simplement parce que c'est un arbre .Si vous recherchez quelqu'un qui travaillera dans le métal et qui a besoin d'une base très solide dans les structures de données, il peut même être beaucoup trop trivial pour les candidats que vous souhaitez embaucher.
Ceci suppose, bien entendu, que vous souhaitiez un développeur possédant les bases / bases des structures de données et dont la position bénéficierait de ces bases. Si vous souhaitez que quelqu'un puisse créer ensemble une page asp en quelques secondes, interviewez pour cela. Le but n'est pas de choisir une question d'entrevue parce que tout le monde le fait, mais d'en choisir une qui mesure les compétences que vous recherchez. Personnellement, je pense que les questions sur les structures de données sont bonnes, liste chaînée ou non.
la source
Non, absolument pas. En fonction de la manière dont elle est formulée, les réponses vont de "ce candidat sait comment concevoir une liste chaînée" à "ce candidat peut programmer une liste chaînée en langue X". Si vous demandez un pseudo-code, il tendra davantage vers le premier. Si vous demandez une implémentation dans un langage particulier, vous approfondirez leur compréhension du langage (en particulier en C et C ++, où vous pouvez gérer des pointeurs, des références et des structures).
J'irais même jusqu'à dire qu'il n'est pas possible d'évaluer tous les candidats en utilisant les mêmes questions. Vous devez adapter vos questions d'entrevue pour évaluer les compétences que vous recherchez dans le poste.
Si la personne va être en mesure d'écrire du code, je penserais à inclure un algorithme et / ou une question sur la structure de données, pour autant que cela soit pertinent pour le poste. J'essayerais de choisir quelque chose qui aurait pu être discuté ou utilisé auparavant. Je me concentrerais également sur des choses autres que la simple implémentation desdits algorithmes et structures de données, telles que le temps d'exécution et la consommation de mémoire (des choses comme la notation big-O). Ces concepts sont pertinents non seulement pour la création de la structure de données, mais également pour le choix de la mise en œuvre la mieux adaptée (telle qu'une
ArrayList
comparaison,LinkedList
par exemple).la source
Je ne pense pas que, pour un poste de programmeur régulier, une question élimine un candidat. Mais c'est un bon moyen de voir si vous avez affaire à un programmeur vraiment expérimenté ou à quelqu'un qui n'a fait que coder des formulaires avec du singe pendant de nombreuses années. Et même ainsi, cela ne devrait pas être un critère fondamental pour choisir un programmeur. Peut-être est-ce un bon programmeur avec une mémoire insuffisante et qui n'a pas lu les mots "liste chaînée" pendant des années (ou ne se souvient pas du nom) mais qui peut toujours faire de bonnes applications.
Donc, comme certains l’ont dit, s’il s’agit d’un travail qui nécessite de travailler avec une liste chaînée et de nombreux algorithmes sophistiqués, etc., alors ok. Est-ce que si pour les données d'entrée habituelles sur un formulaire, valider et afficher est un peu inutile et injuste.
la source
Je pense que c'est un mauvais exemple de question d'entrevue, mais pour une raison différente. Une liste chaînée est un concept tellement simple que savoir ce que c'est de savoir comment le mettre en œuvre. Si la personne ne sait pas ce qu'est une liste chaînée, vous devez expliquer comment cela fonctionne. Vous donnez ainsi la réponse sans découvrir quoi que ce soit sans savoir s'ils savent ou non résoudre les problèmes . La question se résume donc à "savez-vous déjà ce qu'est une liste chaînée et comment ça marche?", Ce qui ne vous dit rien d'utile sur leur pertinence en tant que programmeur.
la source
Écrire une implémentation de liste chaînée est une bonne question d’entrevue, car elle en dira beaucoup sur la manière dont le candidat a codé:
Sait-il ce qu'est une API? Peut-il utiliser le code d'autres personnes? Peut-il écrire du code pour que d'autres personnes puissent l'utiliser?
Sait-il ce qu'est une liste chaînée? Connaît-il des collections, des structures de données, des algorithmes?
S'il ne sait même pas quelles méthodes une liste chaînée doit offrir, vous savez qu'il n'a probablement jamais utilisé une de ces listes ou ne sait pas quand en utiliser une.
Comment gère-t-il le problème? Commence-t-il d'abord par une analyse, une petite spécification, des tests au préalable? Ou commence-t-il simplement à s'amuser?
Est-ce qu'il gère les cas de bord? Qu'en est-il de supprimer le dernier nœud de la liste liée? Et si quelqu'un essayait d'ajouter une référence à la liste liée elle-même à la liste liée, puis supprimait le tout?
Est-ce qu'il gère les exceptions? Chaque langage de programmation a ses propres conventions pour la gestion des exceptions: en Java, vous vous attendez à ce que LinkedList lève une exception NoSuchElementException lorsque vous faites un getFirst () sur une liste vide. D'autres langues peuvent renvoyer indéfini, -1 ou une constante.
la source