Ist es eine schlechte Interviewpraxis, wenn Kandidaten eine Implementierung mit verknüpften Listen schreiben? [geschlossen]

43

Beim Lesen dieser Website und SO habe ich viele Geschichten über Interviewfragen und -antworten gesehen, in denen gesagt wurde, ein Kandidat müsse eine verknüpfte Liste von Grund auf neu implementieren. Normalerweise ist dies eine "Gimme" -Übung zum Programmieren von Rollenkandidaten wie dem Schreiben von FizzBuzz. Die Idee ist, dass wenn der Kandidat dies nicht kann, er nicht programmieren kann und fast sofort abgelehnt werden sollte.

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

  • Moderne höhere Sprachen wie C # und Python verwenden Listen häufig. Das Schreiben eines eigenen verknüpften Listenobjekts wäre nur unter ungewöhnlichen Umständen erforderlich und selbst dann wahrscheinlich nicht ratsam.
  • Untergeordnete Sprachen wie C ++ haben Standardbibliotheken mit Iteratoren / Listencontainern und Objekten.
  • In Anbetracht der ersten beiden Punkte können Programmierer 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 mehr wirklich sehen.
  • Die Rechenleistung ist auch nicht der Faktor, der vor Jahren war, daher ist die Effizienz über Zeiger (im Allgemeinen) nicht mehr das Problem, das es früher war.
  • Eine einfache Websuche nach so etwas wie "Beispiel für verknüpfte Listen" würde viele Codebeispiele hervorbringen, die einfach auswendig gelernt und ausgespuckt werden könnten und nicht wirklich die wahre Kompetenz des Antragstellers anzeigen.

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

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

EDIT : Es gibt viele (gute) Kommentare, die darauf hindeuten, dass es vom Kontext des Jobs abhängt, ob es sich um eine gute oder eine schlechte Frage handelt. 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 Codierungsaufgaben, ähnlich wie bei Fragen wie FizzBuzz oder dem Schreiben einer rekursiven Funktion zur Berechnung von Fakultäten. Hat diese Frage genug Nutzen, um allgemein für die Bewertung von Programmierkandidaten verwendet zu werden? Oder sollte es eine schlechte Frage sein, die man sich stellen sollte, mit Ausnahme der Stellen bei "Senior Developer, Embedded Linked Lists Team"?

joshin4colours
quelle
11
Für welche Position ist das? Was ist das für ein Job? In welcher Domain ist es?
Thomas Owens
1
Ich sehe Ihre Änderungen, aber trotzdem - was für ein Job ist das? Ist das ein Praktikum? Ein Einstiegsjob? Ein Zwischenjob? Suchen Sie einen Programmierer, einen Ingenieur oder einen Wissenschaftler? In welcher Domain ist das? Würden sie jemals in der Lage sein, aus irgendeinem Grund ihre eigenen Algorithmen oder Datenstrukturen zu rollen?
Thomas Owens
3
'C # (...) verwendet Listen nativ häufig' und 'Effizienz über Zeiger war früher nicht das Problem': Wissen Sie, dass diese nativen Listen keine verknüpften Listen sind, sondern Listen, die auf Arrays basieren? Arrays tendieren dazu, aufgrund von Caching eine bessere Leistung zu erzielen. Tatsächlich hatte IIRC, das .NET Framework, bis 2.0 nicht einmal verknüpfte Listen. Ich bin mir ziemlich sicher, dass die meisten C # -Programme keine verknüpften Listen verwenden.
Alex ten Brink
1
@AlextenBrink Interessanterweise bedeutet dies, dass das Wissen über verknüpfte Listen für C # noch weniger wichtig ist. Warum selbst eine Datenstruktur implementieren (mit möglichen Fehlern), wenn ich eine bessere Struktur verwenden kann, die direkt in die Sprache integriert ist?
Joshin4colours
Die Frage, die ich mir gestellt habe, lautet: Warum sollte überhaupt in Betracht gezogen werden, eine Datenstruktur zu verwenden, die in fast allen Fällen einer anderen Datenstruktur unterlegen ist? Verknüpfte Listen sind für die meisten Operationen langsamer als Listen, die auf Arrays basieren. Das einzige, wofür verknüpfte Listen gut sind, ist das Löschen in konstanter Zeit, aber es gibt sehr wenige Situationen, in denen dies erforderlich ist. Beachten Sie, dass ich nicht darüber spreche, ob es sich bei einer Interviewfrage um eine gute Datenstruktur handelt: Die Konzepte könnten ein guter Test sein, ich weiß es nicht.
Alex ten Brink

Antworten:

52

Wenn Sie bei der Beantwortung der Frage wissen, was Sie über einen Kandidaten wissen möchten, ist dies eine gute Interviewfrage. Wenn es Ihnen 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 als etwas schwieriger einstufen, aber es kann eine Unterhaltung über Datenstrukturen im Allgemeinen beginnen, die viel enthüllt.

Denken Sie daran, dass Ihnen keine einzelne Interviewfrage alles sagt, was Sie wissen möchten. Sie müssen wirklich eine Gruppe von Fragen bereit haben. Sie sollten Fragen in einer Reihenfolge von der einfachsten bis zur schwierigsten stellen, damit Sie die Grenze dessen finden , was der Kandidat weiß. Wenn Sie eine Frage stellen und sie es verstehen, 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 Bewertung von Programmierkandidaten verwendet zu werden? Oder sollte es eine schlechte Frage sein, die man sich stellen sollte, mit Ausnahme der Stellen bei "Senior Developer, Embedded Linked Lists Team"?

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

Bill the Lizard
quelle
19
Ihr erster Absatz ist die halbe Wahrheit. Die andere Hälfte ist: Wenn die Frage den Kandidaten dazu bringt, für Sie zu arbeiten, dann ist es eine gute Interviewfrage. Wenn es den Kandidaten dazu bringt, nicht für Sie arbeiten zu wollen, ist es eine schlechte Frage.
Ruakh
5
Sie können die Grenze dessen, was der Kandidat auf diese Weise weiß, nicht finden, weil Sie nicht behaupten können, dass das, was Sie als "kompliziert" und "grundlegend" betrachten, in derselben Reihenfolge auf Ihren Kandidaten zutrifft. LinkedList ist wahrscheinlich eine Grundvoraussetzung für einen Programmierer, der an einer Universität unterrichtet wurde, aber ein Autodidakt musste höchstwahrscheinlich nie eine solche schreiben. Schließlich hat er wahrscheinlich "LinkedList <string> ..." geschrieben, wann immer er eines brauchte. Bedeutet das, dass sein Wissen unter der Ebene "linkedList" verankert ist? Er könnte ein Experte für komplexere Themen sein und in der Lage sein, LLs in 5 Minuten in Google zu lernen.
Sylverdrag
1
@ Sylverdrag Deshalb habe ich gesagt, Sie brauchen mehr als eine Frage. Wenn Sie die Grenze ihres Wissens über verknüpfte Listen gefunden haben, wechseln Sie zu einem anderen Thema.
Bill the Lizard
@ruakh Das spielt definitiv eine Rolle. Wenn jede einzelne Frage, die ich in einem Interview stelle, sich mit banalen Aspekten von CRUD-Apps befasst (dh ich glaube nicht, dass ich in diesem Unternehmen etwas Neues lernen kann), würde es mich nicht aufregen, dort zu arbeiten.
Bill the Lizard
34

Ich habe Jobs nur deshalb verpasst, weil ich mich nur 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 drucklosen Umgebung implementiert. Ich habe mich noch nie über meine Fähigkeiten bei jemandem beschwert, 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 nicht die Frage, sondern der Fragesteller daran schuld ist, dass es sich um eine Hochdrucksituation handelt.

Persönlich bevorzuge ich es, offene Fragen zu einem Problem zu stellen, das der Kandidat bereits gelöst hat - wenn möglich in jüngster Zeit - und dabei sowohl Codierungs- als auch Prozessprobleme zu behandeln. Wenn sie Codebeispiele mitbringen können, fantastisch.

pdr
quelle
Sie müssen etwas fragen, sei es Rätsel oder irgendetwas anderes. Jede Frage kann dazu führen, dass die Person leer bleibt.
Unterzeichnen Sie den
2
@pdr - "Wenn sie Codebeispiele mitbringen können, fantastisch." Wenn sie die mitgebrachten Codebeispiele schrieben, war das von unschätzbarem Wert.
robrambusch
4
Wenn jemand eine Implementierung einer verknüpften Liste in den Hintergrund stellt und sich nicht mit ein wenig Aufforderung zurechtfinden kann oder leicht frustriert wird, würde es wahrscheinlich jemand sein, den ich gerne verpassen würde.
Bill K
1
@pdr - "Und wenn du nicht kannst, wie lange denkst du, wirst du den Job haben?" - Solange es dauert, bis sie unter dem HR-Regime, unter dem Sie leiden, entlassen werden. Hinzu kommen die zusätzlichen Kosten für den Neustart Ihrer Kandidatensuche. Auch die Opportunitätskosten, die sich aus der Tatsache ergeben, dass die nächste Person, die Sie interviewt hätten, möglicherweise zum technischen Dreh- und Angelpunkt Ihrer gesamten Abteilung geworden ist. Aber jetzt sind sie natürlich nicht verfügbar, weil Sie die falsche Person eingestellt haben und sie einen anderen Job gefunden haben.
Robrambusch
1
@robrambusch: Er zeigte hervorragende Fähigkeiten zur Problemlösung und sprach gut über die Klassenstruktur. Aber er hat keinen Code geschrieben. Was das Schreiben von Code in einem Interview angeht, kann das nützlich sein, aber ich behaupte, ich kann in einer Stunde, in der ich mit Ihnen über gelöste Probleme spreche, mehr über Sie erfahren, als Ihnen ein einziges erfundenes Problem zu geben, das eines braucht Stunde zu lösen.
pdr
25

Man muss den Programmierauftragstyp definieren. Wenn Sie in der Entwicklung von Compilern und Algorithmen tätig sind, sollten Sie Fragen zu solchen Dingen haben. Wenn Sie sich in Branchenanwendungen befinden und erwarten, dass der Kandidat CRUD-Anwendungen durchführt, ist möglicherweise die Kenntnis des Konzepts (ohne ein Programm zu schreiben) ausreichend. Das Wissen über die verschiedenen Technologien, die für die Erledigung der Aufgaben speziell für LOB-Anwendungen erforderlich sind, ersetzt heutzutage die Notwendigkeit sauberer Algorithmen.

Keine Chance
quelle
Genau. Letztes Jahr habe ich eine genetische Sortierkomponente für allgemeine Zwecke geschrieben, die auch ein bisschen simuliertes Tempern verwendete (um Klassenpläne zu erstellen) und mehrere "fortgeschrittene" Datenstrukturen verwendete, um sie zum Laufen zu bringen. Ich brauchte keinen einzigen Code. Wenn das .Net-Framework nicht das hatte, was ich brauchte, habe ich C5 oder Power Collections verwendet.
ElGringoGrande
4
Einverstanden, ich schreibe den ganzen Tag LOB-Apps, ich habe in der Vergangenheit verknüpfte Listenimplementierungen geschrieben ... im College ... in COBOL. Ich könnte es wieder tun, aber warum? Viele kompetente LOB-Entwickler haben wahrscheinlich noch nie einen geschrieben und werden es auch nie brauchen.
CaffGeek
1
Im Allgemeinen einverstanden, aber eine verknüpfte Liste ist eigentlich nichts Exotisches. Es sind die Grundlagen, nur eine Ebene nach FizzBuzz.
Francesco De Vittori
1
@FrancescoDeVittori: Ist das nicht manchmal das Problem? Jemand gibt Ihnen ein Problem zu lösen. Es scheint einfach genug zu sein, aber Sie haben es noch nie getan. Ihr Gehirn beginnt zu rasen und versucht, die Fallstricke zu finden, die Sie das Interview kosten werden, wenn Sie nicht daran denken. Und es ist nicht da, aber es lenkt Sie davon ab, das eigentliche Problem zu lösen.
pdr
@FrancescoDeVittori: Können Sie ein paar Beispiele für nicht grundlegende Interviewfragen nennen? Ich brauche das zur Selbstverbesserung. Vielen Dank.
Den
9

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 Anforderung, eine verknüpfte Liste zu implementieren, 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 es, dem Kopf der Liste ein Element hinzuzufügen? Der Schwanz der Liste? Einfügen eines Elements in die Mitte der Liste? Wann würden Sie eine Liste anstelle eines Arrays verwenden? Dies sind grundlegende Datenstrukturkonzepte, die IMHO jeder Programmierer kennen sollte.

Dima
quelle
7

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

1) Es ist eine Frage vom Fizz-Buzz-Typ. 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, dass die Sprachen, mit denen Sie Ihr Verständnis der Konzepte für verknüpfte Listen zeigen können (z. B. C), möglicherweise nicht mit der Sprache übereinstimmen, mit der sie im Job arbeiten werden. Natürlich können Sie in jeder Sprache mit Strukturen grundlegendes Verständnis demonstrieren, aber die Aufforderung an einen Kandidaten, eine verknüpfte Liste in Erlang erneut zu implementieren, ohne [] zu verwenden, ist nicht die gleiche Herausforderung und wird Ihnen nicht das Gleiche über das Verständnis eines Kandidaten sagen Wenn man sie bittet, es in C zu tun, wenn der Job in Java ausgeführt wird, fehlt auch etwas der Punkt.

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

dclements
quelle
6

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 bisschen trainieren.

Wenn ich jemals ein Interview führen würde, würde ich mich für eine Art Linked-List-Implementierung 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.

Wenn Sie das Problem lösen und einige andere Bedingungen in die verknüpfte Liste aufnehmen, haben Sie eine gute Frage. Manche Menschen sind dann gezwungen, Fehler zu machen.

c0da
quelle
2
Keine generische verknüpfte Liste in C.
DeadMG
1
Ernsthaft? Ich dachte, voidZeiger sind nur dafür da ... :) Der erste Link, den ich bei Google für "generic linked list in c" gefunden habe, war: daniweb.com/software-development/c/threads/109260 und ein anderer war ein technisches Interview .com /… Ich dachte, das wüsste jeder!
c0da
Ich habe diese Codes nicht getestet, aber ich habe diese Art der verknüpften Liste früher, und es hat sicher gut funktioniert ...
c0da
Sogar das Schreiben einer generischen verknüpften Liste in C # hat ein oder zwei "Fallstricke" (z. B. das Vergleichen von Elementen des Typs T ist nicht offensichtlich; dh (T v1, T v2) => {return v1 == v2;} wird nicht kompiliert (es sei denn, Sie haben Klassenbeschränkungen oder verwenden den Standard-Gleichheitsoperator)
Steven Evers
@ c0da Meiner Meinung nach ist eine Liste, die voidZeiger verwendet, nicht generisch, sondern nur allgemein gültig . Sie können jede Art von Dingen darin aufnehmen und sie sogar mischen, was sie wollen - und genau das macht es für mich nicht generisch. Es ist so, als würde man den Basistyp objectin objektorientierten Sprachen verwenden ...
stupsen Sie am
5

In meinen bisher rund 10 Jahren als Programmierer (und etwa weiteren zehn Jahren als Hobby) habe ich nicht gedacht, dass ich jemals eine verknüpfte Liste implementieren musste. Wenn mich jemand während eines Vorstellungsgesprächs darum bittet, könnte ich mich dagegen erkundigen, ob ich das regelmäßig tun werde.

Sicherlich gibt es mit ziemlicher Sicherheit Arbeitsplätze dort , wo Sie werden mehr oder weniger Reinraum- Implementierungen von allgemein bekannten Algorithmen schreiben müssen - wie eine verknüpfte Liste von Grund auf neu implementieren. Welchen besonderen Wert hat es für das Unternehmen bei den meisten Programmieraufgaben, dass ein Kandidat dies während eines Vorstellungsgesprächs tun kann? Ist es in einem solchen Umfeld wirklich so wichtig, dass der Kandidat eine perfekte Implementierung bietet, die Kantenfälle korrekt behandelt, Fehler gemäß gängiger Praxis in der Sprache oder im Framework meldet und so weiter? Oder können Sie das übersehen und sich stattdessen darauf konzentrieren, wie sie sich einem Problem nähern, mit dem sie in 10 bis 20 Jahren vielleicht nicht konfrontiert waren?

Als ich für meinen aktuellen Job interviewt habe, hatte ich sehr wenig Erfahrung mit dem im Unternehmen verwendeten Technologie-Stack. Jetzt, ein paar Jahre später, kommen regelmäßig Kollegen zu mir und fragen nicht nur nach den Produkten, deren Implementierung und den von ihnen implementierten Standards, sondern auch nach viel allgemeineren Programmierproblemen (erst gestern wurde mir was gefragt) Die Auswirkungen bestanden aus einer zirkulären Abhängigkeit in einer Standardeinschränkung in SQL Server im Kontext einer bestimmten Tabelle und deren Verwendung in unserem Fall (aus diesem Grund stellte sich heraus, dass es in diesem bestimmten Fall keine Auswirkungen gab). Ich brauchte auch keine brandneue Implementierung für verknüpfte Listen.

Stellen Sie Fragen, die für die Arbeit relevant sind, die dem Kandidaten wahrscheinlich zugewiesen wirdund versuchen, eine Vorstellung davon zu bekommen, wie sie sich fühlen, wenn sie neues Wissen erwerben. Wie würden sie herausfinden, was eine obskure Syntax bedeutet, die sie noch nie gesehen haben? (Wenn Sie zum Beispiel ein C-Shop sind, könnten Sie eine Frage zu Trigraphen stellen.) Lesen Sie für eine Programmierposition regelmäßig Foren wie Stack Overflow oder tragen Sie dazu bei? Wenn sie gebeten würden, eine Aufgabe in einer Programmiersprache oder einem Framework auszuführen, mit der bzw. dem sie wenig oder keine Erfahrung haben (z. B. wenn Sie in erster Linie ein Java-Shop sind, was ist mit Clojure oder .NET?), Wie würden sie dann das Problem angehen? Nehmen Sie vielleicht einen echten Bug aus Ihrem Bug-Tracker heraus (vielleicht sogar einen, der längst behoben ist) und fragen Sie sie, wie sie es im Allgemeinen angehen würden, um ihn zu lösen, und erklären Sie die relevanten Teile des fraglichen Produkts.

Wenn der Kandidat geschäftsfallrelevante Probleme bewältigen kann und ein gutes Gespür dafür hat, neue Dinge zu lernen, ist dies wahrscheinlich ein viel besserer Indikator für die Eignung für diese bestimmte Position, als in der Lage zu sein, gezielte Antworten auf bekannte Fragen zu geben, ob diese Fragen beziehen sich auf FizzBuzz, verknüpfte Listen oder etwas anderes. Werfen Sie einen Blick darauf, wie gut der Kandidat in das Team passt, und ich denke, Sie befinden sich auf ziemlich sicherem Boden.

ein CVn
quelle
4

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 korreliert, mit dem Verständnis, was auf einer (abstrakten) Maschinenebene passiert, und der Fähigkeit, allgemein zu abstrahieren.

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

Benjamin Bannier
quelle
4

Sie fangen an zu sagen, dass es sich um "gimme" Fragen handelt, aber dann weisen Sie darauf hin, dass die Leute verständlicherweise nicht in der Lage sein werden, sie zu beantworten. Ich bin verwirrt.

So denke ich darüber nach:

  • Wie Sie sagen, besteht selten die Notwendigkeit, einen zu schreiben, sodass die Leute ihn 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 du dir Sorgen machst, dass sie vor dem Vorstellungsgespräch lernen, dann füge eine Liste hinzu. Lassen Sie sie das Rundschreiben schreiben und fragen Sie, wie lang die asymptotische Laufzeit ihrer Implementierung ist. Oder lassen Sie sie eine andere gemeinsame und / oder schnelle Datenstruktur schreiben ... Einen binären 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) nur deshalb ist, weil es ein Baum ist .

Wenn Sie jemanden suchen, der im Metallbereich arbeitet und eine sehr solide Grundlage für Datenstrukturen benötigt, sind diese für die Kandidaten, die Sie einstellen möchten, möglicherweise sogar viel zu trivial.

Dies setzt natürlich voraus, dass Sie einen Entwickler suchen, der die Grundlagen von Datenstrukturen besitzt und dessen Position von diesen Grundlagen profitieren würde. Wenn Sie jemanden haben möchten, der in Sekundenschnelle eine Asp-Seite zusammenstellt, interviewen Sie ihn. Es geht nicht darum, eine Interviewfrage auszuwählen, die alle anderen beantworten, sondern eine, die die Fähigkeiten misst, nach denen Sie suchen. Persönlich denke ich, Datenstrukturfragen sind gut, verknüpfte Liste oder nein.

Steven Evers
quelle
In der Praxis ist das nicht verwirrend. FizzBuzz ist eine noch einfachere Frage, und dennoch können Bewerber routinemäßig nicht einmal damit beginnen, sie zu beantworten. Gleiches gilt für verknüpfte Listen. Es ist ein Rätsel der Programmierwelt.
Joshin4colours
@ joshin4colours: Nein, ich bin verwirrt über die Frage. Zunächst sagt das OP, dass LL-Fragen Gimmes sind, führt dann aber Punkte auf, warum ein qualifizierter Entwickler die Frage nicht beantworten würde.
Steven Evers
3

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

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

Ich würde sogar sagen, dass es nicht möglich ist, alle Kandidaten mit denselben Fragen zu bewerten. Sie müssen Ihre Interviewfragen anpassen, um die Fähigkeiten einzuschätzen, nach denen 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 Frage zur Datenstruktur aufzunehmen, sofern dies für die Position relevant ist. Ich würde versuchen, etwas auszuwählen, das vorher diskutiert oder verwendet worden sein könnte. Ich würde mich auch auf andere Dinge konzentrieren als nur die Implementierung der Algorithmen und Datenstrukturen, wie die Laufzeit und den Speicherverbrauch (Dinge wie die Big-O-Notation). Diese Konzepte sind nicht nur für die Erstellung der Datenstruktur relevant, sondern auch für die Auswahl der Implementierung, die am besten geeignet ist (z. B. ArrayListversus a LinkedList).

Thomas Owens
quelle
3

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

Also, wie einige sagten, wenn es sich um einen Job handelt, der mit verknüpften Listen und vielen ausgefallenen Algorithmen usw. arbeiten muss, dann ist das in Ordnung. Ist, wenn für die üblichen Eingabedaten auf einem Formular, validieren und zeigen irgendwie nutzlos und unfair ist.

H27studio
quelle
2

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. Wenn die Person nicht weiß, was eine verknüpfte Liste ist, müssen Sie erklären, wie sie funktioniert, und dabei die Antwort weitergeben, ohne zu wissen, ob sie weiß, wie sie Probleme lösen kann oder nicht . Die Frage lässt sich also reduzieren auf "Wissen Sie bereits, was eine verknüpfte Liste ist und wie sie funktioniert?", Was Ihnen nichts Sinnvolles über ihre Eignung als Programmierer sagt.

Mason Wheeler
quelle
2
Beliebte Fragen unterliegen auch dem Spielverhalten von Menschen, die sich gut einprägen können.
Paul Nathan
1
Wenn Sie einem Kandidaten erklären müssen, wie eine verknüpfte Liste funktioniert, sollten Sie ihn wahrscheinlich nicht mit der Programmierung beauftragen ...
Dima
2

Das Schreiben einer Linked-List-Implementierung ist eine gute Interviewfrage, da sie viel über die Codierungsweise 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 sollte, wissen Sie, dass er wahrscheinlich nie eine verwendet hat oder wann er eine verwenden muss.

  • 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, sich glücklich abzuhacken?

  • Behandelt er Edge Cases? Was ist mit dem Entfernen des letzten Knotens aus der verknüpften Liste? Was ist, wenn jemand versucht, der verknüpften Liste einen Verweis auf die verknüpfte Liste selbst 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 von einer LinkedList erwartet, dass sie eine NoSuchElementException auslöst, wenn Sie getFirst () für eine leere Liste ausführen. Andere Sprachen können undefiniert, -1 oder eine Konstante zurückgeben.

Konerak
quelle
In einer Interview-Codierungsübung überspringe ich, sofern nicht ausdrücklich darum gebeten, alle Arten der Randfallbearbeitung, Fehlerbehandlung usw., die für einen Proof of Concept erforderlich sind. ABER ich würde auch klarstellen, dass es eine Entscheidung ist, die ich treffe. Die Einschränkungen während eines einstündigen oder sogar ein paar Stunden dauernden Interviews unterscheiden sich stark von der Situation, in der Sie tatsächlich an etwas arbeiten, das tatsächlich genutzt werden kann.
ein Lebenslauf am