Разработка
КиноTinder, или как спасти человечество от муки выбора фильмов
Владимир Бондаренко из компании Mauris рассказал нам о тернистом пути еще одного своего проекта — рекомендательного сервиса для кино.
Как известно, соорудить из интересной задумки хорошо работающее, удобное и понятное приложение под силу далеко не каждому. Собственно, поэтому наш путь от идеи до ее реализации занял несколько лет.
Наверняка каждому известно чувство “хочу посмотреть то, не знаю, что, и никто мне не поможет”. Мысль о создании киносервиса посещала нас неоднократно. Но в 2013 году, когда трудовые будни хотелось скрасить хорошей подборкой фильмов на вечер, в очередной раз стало понятно: не все то нравится, чему ставят высокие оценки. Ни рейтинг «Имхонет», ни КиноПоиск и IMDB не смогли помочь в поиске подходящих фильмов. Киноленты с высоким рейтингом были либо просмотрены ранее, либо не интересны, что, собственно, ставило в ступор. А фильмы со средним рейтингом было трудно оценить и отобрать.
Во-первых, комментарии и рецензии делились на два полноценных лагеря: за и против. Во-вторых, сам процесс подбора фильмов занимал достаточно много времени (ведь каждый год только в Голливуде выпускают больше 800 фильмов и сериалов), и в большинстве случаев времени на просмотр киноленты просто не оставалось.
Так и пришла мысль создать сайт со специальным алгоритмом, целью которого является:
А) отображение ТОПа классных фильмов под интересы конкретного пользователя, базируясь на оценках ранее понравившихся фильмов;
В) предоставить возможность ранжирования рекомендаций фильмов, учитывая дополнительные параметры.
Однако приступив к работе, мы сразу же столкнулись с рядом проблем. То, что удобно разработчику, не всегда комфортно для пользователя: программирование заняло всего 2 дня, а превращение в понятный для пользователя сервис – больше года.
Проблема 1. Разработка удобного и понятного интерфейса для пользователя
Запуская сайт мы столкнулись с тем, что от пользователя требовалось воспроизвести в памяти просмотренные киноленты. Когда ресурс требовал ввести в поисковую строку 10 любимых фильмов, половина пользователей впадала в ступор: они просто не могли их вспомнить.
Решение: быстрый хотфикс с постоянно обновляемой подборкой фильмов с лучшим рейтингом – хорошая подсказка для забывчивых.
Проблема 2. Функция «просмотр фильма с другом» не сработала
На FB или ВК выбиралась страница пользователя, и по ней делался перекрестный анализ – какие фильмы не смотрели ни вы, ни он. Сервис хорошо подбирал фильмы в одиночном режиме, но при перекрестном анализе возникала проблема: система выдавала фильмы, которые в большинстве случаев не были интересны обоим пользователям. В итоге комбинацией из двух списков не пользовался практически никто.
Решение: отключили функцию, решив оставить ее доработку до лучших времен, когда сервис будет иметь постоянную аудиторию.
Взлет и падение
После анонса о выходе сервиса в закрытом сообществе результаты превзошли все ожидания – за первую неделю было собрано больше миллиона оценок фильмов. Но была и обратная сторона медали: наши сервера тут же упали. На тот момент у нас не было достаточного опыта работы с большой аудиторией: при одновременном заходе на сайт более 500 пользователей скрипт не выдержал и рухнул.
Весь back-end был написан на php, а в качестве БД использовалась MySQL. Для исправления ситуации требовалось максимально ускорить ресурс – то есть:
- оптимизировать запросы в БД;
- изменить алгоритм;
- изменить конфигурацию сервера;
- дать возможность использовать частично предварительно сгенерированные данные (batch process) и кеши данных.
…к чему мы и приступили.
Проделанную нами работу можно разделить на несколько этапов:
1 этап. Сайт был мультиязычным: имел русскую и английскую локализации. Нам пришлось внедрить memcached – систему кэширования, в которой был заложен перевод контента, а также интерфейса. В итоге, все страницы стали отображаться вдвое быстрее – за счет выгрузки из оперативной памяти и устранения запросов в БД на перевод интерфейса.
2 этап. Объединил несколько операций:
- изменение алгоритма получения данных;
- разбивка сложных запросов на подзапросы;
- применение табличных индексов;
- оптимизация обработки строк (если просто соединить таблицы между собой через JOIN, не факт, что БД выберет оптимальный вариант работы сама);
- использование memory-таблиц. Чтобы из автоматического JOIN-a таблиц использовать ручное соединение, мы сделали ряд простых запросов – они получали те же данные, но в определенном порядке. Это уменьшило количество обрабатываемых данных.
После этого мы занялись переводом индивидуального рейтинга фильма из обычной таблицы в memory (расположенную в оперативной памяти) – в результате получили хороший прирост.
Схема оптимизации была такой: после каждых трех оцененных фильмов происходит пересчет – данные генерируются очень часто, и у нас нет необходимости их хранить. Даже если база обнулится или что-то случится с сервером, мы просто заново сгенерируем для пользователя эти данные (по большей мере, они являются служебными).
Также мы применили ручное партицирование БД: сделали разбиение – оценки фильмов определенных групп посетителей сохранялись в разных таблицах – то есть мы горизонтально разбивали оценки по n-ому количеству таблиц в зависимости от растущей базы пользователей. Размер каждой таблицы был ограничен 1 миллионом записей: это позволяло выполнять sql-запросы с необходимой нам скоростью.
3 этап. Оптимизация сервера. На тот момент мы использовали VPS, ресурсы которого были ограничены, но после конфигурирования результат не заставил себя ждать. Мы увеличили количество одновременных подключений к БД и запросов на сервер.
4 этап. Мы запустили пересчет оценок. После первых дней работы сервиса стало ясно, что динамический подсчет рейтинга фильма замедляет время загрузки страницы: мониторились сотни записей и по ним выводились средние оценки. Написанный нами новый скрипт каждые сутки в 2 часа ночи запускал обновление данных по рейтингам, за счет чего время загрузки страницы сократилось.
Выполнение этих работ заняло несколько дней. В итоге, все закончилось хорошо: после перезапуска сайта все заработало.
Кстати, когда сервер упал, над нами начали сильно подшучивать: на форуме закрытого сообщества Лепрозорий пользователи оставляли в комментариях анимированный гиф-лоадер. Но они не понимали, что отправляя огромное количество этих гифок грузили сервер еще сильнее: у нас был один веб-сервер, который обрабатывал статическую и динамическую информацию. На форуме кеширование фото в комментариях отсутствовало. Люди использовали ссылку, и каждый раз, когда кто-то открывал наш форум и запрашивал 10 таких гифок — шло 10 запросов на сервер, что грузило его еще больше.
Смена концепции
Но веб-сервис – это не только вопросы разработки и техподдержки. Появилась проблема резкого падения числа пользователей. Картина была такова: пользователь заходил на сайт, проводил 2-3 часа за оценкой фильмов и исчезал. В лучшем случае возвращался еще несколько раз. Это дало нам повод задуматься о том, что в таком формате сервис себя исчерпал.
ДУБЛЬ №2
Сервис должен был стать более понятным по формату и мотивировать пользователя к последующим посещениям. Для этого надо было:
- оптимизировать путь пользователя при работе с сервисом (ввести обучение);
- разработать алгоритм по «удержанию» и привлечению пользователя.
Мы начали работу, параллельно выполняя заказы клиентов – а их было очень много. Прошло несколько месяцев, затем еще и еще, и спустя 2 года мы осознали: заказов становится только больше, мы работаем на пике. Если не реализовать наш проект сейчас, этого не случится никогда.
В итоге, в декабре 2016 года, мы вновь перезапустили сервис, преобразовав его формат.
Мы видели, что перспектива развития проекта на мобильном устройстве значительно выше:
- есть возможность напомнить о себе с помощью push-уведомлений;
- список фильмов всегда в кармане пользователя;
- мобильный продукт вполне успешно способен отучить посетителя напрягать память (по аналогии с Тиндер) и спокойно «вести» его.
СЛОЖНОСТИ
- Интерфейс. Как совместить свайпы влево и вправо с большим количеством функций приложения (смотрел, не смотрел, хочу посмотреть и т.д.)? Вариант «хочу смотреть – свайп вправо, не хочу — влево», а внизу «оценка» не оправдал надежд: плей-тест показывал, что люди просто не понимают, чего от них хотят. От бездумных свайпов и оценок наугад алгоритм начинал работать хуже.
Решение пришло тогда, когда мы этого вовсе не ожидали. Устроив выездные корпоративные каникулы с катанием на лыжах в австрийских Альпах, мы, 3 киномана, подключив дизайнера и бутылку приличного виски, нашли решение.
Концепт стал чуть сложнее, но возможность совершить ошибку была сведена к минимуму. Свайп вправо – пользователь видит, что фильм посмотрен, и ему предлагают поставить оценку по десятибалльной шкале. Свайп влево — фильм не был просмотрен ранее, поэтому нужно выбрать один из 3 пунктов («не хочу смотреть», «хочу посмотреть», «не определился»). Мы пожертвовали удобством интерфейса ради того, чтобы процент непонимания механики свелся к нулю. В итоге, пользователь стал понимать, что и зачем он делает, более осознанно принимать решения, после чего алгоритм выдавал ему подходящие фильмы.
Первая подборка для оценки состояла из фильмов с высокими баллами топовых рейтингов – и при этом большинство из них люди просто не смотрели. После 3 свайпов «не смотрел» они разочаровывались и повально закрывали приложение. Вначале для решения проблемы просто поставили фильтры (стали показывать фильмы последних 10 лет), но это не помогло.
Проблему пришлось решать вручную: собрались командой разработчиков и за один вечер сформировали перечень из 52 фильмов, которые видело большинство. Именно их пользователи оценивают в первой выдаче.
Подборка была составлена из фильмов разных жанров, чтобы по их истечению у человека сформировалась разнородная картина, и приложение могло направить его в любое русло, в зависимости от предпочтений. После этого количество пользователей, «прошедших» первые 5 фильмов, составило 95%.
Что в итоге?
Мы запустили приложение, провели бета-тестирование, собрали фидбек, внедрили ряд доработок и сейчас выпустили обновленную версию, которая уже доступна в Google Play и App Store. С iOS версией все оказалось сложнее – нам пришлось пережить 5 проверок от придирчивых модераторов: сотрудники компании Apple тщательно тестируют каждое приложение на всех iOS гаджетах. Они смогли отловить баг при запуске iPhone приложения на iPad, который состоял в том, что при свайпе карточка не уходила, ее нужно было вести пальцем до конца экрана. Основная часть проблем была юридического характера, а именно связана с авторским правом на постеры, которые используются в приложении. Нам пришлось потратить много времени на составление обращения к правообладателям, подбор постеров с определенным типом лицензии, а также разработку механизма, который помогает быстро исключить фильм в случае запроса от правообладателя.
В обновленной версии пользователей ожидает множество фич:
- Ежедневные подборки фильмов на разнообразные тематики — отличная альтернатива свайпанью и получению рекомендаций. Мы ожидаем, что это мотивирует людей чаще пользоваться приложением.
- Расширенный профиль со статистикой по своим оценкам и определением любимых жанров, а также система достижений пользователя. Также теперь в выдачу можно добавить сериалы.
- Поиск фильма: можно сразу найти кино и добавить его в список «хочу посмотреть» или оценить просмотренные ранее фильмы. Добавлена функция «поделиться фильмом с другом» (ссылка, при переходе по которой открывается страница фильма).
- PRO-режим — возможность получить полный доступ к фильмам (в рекомендациях представлены скрытые фильмы) и увидеть расширенную статистику по своим оценкам.
В ближайших планах:
- выпустить обновление с фильтрацией фильмов по актеру;
- добавить возможность комментировать фильмы и сериалы;
- создать ленту, в которой можно будет следить за обновлениями и оценками друзей.
Качайте в App Store и Google Play, ставьте оценки, оставляйте отзывы. Будем признательны за любую обратную связь о проделанной нами работе!