Історія одного тестового завдання

Глава відділу розробки Ecwid Василь Васильків написав про те, як кандидати роблять тестові завдання і що з цього виходить. Вийшло забавно. Публікуємо замітку слово в слово.

***

Я розповім історію одного тестового завдання. Трохи довгу, але, сподіваюся, цікаву.

У нас в Ecwid всі тестові завдання для інженерів відкрито викладені на GitHub ось тут — github.com/Ecwid/new-job. Можна просто почати робити будь-яку вподобану завдання, нікого не попереджаючи, а потім, коли самі будете задоволені результатом, поділитися ним зі мною.

Одне з перших завдань, що я придумав, був консольний качальщик файлів по HTTP. Воно дуже просте і вигадував я його саме з такою думкою. Нехай, міркував я, поки таке просте повисить, а потім-то я, звичайно, додам круті завдання. Потім-то я ого-го що вигадаю! Такі круті тестові викладу, що всі ахнуть і негайно побіжать їх робити, а цей примітивний качальщик я куди-небудь запрячу і нікому більше не буду показувати. Якось так я тоді думав.

Качальщик потрібно зробити дійсно дуже примітивний. Судіть самі — ти йому список посилань в текстовому файлі, а він завантажує ці файли і кладе в зазначену папку на локальному диску. Повинен вміти качати кілька файлів одночасно (в декілька потоків, наприклад, 3 потоку) і витримувати зазначене обмеження на швидкість завантаження, наприклад, 500 кілобайт в секунду. Всі.

Для роботи з HTTP не треба нічого винаходити, можна взяти будь-яку бібліотеку. Для обмеження швидкості — бібліотеку. Для завантаження в декількох потоків навіть бібліотеку не треба — все є в стандартній бібліотеці Java. Можна, звичайно, все це винайти і самостійно написати на коліні, але не обов'язково. Фактично, треба взяти кілька «кубиків» і акуратно скласти їх в правильну фігуру, застосувавши трохи программизма.

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

Не дивно, що це завдання, саме просте і зрозуміле, що робить більшість кандидатів. За минулі роки це тестове настільки збагатило мене новим досвідом, що я вже не зможу списати її в архів, замінивши на більш круті і модні завдання.

Якщо зараз мені пришлють ще 100 консольних качальщиков, я з упевненістю можу сказати, що саме там не буде працювати:
— Частина надісланих робіт просто не буде компілюватися. Так, роботи будуть на компилируемых мовах Java/Kotlin, але компілюватися не будуть. Локальна IT-різновид корпускулярно-хвильового дуалізму, я так розумію цей феномен. Я, звичайно, трохи знайомий з мовами на яких прошу зробити тестове і без гордині особисто дописую ті шматки, що кандидат мав на увазі, але не написав, залишивши мені можливість для творчості. Зазвичай це найцікавіші роботи. Приємно, що кандидат серйозно ставиться до майбутнього місця роботи і не тільки дає можливість вам перевірити його знання, але і, у свою чергу, перевіряє ваші.

— Частина надісланих робіт буде витримувати швидкість скачки з дуже широким розкидом від бажаного. Наприклад, ви хочете завантажувати зі швидкістю 300KB/s, а програма викачує близько 2MB/s. Різниця всього в шість разів, але зате суворо 2 мегабайти в секунду і не більше. Як сказав один кандидат — «швидкість витримується в деякому інтервалі туди-сюди». Мені дуже сподобалося і про «деякий інтервал» і про «туди-сюди». Тепер і сам намагаюся використовувати цей оборот як можна частіше — «Ми зробимо цю фічу за двадцять днів, п'ять днів туди-сюди».

— Паралельна завантаження. З одного боку, я часто думаю прибрати цю вимогу, тому що за нього можна вгадувати вік кандидата, а я цього робити не люблю. Якщо вам приходить лист з питанням «В кілька потоків це як ReGet?», то ти відразу розумієш, що кандидат навряд чи сильно молодше тебе і пам'ятає часи модемів. Я ось теж пам'ятаю всі ці нескінченні ReGet, FlashGet, Download Master і інші милі серцю інтернет-приблуди кінця дев'яностих-початку двохтисячних. Ні, качати треба не один файл в декілька потоків, а тупо декілька файлів одночасно.

Проте, з іншого боку, ця вимога дає невичерпне джерело задоволення при перевірці завдань:

* Наприклад, я хочу качати в 3 потоки, а програма качає в 4. Я ставлю 5 потоків — програма качає в 6. WTF? Як тут можна зробити баг? Йду в исходники і знаходжу коментар «Збільшимо вказану користувачем кількість потоків на один, щоб хиталося ще швидше». Хрін посперечаєшся.

* Інший приклад — кандидат пише «Програма вміє завантажувати файли N потоків, однак випадки N більше одного поки не підтримуються». Фраза прекрасна вся до останньої крапки. Читаючи витирав піт вушанкою, дивувався людської спритності, згадував анекдот про математика і камерний оркестр.

Нескінченну кількість просто цікавих неординарних рішень від людей:

* Як вам, наприклад, таке рішення — завдання просто з'ясовувало файли якого розміру з якою швидкістю треба скачати, ділило розмір на швидкість і засипало на отримане кількість секунд. Я навіть, десь глибоко в душі, знаходжу це рішення логічним — програма повинна працювати NN секунд, вона і працює, що ви докопалися?! Мабуть, кандидат не очікував, що перевіряючий просто візьме і подивиться (яка підступність!), що ж програма за фактом накачала. Дуже хитре рішення, дуже.

* А ось ще, мабуть, дуже дурна людина, який надіслав один клас з порожньою main-функцією (і більше нічого) і пояснив Ось як-то в такому стилі я планую робити це завдання. Сподіваюся, моя думка вже зрозуміла?».
Я доклав серйозні зусилля розглядаючи цей файл на п'ять рядків, але, так і не домігшись від файлу ясності, попросив кандидата розгорнути думку ширше. Чекаю другий рік, не втрачаючи, однак, надії.

* Пам'ятаю прекрасної людини, який написав, що скачування файлів по HTTP, це зовсім просте завдання і чи можна йому його не робити? Я відповів у тому дусі, що, звичайно, можна не робити і ми розлучилися друзями. Більше я його не чув і не бачив. Людина просто запитав мене листом, чи можна йому чогось не робити, я, зі свого боку, не знайшов у собі сил заборонити йому цього. Всі. Сподіваюся, моя відповідь допоміг людині досягти нірвани і він нічого не робить і досі.

* Чудовий кандидат, який сказав, що Java він не знає і чи можна зробити завдання на Go? Я сказав у тому розумінні, що «хрін з ним, давайте на Go», на що отримав відповідь — «відмінно, Go я теж не знаю, ось вивчу і зроблю»! Скажу чесно — я пишаюся знайомством (нехай і шапковим) з такою завзятою людиною.

Самий цікавий випадок стався зі мною в Пензі (SECON, привіт!) вночі на вулиці після after-party. Ніч, вулиця, людей майже немає, я стою і чекаю таксі, щоб поїхати в готель. Раптово звідкись із темряви до мене підходить людина і каже: «Василю, я намагався влаштуватися в Ecwid, ви мені відмовили і з тих пір я дуже хочу з вами зустрітися особисто!!».

Важко переказати, які думки пронеслися у мене в голові за ці секунди. Чувак, якщо ти читаєш ці рядки — дякую за досвід, до мене ніхто ще не підбігав в ночі з такими двозначними формулюваннями.

Я, власне, хотів сказати цією несерйозною історією дві серйозні речі:

1) Шановні кандидати. Вас губить небажання викинути зроблену роботу і почати спочатку. Наприклад, ви почали робити завдання, а наприкінці раптом з'ясували, що забули прикрутити багатопоточність. Ви в паніці починаєте вставляти concurrency-милиці в код, не призначений для цього. Не треба так робити. Самий вірний спосіб — викинути все написане і написати з нуля з урахуванням пропущених вимог. Серйозно. Це не production-код, тут не місце милиць.

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

Ecwid завжди в пошуку розробників. Прямо зараз теж. У нас НЕ великий-legacy проект, географічно розподілені кластера, серйозні навантаження, розумна команда і висока відповідальність. Загалом, непросто, але цікаво. Основний стік — Java/Kotlin, але так само дуже потрібні фахівці з ReactNative.

Шукаємо розробників практично будь-якого рівня від junior і вище (Ульяновськ, Самара). Не треба соромитися, не треба думати «підійду я?», треба просто робити тестове завдання або якщо хочеться, спочатку поговорити зі мною, а вже потім робити тестове. А може робити тестове і не доведеться, це дивлячись як поговорити.

Наш стек у вигляді незрозумілих слів і абревіатур — Java, Kotlin, PostgreSQL, Cassandra, Redis, AWS, Consul, Docker, microservices. Ну і ще багато всякого.

З усіх питань пишіть в коментарях або на join@ecwid.com
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.