Питальник і рубрика складені спеціально під вашу роль.
Сильний кандидат. Тримає і продукт, і техніку: пояснює, чому обрав рішення, а не лише що зробив. Єдина просадка — робота з даними під навантаженням, але помилку побачив сам і виправив у розмові.
Розкажіть про останній проєкт: для кого він, що там було вашою частиною і як ви розуміли, що вийшло.
Почав не з технологій, а з користувача і з цифри, яку рухали. Свою частину відділив від командної без прикрашань: сказав, де тільки допомагав.
Список із фільтрами і пагінацією. Що тримаєте в стані компонента, що в URL, що на сервері?
Фільтри поклав в URL, щоб посилання можна було переслати — назвав це першою причиною, а не наслідком. Серверні дані й локальний стан форми тримає окремо.
Запит на сервер упав. Що бачить користувач?
Розвів помилки за змістом, а не за кодом: 400 — показати, що саме не так у полі; 401 — тихо відправити на логін і зберегти введене; обрив мережі — залишити дані у формі й дати повтор.
Масив записів: згрупувати за полем і порахувати кількість у кожній групі. 8 хвилин у спільному редакторі.
Перша версія: зібрав унікальні значення поля і по кожному ще раз пройшовся масивом. Працює, але це окремий прохід на кожну групу — обидві версії коду нижче на сторінці.
Після питання про обсяг побачив проблему сам, без підказки в бік конкретного методу, і переписав на один прохід з накопиченням в обʼєкт.
Порожній масив згадав сам; запис без потрібного поля обробив після нагадування.
«А, ну да… якщо їх сто тисяч, то я по масиву ходжу стільки разів, скільки груп. Тупо виходить.»
33:15 · кандидатБаг, який відтворюється тільки в продакшені і тільки в частини користувачів. Ваші перші кроки?
Не пішов одразу в код: спершу знайти, що спільного в тих користувачів, і звузити до релізу. Згадав, що варто спитати підтримку, а не тільки дивитись логи.
Вам кажуть: «конверсія в онбордингу низька, зроби щось». З чого починаєте?
Першим питанням пішов у дані: на якому кроці люди відвалюються. Тільки після цього говорив про інтерфейс — і сам сказав, що тиждень верстки без цієї цифри може нічого не змінити.
Тримає структуру: спочатку відповідь, потім обґрунтування. Двічі сказав «не знаю» і одразу додав, як перевірив би — це рідше, ніж здається.
Нижче планки не впав жоден вимір; найближче до межі — код.
Проєкт і фундамент — сильні: говорить про користувача й цифри, помилки сервера розводить за змістом. Гіпотеза після першої третини — рівень вищий за junior.
Редактор показав межу — тому за код 3. Далі гіпотеза підтвердилась: дебаг починає з відтворення, нечітку задачу зводить до одного експерименту. Середній бал — 4.3.
Згрупувати записи і порахувати кількість — 8 хвилин у спільному редакторі.
const roles = [...new Set(users.map(u => u.role))];
const grouped = {};
for (const role of roles) {
grouped[role] = users.filter(u => u.role === role).length;
}Працює. А якщо тут не десять записів, а сто тисяч?
Ну… воно все одно порахує. Просто… а, ну да. Я ж для кожної ролі ще раз по всьому масиву проходжу.
Тупо виходить. Давайте я один раз пройду і буду складати в обʼєкт.
const grouped = {};
for (const user of users) {
const role = user.role ?? "unknown";
grouped[role] = (grouped[role] ?? 0) + 1;
}Тепер один прохід, скільки б записів не було. А якщо в когось поля немає — кладу його в unknown, щоб запис не загубився.
Чотири теми, які лишились відкритими після інтервʼю. Нижче — що має прозвучати у відповіді, щоб вимір закрився на 5.
Користувач змінив один запис у списку. Які запити перезапитуєш, а які лишаєш, і чому?
Таблиця на 200 тисяч рядків з фільтром і сортуванням. З чого почнеш?
Клієнт бачить помилку, у консолі й у логах чисто. Куди дивишся далі?
Відкрий свій репозиторій і проведи по одному рішенню: чому саме так.
Рішення про найм — за вами. Звіт — перший фільтр: на кого варто витрачати час команди далі.
Чому однакові питання дають точніший висновок, ніж вільна розмова — про метод.
По кожному — такий самий звіт. Питання й рубрика одні, тому цифри можна порівнювати. Кандидат A з цього звіту — перший рядок.