olegvg
12/16/2016 - 12:41 PM

Backend_dev_test_assignment_2.md

Тестовое задание #2. Senior Python Developer.

Баннерокрутилка

Задание

Необходимо сделать "баннерокрутилку". Она должна представлять из себя простой веб-сервис написанный на Python 3.4-3.5 с использованием любых показавшихся необходимыми библиотек.

Есть не изменяемый файл конфигурации в CSV, который содержит данные вида:

Image URL;prepaid shows amount;category1;category2;category3; ... ;category N
http://images.com/bannerimage.jpg;1000;auto;bikes;transport; ...

Количество записей в файле не более 1000. Файл содержит только символы Оплаченные показы - сколько раз баннер нужно показать. Категорий у одного баннера может быть от 1 до 10 штук, записанных в соответствующих колонках.

Пример:

http://banners.com/banner1.jpg;500;flight;airlplane
http://banners.com/banner2.jpg;3300;show;britain;benny hill;sketches;tv
http://banners.com/banner3.jpg;1500;games;minecraft;blocks;sandbox
http://banners.com/banner4.jpg;120;onlycategory

При запуске баннерокрутилка читает конфиг и начинает слушать HTTP обращения.

Клиент HTTP GET запросом сообщает категории, которые он готов принять, к примеру: http://bannerokrutilka.com/?category[]=auto&category[]=trains Количество запрошенных категорий может быть от 0 до 10 штук.

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

По характеру запросов считаем, что:

  1. Не будут запрашиваться категории, которых нет в конфиге.
  2. Количество запрошенных категорий равновероятно в рамках 0-10.
  3. Появление любой из категорий в запросе равновероятно.
Дополнительные плюсы:
  1. Код соответствует PEP8.
  2. Реализация механизма, который уменьшает вероятность выдачи одной и той же картинки несколько раз подряд.
  3. Реализация механизма, который позволит показать все баннеры за меньшее количество запросов, так как возможна ситуация, когда для запрошенных категорий категории все подходящие баннеры уже исчерпали свой лимит и ответить на запрос нечем. Нужно минимизировать вероятность возникновения таких случаев.
  4. Реализация в асинхронном стиле / на корутинах.
  5. Наличие тестов.
  6. Storage в неблокирующем стиле: optimistic locking, MVCC, CAS и подобные подходы.
Порядок выполнения:
  1. Необходимо подготовить краткое словесное описание предполагаемого архитектурного решения.
  2. Оценить время, необходимое на разработку, в человеко-часах собственной работы.
  3. Обсудить первые 2 пункта с инженером Работодателя.
  4. Разработать приложение.
  5. Покрыть приложение автотестами (объём обсуждаем).
  6. Представить доступ к задеплоенному web-сервису Баннерокрутилки.