Я очень хорошо знаю JavaScript, но я беру интервью по кодированию [закрыто]

33

В настоящее время я нахожусь в поиске новой позиции в качестве Front-End Developer. Я очень хорошо знаю JavaScript и могу поэтично рассказать о замыканиях, каррировании, прототипировании, шаблонах проектирования, производительности приложений и общей архитектуре интерфейса. Но все же я все равно заканчиваю тем, что взрываю собеседования при приеме на работу. (К вашему сведению, большинство работ, на которые я беру интервью, связано с созданием SPA с использованием какой-то инфраструктуры MVC)

Обычно тесты кодирования представляют собой небольшие фрагменты кода, с которыми я никогда не сталкивался профессионально. Как написать функцию, чтобы решить какую-то математическую задачу. Помимо унаследованной неловкости от попыток писать код, держа телефон в одной руке и заставляя незнакомца видеть ваш экран и наблюдать за каждым набираемым вами символом, я просто не вижу такого рода вещи в реальном мире.

Это серьезный набор навыков, которого мне не хватает, или интервьюеры задают мне неуместные вопросы. Я полагаю, что мне следует заняться функциональным программированием и алгоритмическими изменениями, но я не нашел много хороших ресурсов в Интернете (или в печати), какие-либо предложения?

Майк Фишер
источник
4
Попробуйте Project Euler для некоторых образцов.
Питер К.
11
И получить комплект громкой связи для вашего телефона?
AakashM
Почему вы делаете тест кодирования на вашем телефоне? От вас ожидают, что вы будете работать таким образом, когда получите работу?
Бурхан Али
2
@BurhanAli, телефон для разговора, и это стандарт для 1-го этапа интервью.
Greenoldman
3
Да, я думаю, что некоторые из современных тестов - полная чушь. Я особенно презираю тесты «домой», в которых говорится, что что-то можно сделать за час, но на самом деле это займет полдня или больше, чтобы сделать это правильно. Я отказываюсь делать это прямо. Вы действительно по прихоти интервьюера. Некоторые из них придумывают хорошие тесты, которые оценивают реальные навыки. Другие интервьюеры не знают, что, черт возьми, они делают, и у них есть свои личные планы и проблемы с безопасностью.
Ринго

Ответы:

52

Написание кода - это только часть процесса собеседования.

На самом деле решение логической проблемы - это только часть задачи написания кода.

Интервьюеры хотят быть уверены, что:

  • Вы можете написать код. Многие кандидаты с 10-летним опытом работы на каком-либо языке вообще не могут написать никакого кода, и этот тест предназначен для отклонения этих кандидатов.

  • Вы думаете о проблеме, прежде чем писать код. Многие прыгали к своим клавишам, писали десятки строк кода, а потом находили, что они неправильно поняли исходную проблему, потому что не думали об этом.

  • Вы можете адаптироваться при написании кода. Скажем, вы нашли решение, но когда вы начали его реализовывать, оказалось, что ваша первая идея была не самой лучшей; Можете ли вы быстро переключиться на лучший, в конечном итоге рефакторинг кода, который вы написали?

Это также означает, что такие интервью должны быть более интерактивными . Вместо набора одной рукой купите комплект громкой связи или позвоните через Skype и используйте гарнитуру. Печатайте так, как вы печатаете на работе, комментируя и объясняя, что вы делаете: это внезапно станет намного менее неловким.

Вы занимались парным программированием? Если да, ситуация на собеседовании очень похожа, за исключением того, что интервьюер может не высказать вам свое мнение, и вы не попросите его поменять клавиатуру с вами, когда вы закончите.

Вот несколько примеров чисто математической проблемы и того, как она показывает нематематические навыки разработчика.

Пример 1: простое упражнение по кодированию

Вам необходимо реализовать калькулятор чисел Фибоначчи в JavaScript. Вы должны быть в состоянии изменить индекс. Последовательность Фибоначчи следует этим правилам:

  1. Первые два числа последовательности - это 0 и 1,
  2. Каждое последующее число является суммой двух предыдущих.

Пример: F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, F 10 = 55.

У тебя три минуты.

Здесь интервьюер хочет, чтобы вы думали как можно быстрее, находили решение и быстро его реализовывали. Такое упражнение не связано с тем, что делают настоящие разработчики, и гораздо ближе к тому, что вы можете найти при получении степени CS, но интервьюерам нравятся такие вещи, так что давайте сделаем это. Кроме того, ограничение по времени делает невозможным проведение какого-либо автоматического тестирования, поэтому интервьюер, вероятно, не ожидает этого от вас.

«Описание алгоритма заставляет меня задуматься о рекурсии. Второе правило приводит к следующей рекурсивной функции ».

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

console.log(fibonacci(10));

«Чтобы завершить рекурсию, мы добавим специальные случаи, заменив тело fibonacciфункции».

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

"Выполнено."

Вывод

Как я уже сказал, такое упражнение совершенно не связано с реальной работой разработчика. Это делает это бессмысленным? Не совсем, потому что, по крайней мере, это показывает, что человек:

  • Умеет думать о проблеме. Некоторые кандидаты будут полностью потеряны, и в состоянии стресса потребуется больше, чем выделенное время, чтобы подумать о возможном способе решения проблемы.

  • Знает рекурсию или умеет обходить рекурсию через обычный цикл. Позже интервьюер может спросить, были ли способы использовать / не использовать рекурсию, и каковы преимущества / недостатки рекурсии.

  • Знает основы языка программирования. Неважно, использовал ли человек switch, защитное предложение, условное обозначение или словарь : в зависимости от фона разные кандидаты будут выбирать разные инструменты для достижения одного и того же результата.

  • Сосредоточена на проблеме, не приводя такие вещи, как модульные тесты, масштабируемость или производительность. Затем интервьюер может спросить, почему с точки зрения производительности вышеупомянутая функция ужасна, ожидая, что кандидат объяснит, что нужно сделать, чтобы довести производительность до разумного уровня.

Пример 2: хитрые вопросы

Вам необходимо реализовать калькулятор чисел Фибоначчи в JavaScript. Это должно быть как можно быстрее. Вы должны иметь возможность изменять индекс в диапазоне от 0 до 100. Последовательность Фибоначчи следует этим правилам:

  1. Первые два числа последовательности - это 0 и 1,
  2. Каждое последующее число является суммой двух предыдущих.

Пример: F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, F 10 = 55.

У тебя три минуты.

Теперь у нас есть интересное ограничение, которое показывает, что интервьюер на самом деле заботится не о способности кандидата решать проблемы, а о его способности угадывать, какие пути быстрее других.

Эти сложные вопросы обычно требуют сложных ответов. Здесь, учитывая временные ограничения, нет возможности сделать несколько реализаций, сравнить их, профилировать самую быструю и предложить оптимальное решение.

Вместо этого, как насчет:

«Позвольте мне Google« Первые числа Фибоначчи »... Это выглядит многообещающе. С помощью простого (это будет оксюморон) регулярного выражения мы можем создать список значений через запятую ».

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

«Наконец, сама программа».

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

Вывод

Сложные вопросы требуют сложных ответов. Не будь героическим и не начинай бенчмаркинг и профилирование, когда у тебя всего три минуты. Подумайте над умными способами решить проблему, используя свой опыт. Мой опыт подсказывает мне, что использование карты может оказаться быстрее, чем вычисление числа. Это может быть неправильно, но эту попытку следует ожидать, учитывая ограничение по времени.

Знание ваших инструментов также помогает и является неотъемлемой частью навыков разработчика: не зная регулярных выражений, я бы либо потратил выделенные три минуты поиск в Google для списка через запятую, либо начал бы писать анализатор, который будет создавать нужный мне массив.

Помните, что хороший разработчик - это не тот, кто начинает кодирование сразу, а тот, кто знает, как избежать кодирования при наличии лучшей возможности. Некоторые интервьюеры без колебаний дадут вам задания, которые выглядят как кодирующие, но для которых совсем не требуется код.

Пример 3: завершить разработку приложения

Вам нужно реализовать последовательность Фибоначчи в JavaScript. Длина последовательности определяется во время выполнения программы. Последовательность следует этим правилам:

  1. Первые два числа последовательности - это 0 и 1,
  2. Каждое последующее число является суммой двух предыдущих.

Пример: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89.

Приложение должно быть представлено в виде веб-страницы, позволяющей пользователю указать длину последовательности через поле ввода.

У тебя есть один час.

Давайте начнем.

«Пример последовательности очень полезен, так как он позволит мне провести кучу модульных тестов, чтобы убедиться, что моя реализация не выглядит совершенно неправильно. В общем, я использую Mocha для node.js или QUnit для клиентского JavaScript, но здесь, для простоты, я просто добавлю несколько тестовых функций ».

«Я начинаю с создания index.htmи fib.jsфайлов. Затем я наполняю index.htmдействительно минималистичным и не совместимым с W3C кодом (мы можем вернуться к этому позже, если вам также интересны мои навыки 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>

«Давайте теперь напишем некоторый код, который вызовет функцию генератора Фибоначчи и покажет результаты».

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

«Пришло время запустить код в первый раз, и ... он не работает. Ничего не произошло. Зачем?"

«Хорошо, я забыл fibonacci.init();в конце. Я добавил его, и все же ничего не происходит, хотя он должен хотя бы отобразить сообщение в консоли. Подождите, верно, это не так onclick, но click; Я использую JQuery так часто, что начинаю забывать названия событий в простом JavaScript ».

«Давайте добавим несколько тестов».

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

«Сравнение массивов может быть сложным, поэтому я просто скопирую и вставлю Array.prototype.equalsкод из этого ответа ».

«Теперь, когда мы запускаем приложение, оно отображает:»

Фактические [1, 2, 3] отличаются от ожидаемых [0].

«Тест не прошел, что было ожидаемо, учитывая нашу фактическую реализацию ( return [1, 2, 3];) последовательности Фибоначчи. Пришло время изменить это.

«Из исходного утверждения последовательность Фибоначчи начинается с того [0, 1], что computeстановится:»

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

«Это позволяет пройти первый тест, и теперь мы можем написать наш второй».

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

«Это терпит неудачу, поэтому мы возвращаемся computeи модифицируем его».

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

«Теперь оба теста пройдены, и пришло время перейти к некраевым случаям».

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

«Все три теста пройдены сейчас, за исключением того, что результат не выглядит правильным для больших длин, таких как 100. Чтобы получить эти результаты правильно, мы должны были использовать библиотеку произвольной точности . Есть также вещи для улучшения. Например, соглашения об именах иногда слишком плохие (что fib?). Связанный с HTML код JavaScript должен также идти к другому объекту, а также к тестированию кода. Кроме того, я не проверял compute(0)и не проверял входные данные ».

Вывод

Проходя по примеру, вы можете увидеть взаимодействие, ожидаемое во время интервью. Не все было гладко (вначале я сделал несколько ошибок, которые привели меня в неловкую ситуацию, когда при запуске приложения ничего не происходит), и оригинальный подход был неудачным, если мы должны поддерживать большую длину последовательности, но я достиг показать что:

  • Я могу справиться с разными проблемами,
  • Я использую тестовую разработку, последовательность Фибоначчи является отличной возможностью для этого,
  • Я копирую и вставляю код, когда источник заслуживает доверия, и написание его с нуля кажется чрезвычайно сложным и подверженным ошибкам,
  • Я не слишком полагаюсь на библиотеки, такие как JQuery,
  • Я выбрал правильную область: поскольку интервьюер хочет проверить свои навыки JavaScript, я не буду тратить время на написание идеального и чистого HTML: отсутствие здесь времени дает больше времени на написание юнит-тестов,
  • Я знаю, когда закончить и сказать, что все готово, помня, что куча вещей не идеальна (например, compute(0)что не получится, но для демо это не имеет значения).

Это именно то, что интервьюер должен ожидать от вас.

Арсений Мурзенко
источник