it-swarm.com.de

Ich kenne JavaScript sehr gut, aber ich bombardiere Codierungsinterviews

Daher bin ich derzeit auf der Suche nach einer neuen Position als Front-End-Entwickler. Ich kenne JavaScript sehr gut und kann poetisch über Closures, Currying, Prototypal Inheritance, Design Patterns, App-Leistung und die gesamte Front-End-Architektur sprechen. Trotzdem bombardiere ich immer noch Vorstellungsgespräche. (Zu Ihrer Information, die meisten Jobs, für die ich interviewe, sind für den Aufbau von SPAs mit einer Art MVC-Framework)

Normalerweise sind die Codierungstests kleine Codefragmente von Dingen, die mir beruflich nie begegnen. Schreiben Sie eine Funktion, um ein mathematisches Problem zu lösen. Abgesehen von der Unbeholfenheit, zu versuchen, zu codieren, während man das Telefon in einer Hand hält und einen Fremden Ihren Bildschirm sehen und jeden von Ihnen eingegebenen Charakter beobachten lässt, sehe ich dieses Zeug in der realen Welt normalerweise nicht.

Ist dies eine ernsthafte Fähigkeit, die mir fehlt, oder stellen mir die Interviewer irrelevante Fragen? Ich denke, ich sollte an meinen funktionalen Programmier- und Algorithmus-Chops arbeiten, aber ich habe im Web (oder in gedruckter Form) nicht viele gute Ressourcen gefunden.

33
Mike Fisher

Das Schreiben von Code ist nur ein Teil des Interviewprozesses.

Das eigentliche Lösen des logischen Problems ist nur ein Teil der Code-Schreibaufgabe.

Interviewer möchten sicher sein, dass:

  • Sie können Code schreiben. Viele Kandidaten mit zehnjähriger Berufserfahrung in einer Sprache können überhaupt keinen Code schreiben, und dieser Test soll diese Kandidaten ablehnen.

  • Sie denken über ein Problem nach, bevor Sie Code schreiben. Viele sprangen zu ihren Tastaturen, schrieben Dutzende von Codezeilen und stellten dann fest, dass sie das ursprüngliche Problem missverstanden hatten, weil sie sich keine Zeit nahmen, darüber nachzudenken.

  • Sie können sich beim Schreiben von Code anpassen. Angenommen, Sie haben eine Lösung gefunden, aber als Sie mit der Implementierung begannen, schien Ihre erste Idee nicht die beste zu sein. Können Sie schnell zu einem besseren wechseln und schließlich den von Ihnen geschriebenen Code überarbeiten?

Dies bedeutet auch, dass solche Interviews interaktiver sein sollten . Anstatt mit einer Hand zu tippen, kaufen Sie eine Freisprecheinrichtung oder rufen Sie über Skype an und verwenden Sie ein Headset. Tippen Sie, während Sie bei der Arbeit tippen, während Sie kommentieren und erklären, was Sie tun: Es wird plötzlich viel weniger umständlich.

Hast du Paarprogrammierung gemacht? Wenn ja, ist die Interview-Situation sehr ähnlich, außer dass der Interviewer Ihnen möglicherweise nicht seine Meinung sagt und Sie ihn nicht bitten, die Tastatur mit Ihnen zu wechseln, wenn Sie fertig sind.

Hier sind einige Beispiele für ein rein mathematisches Problem und wie es nicht-mathematische Fähigkeiten eines Entwicklers zeigt.

Beispiel 1: einfache Codierung Übung

Sie müssen den Fibonacci-Zahlenrechner in JavaScript implementieren. Sie sollten in der Lage sein, den Index zu ändern. Die Fibonacci-Sequenz folgt diesen Regeln:

  1. Die ersten beiden Zahlen der Sequenz sind 0 und 1,
  2. Jede nachfolgende Zahl ist die Summe der beiden vorherigen.

Beispiel: [~ # ~] f [~ # ~] = 0, [~ # ~] f [~ # ~]1 = 1, [~ # ~] f [~ # ~]2 = 1, [~ # ~] f [~ # ~]3 = 2, [~ # ~] f [~ # ~]10 = 55.

Sie haben drei Minuten.

Hier möchte der Interviewer, dass Sie so schnell wie möglich denken, die Lösung finden und sie schnell umsetzen. Eine solche Übung hat nichts mit dem zu tun, was Entwickler tatsächlich tun, und ist viel näher an dem, was Sie bei einem CS-Abschluss finden können, aber Interviewer mögen solche Dinge, also lasst es uns tun. Außerdem macht es die Zeitbeschränkung unmöglich, automatisierte Tests durchzuführen, sodass der Interviewer dies wahrscheinlich nicht von Ihnen erwartet.

„Die Beschreibung des Algorithmus lässt mich über Rekursion nachdenken. Die zweite Regel führt zu der folgenden rekursiven Funktion. “

var fibonacci = function (n) {
    return fibonacci(n - 2) + fibonacci(n - 1);
};

console.log(fibonacci(10));

"Um die Rekursion zu beenden, werden wir die Sonderfälle hinzufügen, indem wir den Hauptteil der Funktion fibonacci ersetzen."

switch (n) {
    case 0: return 0;
    case 1: return 1;
    default: return fibonacci(n - 2) + fibonacci(n - 1);
}

"Erledigt."

Schlussfolgerung

Wie gesagt, eine solche Übung hat nichts mit einem tatsächlichen Job eines Entwicklers zu tun. Macht es es bedeutungslos? Nicht wirklich, denn zumindest zeigt es, dass die Person:

  • Kann über ein Problem nachdenken. Einige Kandidaten werden völlig verloren sein und unter Stress mehr als die zugewiesene Zeit in Anspruch nehmen, um über einen möglichen Weg zur Lösung des Problems nachzudenken.

  • Kennt die Rekursion oder kann die Rekursion durch eine gewöhnliche Schleife umgehen. Später kann der Interviewer fragen, ob es Möglichkeiten gibt, Rekursion zu verwenden/nicht zu verwenden, und welche Vor- und Nachteile Rekursion hat.

  • Kennt die Grundlagen der Programmiersprache. Es spielt keine Rolle, ob die Person switch, eine Schutzklausel, eine Bedingung oder ein Wörterbuch verwendet hat: Je nach Hintergrund wählen verschiedene Kandidaten unterschiedliche Werkzeuge aus, um dasselbe zu erreichen.

  • Konzentriert sich auf das Problem, ohne Dinge wie Komponententests, Skalierbarkeit oder Leistung zu bringen. Der Interviewer kann dann fragen, warum die oben genannte Funktion in Bezug auf die Leistung schrecklich ist, und erwartet, dass der Kandidat erklärt, was zu tun ist, um die Leistung auf ein angemessenes Niveau zu bringen.

Beispiel 2: knifflige Fragen

Sie müssen den Fibonacci-Zahlenrechner in JavaScript implementieren. Es sollte so schnell wie möglich sein. Sie sollten in der Lage sein, den Index im Bereich von 0 bis 100 zu ändern. Die Fibonacci-Sequenz folgt diesen Regeln:

  1. Die ersten beiden Zahlen der Sequenz sind 0 und 1,
  2. Jede nachfolgende Zahl ist die Summe der beiden vorherigen.

Beispiel: [~ # ~] f [~ # ~] = 0, [~ # ~] f [~ # ~]1 = 1, [~ # ~] f [~ # ~]2 = 1, [~ # ~] f [~ # ~]3 = 2, [~ # ~] f [~ # ~]10 = 55.

Sie haben drei Minuten.

Jetzt haben wir eine interessante Einschränkung, die zeigt, dass es dem Interviewer nicht wirklich um die Fähigkeit des Kandidaten geht, Probleme zu lösen, sondern um seine Fähigkeit zu erraten, welche Wege schneller sind als andere.

Diese kniffligen Fragen laden normalerweise zu kniffligen Antworten ein. Hier gibt es aus zeitlichen Gründen keine Möglichkeit, mehrere Implementierungen durchzuführen, sie zu bewerten, die schnellste zu profilieren und eine optimale Lösung zu finden.

Was ist stattdessen mit:

"Lassen Sie mich" Erste Fibonacci-Zahlen "googeln ... This sieht vielversprechend aus. Mit einer einfach (das wäre ein Oxymoron) Mit dem regulären Ausdruck können wir eine durch Kommas getrennte Liste von Werten erstellen. “

sed -e "s;\([0-9]*\) \([0-9]*\);'\2',;g" fbncc10.txt | tr '\n' ' '

"Endlich das Programm selbst."

var map = ['0', '1', '1', '2', '3', '5', '8', '13', '21', '34', '55', '89', '144', '233', '377', '610', '987', '1597', '2584', '4181', '6765', '10946', '17711', '28657', '46368', '75025', '121393', '196418', '317811', '514229', '832040', '1346269', '2178309', '3524578', '5702887', '9227465', '14930352', '24157817', '39088169', '63245986', '102334155', '165580141', '267914296', '433494437', '701408733', '1134903170', '1836311903', '2971215073', '4807526976', '7778742049', '12586269025', '20365011074', '32951280099', '53316291173', '86267571272', '139583862445', '225851433717', '365435296162', '591286729879', '956722026041', '1548008755920', '2504730781961', '4052739537881', '6557470319842', '10610209857723', '17167680177565', '27777890035288', '44945570212853', '72723460248141', '117669030460994', '190392490709135', '308061521170129', '498454011879264', '806515533049393', '1304969544928657', '2111485077978050', '3416454622906707', '5527939700884757', '8944394323791464', '14472334024676221', '23416728348467685', '37889062373143906', '61305790721611591', '99194853094755497', '160500643816367088', '259695496911122585', '420196140727489673', '679891637638612258', '1100087778366101931', '1779979416004714189', '2880067194370816120', '4660046610375530309', '7540113804746346429', '12200160415121876738', '19740274219868223167', '31940434634990099905', '51680708854858323072', '83621143489848422977', '135301852344706746049', '218922995834555169026', '354224848179261915075'];

var fibonacci = function (n) {
    return map[n];
};

console.log(fibonacci(10));

Schlussfolgerung

Heikle Fragen laden zu kniffligen Antworten ein. Seien Sie nicht heldenhaft und beginnen Sie nicht mit dem Benchmarking und Profiling, wenn Sie nur drei Minuten Zeit haben. Überlegen Sie sich clevere Möglichkeiten, um das Problem zu lösen, während Sie Ihre Erfahrungen nutzen. Meine Erfahrung gibt mir einen Hinweis darauf, dass die Verwendung einer Karte möglicherweise schneller ist als die Berechnung der Zahl. Es mag falsch sein, aber dieser Versuch sollte angesichts der Zeitbeschränkung erwartet werden.

Die Kenntnis Ihrer Tools hilft ebenfalls und ist ein wesentlicher Bestandteil der Entwicklerfähigkeiten: Ohne Kenntnis der regulären Ausdrücke würde ich entweder die zugewiesenen drei Minuten damit verbringen, nach einer durch Kommas getrennten Liste zu googeln, oder einen Parser schreiben, der das von mir benötigte Array erstellt.

Denken Sie daran, ein guter Entwickler ist nicht einer, der sofort mit dem Codieren beginnt, sondern der weiß, wie man das Codieren vermeidet, wenn eine bessere Gelegenheit verfügbar ist. Einige Interviewer zögern nicht, Ihnen Aufgaben zu geben, die wie Codierungsaufgaben aussehen, für die jedoch fast kein Code erforderlich ist.

Beispiel 3: vollständige Anwendung Entwicklung

Sie müssen die Fibonacci-Sequenz in JavaScript implementieren. Die Länge der Sequenz wird während der Ausführung des Programms festgelegt. Die Reihenfolge folgt diesen Regeln:

  1. Die ersten beiden Zahlen der Sequenz sind 0 und 1,
  2. Jede nachfolgende Zahl ist die Summe der beiden vorherigen.

Beispiel: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89.

Die Anwendung sollte als Webseite dargestellt werden, auf der der Benutzer die Länge der Sequenz über ein Eingabefeld angeben kann.

Du hast eine Stunde Zeit.

Lasst uns beginnen.

„Die Beispielsequenz ist sehr hilfreich, da ich eine Reihe von Komponententests durchführen kann, um sicherzustellen, dass meine Implementierung nicht völlig falsch aussieht. Im Allgemeinen verwende ich Mocha für node.js oder QUnit für clientseitiges JavaScript, aber hier werde ich der Einfachheit halber nur eine Reihe von Testfunktionen ausführen. “

„Ich beginne mit der Erstellung von index.htm Und fib.js Dateien. Dann fülle ich index.htm Mit wirklich minimalistischem und nicht W3C-kompatiblem Code (wir können später darauf zurückkommen, wenn Sie auch an meinen HTML-Kenntnissen interessiert sind). “

<label>Length</label> <input id="length" value="15" />
<input id="compute" type="button" value="Compute" />
<div id="result" style="font-weight:bold;"></div>
<div id="tests"></div>
<script src="fib.js"></script>

"Schreiben wir jetzt einen Code, der die Fibonacci-Generatorfunktion aufruft und die Ergebnisse anzeigt."

fibonacci = (function () {
    var compute,
        init;

    compute = function (length) {
        // TODO: Implement Fibonacci sequence.
        return [1, 2, 3];
    };

    init = function () {
        var button = document.getElementById('compute');
        button.addEventListener('onclick', function () {
            var length = parseInt(document.getElementById('length').value, 10),
                result;

            console.log(
                'Computing Fibonacci sequence of length ' + length + '.'
            );

            result = compute(length);
            document.getElementById('result').innerText = result.join(', ');
        });
    };

    return {
        compute: compute,
        init: init
    };
}());

„Es ist Zeit, den Code zum ersten Mal auszuführen und ... es funktioniert nicht. Nichts passiert. Warum?"

„OK, ich habe die fibonacci.init(); am Ende vergessen. Ich habe es hinzugefügt, und trotzdem passiert nichts, während es zumindest die Meldung in der Konsole anzeigen sollte. Warten Sie, richtig, es ist nicht onclick, sondern click; Ich benutze JQuery so oft, dass ich die Namen der Ereignisse in einfachem JavaScript vergesse. “

"Lassen Sie uns einige Tests hinzufügen."

ensureAreEqual = function (expected, actual) {
    var testResultsContainer = document.getElementById('tests');
    testResultsContainer.innerText += (expected.equals(actual) ?
            '.' :
            ('Actual [' + actual.join(', ') + '] is different from ' +
             'expected [' + expected.join(', ') + '].'));
};

test = function () {
    ensureAreEqual([0], compute(1));
};

"Das Vergleichen von Arrays kann schwierig sein, daher kopiere ich einfach Array.prototype.equals Code von diese Antwort ."

"Nachdem wir die Anwendung ausgeführt haben, wird Folgendes angezeigt:"

Die tatsächliche [1, 2, 3] unterscheidet sich von der erwarteten [0].

„Der Test ist fehlgeschlagen, was angesichts unserer tatsächlichen Implementierung (return [1, 2, 3];) Der Fibonacci-Sequenz sehr zu erwarten war. Es ist Zeit, dies zu ändern. “

"Ausgehend von der ursprünglichen Anweisung beginnt die Fibonacci-Sequenz mit [0, 1], Also wird compute zu:"

compute = function (length) {
    var fib = [0];
    return fib;
};

"Dies macht es möglich, den ersten Test zu bestehen, und wir können jetzt unseren zweiten schreiben."

ensureAreEqual([0, 1], compute(2));

"Es schlägt fehl, also kehren wir zu compute zurück und ändern es."

compute = function (length) {
    var fib = [0, 1];
    return length === 1 ? [0] : fib;
};

"Jetzt bestehen beide Tests und es ist Zeit, zu Fällen zu wechseln, die nicht von Edge stammen."

compute = function (length) {
    var fib = [0, 1],
        i,
        next,
        current = 1,
        previous = 0;

    for (i = 2; i < length; i += 1) {
        next = current + previous;
        previous = current;
        current = next;
        fib.Push(next);
    }

    return length === 1 ? [0] : fib;
};

„Alle drei Tests bestehen jetzt, außer dass das Ergebnis für größere Längen wie 100 nicht richtig aussieht. Um diese Ergebnisse richtig zu machen, wir hätten eine Bibliothek mit beliebiger Genauigkeit verwenden sollen . Es gibt auch Dinge zu verbessern. Beispielsweise sind Namenskonventionen manchmal zu schlecht (was ist fib?). HTML-bezogener JavaScript-Code sollte auch zu einem anderen Objekt gehen und Code testen. Außerdem habe ich compute(0) nicht getestet und die Eingaben nicht überprüft. “

Schlussfolgerung

Wenn Sie durch das Beispiel gehen, sehen Sie möglicherweise die Interaktion, die während eines Interviews erwartet wird. Nicht alles war reibungslos (ich habe am Anfang einige Fehler gemacht, die mich zu einer peinlichen Situation führten, in der beim Ausführen der Anwendung nichts passiert), und der ursprüngliche Ansatz war lahm, wenn wir eine große Sequenzlänge unterstützen müssen, aber ich habe es geschafft zu zeigen, dass:

  • Ich kann mit verschiedenen Problemen umgehen,
  • Ich verwende testgetriebene Entwicklung, wobei die Fibonacci-Sequenz eine hervorragende Gelegenheit dafür ist.
  • Ich kopiere und füge Code ein, wenn die Quelle vertrauenswürdig ist und das Schreiben von Grund auf überwältigend kompliziert und fehleranfällig erscheint.
  • Ich verlasse mich nicht zu sehr auf Bibliotheken wie JQuery,
  • Ich habe den richtigen Bereich gewählt: Da der Interviewer meine JavaScript-Kenntnisse überprüfen möchte, werde ich keine Zeit damit verschwenden, perfektes und sauberes HTML zu schreiben. Wenn Sie hier keine Zeit verbringen, können Sie mehr Zeit mit dem Schreiben von Komponententests verbringen.
  • Ich weiß, wann ich fertig sein muss und sage, dass ich fertig bin, während ich bedenke, dass einige Dinge nicht perfekt sind (wie compute(0), was fehlschlagen wird, aber für die Demo keine Rolle spielt).

Genau das sollte ein Interviewer von Ihnen erwarten.

52