Тестові завдання для фронтенд-розробників: приклади з українських компаній

Фронтенд зараз є найбільш конкурентним напрямом на українському IT-ринку: за даними DOU, на одну позицію претендує в середньому 100 кандидатів. При цьому кількість вакансій тримається на рівні 200-250 на місяць (тоді як у 2021 році йшлося про тисячу).

Одна з можливостей проявити себе і продемонструвати експертизу роботодавцю — це виконання тестового. Тож редакція DOU поспілкувалася з українськими компаніями, які наймають Front-end спеціалістів, і отримала приклади реальних тестових завдань для різних рівнів. А також розпитала, на що роботодавці звертають увагу, оцінюючи виконані проєкти, і якими бувають причини відмов.

Приклади тестових завдань

ZONE3000

У нашому проєкті тестові завдання стосуються насамперед TypeScript. Оскільки ми розробляємо бібліотеки компонентів, важливо, щоб людина вміла експресивно описати API.

Кандидат має описати тип для пропсів компонента. Якщо variant = uncontrolled, то onChange — обов’язкова пропсу, а value — заборонена. І навпаки, якщо variant = controlled, то value — обов’язкова, а onChange — заборонена. Користувач компонента повинен розуміти, що якщо він передав variant = controlled, то він має передати value, а не onChange, і отримати відповідну помилку на це.

import * as React from "react";
// Describe props for this component
type Controlled = {
  variant: 'controlled';
  onChange: () => void;
};

type Uncontrolled = {
  variant: 'uncontrolled';
  value: string;
};

type Props = Controlled | Uncontrolled;
export const Textfield = (props: Props) => {
  if (props.variant === "controlled") {
    return <input type="text" onChange={props.onChange} />;
  }
  if (props.variant === "uncontrolled") {
    return <input type="text" value={props.value} />;
  }
};

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

Ми дозволяємо кандидатам скористатися гуглом, але потрібно дати доступ до екрана. Дивлячись на те, як спеціаліст гуглить, ми розуміємо, як він мислить.

Більшість фронтенд-розробників уже працювали з TypeScript, і наша мета не в тому, щоб перевірити знання мови програмування, а побачити, як кандидат розв’язує задачі, з якими він, найімовірніше, не стикався раніше. Одного разу ми співбесідували спеціаліста з багатьма роками досвіду. Він не знав, як розв’язати задачу, і ми дозволили йому погуглити. Утім він дуже швидко здався. На цьому інтерв’ю закінчилося.

На нашому проєкті задачі такі, що потрібна наполегливість у пошуку рішень. Ми не шукаємо рокстарів і розуміємо, що мало хто працював з бібліотекою 40 годин на тиждень. Але нам важливо, щоб людина підсилювала команду, а не навпаки.

Genesis (HOLYWATER)

🟢Тестове завдання рівня Junior

Завдання — реалізувати застосунок «Календар подій», використовуючи бібліотеку React.

Новий користувач заходить у застосунок і бачить сторінку, яка складається з:

  • кнопки відкриття форми та створення події (лівий верхній кут на референсі);
  • фільтру за датою. За замовчанням обрано поточний місяць;
  • сітки календаря обраного у фільтрі місяця, яка складається з днів (комірок).

Комірка містить:

  • номер дня місяця (1, 2, 3);
  • день тижня;
  • список подій.

Комірка нинішнього дня має бути візуально виділена.

Референс сторінки:

Вимоги до фільтру за датою:

  • Місяці мають перемикатися кнопками «<» і «>».
  • Кнопка календаря відкриває date picker, де є можливість обрати рік і місяць.

Створення події:

  • Клік на створення події.
  • Відкривається незаповнена форма, яка складається з трьох полів:
    • Title (required)
    • Description
    • Date (required), Time (optional)
  • Форму можливо закрити кліком у будь-яку зону поза формою або хрестиком.
  • Кнопка Save зберігає та закриває форму. Кнопка має бути неактивною, доки обовʼязкові поля не будуть введені.

Референс форми створення події:

Редагування/видалення подій:

  • Клік на подію відкриває заповнену форму в режимі редагування.
  • Кнопка Save оновлює подію та закриває форму.

Умови:

  • Не використовуйте готові календарі.
  • Застосунок зберігає стан фільтрів після перезавантаження сторінки.
  • Застосунок використовує localStorage як сховище даних.
  • Застосунок може візуально відрізнятися від наведених референсів.
  • Форма створення події має відкриватися не лише натисканням на кнопку, а також при кліку на комірку дня в календарі. Поле Date у такому випадку має бути заповнено автоматично.

🟡Тестове завдання рівня Middle

Застосунок — Quiz. Необхідно реалізувати, використовуючи бібліотеку React. Посилання на дизайн.

Summary

Користувач застосунку має змогу обрати зручну для себе мову на початку проходження вікторини, відповісти на запитання та ввести свій email. Після завершення вікторини, є можливість завантажити csv-файл з відповідями та пройти квіз ще раз.

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

Вікторина продовжується тією мовою, яку обрав юзер. Всі екрани мають бути локалізовані (quiz, loader, email, thank-you).

  • Доступні локалізації: English, French, German, Spanish.
  • Приклад локалізованого запитання (French):

Сторінка вікторини складається з:

  • Поточного запитання (single-select / multiple-select / bubble etc.)
  • При кліку на відповідь додається анімація, юзер переходить до наступного запитання.
  • Header, який містить:
    • Progress bar
    • Номер поточного запитання
    • Кнопку для повернення на попереднє запитання

Після завершення вікторини, показується лоадер від 0 до 100%. Час завантаження лоадера — 5 секунд.

Юзер переходить до введення email.

  • Кнопка «Next» має бути недоступна при некоректному/пустому email;
  • Email має валідуватися. При некоректному введенні треба показувати текстову помилку та змінювати колір поля введення. Приклад:

Після успішного введення пошти, юзер потрапляє на екран Thank-you.

Кнопка «Retake quiz» дозволяє пройти вікторину ще раз. Користувача направляє на перше запитання, всі його дані та відповіді мають очиститись.

Кнопка «Download my answers» дозволяє завантажити csv файл. Файл містить інформацію про відповіді юзера та складається з 4 колонок:

  1. order — номер запитання;
  2. title — текст запитання;
  3. type — тип запитання;
  4. answer — відповідь юзера;

Приклад csv файлу:

Виконане завдання необхідно відправити посиланням на GitHub з відкритим доступом.

🔴Тестове завдання рівня Senior

Завдання 1

Застосунок — Quiz. Треба реалізувати його, використовуючи бібліотеку React.

Summary

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

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

Вікторина продовжується тією мовою, яку обрав користувач. Всі екрани мають бути локалізовані (quiz, loader, email, thank-you).

  • Доступні локалізації: English, French, German, Spanish.
  • Приклад локалізованого запитання (French):

Сторінка вікторини складається із запитання (single-select / multiple-select / bubble etc.). При натисканні на відповідь додається анімація, користувач переходить до наступного запитання:

Header повинен містити:

  • progress bar;
  • номер запитання;
  • кнопку для повернення на попереднє запитання.

Після завершення вікторини показується лоадер від 0 до 100%.

  • Час завантаження лоадера — 8 секунд.
  • Лоадер має симулювати завантаження даних із сервера, зупиняючись на певних відсотках (наприклад, 25%, 50%, 75%) на кілька мілісекунд, щоб створити відчуття реального процесу завантаження.
  • Лоадер повинен показувати динамічний контент, такий як випадкові цитати, поради або факти, що змінюються під час завантаження. Це зробить процес очікування цікавішим для користувача.

Користувач переходить до введення імейлу.

  • Кнопка «Next» має бути недоступна при некоректному/порожньому імейлі.
  • Треба реалізувати функцію debounce на чистому JavaScript, не використовуючи сторонні бібліотеки.
  • Функція має викликати перевірку імейлу після затримки (наприклад, 300 мс) з моменту останнього введення символу.
  • Валідація імейлу: у разі некоректного введення скриньки рамка поля повинна змінювати колір на червоний, а під полем має з’являтися текстова помилка.

Приклад:

Після успішного введення скриньки користувач потрапляє на екран Thank-you.

Кнопка Retake quiz дає змогу пройти вікторину ще раз. Користувача скеровує на перше запитання, всі його дані та відповіді мають очиститись.

Кнопка Download my answers дає змогу завантажити CSV-файл. Файл містить інформацію про відповіді користувача та складається з чотирьох колонок:

  • order — номер запитання;
  • title — текст запитання;
  • type — тип запитання;
  • answer — відповідь користувача.
  • Завдання 2

    Після завершення розробки основної функціональності застосунку треба проаналізувати продуктивність і покращити швидкість його завантаження і загальний UX.
    • Використати інструменти аналізу продуктивності (наприклад, Google Lighthouse).
    • Реалізувати розділення коду (code splitting) для зменшення розміру основного бандлу і прискорення завантаження сторінок.
    • Оптимізувати роботу з даними, використовуючи memoization і хуки.
    • Реалізувати відкладене завантаження (lazy loading) для компонентів, які не відразу потрібні під час старту застосунку.

    Умови

    Від кандидатів рівня Senior ми очікуємо пропозиції щодо можливих продуктових поліпшень застосунку та впровадження їх у тестове завдання.
    Обовʼязковою є адаптивність інтерфейсу для різних типів пристроїв (mobile, tablet, desktop). Треба забезпечити кросбраузерну сумісність застосунку для основних браузерів (Chrome, Safari, Edge).

    Важливо, щоб список із запитаннями був винесений на конфіг і легко кастомізувався. Щоб додати ще одне запитання до вікторини, треба лише оновити конфіг (order, title, question_type тощо), а не додавати ще один компонент із запитанням.

    Буде плюсом, якщо застосунок типізований з використанням TypeScript.

    Передбачити зміну місця зберігання даних, наприклад, на REST API (з найменшими змінами в коді).

    «Додаткові бали» можна отримати за те, що квіз розгалужений (наступне запитання залежить від відповіді на попереднє). Приклад розгалуження — залежно від відповіді на запитання про вік (/quiz/3), кастомізуємо топіки на екрані /quiz/5.

  • На що ще звертають увагу компанії

    Для Junior-спеціалістів тестові завдання допомагають перевірити базові знання і навички HTML, CSS і JavaScript, а критеріями оцінки є чистота коду, спосіб розв’язання задачі та дотримання вимог. Оскільки кандидатів на вакансії Junior багато, тестові завдання пришвидшують рекрутинговий процес, зазначає Ярослава Комаренко, Global Recruitment Partner в ALLSTARSIT. У Genesis від кандидатів рівня Junior очікують уважності та реалізації завдання відповідно до вимог.

    Тестові завдання для Middle-рівня мають на меті перевірити знання фреймворків та бібліотек і здатність розв’язувати складні технічні задачі, зазначають в компанії ALLSTARSIT. Кандидати мають знати сучасні технології, використовувати патерни проєктування, а якість коду для них критичніша, ніж для Junior. У HOLYWATER від кандидатів рівня Middle очікують самостійності в ухваленні технічних рішень і гнучкого масштабованого підходу до архітектури.

    Від Senior-спеціаліста очікують експертні знання в технологіях, з якими він працює, у системному дизайні, оптимізації продуктивності, поглиблених концепціях JavaScript, глибоке розуміння CI/CD-процесів. Тестові завдання для Senior можуть перевіряти, чи зможе кандидат працювати з особливостями домену проєкту. Велику роль в ухваленні рішення відіграє вміння аргументувати свою думку і обстоювати її.

    «Для Senior-спеціалістів, — розповідає Ярослава Комаренко з ALLSTARSIT, — тестове завдання рідко є окремим етапом рекрутингового процесу. Частіше це частина технічного інтервʼю з членами проєктної команди».

    Сергій Носко, Front-end Developer в ZONE3000, вважає, що кандидати більш лояльно ставляться до тестових, які потрібно зробити під час співбесіди, ніж до тих, які дають виконати до інтерв’ю.

    У HOLYWATER під час наймання Senior-спеціалістів має значення, щоб на попередніх місцях роботи кандидат був візіонером змін і постійно вдосконалював свій продукт і навички.

    Чому компанії відмовляють після тестового

    Найчастішою причиною відмови за підсумками тестового є «недостатній рівень технічних навичок», зазначає Олексій Величко, Full Stack Developer у HOLYWATER. Втім, зауважує, що в компанії готові дати змогу доопрацювати завдання, якщо рішення кандидата не критично відрізнялось від очікувань.

    Також компанія звертає увагу на важливість дотримання домовлених дедлайнів:

    «Якщо виникають непередбачувані обставини, важливо, щоб кандидат попередив про можливу затримку або відмову виконувати завдання», — зазначає Talent Researcher з HOLYWATER Елеонора Бондаренко.

    Водночас трапляються випадки, коли кандидати не завершили тестове, але пройшли на наступний етап.

    «Ми можемо рекомендувати навіть людину, яка чогось не знала, але сподобалась особистими рисами. Навіть якщо спеціаліст не до кінця розв’язав задачу, але продемонстрував вміння шукати інформацію та рухався у правильному напрямку, це однозначно плюс», — зазначає Сергій Носко з ZONE3000.

    Як ставитеся до тестових ви? Поділіться своїми прикладами в коментарях!

    Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

    👍ПодобаєтьсяСподобалось10
    До обраногоВ обраному5
    LinkedIn



    18 коментарів

    Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.

    Знову ці повністю відірвані від реальності тестові. Все одно потім все зводиться до CRUD тасків з мінімальною кількістю логіки та використанням базових можливостей мов програмування (бо код має читатись гарно). Тільки час витрачаєте, причому обох сторін.

    Я абсолютно проти тестових завдань, якщо це не лайв кодинг під час співбесіди. Але мене дивує обурення коментаторів тут щодо складності завдань. Там же нічого складного немає!

    Але мене дивує обурення коментаторів тут щодо складності завдань. Там же нічого складного немає!

    Якщо ви про завдання «Календар подій», то для початку дайте оцінку такого проекту: за скільки ви б його зробили та за скільки б його зробив джун (тут ми розуміємо людину, що шукає першу роботу).

    ЧатГПТ оцінив 34-56 годин. По його розбивці, я б скоротив день на 4-12 годин, але в цілому згоден з такою оцінкою.

    Щодо складності, то не знаю як зараз, але «в мій час» там би вилізло багато еджкейсів з кліками на сітку для додавання події. Робота з датами — це окрема тема де можна закопатись.

    Згадалось як мені давали тестове «матчинг енджин для спрощеного ФІКС флоу, але з пітримкою апдейтів». Скоріше за все компанія хотіла поревірити роботу з колекціями і тд, тобто рішення мало бути ін-меморі на 1 машині.
    Проблема в тому, що таке рішення не має сенсу в принципі, а мінімально живе з дотриманням вимог по масштабуванню, аудиту, лейтенсі, надійності для реального проекту я якраз в той час зробив 3-6 місяців (і це типу швидко). Власне, що б показало те тестове зовсім не ясно.

    Якщо реалізовувати повноцінний реді-ту-юз календар — так. Якщо робити тільки те, що вказано у вимогах — за вечір-два можна зробити. Це ж простий лейаут із мінімумом логіки.
    Зможете показати як чат-гпт то декомпозував? Бо виглядає так, що він вам «гугл» запропонував зробити.

    Зможете показати як чат-гпт то декомпозував? Бо виглядає так, що він вам «гугл» запропонував зробити.

    Вже ні, бо відкритою версією користувався. Я ж кажу, що 4-12 я б прибрав, там окремо був сетап проекту (хоча для джуна це актуально), там ще на пошук наче багато було.
    Оце не змінює може питання:
    Дайте ви свою оцінку (розбивку і оцінку такої задачі ж сеньойр може зробити?). Ви це зробите за 2 години? Якщо ні, то джуну треба буде 4+. Якщо ваша оцінка 4-6, то джуну 8+.

    Ну так і є. Виходячи із наявних вимог я б оцінив би як 4+ годин. Фронтендом я не займаюсь роки 4 вже. Тобто по знанням я десь як джун. Це теж багато, як для тестового завдання але не по складності, а по об’єму.
    Ще раз наголошу: Я проти тестових завдань, окрім лайв кодінгу.

    У нашому проєкті тестові завдання стосуються насамперед TypeScript. Оскільки ми розробляємо бібліотеки компонентів, важливо, щоб людина вміла експресивно описати API.

    І перевіряється це запитанням «Опишіть бест практики при створенні АПІ». З вас 1000 шекелів.

    Нормальні контори, яким потрібні нормальні працівники, не дають тестові завдання. Детальніше тут dou.ua/...​signment-for-job-seekers
    До речі, з часу написання статті (30 листопада 2018) так і не зустрів жодної адекватної контори, яка б вимагала тестове, навіть на «ринку працедавця».

    Ми дозволяємо кандидатам скористатися гуглом, але потрібно дати доступ до екрана. Дивлячись на те, як спеціаліст гуглить, ми розуміємо, як він мислить.

    1) Це не тестове завдання, а лайфкодінг називається.
    2) Давати на лайфкодінг щось, що вимагає гугла — це неефективне використання часу і кандидата, і свого.
    3) Відсікається частина людей, яким не комфортно працювати коли їм дивляться через плече. Якщо у вас не парне програмування, то вам не потрібно відсікати людей за цією ознакою.

    Колись влаштовувався в одну заморську контору на посаду фронтенд-розробника. Посада без рівня, єдина вимога — досвід ФЕ мінімум 3 роки (в мене на той час трохи не дотягувало до 3).
    Проходив тестове на HackerRank. Саме завдання:

    Є стандартний хтмл документ. До нього треба додати список (ul/ol не важливо) і кніпку, і шоб при кліку на кніпку до списку додавався ліст айтем (не важливо з яким наповненням). Без використання фреймворків.
    ...
    От і все завдання. True story.
    Потім мені ще на одній зустрічі сказали, що інші кандидати взагалі писали якусь дичину.

    А тут в статті таке...

    Хаха, задача зробити календар на джуна. Та там столько еджкейсів, що ПМ з лідом будут тільки тиждень писати реквайременти.

    Іронічна)) Вимога: Спеціаліст із використання унітазу

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

    • Досвід роботи з освітленням — Необхідно впевнено вмикати світло у туалеті, щоб мінімізувати ризик «промахів». Ми очікуємо від вас досконале знання перемикачів та вміння працювати в умовах слабкого освітлення.
    • Орієнтація у просторі — Уміння точно оцінювати положення унітазу в просторі, особливо вночі. Сила координації вашого тіла буде перевірена на кожному кроці.
    • Навички прийняття рішень у стресових ситуаціях — Зволікання може призвести до неприємних наслідків. Ваша здатність швидко ухвалювати рішення визначить успіх операції.
    • Знання у сантехніці — Буде корисним знання роботи змиву води. Ми не хочемо, щоб ви розгубилися перед кнопкою з двома режимами змиву — економним та повним.
    • Етика та дотримання стандартів — Уміння використовувати туалетний папір у розумних кількостях, зберігаючи баланс між комфортом і турботою про довкілля.
    • Уміння користуватися милом і рушником — Бонусом буде розуміння того, як мити руки після завершення всіх операцій.
    • Гнучкість у непередбачених ситуаціях — Ваш досвід у вирішенні форс-мажорів, таких як «забули папір» або «закрита кришка», буде вирішальним.
    Надсилайте ваше резюме, якщо готові прийняти виклик та приєднатися до нас у боротьбі за чистоту та комфорт!

    Тестові в HOLYWATER — це ж просто проекти. Так, невеличкі, але ж це просто проекти, за які так то, гроші платять. Якщо воно оплачується — ну я ще можу зрозуміти, хоча всеодно треба сову на глобус натягувати. Аж цікаво, які терміни таких «завдань».
    Хороший спосіб, аби НЕ наймати людей)

    підтримую — якийсь сюр. Витратити від 1 до декількох днів, а потім отримати відповідь в стилі: «нам не сподобався ваш eslint/tslint конфіг, ми віддали перевагу іншому кандидату».

    І ти «дуже вмотивований» від «корисного» проекту йдеш робити наступний для компанії через дорогу

    Genesis, яким був, таким й залишився:

    Наши специалисты много работают — в среднем это 10-11 часов. Они это делают не потому, что их кто-то заставляет.

    Краще вкласти час на пошук прямого контракту, ніж вирішувати такі великі тестові для Genesis:

    На його виконання було витрачено ТИЖДЕНЬ щоденної праці по 4-5 годин.
    Наши специалисты много работают — в среднем это 10-11 часов.

    😅
    Трудоголіки помирають раніше за алкоголіків, — показало 20-річне дослідження(pubmed.ncbi.nlm.nih.gov/1585898)
    Перепрацювання на 3 години на день підвищують ризик депресій, інсульту та інфаркту на 100%. Крім того, трудоголізм не приносить жодної користі в роботі, а навпаки підвищує кількість помилок.

    Погоджуюсь, безоплатні перепрацювання шкідливі для здоров’я

    Навіть оплачувані шкідливі. Хоча якщо ви працюєте щоб це все потім вкласти в лікарню то ваше особисте діло.

    Тестове завдання рівня Junior

    Під час виконання цього завдання джун точно стане сіньором

    Ні*** собі

    Тестове завдання рівня Junior

    Підписатись на коментарі