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

Итак, я в настоящее время занимаюсь поиском новой должности в качестве разработчика Front-End. Я очень хорошо разбираюсь в JavaScript и могу поэтически поэкспериментировать о Closures, Currying, Prototypal Inheritance, Design Patterns, производительности приложений и общей архитектуре Front-End. Но все же я все еще заканчиваю интервью с бомбардировками. (FYI большинство рабочих мест, с которыми я веду собеседование, предназначены для создания SPA с какой-то структурой MVC)

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

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

30 голосов | спросил Mike Fisher 25 J000000Friday14 2014, 11:21:21

1 ответ


48

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

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

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

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

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

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

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

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

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

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

  

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

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

Пример: 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. Последовательность Fibonacci следует этим правилам:

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

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

     

У вас есть три минуты.

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

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

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

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

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

Заключение

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

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

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

Пример 3: полное приложение разработка

  

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

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

Пример: 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), который не удастся, но это не имеет значения для демонстрации).

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

ответил Arseni Mourzenko 25 J000000Friday14 2014, 12:43:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132