Backend разработчик в Avito Tech
Тестовое задание для стажера Backend
В Авито часто проводятся различные эксперименты — тесты новых продуктов, тесты интерфейса, скидочные и многие другие. На архитектурном комитете приняли решение централизовать работу с проводимыми экспериментами и вынести этот функционал в отдельный сервис.
Требуется реализовать сервис, хранящий пользователя и сегменты, в которых он состоит (создание, изменение, удаление сегментов, а также добавление и удаление пользователей в сегмент)
Сценарии использования:
Хотим провести несколько экспериментов и протестировать новый функционал Авито:
Кто из пользователей в какой эксперимент попадет будет решать большой отдел аналитики, а мы лишь дадим им возможность для таких тестов.
Допустим аналитики создали сегменты:
и добавили созданные сегменты нескольким пользователям:
| Пользователь | Сегменты которым он принадлежит |
|---|---|
| 1000 | [AVITO_VOICE_MESSAGES, AVITO_PERFORMANCE_VAS, AVITO_DISCOUNT_30, …] |
| 1002 | [AVITO_VOICE_MESSAGES, AVITO_DISCOUNT_50, …] |
| 1004 | нет сегментов |
Формат хранения данных в базе данных не ограничен - можно выбрать любой удобный
Получили следующие данные:
Теперь мы хотим через API сервиса по user_id получать список сегментов в которых он состоит.
Технические требования:
Будет плюсом:
Основное задание (минимум):
Детали по заданию:
Далее перечислены дополнительные задания.
Они не являются обязательными, но их выполнение даст существенный плюс перед другими кандидатами.
Можно выбрать несколько из представленных
Доп. задание 1:
Иногда пользователи приходят в поддержку и спрашивают почему у них пропал/появился какой-то новый функционал. Нужно иметь возможность посмотреть когда точно пользователь попал в конкретный сегмент.
Задача: реализовать сохранение истории попадания/выбывания пользователя из сегмента с возможностью получения отчета по пользователю за определенный период. На вход: год-месяц. На выходе ссылка на CSV файл.
Пример отчета:
идентификатор пользователя 1;сегмент1;операция (добавление/удаление);дата и время
идентификатор пользователя 1;сегмент2;операция (добавление/удаление);дата и время
идентификатор пользователя 2;сегмент3;операция (добавление/удаление);дата и время
Доп. задание 2:
Бывают ситуации когда нам нужно добавить пользователя в эксперимент на ограниченный срок. Например выдать скидку всего на 2 дня.
Задача: реализовать возможность задавать TTL (время автоматического удаления пользователя из сегмента)
Пример: Хотим чтобы пользователь попал в сегмент на 2 дня - для этого в метод добавления сегментов пользователю передаём время удаления пользователя из сегмента отдельным полем
Доп. задание 3:
Мы хотим добавлять пользователя в сегмент не в ручную, а автоматически. В сегмент будет попадать заданный процент пользователей.
Задача: в методе создания сегмента, добавить опцию указания процента пользователей, которые будут попадать в сегмент автоматически. В методе получения сегментов пользователя, добавленный сегмент должен отдаваться у заданного процента пользователей.
Пример: создали сегмент AVITO_VOICE_MESSAGES и указали что 10% пользователей будут попадать в него автоматически. Пользователь 1000 попал в этот сегмент автоматически. При запросе сегментов пользователя 1000, сегмент AVITO_VOICE_MESSAGES должен отдаваться всегда.
Опубликовано 17 ноября 2025