Was ist Ihr Lieblingsproblem bei einem Whiteboard-Interview? [geschlossen]

52

Wie der Titel schon sagt, was ist Ihr Lieblingsproblem bei einem Whiteboard-Interview und warum hat es sich für Sie als effektiv erwiesen?

Junior, Senior, Java, C, Javascript, PHP, SQL, Pseudocode usw.

NickC
quelle
4
Ein Problem, das ich hasste, war Einsteins Rätsel. stanford.edu/~laurik/fsmbook/examples/Einstein'sPuzzle.html Ich konnte es in 30 Minuten nicht schaffen. Aber dann war ich sauer und fand Folgendes : games.flowix.com/en/index.html Also habe ich trainiert, ein schwierigeres 6 x 6 x 6-Problem im Durchschnitt in 20 Minuten zu lösen. Ich glaube, ich kann jetzt 5 x 5 x 5 in 30 Minuten bewältigen. Welche dummen Rätsel der Arbeitgeber auch immer auf mich wirft - ich werde mich an sie erinnern und sie beim nächsten Mal abschneiden. Es gibt so viele gute Rätsel.
Job
20
@Job: Keiner sagt etwas darüber aus, wie sich ein Mitarbeiter im Job verhält. Es sei denn, Sie verbringen Ihre ganze Arbeitszeit damit, diese Art von Rätseln zu lösen, anstatt die eigentliche Arbeit zu erledigen.
Robert Harvey
1
@Robert Harvey Sie meinen, Sie sind in einem Geschäft tätig, das Geld anders verdient als das Lösen von Rätseln? Ich hatte keine Ahnung ...;) Das Rätsel macht aber Spaß. Nebenbei bemerkt, ein Unternehmen, für das ich als ersten Schritt beim Screening für die tatsächlich verwendeten IQ-Tests gearbeitet habe. Ich möchte ein paar gute Whiteboard-Fragen finden, um die besten Kandidaten zu trennen, nicht um sie einfach zu überprüfen.
Nicole
4
@Renesis: Als Entwickler kann ich sehen, wie das Lösen eines Puzzles Fähigkeiten zum Lösen und Analysieren von Problemen identifiziert, aber Entwickler müssen auch wissen, wie diese Lösung in Code übersetzt wird. Das Lösen eines Puzzles zeigt nur die Hälfte dieser Ausführung. Es ist der Unterschied zwischen dem Lösen eines Rubix-Cubes und dem Schreiben eines Algorithmus zum Lösen eines Rubix-Cubes.
Robert Harvey
@Robert Harvey Ich stimme zu, ich suche speziell nach Codierungsproblemen, nicht nur nach Denkproblemen.
Nicole

Antworten:

22

Ich bitte den Kandidaten, eine Lösung für ein Problem zu entwerfen, auf das ich in meiner täglichen Arbeit gestoßen bin. Dabei versuche ich, einen Dialog zwischen mir und dem Kandidaten herzustellen. Ich versuche über das Design zu diskutieren, das er erstellt, als hätte ich noch nie über das Problem nachgedacht.

Ich versuche zu bewerten, ob wir uns verstehen und ob wir über ein technisches Problem ohne Verwirrung sprechen können.

Konkretes Beispiel

(Für einen Java-Desktop-Entwickler)

Entwerfen Sie eine API für den Navigationsverlauf eines Webbrowsers (vorherige Seite, nächste Seite, Liste der 10 vorherigen Seiten), die in vielen Teilen der Anwendung wiederverwendbar ist (hier gebe ich konkrete Beispiele in unserer App). Skizzieren Sie anschließend eine Implementierung.

Ich mag dieses, weil es einfach genug ist, leicht zu veranschaulichen ist, Schritt für Schritt gelöst werden kann (zusätzliches Verhalten hinzufügen, ohne alles zu beschädigen), es ermöglicht, über Randfälle und Fehlerbehandlung zu sprechen und es ermöglicht auch, über Daten zu sprechen Strukturen.

Barjak
quelle
40

Ich fand diese extrem aufschlussreich, wenn ich Kandidaten interviewte und diejenigen herausfilterte, die nichts zu suchen hatten. Es ist ähnlich komplex wie Fizz Buzz, konzentriert sich jedoch auf Datenbankkenntnisse.

Assuming the following basic  table structure
Documents (DocID, DocDate)
Keywords (KeyWordID, KeyWord)
DocumentKeywords (DocID,KeywordID)

Write a query to return the following:
Part 1: Documents with a DocDate after 4/1/1995  
Part 2: Documents that contain the keyword "Blue"  
Part 3: Documents that contain the either the keyword "Blue" or "Yellow"
Part 4: Documents that contain the both the keywords "Blue" and "Yellow"

Ich lasse sie es in jeder SQL-Variante schreiben, die sie wollen, und bin nicht zu wählerisch bei kleineren Syntaxproblemen. Ich möchte vor allem wissen, dass sie grundlegende relationale DB-Konzepte verstehen.

Die meisten Kandidaten kommen ohne Probleme durch Teil 3. Sie werden erstaunt sein, wie viele glauben, dass die Antwort auf Teil 4 darin besteht, den Operator in der where-Klausel von OR in AND zu ändern.

JohnFx
quelle
2
Ah, ich sehe das Problem mit # 4. Ihre Dokumente haben nur ein Schlüsselwort pro Zeile, sodass Sie nicht wissen können,
ob
8
Hoppla! Ich kann sehen, wie ich mich in einem Interview in (4) verliebt habe. @Job: Als Interviewer würde ich den Kandidaten bitten, die Frage zu erklären, in der Hoffnung, dass er über sein Problem stolpert, um zu sehen, wie er damit umgeht . (das sagt dir normalerweise mehr als ein Kandidat, der deine Fragen beim ersten Versuch beantwortet.)
peterchen
3
@Renesis, ich bin mir nicht so sicher, ob das wirklich tief greift. Dies scheint ziemlich gut zu sein, um herauszufinden, ob jemand über grundlegende SQL-Abfragefähigkeiten verfügt. Ich bin schockiert darüber, wie wenig Entwickler heutzutage über diese grundlegenden Fähigkeiten verfügen.
Mark Freedman
2
@ jk01, vielleicht habe ich eine alte Einstellung dazu, aber IMO sollte ein runder Entwickler über DB-Kenntnisse verfügen, um nicht über Code zuzugreifen, sondern um die Domäne zumindest durch Experimentieren mit Abfragen zu verstehen. Ohne dies hat ein Entwickler einen ziemlich signifikanten toten Winkel. Es ist auch EXTREM nützlich für die Systemunterstützung und Fehlerbehebung. Abstraktion ist in Ordnung, um die Entwicklung zu vereinfachen und die Produktivität zu steigern, aber ich habe zu viele Annahmen getroffen, weil diese so oft weg abstrahiert werden. Ich könnte weitermachen, aber das könnte eine ganz andere Debatte sein, von der ich mir sicher bin, dass sie woanders stattfindet;)
Mark Freedman,
4
@ back2dos - Sei nicht beleidigt, nur weil du es nicht beantworten kannst. Es mag viele andere Technologien geben, die dies einfacher machen, aber wir verwenden viele SQL-Datenbanken und ich rekrutiere Leute, die wissen, wie man die von uns verwendeten Technologien einsetzt, und keine Ausreden dafür, warum sie meine Interviewfragen nicht beantworten müssen .
JohnFx
20

"Zeichnen Sie für mich das Design des letzten Projekts, an dem Sie gearbeitet haben, auf die Pinnwand, ohne mir sensible Details preiszugeben."

Uberto
quelle
Wie würden Sie das Design definieren? Suchen Sie ein Klassendiagramm? Noch ein UML-Diagramm? Eine Grundskizze der Ebenen?
Justkt
1
Ich nenne sie Ballongramme. ;) Zeichnen Sie einfach die Cicles, geben Sie Namen ein und verbinden Sie sie mit benannten Pfeilen. Seine Bewerbung interessiert mich nicht, aber die Tatsache, dass er sie verstanden hat.
Uberto,
5
+1. Für Leute, die vorher einen Job hatten, ist dies definitiv eines der besten Dinge, die Sie tun können. Wenn sie erklären können, wie das Projekt aufgebaut ist, ist es schon viel wert. Wenn sie eine Idee haben, warum es so strukturiert ist oder wie manche Dinge besser gemacht werden könnten, dann ist dies wirklich ein großes Plus.
back2dos
3
@justkt: Wichtig ist, dass der Befragte die Informationen über bekommt. Es ist unwichtig, wie. Ich habe Leute getroffen, die UML wirklich kennen, die nichts damit erklären können, und Leute, die komplexe Systeme mit ein paar verschnörkelten Zeilen erklären können.
back2dos
2
Wie um alles in der Welt soll jemand das Design eines Projekts zeichnen, ohne sensible Details preiszugeben?
Nemanja Trifunovic
14

Implementieren strcpy, strcmpund Freunde.

fredoverflow
quelle
4
Ich bitte Kandidaten um Umsetzung atoi().
Chrisaycock
2
Sie werden erstaunt sein, wie viele Leute das nicht umsetzen können strdup().
Tim Post
10
Das ist nur fair, wenn die Stelle für einen C-Programmierer ausgeschrieben ist.
Im Interview für meinen aktuellen Job hat mich der Interviewer gebeten, eine strrev()Funktion zum Umkehren der Zeichenfolge zu implementieren . Meine Whiteboard-Lösung hat sie beeindruckt und ich mache jetzt meine Arbeit.
Gulshan
@crisaycock atoi () ist einfach. itoa () ist falsch
Michael Brown
14

Mein Favorit, der einige Disziplinen umfasst, ist das Zählen der Anzahl von Knoten in einem Binärbaum unter Berücksichtigung der Schnittstelle (in C #):

public interface IBinaryTree<T>
{
    IBinaryTree<T> Left
    {
        get;
    }

    IBinaryTree<T> Right
    {
        get;
    }

    T Data
    {
        get;
    }

    // Other properties and methods not germane to this problem.
}

und nur zum Spaß, hier ist die Implementierung, obwohl der Befragte dies nicht sehen muss.

public sealed class BinaryTree<T> : IBinaryTree<T>
{
    private readonly IBinaryTree<T> left;

    private readonly IBinaryTree<T> right;

    private readonly T data;

    public BinaryTree(
        IBinaryTree<T> left,
        IBinaryTree<T> right,
        T data)
    {
        this.left = left;
        this.right = right;
        this.data = data;
    }

    public IBinaryTree<T> Left
    {
        get
        {
            return this.left;
        }
    }

    public IBinaryTree<T> Right
    {
        get
        {
            return this.right;
        }
    }

    public T Data
    {
        get
        {
            return this.data;
        }
    }

    // Other properties and methods not germane to this problem.
}

und die Assistenzklasse:

public static class BinaryTreeNodeCounter
{
    public static int CountNodes<T>(this IBinaryTree<T> tree)
    {
        // TODO: What goes here?
    }
}

Die Lösung, die ich sehen möchte, ist folgende:

public static class BinaryTreeNodeCounter
{
    public static int CountNodes<T>(this IBinaryTree<T> tree)
    {
        return tree == null
            ? 0
            : 1 + tree.Left.CountNodes() + tree.Right.CountNodes();
    }
}

Wie es Kenntnisse von demonstriert:

  • wie ein Baum (insbesondere ein binärer Baum) funktioniert
  • die rekursive Definition eines binären Baumes
  • rekursive Methoden und wie Basisfälle die Rekursion stoppen
  • Was das Zählen eines einzelnen Knotens bedeutet
  • Schnittstellen als Vertrag
  • (weniger wichtige) Kenntnisse der C # -Syntax:
    • Generika
    • Erweiterungsmethoden
    • ternärer Operator
Jesse C. Slicer
quelle
Könnte es eine Erweiterungsmethode sein?
Gulshan
In der heutigen Zeit ja. Wir haben zu dieser Zeit in VS 2005 codiert, daher die spärliche Syntax.
Jesse C. Slicer
Warum eine Erweiterungsmethode verwenden, wenn Sie den Quellcode für die ursprüngliche Klasse haben? Dafür gibt es keine Erweiterungsmethoden.
Batibix
Ich hätte ein Level tiefer gehen und dem Kandidaten eine Schnittstelle zeigen können, die diese Klasse implementiert. Das Wesentliche ist, dass die ursprüngliche Klasse nicht geändert werden muss - einige Einsteiger-Entwickler würden gerne der Klasse etwas hinzufügen, um die Anfrage "einfacher" zu machen.
Jesse C. Slicer
heiliger Mist, der Java sehr ähnlich sieht!
Testen Sie den
12

Zwei Fragen, die für mich interessante Whiteboard-Diskussionen ausgelöst haben, sind:

  1. "Bitte erläutern Sie so ausführlich, wie Sie möchten, wie ein Webbrowser eine generierte Seite erstellt."
  2. "Bitte erläutern Sie, wie Java Hibernate funktioniert."

Sie beginnen einfach und werden dann immer komplexer.

Gary Rowe
quelle
31
ehi, ich bin nicht einmal qualifiziert, die Antworten zu beurteilen ... Ich denke, dass Sie für die zweite 12 schwarze Kerzen und eine Ziege benötigen ...
Uberto
4
Das zweite ist ganz einfach: Ihr Betriebssystem speichert den Prozessor-Cache und -Stack sowie den Inhalt Ihres Arbeitsspeichers auf der Festplatte und stellt ihn dann wieder her, wenn der Computer wieder eingeschaltet wird.
Malfist
Es kann jedoch Tage dauern, bis die erste Frage beantwortet ist.
Malfist
@Malfist Ich meinte das Java Hibernate Persistence Framework.
Gary Rowe
2
@ Paul Stephenson Ja, aber nur um sicher zu gehen ...
Gary Rowe
8

Ich mag es nicht, ein Puzzle oder eine Designfrage als Whiteboard-Frage zu verwenden. Ich bevorzuge einfache Fragen, die die Fähigkeit des Kandidaten testen, Code zu schreiben. Meine Favoriten sind:

1) Schreiben Sie eine Funktion, um eine einfach verknüpfte Liste umzukehren. (Es dauert eine Weile, bis sie feststellen, dass sie 3 Zeiger benötigen.)

2) Bestimmen Sie bei einem gegebenen Binärbaum die Tiefe des Binärbaums. (Diese Frage testet ihre Fähigkeit, rekursiven Code zu schreiben. Lassen Sie mich prüfen, ob der Basisfall intakt ist.)

3) Schreiben Sie eine Prozedur für die binäre Suche in einem Array von Ganzzahlen. (Wie Jon Bentley (in Programming Pearls) sagt, neigen viele Menschen dazu, Fehler beim Schreiben einer binären Suche zu machen. Man kann dann Fehler finden, Testfälle schreiben, den Code durchlaufen usw.)

pyNem
quelle
+1, Ich mag, dass Ihr Ansatz keinen Sinn macht, jemanden nach dynamischen Programmen oder solchen Konzepten zu fragen, wenn sie in der Geschäftsprogrammierung kaum verwendet werden. + Der Schwerpunkt sollte auch auf der Codequalität liegen und nicht auf der Lösung allein.
Geek
Ich habe nichts gegen Designfragen einzuwenden, aber ich habe mich einmal mit einem Typen unterhalten, dessen Hobby es war, Rätsel zu lösen, und er hatte einige schreckliche Fragen. Es war, als würde ich jemandem Fragen zur Kampfkunst stellen.
Bob Murphy
Vermutlich sollte man wissen, dass man in (3) "sortiertes Array" meint, oder?
HaveAGuess
7

Wir haben das bei einer Firma benutzt, für die ich gearbeitet habe.

Wir gaben dem Kandidaten ein Stück Papier, das zur Verfolgung der Zeit verwendet wurde. Es war eine echte Arbeitszeittabelle, die von einer oder unseren Abteilungen verwendet wurde. Wir haben den Kandidaten gebeten, uns durch den Entwurfsprozess zu führen, um ein besseres Zeiterfassungstool zu entwickeln. Keine Grenzen, keine Angabe der Sprache usw., ich möchte nur sehen, wie gut der Kandidat im "vollen Lebenszyklus" war. Es gab uns einen echten Einblick, wie sie Anforderungen sammelten. Wie sie Datenbanktabellen strukturiert haben, welche Art von Benutzeroberfläche sie möglicherweise verwenden. Kommunikationsfähigkeiten waren offensichtlich für diese Aufgabe erforderlich. Es wurde in der Regel in einem Raum mit mehreren großen weißen Brettern durchgeführt und dauerte bis zu 2 Stunden.

Wir haben mehrere Personen mit diesem Verfahren eingestellt, und wenn sie die Aufgabe wirklich gut gemeistert haben, haben sie es wirklich gut für uns gemacht. Wenn sie marginal waren und wir beschlossen, sie trotzdem einzustellen (separates Thema), waren sie marginale Programmierer.

Bill Leeper
quelle
6

Ich verwende ein Problem, das für meine Programmierdomäne relevant ist.

Wenn ich Webanwendungen entwickle, möchte ich wissen, wie sie ein Webformular erstellen, mit dem Datensätze gelöscht werden, und wie sie beispielsweise den Datensatz aus der Datenbank entfernen. Dies sagt mir, ob sie grundlegende Datenbankprinzipien kennen, wie sie mit dem Benutzer interagieren, um das Löschen zu überprüfen, und ob sie wissen, was ein weiches Löschen ist.

Ich habe keinen Favoriten. Das Problem, das ich wähle, hängt stark vom jeweiligen Job ab.

Es ist mir egal, ob sie das Problem in einem Interview vollständig lösen können oder nicht, welche Technologien und Sprachen sie verwenden oder wie beschissen ihr Code auf einem Whiteboard aussieht. Ich suche ein Gedankenmuster; Ich möchte sehen, ob sie wissen, wie sie Probleme durchdenken und lösen können.

Robert Harvey
quelle
2
+1 Für den letzten Absatz, der alles wichtig ist. Normalerweise ist in solchen Dingen nicht die Antwort von Bedeutung, sondern der Weg dorthin. Wie alle meine Mathematiklehrer sagten: "Zeig deine Arbeit!"
Orbling
4

Mein Favorit war einer, den ein Freund von mir benutzt hat.

Schreiben Sie mir eine Funktion zum Generieren / Drucken / Speichern der ersten "n" Primzahlen und erklären Sie dann, wie es funktioniert und wie effizient es ist.

Es funktioniert gut, weil:

  1. Da es sich um eine algorithmische Frage handelt, muss der Befragte in der Lage sein, zu denken und dann sein Denken zu erklären - damit Sie sehen können, wie sein Gehirn funktioniert.

  2. Es ist sprachunabhängig.

  3. Kaum jemand versteht es richtig (es gibt normalerweise einen Randfall, den er übersieht (1 oder 2 normalerweise), oder er handhabt keine negativen Zahlen, so dass man sieht, wie er mit Fehlern umgeht und dass ihm gesagt wird, dass er falsch liegt.

  4. Die meisten tun dies als einfaches, aber sehr langsames Sieb (z. B. überprüfen 80% der Leute, ob n eine Primzahl ist, indem sie n durch alle ganzen Zahlen teilen, die kleiner als n sind), was Ihnen viel Raum für Gespräche darüber gibt, wie sie den Algorithmus verbessern könnten bei räumlichen / zeitlichen Kompromissen, z. B. "Warum teilen Sie eine Zahl durch 4, wenn Sie bereits wissen, dass sie nicht durch 2 teilbar ist?" oder "Sie haben herausgefunden, dass Sie nur durch alle Primzahlen dividieren müssen, die kleiner als sqrt (n) sind, aber dazu müssen Sie diese Zahlen irgendwo speichern. Was bedeutet das?")

Sie müssen nicht die richtige Antwort finden. Wenn jemand denken und erklären kann, ist er ein langer Weg, um ein guter Kandidat zu sein.

Rhys Gibson
quelle
Ich habe einmal eine Interview-Frage bekommen, bei der mir ein sehr verschleierter Block C-Code gegeben wurde, und gefragt wurde, was er macht. Auf eine sehr runde Art druckte es jede zweite Primzahl aus. 300 Personen bewarben sich und boten mir die Stelle an, da ich anscheinend der einzige Kandidat war, der ihnen erklärte, was der Zweck der Stelle war, anstatt die Werte herauszuholen. Also ja, +1, Primzahlen sind eine gute Prüfung. Vor allem, wenn sie ein Sieb entwickeln, das die Komplexität der Berechnungen gegen die Komplexität des Raums austauscht.
Orbling
1
1 ist keine Primzahl ..
2
@ Thorbjørn - na klar, aber ein guter Prozentsatz der Routinen, die ich gesehen habe, um dieses Problem zu lösen, hat mir gesagt, dass es ist
Rhys Gibson
dann haben sie einen Bug :)
3

Etwas mit dem Namen aff_z, das Teil der C-Prüfungen meiner Ingenieurschule war und als "Dummy" -Test verwendet wurde, damit Schüler nach der Rückkehr aus dem Urlaub versagen den gesamten Test ungültig machen. Zwingt Sie dazu, schwachsinnige Details zu beachten. Ich habe es ein oder zwei Mal in Interviews wiederverwendet.

Wie auch immer ... Ich habe die genaue Formulierung vergessen, aber es war so etwas ...

Write a function taking a single char parameter named c and returning nothing (void).
You function must satisfy the following requirements:

 - if c is bigger or equal to 0, then print 'z' to standard output
 - if c is stricly smaller than 0 , then print 'z' to standard output
 - in any other case, print the letter 'z' to standard output

Das Traurige ist, dass nicht nur einige Studenten extrem komplizierte Lösungen finden würden, wenn die Antwort ziemlich offensichtlich ist, sondern dass einige sogar scheitern würden.

Und ob Sie es glauben oder nicht, es geschah auch während der Interviews.

Es hat ziemlich viel Spaß gemacht, es in Interviews zu führen, da einige Bewerber anfingen, die möglichen Zweige zu schreiben und dann erkannten, was falsch ist (natürlich, wenn Sie sie nur mündlich fragen, ist es ziemlich verständlich, dass sie dies tun, wenn Sie sprechen ... aber wenn Sie gib es schriftlich, ich finde es rätselhaft ...)

Es ist dumm, aber ich denke, es ist ein minimalistisches Screening (ähnlich wie bei der Einstellung von JS-Programmierern immer gefragt wird, wie eine Variable deklariert werden soll und je nach ihrer Antwort, ob die Verwendung von var überhaupt einen Unterschied macht oder nicht. Sehr oft ein trauriger Moment, ehrlich.)

Haylem
quelle
1
Hatten Sie jemals Kandidaten in Interviews, die sich dadurch beleidigt fühlten? Oder denkst du, du hattest einfach Spaß auf ihre Kosten, anstatt ein ernsthaftes Interview zu führen?
Nicole
@Renesis: Ich hatte einige, die mich zuerst mit einem Grinsen ansahen. Einige davon haben den Test nicht bestanden. Im Allgemeinen lachen die guten Kandidaten, wenn sie aus sind. Für die JS-Programmierer zum Beispiel hatte ich ziemlich viele Kandidaten, die die Antwort auf das Interview mit einem "duh variablename = variablevalue;" nicht bestanden hatten, während die Guten nur am Telefon oder persönlich lachten und mir direkt sagten, was die anderen mit oder ohne waren var).
Haylem
1
@Renesis: Außerdem könnte es mich nicht weniger interessieren, wenn einige beleidigt werden. Es ist in keiner Weise diskriminierend. Wenn sie beleidigt sind, gehe ich davon aus, dass sie nicht gerne auf die Probe gestellt oder befragt werden. Ich hatte nie wirklich das Gefühl, dass Bewerber Spaß auf ihre Kosten hatten. Normalerweise entschuldige ich mich sogar, bevor ich sehr einfache Fragen stelle, da es sich für die Guten wie Zeitverschwendung anfühlt. Aber die Sache ist, es ist keine Zeitverschwendung für mich. Nicht danach zu fragen wäre ne, auf längere Sicht.
Haylem
@Renesis: Und oft nicht, was ich nach dem Grinsen / Lachen / beleidigten Blick bekam, war ein beschämter Ausdruck und eine Entschuldigung von demjenigen, der versagt hat oder angefangen hat, die Verzweigung für den gesamten Test zu schreiben, als er merkte, dass sie nutzlos war. Ja, ich habe Spaß daran, diesen Test zu geben, aber ich würde ihn nicht geben, wenn es keinen guten Grund gäbe.
Haylem
Persönlich hätte ich beim Lesen eine geistige Verfassung und würde mich fragen, ob jemand anderes die Frage geschrieben hat, damit sich der Interviewer über ihn lustig macht.
Wildpeaks
3

Es kommt wirklich darauf an, wonach Sie suchen. Als Organisation, die viel dynamische Webarbeit mit Bildern leistet, neige ich dazu, eine Geometrie-Frage zu stellen, die für den Job relevant ist. Auf jeden Fall neige ich dazu, eine Geometrie-Frage zu stellen, da ich es als guten Mathe-Test betrachte, der schön und visuell ist und dem Kandidaten die Fähigkeit zeigt, seine Arbeit visuell darzustellen und ein Problem methodisch zu bearbeiten.

Für fortgeschrittene Kandidaten stelle ich gelegentlich folgende Frage:

Dieses Bild zeigt einen Halbmond. Die Breite des Halbmonds von B nach D beträgt 9 cm und zwischen E und F 5 cm. C ist der Mittelpunkt des größeren Kreises.

a) Bitte berechnen Sie die Fläche des Halbmonds. Crescent Moon Mathe-Frage

b) Beschreiben Sie die Berechnungen, die erforderlich sind, um die Größe eines Bilds so zu ändern, dass es in den inneren Kreis passt, und positionieren Sie es innerhalb des Kreises, wenn der Mittelpunkt bekannt ist.

Für eine einfachere Frage gebe ich normalerweise die gleiche Art von Frage, benutze aber das Beispiel "Quadrat innerhalb eines Kreises innerhalb eines Quadrats". Obwohl dies sehr einfach ist, würde ich eine perfekte Algebra erwarten.

Quadrat innerhalb eines Kreises innerhalb eines Quadrats

Darüber hinaus neige ich dazu, sie zu bitten, einen Algorithmus zum Erzeugen aller Kombinationen eines Datensatzes variabler Länge zu starten.

Orbling
quelle
1
Die Antwort für a) ist 128,75? (Ich weiß nicht, ob ich einen Fehler gemacht habe). Ich mag es, aber es geht mehr um Geometrie.
Hoàng Long
2
Entschuldigen Sie auch die Verzögerung beim Kommentieren. Ich mag es nicht, in der Regel und doppelt zu stimmen, ohne zu kommentieren, warum. Bei meiner Ablehnung geht es nicht um die Frage selbst, sie hat sicherlich einen Sinn für Sie. Ich glaube nur nicht, dass sie in einem Programminterview einen angemessenen Kontext hat.
Philip Regan
7
-1 weil Geometrie ein guter Kandidat für Just In Time Learning ist und nicht meine Fähigkeit widerspiegelt, Qualitätssoftware zu erstellen.
Malfist
2
Ich habe dieses Problem genossen. Ich hoffe, es macht dir nichts aus, wenn ich meine Lösung für Teil (a) teile. Die Durchmesser unterscheiden sich um 9 cm. Wenn also der innere Kreis den Radius r hat, hat der äußere Kreis den Radius r + 4,5. Die Fläche des Halbmonds ist der Unterschied in den Flächen der Kreise: pi (r + 4.5) ^ 2 - pi * r ^ 2. Alles was übrig bleibt, ist r zu finden. Definieren Sie C als Punkt (0,0), dann liegt Punkt E bei (0, r - 0,5) (da CE 5 cm kleiner als der größere Radius ist). Der innere Kreis ist 4,5 cm nach rechts verschoben, daher lautet seine Gleichung (x - 4,5) ^ 2 + y ^ 2 = r ^ 2. Stecke (x, y) = (0, r - 0,5) ein und löse nach r.
Tim Goodman
2
+1, weil ich denke, dass es eine gute Frage für einen Job ist, der Geometrie erfordert. Es gibt viele Gründe, nicht nur eine Formel. Trotzdem kenne ich einige gute Programmierer, die nur deshalb auffallen würden, weil sie in 10 Jahren nicht einmal mehr über Kreise nachdenken mussten - aber die Frage stellt keine passende Frage für ein Entwicklerinterview. Die aktuell am häufigsten gewählte SQL-Frage (die mir auch gefällt) ist mindestens genauso berufsspezifisch.
Tim Goodman
3

Die besten FizzBuzz- Antworten, die ich gesehen habe, sind:

SQL Server 2008

;WITH mil AS (
 SELECT TOP 100 ROW_NUMBER() OVER ( ORDER BY c.column_id ) [n]
 FROM master.sys.all_columns as c
 CROSS JOIN master.sys.all_columns as c2
)                
 SELECT CASE WHEN n  % 3 = 0 THEN
             CASE WHEN n  % 5 = 0 THEN 'FizzBuzz' ELSE 'Fizz' END
        WHEN n % 5 = 0 THEN 'Buzz'
        ELSE CAST(n AS char(6))
     END + CHAR(13)
 FROM mil

C # (einfach)

foreach (int number in Enumerable.Range(1, 100))
{
    bool isDivisibleBy3 = (number % 3) == 0;
    bool isDivisibleBy5 = (number % 5) == 0;

    if (isDivisibleBy3)
         Console.Write("Fizz");

    if (isDivisibleBy5)
         Console.Write("Buzz");

    if (!isDivisibleBy3 && !isDivisibleBy5)
         Console.Write(number);

    Console.WriteLine();
}

C # (clever)

 Enumerable
  .Range(1, 100)
  .Select(i =>
    i % 15 == 0 ? "FizzBuzz" :
    i % 5 == 0 ? "Buzz" :
    i % 3 == 0 ? "Fizz" :
    i.ToString())
  .ToList()
  .ForEach(s => Console.WriteLine(s));
Simon Hughes
quelle
1
Möglicherweise möchten Sie hinzufügen, in welchem ​​bestimmten SQL-Dialekt dies geschrieben ist.
Sieht gut aus mit dem funktionalen Stil.
Orbling
2

Ich suche nach ein paar Dingen in Kandidaten, die ich interviewt habe. Aus einem Grund, den ich online nicht beschreiben kann, bekommen wir ziemlich schlechte Kandidaten, und ich habe damit gerechnet, also bin ich ziemlich locker mit ihnen. Trotzdem suche ich:

  • Designbewusstsein.

    "Zeigen Sie mir die Tabellenstruktur für ein Adressbuchprogramm mit Kontakten mit Vor- und Nachnamen an, die mehrere Telefonnummern mit einer Beschreibung der Nummer enthalten können (Zelle / Zuhause / Arbeit / etc.)"

    Ich suche hier kein UML 2.0-Spezifikationsdiagramm, hier ist ein einfaches Blasendiagramm in Ordnung. Solange es vernünftig ist.

  • Kenntnisse im Umgang mit einer Datenbank (zB SQL)

    1. Schreiben Sie eine Anfrage, um alle Telefonnummern von Personen mit dem Nachnamen "smith" abzurufen.
    2. Schreiben Sie eine Abfrage, um alle Kunden in die Datenbank aufzunehmen, und geben Sie die Telefonnummern der Kunden mit dem Nachnamen "smith" an.
  • Testkenntnisse

    Angenommen, es gibt eine Methode mit der Signatur public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName), die die Ergebnisse Ihrer Abfrage von früher zurückgibt. Angenommen, wenn Sie der Methode eine Null übergeben, wird eine NullReferenceException ausgelöst. Schreiben Sie einen Test, um diese Funktionalität zu demonstrieren.

    Schreiben Sie einen Test, der zeigt, dass GetPhoneNumbers eine private Telefonnummer von (123)456-7890 für jemanden mit dem Nachnamen "smith" zurückgibt.

  • Kenntnisse, wie man Code schreibt

    Implementieren Sie eine Methode, die die Anforderungen der von Ihnen geschriebenen Tests erfüllt.


Angesichts der Anzahl und Qualität der Bewerber, die wir bekommen haben, habe ich alle interviewt, die sich jemals ernsthaft beworben haben. Ich habe niemanden eingestellt.

Steve Evers
quelle
Sprechen Sie in SQL 2 davon, dies alles in einer Abfrage zu tun? Ist der Zweck nur, das Verständnis der linken / rechten oder inneren Verbindungen zu messen?
Nicole
@Renesis: Ja, das ist es.
Steven Evers
2

Ich lasse sie normalerweise ein Blockdiagramm des letzten Systems skizzieren, an dem sie gearbeitet haben, und frage sie nach den Beziehungen zwischen den Blöcken und lasse sie dann den Block ausarbeiten, an dem sie arbeiten / verantwortlich sind. Sie können aus dieser Übung viele Dinge lernen, wie zum Beispiel, wie man über seinen kleinen Bereich hinausschaut, wie wichtig es für ihn ist, zu wissen, wo er handelt. Sie können auch lernen, welche Rolle er gespielt hat, ob es sich um einen Schlüssel oder eine Seite handelt Rolle.

Assimiz
quelle
2

Schreiben Sie einen Algorithmus für das folgende Problem: Geben Sie bei einer gegebenen Zahl n die Gesamtzahl der (eindeutigen) Binärbäume mit n Knoten aus.

Für n = 0 und n = 1 lautet die Antwort also 1. Für n = 2 haben Sie 2: den Wurzelknoten und dann den zweiten Knoten entweder links oder rechts.

Sie erhalten Einblick in Designtechniken und können prüfen, ob diese an Rekursion oder Memoisierung oder an die dynamische Programmierlösung denken.

[Siehe auch diese StackOverflow- Diskussion für den verwandten, aber unterschiedlichen Fall von Binärsuchbäumen.]

Macneil
quelle
Ein UI-Programmierer, der sich mit dynamischer Programmierung nicht auskennt, ist also ein schlechter Programmierer? Zum Teufel ist jeder Business-Programmierer, der sich nicht an dynamisches Programmieren erinnern kann, schlecht? Viele Teenager bei topcoder werden ein dynamisches Programmierproblem haben, aber sehen Sie sich den Code an, den sie schreiben.
Geek
@ Geek: Denken Sie daran, dass "Whiteboard" -Probleme eine Möglichkeit sind, den Denkprozess von jemandem zu sehen. Dynamische Programmierprobleme sollten in diese Diskussion einbezogen werden, da sie unter anderem bei Google sehr beliebt sind.
Macneil
Ich bin nicht anderer Meinung, aber ich habe zwei Fragen. 1. Das Unbekannte lösen? DP-Probleme werden zu einem Spaziergang im Park, wenn Sie einige Probleme in der jüngeren Vergangenheit gelöst haben oder sich noch an das Konzept außerhalb des Studiums erinnern. Jemand, der es vergessen hat, wird auf der weißen Tafel definitiv nicht gut abschneiden. 2. Wenn jemand Schwierigkeiten hat, ein Problem zu lösen, können Sie seine Codequalität nicht quantifizieren. Wie wäre es, wenn Sie ein Problem in einer LinkList oder in Strings oder Arrays angeben, sodass die Person das Problem lösen und Code schreiben kann?
Geek
Ich würde nicht unbedingt erwarten, dass ein Befragter es richtig macht, wie auch immer einige Unternehmen es tun werden.
Macneil
@Geek: „Ein… Programmierer, der keine Erfahrung mit dynamischer Programmierung hat, ist ein schlechter Programmierer?“ - ja . Trotzdem stimme ich zu, dass das Denken in der dynamischen Programmierung nicht trivial ist, wenn Sie nicht daran gewöhnt sind. Aber es zu wissen ist ein absolutes Muss.
Konrad Rudolph
2

Wenn ich einen Softwareentwickler interviewen würde, würde ich ihn bitten, eine Software zu entwerfen und die Hardwareanforderungen zu beschreiben, um doppelte Einträge aus einer beliebig großen Datei zu entfernen, die in jeder Zeile einen vollständigen Namen enthält. Ich lasse einige Teile der Problembeschreibung zielstrebig. Dann fordere ich ihn auf, herauszufinden, ob er die Analyse und Klärung von Anforderungen, verschiedene Kompromisse, Datenstrukturen und -algorithmen, E / A (Sekundärspeicher), Software- und Hardwaretechnologien, Skalierbarkeit usw. versteht.

Ich denke, es ist ein kleines, aber herausforderndes Problem, das die Kenntnisse und Fähigkeiten des Bewerbers in vielen Bereichen der Datenverarbeitung offenbart.

Ebrahim Mohammadi
quelle
2

Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence

Viele Jungs könnten sich daran halten. Wenn eine Lösung angegeben wird, wird normalerweise eine Rekursion verwendet. Nachdem:

Implement the same via 'for'-loop

Ich kann Ihnen nicht sagen, wie viele Stipendiaten beide Aufgaben nicht erfüllen - 50% der Kandidaten.
Deswegen mag ich es :)

alexb
quelle
Was ist, wenn die erste Implementierung über eine for-Schleife erfolgt?
Darknight,
2
Zur Implementierung wird eine rekursive Version vorgeschlagen. Normalerweise implementieren Jungs nach einer for-Schleife erfolgreich eine rekursive Version.
Alexb
Oder Sie könnten dies als eine einzige Anweisung implementieren: fib(n)=round(power(PHI,n)/SQRT5). PHI und SQRT5 sind Konstanten, die den Goldenen Schnitt (1.618 ...) bzw. die Quadratwurzel von 5 darstellen.
Osterwal
2

Für Datenbanken gehe ich mit:

Tabelle: Dinge

ID Name
1 Bodkin Van Horn
2 Hoos-Foos
3 Hoos-Foos
4 Hot-Shot
5 Marvin O'Gravel-Ballongesicht
6 Snimm
7 Marvin O'Gravel-Ballongesicht
8 Marvin O'Gravel-Ballongesicht
9 Dave

Schreiben Sie mir eine SQL-Anweisung, die eine Tabelle wie diese anhand des Namens desupliziert (und es ist mir egal, welche ID ich zurückerhalte, aber welche zurückgegeben wird, muss für diesen Namen gültig sein). Wenn die Tabelle mit dem richtigen SQL-Code versehen ist, sieht sie folgendermaßen aus:

Tabelle: Dinge

ID Name
1 Bodkin Van Horn
2 Hoos-Foos
4 Hot-Shot
5 Marvin O'Gravel-Ballongesicht
6 Snimm
9 Dave

Ich mag es weil:

  • Deduplizierung ist ein echtes Problem
  • Es gibt eine Reihe von Möglichkeiten, dies zu tun
  • Ich denke, dass Sie so ziemlich alle diese Methoden benötigen, um entweder (etwas) komplexeres SQL (im Wesentlichen GROUP BY und HAVING) zu verstehen oder um über die Verkettung mehrerer einfacherer Anweisungen argumentieren zu können.
  • Aufgrund dieses letzten Teils können Sie sie auch dann fragen, was sie denken und auf diese Weise darüber sprechen, wenn sie mit der Syntax oder was auch immer zu kämpfen haben.
  • Es verweist auf Dr. Seuss

(Hier finde ich, dass es einen ganz trivialen Weg gibt, und ich habe es die ganzen Jahre über kompliziert).

Jon Hopkins
quelle
1
Ich glaube, ich weiß nicht, was als "ganz trivial" gilt ... Etwas wie SELECT min(ID), Name FROM Things GROUP BY Namewürde funktionieren, oder?
Tim Goodman
@ Tim - Das gibt Ihnen die Zählung für alles. Ich möchte nur solche mit Duplikaten. Bei manueller Bearbeitung werden die Ergebnisse nicht gezählt, vorausgesetzt, sie werden auf Millionen von Zeilen skaliert. Es ist ein einfaches Problem, aber meiner Erfahrung nach kommen 80% der Leute, die behaupten, SQL zu kennen, nicht einmal bis zu Ihrem ersten Stich.
Jon Hopkins
@ Jon: Ich bin mir nicht sicher, was du mit "Das zählt für alles" meinst. Aus Ihrer Beispiellösung geht hervor, dass Sie für jeden eindeutigen Namen eine Zeile benötigen. Aus Ihren Kommentaren geht hervor, dass Sie vielleicht so etwas wie meinen HAVING count(Name) > 1, aber in Ihrer Beispielantwort sollten Bodkin Van Horn, Hot Shot, Snimm und Dave weggelassen werden.
Tim Goodman
@ Tim - Du hast recht, es ist wirklich unklar. Ich bearbeite, wenn ich ein paar Minuten Zeit habe.
Jon Hopkins
1
Ich glaube , ich würde dies tun: DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name). Haben Sie eine bevorzugte Lösung?
Tim Goodman
2

Mein Lieblingsproblem beim C ++ - Whiteboard ist die Implementierung des Kandidaten

Vector3 a(1, 0, 0), b(0, 1, 0); // Mathematical 3D vectors
double c = 7.0;
double d = a * c;
Vector3 e = a * b;

Daraus kann ich lernen

  • wenn der Kandidat erkennt, dass Sie bei Rückgabetyp nicht überladen können (Angabe von C ++ auf Junior-Level)
  • wenn der Kandidat weiß, wie man einen temporären Operator zurückgibt und Casting-Operatoren implementiert (Angabe von C ++ auf mittlerer Ebene)
  • wenn der Kandidat grundlegende Vektor-Mathematik kann (wichtig für unsere Anwendungsdomäne)
Schmiede
quelle
2

Wie würden Sie ein Standardkartenspiel mit 52 Karten darstellen? Jede Programmiersprache ist in Ordnung. Wie würden Sie die Karten mischen?

MrDatabase
quelle
Vektor <Karte> mit C ++ 'Shuffle-Funktion :)
rechts
1

Am liebsten frage ich zuerst den Prototyp von printf. Dann implementieren Sie printf, wenn Sie ein Low-Level-API printc (char c) erhalten, das ein Zeichen druckt. Gibt alle möglichen interessanten Antworten aus, als wäre der Stack Teil der CPU. Wie Sie vielleicht erraten haben, bin ich von einem C und einem eingebetteten Hintergrund.

aufather
quelle
Ich verstehe nicht, dass der Stack Teil der CPU ist.
Barjak
Jeder, der etwas über Computerarchitektur weiß, würde das wissen. Für mich hat das nichts zu tun, also demonstriert der Typ seine Ignoranz.
Michael K
@aufather: Wenn ich mich richtig erinnere, musst du eine varargs()Funktion aufrufen oder so. Hab ich recht? Ich habe es nur einmal getan, um zu sagen, dass ich es vor einiger Zeit getan habe.
Michael K
@barjak - Sobald Sie mit der Implementierung von printf beginnen, müssen Sie auf Ihren Stack zugreifen, und ich habe Antworten erhalten, dass sich der Stack in der CPU befindet.
aufather
@Michael - In der Embedded-Welt müssen Sie Ihre Plattformarchitektur wirklich gut kennen. Diese Frage beseitigt die Unwissenden also ziemlich früh.
aufather
1

Sie haben eine Schüssel mit 200 Fischen. Von diesen Fischen sind 99% keine Guppys. Wie viele Fische sollten Sie entfernen, damit 2% der verbleibenden Fische Guppys sind. Zeigen Sie Ihre Arbeit.

Hier geht es um verwirrende Anforderungen. Es wird gesagt, dass auf diese Weise die Perspektiven während derselben Frage mehrmals geändert werden. Es ist beabsichtigt zu sehen, ob sie herausfinden können, was wirklich los ist.

Sie wären überrascht, wie viele Leute es falsch verstehen.

Dacracot
quelle
4
Fügen Sie zwei 12-Zoll-Oscars in die Schüssel ein, damit 98% der Guppys sehr bald entfernt werden.
Geek
Was passiert, wenn Sie einen Guppy entfernen?
1
1% Guppys = 200 x 1% = 2 (200-2 = 198 andere Fische), wobei 2 = 2%, verbleibender Fisch = 98% = 98 (1: 1). 98 = 198 - 100 => answer = 100. [Vorausgesetzt, Sie können die anderen Fische selektiv auswählen. Wenn Sie Guppys entfernen, gibt es andere Antworten.] Gute Frage, Sie wären überrascht, wie wenig Leute damit umgehen, obwohl es für einen Programmierer ein Kinderspiel sein sollte.
Orbling
1

Ich habe ein paar Favoriten, aber hier sind ein paar, die fast immer auftauchen. Die meiste Zeit mache ich technische Interviews in der Endrunde (C ++), also bevorzuge ich längere und offenere Fragen, die zu neuen Interessensgebieten führen. Es gibt keine "richtige" Antwort, nur eine Öffnung für andere Gespräche.

1) Implementieren eines gemeinsamen Basiszeigers, Erklärungen, wo es Mängel im Vergleich zu den gemeinsamen Zeigern von tr1 oder boost in ihrer Implementierung gibt, wie sie verwendet werden sollten usw.

2) Eine Codeüberprüfung. Für erfahrene Mitarbeiter erwarten wir, dass sie in der Lage sind, einen bereitgestellten Code auf Designprobleme, Fehler, Codierungshorror und potenzielle Wartbarkeitsprobleme zu überprüfen. Natürlich auch, wie sie das beheben würden; und manchmal, wie sie diese Nachricht an den Junior-Entwickler weitergeben, den sie abschießen.

Alaric
quelle
1

Eine Frage, die ich verwendet habe, seit sie bei mir verwendet wurde, ist die folgende:

Schreiben Sie eine Funktion, um alle Zahlen zwischen 1 und 100 zu drucken.

Ein großer Teil des Grundes, warum ich es benutzt habe, ist auf die Tatsache zurückzuführen, dass Sie dann die Lösung nehmen und sich in verschiedene Richtungen bewegen können:

Wie würden Sie die Funktion ändern, um alle Zahlen zwischen 1 und 1000, 10000 oder n zu drucken ?

Ihre Antworten auf diese Fragen können Ihnen Aufschluss darüber geben, wie sie auf sich ändernde Anforderungen reagieren und ob sie Leistungsaspekte erkennen können. Ein starker Kandidat könnte mit einer Frage antworten, was die Funktion benötigt und wie oft sie aufgerufen werden würde.

In eine andere Richtung bewegen:

Wie würden Sie Dinge ändern, wenn Sie wüssten, dass diese Funktion mehrmals pro Minute aufgerufen wird und die Leistung ein Problem darstellt?

Ich benutze dies, um ihr Querdenken zu überprüfen. Da die Berechnung von Primzahlen mit zunehmendem Maximalwert langsam sein kann, ist es manchmal sinnvoller, nur eine berechnete oder vorberechnete Nachschlagetabelle zu verwenden, die auf der Grundlage des zu lösenden Problems angepasst wird.

rjzii
quelle
1

Hier ist eine, die zum Nachdenken anregt: Es ist unkompliziert, erfordert ein wenig Mathematik und überprüft die Kenntnisse des Kandidaten über das grundlegende Computerdesign (Überlauf, numerische Darstellung usw.):

Schreiben Sie ein Programm (oder eine Prozedur), das / die ein Paar Ganzzahlen X, Y als Eingabe verwendet und festlegt, ob X * Y gleichmäßig durch 10 teilbar ist auf Ihrer Maschine.


Musterlösung:


T_BOOL MultipleOfTen(int x, int y)
{
    return((x%2==0 || y%2==0) && (x%5==0 || y%5==0));
}
Oosterwal
quelle
0

Füllen Sie die folgende Methode aus: PS Ein Modus einer Zahl ist die Zahl (in der Liste), die am häufigsten vorkommt.

public int getMode(List<Integer> numberList) {


}

Dies ist zu sehen, dass Ihr Code effizient ist.

Buhake Sindi
quelle
-2

Wie würden Sie eine Ersatzmatrix darstellen, die relativ groß ist, z. B. 1000x1000, aber höchstens 100 Einträge ungleich Null enthält?

MrDatabase
quelle