Znam JavaScript naprawdę dobrze, ale bombarduję wywiady kodujące [zamknięte]

33

Obecnie szukam nowej pozycji jako programista Front-End. Bardzo dobrze znam JavaScript i potrafię poetycko nawiązywać do zamknięć, curry, dziedziczenia prototypów, wzorców projektowych, wydajności aplikacji i ogólnej architektury front-end. Ale wciąż wciąż bombarduję rozmowy kwalifikacyjne. (Do Twojej wiadomości większość zadań, z którymi rozmawiam, to budowanie SPA z jakimś szkieletem MVC)

Zwykle testy kodowania to małe fragmenty kodu rzeczy, z którymi nigdy nie spotkałem się profesjonalnie. Jak napisać funkcję, aby rozwiązać jakiś problem matematyczny. Oprócz odziedziczonej niezręczności związanej z próbą kodowania, gdy trzymasz telefon w jednej ręce i gdy nieznajomy widzi Twój ekran i obserwuje każdą wpisaną przez ciebie postać, po prostu zwykle nie widzę tego rodzaju rzeczy w prawdziwym świecie.

Czy to poważny zestaw umiejętności, których mi brakuje, czy też ankieterzy zadają mi nieistotne pytania. Chyba powinienem popracować nad funkcjonalnym programowaniem i algorytmami, ale nie znalazłem wielu dobrych zasobów w Internecie (ani w wersji drukowanej), jakieś sugestie?

Mike Fisher
źródło
4
Wypróbuj Project Euler dla niektórych próbek.
Peter K.,
11
I uzyskać zestaw głośnomówiący do telefonu?
AakashM
Dlaczego przeprowadzasz test kodowania na swoim telefonie? Czy oczekuje się, że będziesz pracować w ten sposób po otrzymaniu pracy?
Burhan Ali
2
@BurhanAli, telefon służy do rozmowy i jest to standard w pierwszym etapie wywiadu.
greenoldman
3
Tak, myślę, że niektóre dzisiejsze testy sceenów to kompletne bzdury. Nienawidzę testów „zabrania do domu”, w których mówią ci, że coś można zrobić w ciągu godziny, ale w rzeczywistości zajęłoby to pół dnia lub dłużej. Nie chcę tego robić wprost. Naprawdę jesteś kaprysem ankietera. Niektórzy z nich wymyślają dobre testy oceniające umiejętności w świecie rzeczywistym. Inni ankieterzy nie wiedzą, co do diabła robią, i mają swoje własne programy i niepewność.
Ringo,

Odpowiedzi:

52

Pisanie kodu to tylko część procesu rozmowy kwalifikacyjnej.

Właściwie rozwiązanie logicznego problemu jest tylko częścią zadania pisania kodu.

Ankieterzy chcą mieć pewność, że:

  • Możesz pisać kod. Wielu kandydatów z dziesięcioletnim doświadczeniem zawodowym w języku nie może w ogóle napisać żadnego kodu, a ten test ma na celu ich odrzucenie.

  • Myślisz o problemie przed napisaniem kodu. Wielu skakało po klawiaturze, pisało dziesiątki linii kodu, a potem stwierdzało, że źle zrozumieli pierwotny problem, ponieważ nie zastanawiali się nad tym.

  • Możesz się dostosować podczas pisania kodu. Powiedzmy, że znalazłeś rozwiązanie, ale kiedy zacząłeś je wdrażać, okazało się, że twój pierwszy pomysł nie był najlepszy; czy możesz szybko przejść na lepszy, ostatecznie refaktoryzując napisany kod?

Oznacza to również, że takie wywiady powinny być bardziej interaktywne . Zamiast pisać jedną ręką, kup zestaw głośnomówiący lub zadzwoń przez Skype i użyj zestawu słuchawkowego. Pisz podczas pisania w pracy, jednocześnie komentując i wyjaśniając, co robisz: nagle stanie się o wiele mniej niezręczne.

Czy wykonałeś programowanie w parach? Jeśli tak, sytuacja podczas rozmowy kwalifikacyjnej jest bardzo podobna, z wyjątkiem tego, że osoba przeprowadzająca wywiad może nie wyrazić swojej opinii i nie poprosisz go, aby po zakończeniu zmienił klawiaturę.

Oto kilka przykładów czysto matematycznego problemu i sposobu, w jaki pokazuje on niematematyczne umiejętności programisty.

Przykład 1: proste ćwiczenie kodowania

Musisz zaimplementować kalkulator liczb Fibonacciego w JavaScript. Powinieneś być w stanie zmienić indeks. Sekwencja Fibonacciego podlega następującym zasadom:

  1. Pierwsze dwie liczby sekwencji to 0 i 1,
  2. Każda kolejna liczba jest sumą dwóch poprzednich.

Przykład: F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, F 10 = 55.

Masz trzy minuty.

Tutaj ankieter chce, abyś pomyślał tak szybko, jak to możliwe, znalazł rozwiązanie i szybko je wdrożył. Takie ćwiczenie nie ma związku z tym, co robią prawdziwi programiści, i jest znacznie bliższe temu, co można znaleźć, zdobywając dyplom CS, ale ankieterom podobają się tego rodzaju rzeczy, więc zróbmy to. Ponadto ograniczenie czasowe uniemożliwia przeprowadzenie zautomatyzowanych testów, więc osoba przeprowadzająca wywiad prawdopodobnie tego nie oczekuje od ciebie.

„Opis algorytmu każe mi myśleć o rekurencji. Druga zasada prowadzi do następującej funkcji rekurencyjnej. ”

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

console.log(fibonacci(10));

„Aby zakończyć rekurencję, dodamy specjalne przypadki, zastępując zestaw fibonaccifunkcji.”

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

"Gotowy."

Wniosek

Jak powiedziałem, takie ćwiczenie jest całkowicie niezwiązane z faktyczną pracą programisty. Czy to czyni to bez znaczenia? Nie bardzo, bo przynajmniej pokazuje, że osoba:

  • Potrafi myśleć o problemie. Niektórzy kandydaci zostaną całkowicie zagubieni i pod wpływem stresu zajmą więcej czasu niż tylko przydzielony czas, aby pomyśleć o możliwym sposobie rozwiązania problemu.

  • Zna rekurencję lub potrafi obejść rekurencję przez zwykłą pętlę. Później osoba przeprowadzająca wywiad może zapytać, czy istnieją sposoby wykorzystania / nieużytkowania rekurencji oraz jakie są zalety / wady rekurencji.

  • Zna podstawy języka programowania. Nie ma znaczenia, czy użyta osoba switch, klauzula ochronna, warunkowa czy słownik : w zależności od tła, różni kandydaci wybiorą różne narzędzia, aby osiągnąć to samo.

  • Koncentruje się na problemie, nie wnosząc rzeczy takich jak testy jednostkowe, skalowalność lub wydajność. Ankieter może następnie zapytać, dlaczego pod względem wydajności powyższa funkcja jest okropna, oczekując od kandydata wyjaśnienia, co należy zrobić, aby doprowadzić wydajność do rozsądnego poziomu.

Przykład 2: trudne pytania

Musisz zaimplementować kalkulator liczb Fibonacciego w JavaScript. Powinno być jak najszybciej. Powinieneś być w stanie zmienić indeks w zakresie od 0 do 100. Sekwencja Fibonacciego jest zgodna z następującymi zasadami:

  1. Pierwsze dwie liczby sekwencji to 0 i 1,
  2. Każda kolejna liczba jest sumą dwóch poprzednich.

Przykład: F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, F 10 = 55.

Masz trzy minuty.

Teraz mamy ciekawe ograniczenie, które pokazuje, że ankieterowi tak naprawdę nie zależy na zdolności kandydata do rozwiązywania problemów, ale raczej na jego zdolności do odgadnięcia, które sposoby są szybsze niż inne.

Te trudne pytania zazwyczaj zapraszają do trudnych odpowiedzi. Tutaj, biorąc pod uwagę ograniczenia czasowe, nie ma możliwości dokonywania wielu wdrożeń, porównywania ich, profilowania najszybszego i dostarczania optymalnego rozwiązania.

Zamiast tego:

„Pozwól mi Google” Pierwsze liczby Fibonacciego ... To wygląda obiecująco. Za pomocą prostego wyrażenia regularnego (byłby to oksymoron) możemy stworzyć listę wartości oddzieloną przecinkami. ”

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

„Wreszcie sam program”.

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));

Wniosek

Podchwytliwe pytania zapraszają do trudnych odpowiedzi. Nie bądź bohaterski i nie rozpoczynaj testów i profilowania, gdy masz tylko trzy minuty. Pomyśl o sprytnych sposobach rozwiązania problemu podczas korzystania z doświadczenia. Moje doświadczenie daje mi podpowiedź, że korzystanie z mapy może być szybsze niż obliczenie liczby. Może być źle, ale należy się spodziewać tej próby, biorąc pod uwagę ograniczenie czasowe.

Znajomość narzędzi pomaga i jest niezbędną częścią umiejętności programistycznych: bez znajomości wyrażeń regularnych spędziłbym przydzielone trzy minuty na googlingu na liście oddzielonej przecinkami, lub zacząłem pisać parser, który zbuduje potrzebną tablicę.

Pamiętaj, że dobry programista nie jest tym, który zaczyna kodowanie od razu, ale wie, jak uniknąć kodowania, gdy jest lepsza okazja. Niektórzy ankieterzy nie zawahają się nadać ci zadań, które wyglądają jak kodowanie, ale które prawie nie wymagają kodu.

Przykład 3: pełne opracowanie aplikacji

Musisz zaimplementować sekwencję Fibonacciego w JavaScript. Długość sekwencji jest określana podczas wykonywania programu. Sekwencja jest zgodna z następującymi zasadami:

  1. Pierwsze dwie liczby sekwencji to 0 i 1,
  2. Każda kolejna liczba jest sumą dwóch poprzednich.

Przykład: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89.

Aplikacja powinna być prezentowana jako strona internetowa, umożliwiająca użytkownikowi określenie długości sekwencji za pomocą pola wprowadzania.

Masz godzinę

Zaczynajmy.

„Przykładowa sekwencja jest bardzo pomocna, ponieważ pozwoli mi przeprowadzić kilka testów jednostkowych, aby upewnić się, że moja implementacja nie wygląda zupełnie źle. Ogólnie używam Mocha dla node.js lub QUnit dla JavaScript po stronie klienta, ale tutaj, dla uproszczenia, po prostu rzucę kilka funkcji testowych. ”

„Zaczynam od tworzenia index.htmi fib.jsplików. Następnie wypełniam index.htmbardzo minimalistycznym i niezgodnym z W3C kodem (możemy wrócić do tego później, jeśli interesują Cię również moje umiejętności HTML). ”

<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>

„Napiszmy teraz kod, który wywoła funkcję generatora Fibonacciego i wyświetli wyniki”.

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
    };
}());

„Czas uruchomić kod po raz pierwszy i ... to nie działa. Nic się nie dzieje. Czemu?"

„OK, zapomniałem fibonacci.init();na końcu. Dodałem go i nadal nic się nie dzieje, podczas gdy powinien przynajmniej wyświetlać komunikat w konsoli. Czekaj, racja, nie jest onclick, ale click; Używam JQuery tak często, że zaczynam zapominać nazwy zdarzeń w zwykłym JavaScript. ”

„Dodajmy testy”.

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));
};

„Porównywanie tablic może być trudne, więc po prostu kopiuję i wklejam Array.prototype.equalskod z tej odpowiedzi ”.

„Po uruchomieniu aplikacji wyświetla się:”

Rzeczywisty [1, 2, 3] różni się od oczekiwanego [0].

„Test nie powiódł się, co było wysoce oczekiwane, biorąc pod uwagę naszą faktyczną implementację ( return [1, 2, 3];) sekwencji Fibonacciego. Czas to zmienić. ”

„Z pierwotnego stwierdzenia sekwencja Fibonacciego zaczyna się od [0, 1], więc computestaje się:”

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

„Umożliwia to zdanie pierwszego testu, a teraz możemy napisać drugi.”

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

„Nie udaje się, więc wracamy do niego computei modyfikujemy”.

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

„Teraz oba testy przeszły pomyślnie i nadszedł czas, aby przejść do przypadków innych niż krawędzie”.

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;
};

„Wszystkie trzy testy przeszły teraz pomyślnie, z wyjątkiem tego, że wynik nie wygląda dobrze dla większych długości, takich jak 100. Aby uzyskać prawidłowe wyniki, powinniśmy użyć biblioteki o dowolnej precyzji . Są też rzeczy do poprawy. Na przykład konwencje nazewnictwa są czasami zbyt złe (co jest fib?). Kod JavaScript związany z HTML powinien również przejść do innego obiektu, a także kodu testowego. Ponadto nie testowałem compute(0)i nie sprawdzałem danych wejściowych. ”

Wniosek

Przechodząc przez przykład, możesz zobaczyć interakcję oczekiwaną podczas wywiadu. Nie wszystko poszło gładko (popełniłem kilka błędów na początku, co doprowadziło mnie do zawstydzającej sytuacji, w której nic się nie dzieje po uruchomieniu aplikacji), a oryginalne podejście było kiepskie, jeśli musieliśmy obsługiwać dużą długość sekwencji, ale udało mi się pokazać że:

  • Potrafię poradzić sobie z różnymi problemami,
  • Korzystam z programowania opartego na testach, a sekwencja Fibonacciego stanowi doskonałą okazję do tego,
  • Kopiuję i wklejam kod, gdy źródło jest godne zaufania, a pisanie go od zera wydaje się niezwykle skomplikowane i podatne na błędy,
  • Nie polegam nadmiernie na bibliotekach takich jak JQuery,
  • Wybrałem odpowiedni zakres: ponieważ ankieter chce sprawdzić moje umiejętności JavaScript, nie będę marnować czasu na pisanie doskonałego i czystego HTML: nie spędzanie czasu tutaj pozwala spędzić więcej czasu na pisaniu testów jednostkowych,
  • Wiem, kiedy skończyć i informuję, że skończyłem, pamiętając jednak, że kilka rzeczy nie jest idealne (takie, compute(0)które zawiodą, ale nie ma to znaczenia dla wersji demo).

Właśnie tego powinien oczekiwać od ciebie ankieter.

Arseni Mourzenko
źródło