it-swarm.com.de

Ist es eine schlechte Interviewpraxis, wenn Kandidaten eine Implementierung einer verknüpften Liste schreiben?

Lesen dieser Site und SO Ich habe viele Geschichten über Interviewfragen und -antworten gesehen, in denen es heißt, ein Kandidat müsse eine verknüpfte Liste von Grund auf neu implementieren. Normalerweise ist dies eine "Gimme" -Übung für die Programmierung von Rollenkandidaten wie Schreiben von FizzBuzz. Die Idee ist, dass der Kandidat, wenn er dies nicht kann, nicht programmieren kann und fast sofort abgelehnt werden sollte.

Ich kann jedoch nicht anders, als zu glauben, dass dies aus folgenden Gründen eine schlechte Praxis sein könnte:

  • Moderne übergeordnete Sprachen wie C # und Python verwenden Listen nativ häufig; das Schreiben eines eigenen verknüpften Listenobjekts wäre nur unter ungewöhnlichen Umständen erforderlich und selbst dann wahrscheinlich schlecht beraten.
  • Untergeordnete Sprachen wie C++ verfügen über Standardbibliotheken mit Iteratoren/Listencontainern und Objekten.
  • In Anbetracht der ersten beiden Punkte können Codierer Jahre vergehen, ohne überhaupt daran zu denken, eine Liste (verknüpft, doppelt verknüpft usw.) selbst zu implementieren. Einige mögen solche Dinge seit College-Tagen nicht einmal wirklich sehen.
  • Rechenleistung ist auch nicht der Faktor, der es vor Jahren war, daher ist Effizienz über Zeiger nicht das Problem, das es früher war (im Allgemeinen).
  • Eine einfache Websuche nach etwas wie "Beispiel für eine verknüpfte Liste" würde viele Codebeispiele hervorbringen, die einfach auswendig gelernt und zurückgespuckt werden könnten, ohne wirklich auf die wahre Kompetenz des Antragstellers hinzuweisen.

Ich sollte sagen, dass die Verwendung einer verknüpften Liste, die zu nbefristeten Fragen/Diskussionen über die Fähigkeiten der Kandidaten zur Problemlösung/zum kritischen Denken führt, wahrscheinlich eine wirklich gute Interviewpraxis ist. Auf jede Art und Weise kann ein Interviewer wirklich sehen, wie ein Bewerber ist und wie er es für äußerst vorteilhaft hält.

Ich denke, dieser binäre Ansatz von "kein verknüpfter Listencode, kein Job" für Programmierer, die an einem Desktop oder einer Webanwendung arbeiten, ist etwas veraltet. Es könnte auch ziemlich schädlich sein; Ein Kandidat, der sich nicht erinnern kann, wie man richtig mit dem Kopf einer Liste arbeitet, könnte ein ansonsten ausgezeichneter Programmierer und Mitarbeiter sein und sich in der Mischung verlieren. Gedanken?

EDIT : Es gibt viele (gute) Kommentare, die darauf hinweisen, dass es vom Kontext des Jobs abhängt, ob dies eine gute oder eine schlechte Frage ist. Ich stimme voll und ganz zu, also lassen Sie mich diese Frage umformulieren: Das Implementieren einer verknüpften Liste ist eine häufige Interviewfrage für eine Vielzahl von Codierungsjobs, ähnlich wie Fragen wie FizzBuzz oder das Schreiben einer rekursiven Funktion zum Berechnen von Fakultäten. Hat diese Frage genug Nutzen, um allgemein für die allgemeine Bewertung von Programmierkandidaten verwendet zu werden? Oder sollte eine schlechte Frage in Betracht gezogen werden, mit Ausnahme der Positionen "Senior Developer, Embedded Linked Lists Team"?

43
joshin4colours

Wenn die Beantwortung der Frage Ihnen sagt, was Sie über einen Kandidaten wissen möchten, ist dies eine gute Interviewfrage. Wenn es dir das nicht sagt, ist es eine schlechte Frage.

Einfache Fragen wie FizzBuzz erfüllen einen bestimmten Zweck. Wenn ein Kandidat FizzBuzz nicht codieren kann, kann er einfach nicht codieren und Sie können das Interview vorzeitig beenden. Ich würde die Implementierung einer verknüpften Liste nur geringfügig schwieriger bewerten, aber es kann eine Konversation über Datenstrukturen im Allgemeinen beginnen, die viel enthüllt.

Denken Sie daran, dass keine einzelne Interviewfrage Ihnen alles sagt, was Sie wissen möchten. Sie müssen wirklich eine Gruppe von Fragen bereithalten. Sie sollten Fragen in einer Reihenfolge von der einfachsten bis zur schwierigsten stellen, damit Sie das Limit dessen finden, was der Kandidat weiß. Wenn Sie eine Frage stellen und sie es nageln, wissen Sie immer noch nicht, was sie sonst noch tun oder nicht wissen.


In Bezug auf Ihre Bearbeitung:

Hat diese Frage genug Nutzen, um allgemein für die allgemeine Bewertung von Programmierkandidaten verwendet zu werden? Oder sollte eine schlechte Frage in Betracht gezogen werden, mit Ausnahme der Positionen "Senior Developer, Embedded Linked Lists Team"?

Ich denke, es ist eine gute allgemeine Frage, die zur Bewertung praktisch jedes Programmierkandidaten verwendet werden kann. Es muss nur Teil einer größeren Gruppe von Fragen sein. Es wäre ein guter Eisbrecher für viele Arten von Positionen (selbst wenn der Kandidat eine verknüpfte Liste nicht von Grund auf neu implementieren kann, kann er möglicherweise erklären, wie er zuvor eine verwendet hat und welche Schlüsselfunktionen verwendet werden) oder für den Anfang von Eine lange Folge fortgeschrittener Fragen für die Position "Senior Developer, Embedded Linked Lists Team".

52
Bill the Lizard

Ich habe Jobs verpasst, nur weil ich mich mit einfachen Rätseln wie diesen beschäftigt habe. Ich habe solche Rätsel auch in anderen Interviews hervorragend gelöst - ich weiß, wie man eine verknüpfte Liste in einer Umgebung ohne Druck implementiert. Ich hatte noch nie eine Beschwerde über meine Fähigkeiten von jemandem, mit dem ich zusammengearbeitet habe. Vielleicht sollte ich nicht denken, dass ich Jobs verpasst habe, ich sollte denken, dass sie mich verpasst haben.

Also ja, ich denke, es ist bestenfalls eine fragwürdige Praxis, aber ich verstehe es. Ich habe auch die Möglichkeit in Betracht gezogen, dass es nicht die Schuld der Frage ist, sondern der Fragesteller, um sie zu einer Hochdrucksituation zu machen.

Persönlich stelle ich lieber offene Fragen zu einem Problem, das der Kandidat bereits gelöst hat - wenn möglich vor kurzem - und deckt sowohl Codierungs- als auch Prozessprobleme ab. Wenn sie Codebeispiele mitbringen können, fantastisch.

34
pdr

Man muss den Programmierauftragstyp definieren. Wenn Sie sich mit der Entwicklung von Compilern und Algorithmen befassen, sollten Fragen zu solchen Dingen erwartet werden. Wenn Sie sich in Branchenanwendungen befinden und erwarten, dass der Kandidat CRUD-Anwendungen ausführt, ist möglicherweise die Kenntnis des Konzepts (ohne ein Programm zu schreiben) ausreichend. Heutzutage ersetzt das Wissen über verschiedene Technologien, die erforderlich sind, um die Arbeit speziell für LOB-Anwendungen zu erledigen, die Notwendigkeit sauberer Algorithmen.

25
NoChance

Meine Antwort lautet "Es kommt darauf an". Ich würde diese Frage stellen, wenn ein Kandidat C oder C++ in seinem Lebenslauf aufgeführt hat. Die Frage nach der Implementierung einer verknüpften Liste ist ein guter Test für das Verständnis von Zeigern, der für einen C- oder C++ - Programmierer unbedingt erforderlich ist.

Wenn ein Kandidat hingegen nicht behauptet, C oder C++ zu kennen, würde ich ihn nicht bitten, eine verknüpfte Liste zu implementieren, aber ich würde in Betracht ziehen, Fragen dazu zu stellen. Erklären Sie auf hoher Ebene, wie eine verknüpfte Liste funktioniert. Wie komplex ist das Hinzufügen eines Elements zum Kopf der Liste? Das Ende der Liste? Ein Element in die Mitte der Liste einfügen? Wann würden Sie eine Liste im Gegensatz zu einem Array verwenden? Dies sind grundlegende Datenstrukturkonzepte, die meiner Meinung nach jeder Programmierer kennen sollte.

9
Dima

Ich würde es nicht als schlechte Interviewfrage betrachten. Viel Verständnis und Programmierung von Datenstrukturen beginnt mit einem wirklich guten Verständnis der verknüpften Listen. Das heißt, es gibt einige Einschränkungen:

1) Es handelt sich um eine Frage vom Typ Fizz-Buzz. Sie validieren nur etwas sehr Grundlegendes: Versteht die Person eine verknüpfte Liste? Fragen Sie es und fahren Sie fort.

2) Bei verknüpften Listen besteht die Herausforderung darin, dass die Sprachen, die sich hervorragend dazu eignen, Ihr Verständnis von Konzepten für verknüpfte Listen (z. B. C) zu demonstrieren, möglicherweise nicht mit der Sprache übereinstimmen, mit der sie im Job arbeiten. Sie können das Grundverständnis natürlich in jeder Sprache mit Strukturen demonstrieren, aber einen Kandidaten zu bitten, eine verknüpfte Liste in Erlang erneut zu implementieren, ohne [] zu verwenden, ist nicht die gleiche Herausforderung und sagt Ihnen nicht das Gleiche über das Verständnis eines Kandidaten als sie bitten, es in C zu tun. Sie zu bitten, es in C zu tun, wenn der Job in der Nähe ist Java fehlt auch der Punkt etwas.

3) Vor diesem Hintergrund und angesichts der allgemeinen Herausforderungen der "Whiteboard-Programmierung" würde ich bei Fragen dieser Art Pseudocode oder Diagramme akzeptieren, sofern sie das Verständnis der Kernprinzipien demonstrieren. Ich fordere die Leute nicht auf, Code auf ein Whiteboard zu schreiben, das syntaktisch und logisch perfekt ist, insbesondere wenn sie sich dann umdrehen und logische Probleme identifizieren können, wenn sie aufgefordert werden, ihn erneut anzusehen. YMMV.

7
dclements

Wenn ich Interviews gab, wurde ich oft nach Implementierungen von verknüpften Listen und einigen Algorithmen gefragt, die sich auf verknüpfte Listen konzentrierten. Ich habe die meisten von ihnen gelöst, und bei einigen musste ich meine Neuronen ein wenig trainieren.

Wenn ich jemals ein Interview führen würde, würde ich mich für eine Art Implementierung einer verknüpften Liste entscheiden, nicht um zu testen, wie gut eine Person im Codieren ist, sondern um zu überprüfen, wie viel Aufmerksamkeit eine Person den Details schenkt. Jeder kann eine verknüpfte Liste schreiben, aber es sind die Grenzfälle, an denen selbst einige gute Programmierer scheitern. Fragen Sie ihn nicht: Write a code for linked list in C/C++. Bitten Sie ihn, eine generische verknüpfte Liste in C (nicht C++) usw. zu schreiben.

Verdrehen Sie das Problem und setzen Sie einige andere Bedingungen in die verknüpfte Liste, und Sie haben eine gute Frage zu stellen. Manche Menschen müssen dann Fehler machen.

6
c0da

In meinen ungefähr 10 Jahren professioneller Programmierung (und ungefähr weiteren zehn Jahren als Hobby) glaube ich nicht, dass ich jemals eine verknüpfte Liste implementieren musste. Wenn mich jemand während eines Interviews darum gebeten hat, könnte ich dem entgegenwirken, indem ich frage, ob ich das regelmäßig bei der Arbeit tun werde.

Natürlich gibt es mit ziemlicher Sicherheit Jobs, bei denen Sie werden Mehr oder weniger Reinraumimplementierungen allgemein bekannter Algorithmen schreiben müssen - beispielsweise eine verknüpfte Liste von Grund auf neu implementieren. Aber welchen spezifischen Wert hat es für die meisten Programmierjobs für das Unternehmen, dass ein Kandidat dies während eines Interviews tun kann? Ist es in einer solchen Umgebung wirklich so wichtig, dass der Kandidat eine perfekte Implementierung bereitstellt, die Edge-Fälle korrekt behandelt, Fehler gemäß der in der Sprache oder im Framework üblichen Praxis meldet und so weiter? Oder können Sie das übersehen und sich stattdessen darauf konzentrieren, wie sie tatsächlich ein Problem angehen, mit dem sie vielleicht seit 10 bis 20 Jahren nicht mehr konfrontiert wurden?

Als ich für meinen aktuellen Job interviewt habe, hatte ich sehr wenig Erfahrung mit dem im Unternehmen verwendeten Technologie-Stack. Jetzt, einige Jahre später, kommen regelmäßig Kollegen zu mir und stellen Fragen nicht nur zu den Produkten, ihrer Implementierung und den von ihnen implementierten Standards, sondern auch zu viel allgemeineren Programmierproblemen (erst gestern wurde mir gefragt, was Die Auswirkungen waren eine zirkuläre Abhängigkeit in einer Standardeinschränkung in SQL Server im Kontext einer bestimmten Tabelle und deren Verwendung in unserem Fall. In diesem Fall stellte sich heraus, dass es in diesem bestimmten Fall keine Auswirkungen gab. Ich brauchte auch dafür keine brandneue Implementierung einer verknüpften Liste.

Stellen Sie Fragen, die für die Arbeit relevant sind, die dem Kandidaten wahrscheinlich zugewiesen wird, und versuchen Sie, eine Vorstellung davon zu bekommen, wie er sich dabei fühlt, neues Wissen zu erwerben. Wie würden sie vorgehen, um die Bedeutung einer obskuren Syntax herauszufinden, die sie noch nie gesehen haben? (Wenn Sie beispielsweise ein C-Shop sind, können Sie eine Frage mit Trigraphen versuchen.) Lesen sie für eine Programmierposition regelmäßig Foren wie Stack Overflow oder tragen sie dazu bei? Wenn sie gebeten wurden, eine Aufgabe in einer Programmiersprache oder einem Framework auszuführen, haben sie wenig oder keine Erfahrung damit (sagen wir, wenn Sie in erster Linie ein Java Shop, was ist mit Clojure oder .NET?), Wie würden sie sich dann dem Problem nähern? Vielleicht einen echten Fehler aus Ihrem Bug-Tracker entfernen (möglicherweise sogar einen, der längst behoben ist) und sie fragen, wie sie sich im Allgemeinen der Lösung des Problems nähern würden, und bereit sein, die relevanten Teile von zu erklären das betreffende Produkt.

Wenn der Kandidat mit geschäftsfallrelevanten Arten von Problemen umgehen kann und eine gute Einstellung zum Erlernen neuer Dinge hat, ist dies wahrscheinlich ein viel besserer Indikator für die Passform für diese bestimmte Position als die Möglichkeit, Dosen bereitzustellen Antworten auf bekannte Fragen, unabhängig davon, ob es sich um FizzBuzz, verknüpfte Listen oder etwas anderes handelt. Geben Sie an, wie gut der Kandidat zum Team passt, und ich würde denken, dass Sie sich auf einem ziemlich sicheren Boden befinden.

5
a CVn

Natürlich müssten die meisten Leute niemals eine verknüpfte Liste implementieren, aber um sie von Grund auf neu zu implementieren, muss man wahrscheinlich mit Zeigern richtig umgehen. Die Idee ist dann, dass die Bildung eines konsistenten mentalen Modells für Zeiger mit den Sprachkenntnissen, dem Verständnis dessen, was auf einer (abstrakten) Maschinenebene geschieht, und der Fähigkeit, allgemein zu abstrahieren, korreliert.

Ich sage nicht, dass dies notwendigerweise das beste Maß wäre, sondern nur, dass es eine gewisse Korrelation gibt.

4

Sie sagen zunächst, dass es sich um "Gimme" -Fragen handelt, aber dann weisen Sie darauf hin, dass die Leute sie verständlicherweise nicht beantworten können. Ich bin verwirrt.

So denke ich darüber nach:

  • Es gibt selten eine Notwendigkeit, eine zu schreiben, wie Sie sagen, so dass die Leute leicht vergessen haben.
  • Sie sind nicht unglaublich schwer zu schreiben.
  • Die Konzepte, mit denen sie geschrieben wurden, können als grundlegend angesehen werden.
  • Sie werden unglaublich oft verwendet (auch wenn Sie sich dessen nicht bewusst sind).

Ich denke, das macht sie zu guten Fragen. Wenn Sie sich Sorgen machen, dass sie vorab für das Interview lernen, werfen Sie eine Liste ein. Lassen Sie sie das Rundschreiben schreiben und fragen Sie nach der asymptotischen Laufzeit ihrer Implementierung. Oder lassen Sie sie eine andere gemeinsame und/oder schnelle Datenstruktur schreiben ... Ein binärer Suchbaum? Eine Warteschlange (FIFO)? Ein Stapel (FILO)? Eine naive (O(n)) Prioritätswarteschlange? Viele Leute, die ich kenne, denken, dass eine BST O(log n) ist, nur weil es ein Baum ist .

Wenn Sie jemanden suchen, der am Metall arbeitet und eine sehr solide Grundlage in Datenstrukturen benötigt ... können diese sogar viel zu trivial für die Kandidaten, die Sie einstellen möchten.

Dies setzt natürlich voraus, dass Sie einen Entwickler suchen, der über die Grundlagen von Datenstrukturen verfügt und dessen Position von diesen Grundlagen profitieren würde. Wenn Sie jemanden suchen, der in Sekundenschnelle eine Asp-Seite zusammenstellen kann, interviewen Sie dafür. Es geht nicht darum, eine Interviewfrage auszuwählen, weil alle anderen dies tun, sondern eine, die die Fähigkeiten misst, nach denen Sie suchen. Persönlich denke ich, dass Datenstrukturfragen gut sind, verknüpfte Liste oder nein.

4
Steven Evers

Hat diese Frage genug Nutzen, um allgemein für die allgemeine Bewertung von Programmierkandidaten verwendet zu werden?

Nein auf keinen Fall. Je nachdem, wie es formuliert ist, reicht das, was es Ihnen sagt, von "Dieser Kandidat weiß, wie man eine verknüpfte Liste erstellt" bis zu "Dieser Kandidat kann eine verknüpfte Liste in Sprache X programmieren". Wenn Sie nach Pseudocode fragen, tendiert dieser eher zum ersten. Wenn Sie nach einer Implementierung in einer bestimmten Sprache fragen, werden Sie mehr über deren Verständnis der Sprache erfahren (insbesondere mit C und C++, wo Sie mit Zeigern, Referenzen und Strukturen umgehen können).

Ich würde sogar so weit gehen zu sagen, dass es nicht möglich ist, alle Kandidaten mit denselben Fragen zu bewerten. Sie müssen Ihre Interviewfragen anpassen, um die Fähigkeiten zu bewerten, die Sie in der Position suchen.

Wenn die Person in der Lage sein wird, Code zu schreiben, würde ich darüber nachdenken, einen Algorithmus und/oder eine Datenstrukturfrage aufzunehmen, solange dies für die Position relevant ist. Ich würde versuchen, etwas auszuwählen, das vorher besprochen oder verwendet worden sein könnte. Ich würde mich auch auf andere Dinge konzentrieren als nur auf die Implementierung dieser Algorithmen und Datenstrukturen, wie die Laufzeit und den Speicherverbrauch (Dinge wie Big-O-Notation). Diese Konzepte sind nicht nur für die Erstellung der Datenstruktur relevant, sondern auch für die Auswahl der am besten geeigneten Implementierung (z. B. ein ArrayList gegenüber einem LinkedList).

3
Thomas Owens

Ich denke nicht, dass ein regulärer Programmierjob eine Frage sein sollte, die einen Kandidaten ausschließt. Aber es ist gut zu sehen, ob Sie es mit einem wirklich erfahrenen Programmierer oder mit jemandem zu tun haben, der seit vielen Jahren nur Affencodierungsformulare verwendet. Und trotzdem sollte es kein grundlegendes Kriterium für die Auswahl eines Programmierers sein. Vielleicht ist ein großartiger Programmierer mit schlechtem Gedächtnis und hat die Wörter "verknüpfte Liste" seit Jahren nicht mehr gelesen (oder erinnert sich nicht an den Namen), kann aber trotzdem gute Apps erstellen.

Also, wie einige sagten, wenn es ein Job sein soll, der mit verknüpften Listen und vielen ausgefallenen Algorithmen usw. arbeiten muss, dann ok. Ist, wenn für die üblichen Eingabedaten auf einem Formular, validieren und zeigen ist irgendwie nutzlos und unfair.

3
H27studio

Ich denke, dass dies ein schlechtes Beispiel für eine Interviewfrage ist, aber aus einem anderen Grund. Eine verknüpfte Liste ist ein so einfaches Konzept, dass man wissen muss, wie man sie implementiert, um zu wissen, was es ist. Wenn die Person nicht weiß, was eine verknüpfte Liste ist, müssen Sie erklären, wie sie funktioniert, und dabei geben Sie die Antwort weiter, ohne etwas über herauszufinden, ob sie weiß, wie Probleme lösen . Die Frage lässt sich also auf "Wissen Sie bereits, was eine verknüpfte Liste ist und wie sie funktioniert?" Reduzieren, was Ihnen nichts Nützliches über ihre Eignung als Programmierer sagt.

2
Mason Wheeler

Das Schreiben einer Implementierung mit verknüpften Listen ist eine gute Interviewfrage, da sie viel über die Art und Weise der Codierung des Kandidaten verrät:

  • Weiß er, was eine API ist? Kann er den Code anderer Leute verwenden? Kann er Code schreiben, damit andere ihn verwenden können?

  • Weiß er, was eine verknüpfte Liste ist? Kennt er Sammlungen, Datenstrukturen, Algorithmen?

Wenn er nicht einmal weiß, welche Methoden eine verknüpfte Liste bieten soll, wissen Sie, dass er wahrscheinlich nie eine verwendet hat oder wann er eine verwenden soll.

  • Wie geht er mit dem Problem um? Beginnt er zuerst mit einer Analyse, einer kleinen Spezifikation, einigen Tests im Voraus? Oder fängt er einfach an, glücklich wegzuhacken?

  • Behandelt er Edge-Fälle? Was ist mit dem Entfernen des letzten Knotens aus der verknüpften Liste? Was ist, wenn jemand versucht, einen Verweis auf die verknüpfte Liste selbst zur verknüpften Liste hinzuzufügen und dann das Ganze löscht?

  • Behandelt er Ausnahmen? Jede Programmiersprache hat ihre eigenen Konventionen für die Behandlung von Ausnahmen: In Java wird erwartet, dass eine LinkedList eine NoSuchElementException auslöst, wenn Sie getFirst () für eine leere Liste ausführen. Andere Sprachen geben möglicherweise undefiniert, -1 oder eine Konstante zurück.

2
Konerak