Тестові і лайв-кодинг для Java-інженерів: приклади завдань від IT-компаній

Які тестові завдання дають Java-інженерам для перевірки технічних навичок? Ми отримали приклади тестових від IT-компаній і попросили їх розповісти, чим відрізняються перевірки Junior-кандидатів від тестових Middle і Senior. І ще — про те, де більше шансів потрапити на онлайн-кодинг і чому варто звернути увагу на Java Stream API та багатопотоковість.

«У наших завданнях немає навмисних пасток»

Олександр Сутягін, Senior Java Software Engineer в N-iX

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

Я маю п’ять завдань на знання Java Stream API. Для Junior достатньо розв’язати три. Четверте — це вже із зірочкою. Якщо розв’яже, великий молодець. Middle має завершити всі п’ять задач, а Senior запропонувати ще й альтернативні варіанти розв’язку. З Senior можна поспілкуватись про те, що буде ефективніше за використанням пам’яті та швидкодією.

package com.company;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.function.Function;

import java.util.stream.Collectors;

public class InterviewTest {

    public static void main(String[] args) {

        Student studentFirst = new Student(1, "John", List.of("Math", "History", "Ukrainian"));

        Student studentSecond = new Student(2, "Albert", List.of("Math", "English", "Astronomy"));

        List<Student> students = List.of(studentFirst, studentSecond);

        List<Integer> studentIds = List.of(1, 5);

        //1. Знайти студентів зі списку students, які мають id зі списку studentIds

        List<Student> filteredStudents = students.stream().filter(student -> studentIds.contains(student.id)).toList();

        //2. Знайти унікальні предмети, які вивчають студенти зі списку students

        List<String> uniqueSubjects = students.stream().flatMap(student -> student.subjects.stream()).distinct().toList();

        //3. Створити мапу, де ключ - це id студента, а значення - об'єкт студента зі списку students

        Map<Integer, Student> studentsById = students.stream().collect(Collectors.toMap(Student::id, Function.identity()));

        //4. Відсортувати студентів за предметами відповідно до наведеного списку

        List<String> subjects = List.of("Math", "English", "History", "Ukrainian", "Astronomy");

        // Варіант рішення через лямбди

        List<Student> list = students.stream().sorted((student1, student2) ->

                        Integer.compare(

                                student1.subjects.stream().mapToInt(o -> subjects.size() - subjects.indexOf(o)).sum(),

                                student2.subjects.stream().mapToInt(o -> subjects.size() - subjects.indexOf(o)).sum()))

                .toList();

        // Варіант рішення через мапу

        Map<String, Integer> subjectPriority = new HashMap<>();

        for (int i = 0; i < subjects.size(); i++) {

            subjectPriority.put(subjects.get(i), i);

        }

        List<Student> sortedStudents = students.stream()

                .sorted((student1, student2) -> {

                    int priority1 = student1.subjects.stream().mapToInt(subjectPriority::get).sum();

                    int priority2 = student2.subjects.stream().mapToInt(subjectPriority::get).sum();

                    return Integer.compare(priority1, priority2);

                })

                .toList();

        System.out.println(list);

        System.out.println(sortedStudents);

    }

    private record Student(Integer id, String name, List<String> subjects) {

    }

}

Візьмемо завдання на фільтрацію. Насамперед я звертаю увагу на те, як кандидат створює об’єкти. Цікаво, як називає змінні. Як робить списки. Це залежить від версії Java, і використання новіших методів буде плюсом. Дуже важливо, як людина розуміє задачу. В наших завданнях немає навмисних пасток, але інколи кандидат починає писати код раніше, ніж зрозуміє, що від нього очікують.

Завжди уточнюю, що це завдання на стрими і його не потрібно розв’язувати через цикли. Є люди, які не знають стримів, і це можуть бути навіть сеньйори. Вони використовували старішу версію Java, де стримів не було. Але ця версія була актуальною років 15 тому, і без знання Java Stream API я не можу вважати людину навіть джуном. З іншого боку, кандидату можна пробачити, якщо він не пам’ятає окремих функцій. Можливо, код він писав давно, а займався архітектурою.

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

«Якщо дуже суворо оцінювати лайв-кодинг, то нікого не наймеш»

Володимир Балицький, Senior Java Developer в Intellias

Я майже не практикую домашніх завдань. За весь досвід проведення співбесід був лише один проєкт, де давали домашні. Це був Android-застосунок, і від потенційного учасника команди очікували знання Clean Architecture. Ми давали тиждень на виконання. На жаль, це домашнє завдання не дало хороших результатів. Були кандидати, які виконали все ідеально, покрили код тестами, а на співбесіді не впоралися з технічною частиною.

Senior не буде робити домашнє, тому що він цінує свій час

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

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

Задачу, яку ви побачите далі, я придумав сам, тому її неможливо ніде знайти. Вона допомагає перевірити як алгоритмічну базу, так і знання багатопотоковості в Java. Я не ставлю обмежень на фреймворки і бібліотеки. Задача має багато варіантів розв’язку. Її можна розв’язати навіть в 3-4 рядки за допомогою CompletionService. Абсолютно нормально, якщо кандидат про це не знає. Але є люди, які загалом відмовляються міркувати над цим, а є ті, хто ставить запитання та пропонує варіанти розв’язку.

Задача:

Є великий набір даних (файл, окремий рядок, окремі параметри запиту), які ми відправляємо до вебсервісу. Ми знаємо, що вебсервіс буде повертати відповідь зі статусом 200, але з певного моменту він почне повертати 404. Нам потрібно зберігати результати тих запитів, доки відповідь від сервісу 200, і припинити процес відправки, щойно починають надходити відповіді 404. Запити потрібно робити паралельно, щоб пришвидшити процес, оскільки обсяг досить великий, зупинити весь процес потрібно коректно. Цікавлять альтернативні шляхи вирішення такого завдання.

Лайв-кодинг для кандидата може бути стресовим. Якщо дуже суворо його оцінювати, то нікого не наймеш. Хіба що кандидат займався спортивним програмуванням.

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

В Європі задачі різного ступеню складності давали завжди. Одного разу в нідерландському стартапі мені запропонували задачу, розв’язати яку було нереально, і вона жодним чином не перегукувалася з роботою. Не знаю, яку ціль вони переслідували, даючи таке тестове.

«Відмовляли й тому, що не було тестів»

Іван Маглатій, Engineering Manager в Avenga

У нашій команді джавістів ми не фанатіємо від тестових завдань, зокрема лайв-кодингу. Нам цікавіше поспілкуватися з кандидатами про їхні попередні проєкти та завдання.

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

Приклад завдання з системного дизайну:

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

Деталі системи. Система має монолітну архітектуру та розгорнута у власному дата-центрі (on-premises), причому база даних і застосунок містяться на одному сервері.

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

Що потрібно зробити:

— Виявити вузькі місця, що призводять до проблем з продуктивністю.

— Запропонувати конкретні рішення для підвищення стійкості до навантажень.

— Розглянути варіанти масштабування (горизонтального або вертикального).

— Забезпечити мінімальний вплив на роботу системи.

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

Приклад завдання від клієнта:

We have a coding challenge that involves processing data from a web server with multiple endpoints. The task is to develop a program that:

Reads Data from Two Sources:

— JSON Source: Emits JSON records.

— XML Source: Emits XML records.

Processes the Records:

Categorizes each record as «matched», «unmatched», or «invalid»:

— Matched: Records with matching IDs from both sources.

— Unmatched: Records without a matching ID in the other source.

— Invalid: Malformed records (these can be ignored).

Sends Results:

Sends the «matched» and «unmatched» records to the Result Endpoint.

Key Requirements:

— Concurrency: The program must read from both sources simultaneously and begin sending data before all records are received.

— Scalability: It should efficiently handle large datasets, as it will be tested with much larger volumes of data.

— Resilience: Occasionally, the endpoints may return a bad response. The program should handle this gracefully, retrying requests as necessary.

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

«Дрібні неточності чи незначні помилки переважно „пробачають“»

Богдан Сергієнко, Chief Technology Officer у Master of Code Global

Ми практикуємо домашні завдання, щоб не створювати зайвого стресу кандидату та водночас перевірити якість виконання й уважність. Зазвичай тестові даємо кандидатам на позицію джуніора або на специфічні позиції. Наприклад, Solution Delivery Manager для AI має показати розуміння AI. Коли ж практикуємо онлайн-кодинг, то радше щоб швидко подивитись напрямок думок, а не перетворювати це на змагання з програмування.

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

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

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

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

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

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

Приклад завдання

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

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

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

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



32 коментарі

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

декілька коментарів щодо запропонованих рішень до тестових завдань Олександра С.

//2. Знайти унікальні предмети, які вивчають студенти зі списку students
List uniqueSubjects — одне лише поєднання цих слів вже викликає сумнів в навичках опитуваного

//4. Відсортувати студентів за предметами відповідно до наведеного списку
// Варіант рішення через лямбди

помилка в логіці яка приводить до протилежного очікуваному результату
.mapToInt(o -> subjects.size() - subjects.indexOf(o)).sum()
індекс елемента визначається з кінця списку, хоча потрібно з початку
.mapToInt(o -> subjects.indexOf(o)).sum()

p.s. варіант рішення через лямбди і мапу видадуть обернені результати якщо задати вхідні дані з різними сумарними значеннями приорітетів.

// Варіант рішення через мапу
це рішення вірне однак можна покращити- разом із Java Streams в Сomparator додали набір дуже зручних вспоміжних методів.
наприклад, сomparator::comparing дозволяє уникнути дублювання визначення критерію сортування:

List sortedStudents = students.stream()
.sorted((student1, student2) -> {
int priority1 = student1.subjects.stream().mapToInt(subjectPriority::get).sum();
int priority2 = student2.subjects.stream().mapToInt(subjectPriority::get).sum();
return Integer.compare(priority1, priority2);
})
.toList();

List sortedStudents = students.stream()
.sorted(Comparator.comparing(student -> student.subjects.stream().mapToInt(subjectPriority::get).sum()))
.toList();

Це в Nix такі тестові? На стрім апі? Жесть яка. Мені здається важливіше розуміти структури данних, а не апі з мови для їх реалізації. Можна ж не тільки на джаві то все написати, для джуна ще ок, стрім апі питати, але сеньйора — це прям ой-ой

Особливо смішно таке питати коли ІДЕ з копайлотом це все може підказати.

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

Зібрати унікальні предмети через
.distinct().collect(toList())
замість
.collect(toSet())?
І цей пан проводить співбесіди?

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

Короче, посони, перед тим як проводити співбесіди і мучати когось своїми задачами, навчіться кодити і формулювати думку.

Зібрати унікальні предмети через
.distinct().collect(toList())
замість
.collect(toSet())?
І цей пан проводить співбесіди?

А в чому саме проблема? Дістінкт має якісь системні проблеми?
Рішення приблизно однакові.

Вони однакові чисто фунціонально, в даному конкретно випадку, але вони принципово різні по суті.

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

Розглянем ситуацію, коли автор даного тестового завдання присилає мені пул реквест де я бачу декларацію метода:

List getUniqueWhatevers(...)

Чи пропущу я такий пр? Ніт звісно! Я думаю ти чудово розумієш чому.

Тут я посперечаюся: реалізація з distinct і toList має місце бути, коли є потреба потім використати API, яке на вхід приймає все одно приймає саме List. Звичайно, у твоїй реалізації не мішає нічого викликати toList на множину, але це по перформансу буде абсолютний еквівалент, по ідіоматичності звичайно можна посперечатися, але до***тися до такого при даних умовах в ПРі більшістю девелоперів буде сприйматися як синдром вахтьора «я начальник, ти дурак». Тому навіщо вносити в свою команду додаткову токсичність?

коли є потреба потім використати API, яке на вхід приймає все одно приймає саме List.

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

ідіоматичності звичайно можна посперечатися

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

більшістю девелоперів буде сприйматися як синдром вахтьора «я начальник

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

Тому навіщо вносити в свою команду додаткову токсичність?

Тому що це не токсичність, а частина цілком логічних вимог до якості коду, який в свою чергу, результується в якість продукту, що в свою чергу, в середньо- і дальностроковій перспективі, переконує гівнокодерів в тому що this is the way, а не токсік.

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

Алгоритми і структури даних не вчора придумали і, відповідно, не дарма їх питають у фаангах)

Тобто ви не знаєте що перевіряють задачками на алгоритми у ФААНГах :)

а що перевіряють задачками на алгоритми у бігтех компаніях?

а що перевіряють задачками на алгоритми у бігтех компаніях?

Дуже жаль, що на доу немає тегу спойлер

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

І так (апд 2) проблема тут радше не технічна а психологічна, бо показує відсутність само-модерації коду. Автор дає цю задачу на публікацію. Коли він писав — він А) не подумав про те що ліст не найкращим чином відображає сет Б) не передивився свій код повторно або не знайшов власну похибку.

мені важко зосередитись на написанні коду коли хтось умовно «дивиться з-за плеча». та й взагалі я дуже роздратовуюсь коли доводиться робити будь шо в таких умовах. Але через 5 хвилин після лайвккодингу приходять прості й ефективні рішення задачі і я міг би написати її. Але потяг вже пішов. Іноді я просто сижу і в думках пишу код, скоріше псевдокод, але мені це допомогає. На лайвкодингу це сприймається що я туплю і треба якось пояснювати над чим я думаю. І це трохи збиває і все котиться коту під хвіст. Чи це говорить що я поганий кандидат?

Чи це говорить що я поганий кандидат?

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

Та без питань) Я знайду собі роботу без хоррор кодінгу.

Я знайду собі роботу без хоррор кодінгу.

Розкажіть про ваш досвід пошуку роботи цьогоріч? Скільки зайняв, скільки інтервюз з ХР, скільки технічних, скільки оферів, яка зп по квантилям доу?
Скільки пішли далі після відмови лайфкодити?

Ви ж в Україні?

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

десь півтора місяі активного пошуку, біля 7 технічних співбесід. З них 2-3 реально цікавих. без тестових та лайвкодингу.

Круто, з мого досвіду 1.5 місяці — це лише, щоб пару норм вакансій з’явились на ринку і ХР будуть роздуплятись (організовувати співбесіди). А от девелоперські позиції без лайфкодінгу не можу пригадати вже років 10 (найближче до без лайфкодінгу, що було це «написати функцію, що друкує ціле числа в строку», і це на ліда, все інтерв’ю було про менеджмент/практики і кілька хвилин по джаві оця задачка)

У мене була історія про лайвкодинг, стара правда. На одній із співбесід мене попросили накодити якийсь алгоритм простий, типу перевертання строки. а може щось трохи складніше та не суть. А я яккраз перед тим саме його дивився і кодив на хакерарнк. Тож мені було його ліньки писати знову та я й через своїх тарганів бояввся що накосячу. Тож просто чесно зіізнався що напередодні робив його і розказав як я його зробив би. Обійшлося без лайвкодингу і здається то було успішне інтерв’ю.

А от девелоперські позиції без лайфкодінгу не можу пригадати вже років 10

У тебе якийсь викривлений досвід, сорі. За весь час я стикався всього з двома випадками коли просили лайвкодінг, і то, це були найнецікавіші і / або найнеадекватніші співбесіди.

апд. зі свого боку ніколи не питав лайвкодінг. це якась дурацька суміш з карго-культа і хворобливого бажання загнати кандидата в стан стресу

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

У цьому пості багато говорять про тестові завдання, але автори скромно обходять питання оплати.
Якщо людина робила тестові завдання, тобто фактично виконувала роботу, чому вона має робити це безкоштовно? Компанія Master Of Code Global настільки бідна, що не може сплатити за кілька годин роботи?

Якщо людина робила тестові завдання, тобто фактично виконувала роботу, чому вона має робити це безкоштовно?

Готувати резюме — це не робота? Особливо коли воно під конкретну вакансію.
Проходження співбесіди чому не має оплачуватись компанією? Там часто зустрічається «задача на дизайн», чому б не чарджити за неї як за роботу архітектора? А в деяких (зараз скоріше в багатьох) аутсорс конторах є співбесіда з клієнтом, чому кандидат має безкоштовно заробляти репутацію конторі?
Ідея з оплатою тестового не нова. Для фрілансерів вона має сенс, бо це просто погодинка, але тут вона замінює випробувальний термін, а не етап інтерв’ю. Для звичайного найму розмови про оплату ДЗ — це просто пасивно-агресивний сигнал, що кандидат негативно ставиться до тестових, але має занадто низькі софт скіли, щоб про це сказати відкрито

Є люди, які не знають стримів, і це можуть бути навіть сеньйори. Вони використовували старішу версію Java, де стримів не було.

Насилу віриться, що в 2024 є люди, які не знають Stream API (Java 8), тобто вони досі працюють на Java 7 або старіших версіях

4. Відсортувати студентів за предметами відповідно до наведеного списку

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

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

Пару раз на собеседованиях выполнял задачку по лайв-кодингу так, что код работал (тесты выполнялись правильно). Но оказывалось, что клиент хотел видеть не просто выполненую задачу, а «задачу, выполненую именно тем способом, которым хотел клиент».
С тех пор лайв-кодить отказываюсь

«задачу, выполненую именно тем способом, которым хотел клиент».

Оце дуже важлива і типова помилка інтерв’юерів (або недосвідчених, або тих хто не хоче розвиватись), щоправда вона частіше зустрічається не при лайфкодінгу, а з тестовими.
Люди вкладають душу в завдання і вимальовують собі ідеальний сценарій того як воно має працювати. Кандидат на якомусь етапі, іноді на першому, робить щось не так як нафантазував інтерв’юер і далі все йде не по плану. Ну і звісно є інтерв’юер не може визнати, що він налажав, а бачить проблему в кандидатові.

Як казав один знайомий:
Ми плануємо не для того, щоб все відбулось відповідно до плану, а для того, щоб знати, о робити, коли все піде не по плану.

UPD.

задачку по лайв-кодингу та

Можете дати більше деталей? Бо по лайфкодінгу мені приходить в голову лише сценарій типу «ви зробили рекурсію, а хотіли імплементацію через стек»

Не помню уже — это давно было. Что-то про сортировку массива и еще что-то

Обожнюю.
«Завдання маленьке, 2-3 години максимум. Але треба, щоб код був красивий, відпрацьовували всі едж кейси і тести були написані»

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