Я дуже добре знаю JavaScript, але інтерпретую кодування бомби [закрито]


33

Тож я зараз шукаю нову посаду як розробника Front-End. Я дуже добре знаю JavaScript і можу поетично висловлюватись про закриття, каррінг, прототипічне успадкування, шаблони дизайну, ефективність додатків та загальну архітектуру Front-End. Але все ж я все-таки закінчую бомбардування співбесіди. (Більшість фінансових справ, які я беру на співбесіду, стосуються побудови SPA з якоюсь основою MVC)

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

Це серйозний набір навичок, якого мені бракує, або інтерв'юери задають мені нерелевантні запитання. Я думаю, я повинен працювати над своїм функціональним програмуванням та відбитками алгоритмів, але в Інтернеті (або в друкованих версіях) я не знайшов багато корисних пропозицій?


4
Спробуйте Project Euler для деяких зразків.
Пітер К.

11
І отримаєте комплект телефону для вільних рук?
AakashM

Чому ви робите тест на кодування на своєму телефоні? Чи очікується, що ви працюєте таким чином, коли отримаєте роботу?
Бурхан Алі

2
@BurhanAli, телефон призначений для розмови, і це стандартно для 1-го етапу співбесіди.
greenoldman

3
Так, я думаю, що деякі тести на сцени сьогодні є повним глупотою. Особливо я зневажаю тести «додому», де вони говорять, що щось можна зробити за годину, але насправді це знадобиться півдня або довше, щоб зробити це правильно. Я відмовляюся робити це прямо. Ти справді за примхою інтерв'юера. Деякі з них придумують хороші тести, які оцінюють навички реального світу. Інші інтерв'юери не знають, що на біса вони роблять, і мають свої особисті програми та невпевненість у собі.
Рінго

Відповіді:


52

Написання коду - лише частина інтерв'ю.

Власне вирішення логічної задачі є лише частиною завдання написання коду.

Інтерв'юери хочуть бути впевненими, що:

  • Ви можете написати код. Багато кандидатів з десятирічним професійним досвідом мовою взагалі не можуть написати жодного коду, і цей тест призначений для відхилення цих кандидатів.

  • Ви думаєте про проблему, перш ніж писати код. Багато хто стрибне до своїх клавіатур, напише десятки рядків коду, а потім виявить, що вони неправильно зрозуміли первісну проблему, бо не забирали часу на роздуми над нею.

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

Це також означає, що такі інтерв’ю повинні бути більш інтерактивними . Замість того, щоб вводити однією рукою, придбайте гарнітур або зателефонуйте через 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));

Висновок

Хитрі запитання пропонують хитрі відповіді. Не будьте героїчними, і не починайте тестування та профілювання, коли у вас є лише три хвилини. Подумайте про розумні способи вирішення проблеми, використовуючи свій досвід. Мій досвід дає мені підказку, що використання карти може бути швидшим, ніж обчислення числа. Це може бути неправильним, але слід намагатися очікувати цієї спроби, враховуючи часові обмеження.

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

Пам’ятайте, хороший розробник - це не той, хто починає кодування відразу, але хто знає, як уникнути кодування, коли є краща можливість. Деякі інтерв'юери не соромляться дати вам завдання, схожі на кодування, але які майже не потребують коду.

Приклад 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-код, пов'язаний з HTML, також повинен переходити до іншого об'єкта, а також код тестування. Крім того, я не перевіряв compute(0)і не перевіряв вхідні дані ».

Висновок

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

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

Саме цього слід очікувати від вас інтерв'юера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.