Тестовые задания#
Первое правило тестовых заданий: не делать тестовые задания. Тестовые задания связывают вас по рукам и ногам не облагая компанию какими-либо обязательствами. Пока вы тратите выходные на бесплатную работу компания перелопачивает десятки кандидатов, а затем вы получаете шаблонный отказ. В среднем тестовые задания это потеря времени, потому что их не проверяют.
Я много раз встречал такую тактику: после отсева резюме, но до собеседований, компания сплошняком раздает тестовое задание всем кандидатам. Работает просто как галочка: собеседуют всех, кто отправил задание. Отличная проверка на мотивацию, неумение ценить свое время или отчаяние.
Если делать все тестовые задания, то в лучшем случае будет один вымученный оффер. Лучше потратить время на получение множества опций.
При этом оба моих оффера в этот поиск работы пришли через тестовые задания, и в позапрошлый поиск работы тоже. Потому что есть редкие исключения из первого правила.
В более строгом виде первое правило можно сформулировать так: не делать тестовое задание до собеседований, если оно занимает слишком много времени, если оно не интересное или если не очень хочется в эту компанию.
Иногда работает предложить вместо тестового задания разобрать ваш публично доступный проект на ту же тему. Всегда предлагайте это если тестовое задание не стоит усилий. В худшем случае вам просто скажут нет.
Тестовое задание обязательно стоит делать, когда все звезды выстроились в ряд: оно интересное, есть время и компания вам нравится.
Note
Однажды компания оплатила мне выполнение тестового задания. Но это просто фантастика, считайте, что так не бывает.
Лучшая ситуация это когда тестовое задание заменяет алгоритмы и другие этапы технических собеседований. Вы присылаете задание, а на собеседовании разбираете решение. В тысячу раз лучше решения алгоритмических задач, потому что они как билеты на экзамене. Попалось то, что знаешь - сдал, садись, пять. Большой фактор случайности. Тестовое задание позволяет вам реально подготовиться и вложиться там, где это имеет смысл.
Второе правило тестовых заданий: если решили делать, то делайте на 150%. В предыдущих частях было много сказано про экономию сил и времени. Вся экономия времени была не ради того, чтобы успевать полежать на диване, а чтобы в нужный момент выложиться по полной. Важно сделать больше, чем требуется, чтобы обойти остальных кандидатов. В идеале показать своим решением понимание проблемы компании, ведь тестовые задания часто связаны с позицией, на которую вас нанимают. Решение должно сообщать не “я могу решить эту задачу”, а “я могу решить ваши проблемы.”
Личный пример: одно тестовое задание#
Расскажу, как в Марте 2022 я делал тестовое задание для компании RogaAndKopyta (не поверите, но название изменено).
Note
Это задание на ML инженера, поэтому мне трудно будет избежать терминологии. Если вы не разбираетесь в ML, это не страшно: постарайтесь ухватить суть подхода к решению, а именно то, что в этом случае я старался перевыполнить задачу.
У меня был один из лучших опытов собеседований с этой компанией. Полная прозрачность, отношение на равных, очень приятные люди и никакого булщита. На собеседовании с СЕО я испытал такое доверие, что нарушил все правила поведения и сказал, что на самом деле точно не знаю чего хочу. Тогда мне были интересны и исследования, и инженерия, и бизнес. Не делайте так. Несмотря на это, они все равно сделали мне оффер. Настолько у нас с ними все хорошо складывалось.
Компания занимается рекомендациями размеров одежды для крупного маркетплейса. При выборе размера покупатель заполняет небольшой опрос: обычно ношу 36-ой, рост 156, бывает жмет в плечах. В ответ получает ML рекомендацию: покупай 36-ой. Это растит конверсию в покупку.
На собеседовании мы с СТО сразу нашли общий язык. Он рассказал, что под каждый магазин они тренируют модель руками. Вначале бывает очень мало данных от магазинов. Я сразу понял: “Значит проблема в том, что так масштабироваться невозможно. Нужно подключать магазины автоматически и решить проблему холодного старта.” СТО очень понравилось, что я ухватил суть проблемы. Я сказал, что могу это сделать.
100%#
После ряда собеседований они прислали мне тестовое задание. CSV с 300 ответами покупателей на опрос. Id продукта, категория, рост покупателя, обычно покупаемый размер, ответы в каких местах обычно жмет, какой размер в итоге купил, какой фидбек оставил, какие были проблемы с купленной вещью. Задача: дать рекомендации.
Первая проблема, что нет таргета (целевой переменной). Мы не знаем какой размер человеку действительно подходит, знаем только какой он купил. Вторая проблема: ничего из моделей не учится. Я подошел к задаче как к классификации, где рекомендуемый размер — это класс. Попробовал для начала предсказывать купленный размер. Логистическая регрессия, простая модель классификации, просто не сходилась.
Еще в начале подумал, что влияют только два весомых признака: обычно покупаемый размер и рост. Визуализация это подтвердила: какой человек обычно носит размер, такой и покупает. Данных нет, таргета нет, признаков нет, как решать?
Я уже хотел бросить это тестовое. Но решил поиграть в игру: что, если бы я уже работал в этой компании? Приходит ко мне бизнес, и что я ему скажу? “Ой тут ничего не сделать, я сдаюсь”? Стало интересно, что же можно выжать из того, что дали.
ML не обучается. Максимум можно сделать какую-то таблицу: с таким обычным размером, таким ростом и прочими ответами как у тебя люди чаще всего покупают эту вещь с размером Х. Не руками же эту таблицу составлять: и оверфит большой, и обновлять трудно, и проблему масштабирования так не решить. Нужна обучаемая автоматическая таблица.
И я как раз знаю такую! Алгоритм Random Forest. Раскладывает обучающую выборку по полочкам. Не переобучается. Экстраполировать не умеет, а нам как раз не нужно. Умеет обрабатывать все виды признаков и даже никакого препроцессинга не надо. На train-test split данных нет, а RF как раз дает бесплатно out-of-bag оценку тестовой ошибки. Обучил на предсказание купленного размера: красота, около 0.7 OOB f1-score. Но как же рекомендовать не тот размер, что обычно покупают, а тот, что подойдет? Придумал трюк: выкидываем все примеры, где у людей был негативный фидбек, на остальных обучаем. Получаем модель, которая говорит “люди с твоими параметрами, которые оказались довольны, купили Х.”
Попробовал, изучил результаты предсказаний на недовольных покупкой, которые не попали в трейн сет модели. Нашел несколько крутых случаев: человек купил размер Х, написал фидбек, что вещь оказалась маловата. Рекомендация модели: стоило покупать на размер больше. Вау, полезные рекомендации, отпад!
Но это только начало, потому что это выполнение на сто процентов. Надо на сто пятьдесят. Что еще можно выжать? Я задумался, что для эффективности рекомендаций важно доверие к ним. С чего тебе верить черному ящику, который говорит покупать 50-ый размер?
150%#
Как минимум можно использовать вероятности классификатора. Мы на 95% уверены, что вам подойдет размер 50. Можно использовать то, сколько людей попало в лист. 567 человек из 1000 похожих на вас купили размер 50 и были довольны. Неплохо, но можно еще лучше: SHAP feature importance. Мы на 95% уверены, что вам подойдет 50-ый, потому что вы указали, что носите 49-50 и вам обычно жмет в районе живота. Попробовал, заработало: рекомендации и импортансы адекватные.
Я засиделся за выполнением тестового до четырех утра. Настолько затянуло. Было еще много идей, которые хотелось сделать, но я просто высказал их на собеседовании. Первая идея в том, что в реальности такие данные могут быть нерепрезентативны. Просто может быть, что никто (пока) не купил майку 36 размера и этого класса нет в датасете. Для решения этой проблемы я бы сделал усредненную модель, которая тренировалась бы предсказывать подходящий размер на данных всех магазинов и без учета конкретного продукта. Она говорила бы, что обычно с такими-то ответами покупают футболки размера 36. Эта модель давала бы неплохие рекомендации пока для магазина копится датасет. Потом можно обучить отдельную модель под магазин, а предсказания усредненной модели использовать как признак. Вторая идея: добавить внешних данных. Можно по таблицам размеров сказать, какой размер скорее всего подойдёт при данном росте. Киллер фича была бы. Третья идея — это использовать изображения, текстовые описания и прочие фичи продуктов.
По результатам мое решение было вне конкуренции и мне сказали, что я самый сильный кандидат с большим отрывом. Особенно им понравился продуктовый подход. СТО сказал, что он устал собеседовать ML-щиков которые привыкли “теребить проценты.”
Мне сделали оффер на уровне US зарплаты плюс стоки, что было вдвое больше остальных предложений.
🤗 Если этот материал был для вас полезен есть два способа отблагодарить меня:
Прислать ссылку на методичку своему другу.
Подписаться на мой телеграм канал.