Тестовые задания#

Первое правило тестовых заданий: не делать тестовые задания. Тестовые задания связывают вас по рукам и ногам не облагая компанию какими-либо обязательствами. Пока вы тратите выходные на бесплатную работу компания перелопачивает десятки кандидатов, а затем вы получаете шаблонный отказ. В среднем тестовые задания это потеря времени, потому что их не проверяют.

Я много раз встречал такую тактику: после отсева резюме, но до собеседований, компания сплошняком раздает тестовое задание всем кандидатам. Работает просто как галочка: собеседуют всех, кто отправил задание. Отличная проверка на мотивацию, неумение ценить свое время или отчаяние.

Если делать все тестовые задания, то в лучшем случае будет один вымученный оффер. Лучше потратить время на получение множества опций.

При этом оба моих оффера в этот поиск работы пришли через тестовые задания, и в позапрошлый поиск работы тоже. Потому что есть редкие исключения из первого правила.

В более строгом виде первое правило можно сформулировать так: не делать тестовое задание до собеседований, если оно занимает слишком много времени, если оно не интересное или если не очень хочется в эту компанию.

Иногда работает предложить вместо тестового задания разобрать ваш публично доступный проект на ту же тему. Всегда предлагайте это если тестовое задание не стоит усилий. В худшем случае вам просто скажут нет.

Тестовое задание обязательно стоит делать, когда все звезды выстроились в ряд: оно интересное, есть время и компания вам нравится.

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 зарплаты плюс стоки, что было вдвое больше остальных предложений.


🤗 Если этот материал был для вас полезен есть два способа отблагодарить меня:

  1. Прислать ссылку на методичку своему другу.

  2. Подписаться на мой телеграм канал.