Connect with us

Разработка

КиноTinder, или как спасти человечество от муки выбора фильмов

Владимир Бондаренко из компании Mauris рассказал нам о тернистом пути еще одного своего проекта – рекомендательного сервиса для кино.

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, который состоял в том, что при свайпе карточка не уходила, ее нужно было вести пальцем до конца экрана. Основная часть проблем была юридического характера, а именно связана с авторским правом на постеры, которые используются в приложении. Нам пришлось потратить много времени на составление обращения к правообладателям, подбор постеров с определенным типом лицензии, а также разработку механизма, который помогает быстро исключить фильм в случае запроса от правообладателя.

В обновленной версии пользователей ожидает множество фич:

  1. Ежедневные подборки фильмов на разнообразные тематики – отличная альтернатива свайпанью и получению рекомендаций. Мы ожидаем, что это мотивирует людей чаще пользоваться приложением.
  2. Расширенный профиль со статистикой по своим оценкам и определением любимых жанров, а также система достижений пользователя. Также теперь в выдачу можно добавить сериалы.
  3. Поиск фильма: можно сразу найти кино и добавить его в список «хочу посмотреть» или оценить просмотренные ранее фильмы. Добавлена функция «поделиться фильмом с другом» (ссылка, при переходе по которой открывается страница фильма).
  4. PRO-режим – возможность получить полный доступ к фильмам (в рекомендациях представлены скрытые фильмы) и увидеть расширенную статистику по своим оценкам.

В ближайших планах:

  • выпустить обновление с фильтрацией фильмов по актеру;
  • добавить возможность комментировать фильмы и сериалы;
  • создать ленту, в которой можно будет следить за обновлениями и оценками друзей.

Качайте в App Store и Google Play, ставьте оценки, оставляйте отзывы. Будем признательны за любую обратную связь о проделанной нами работе!

Комментарии
Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Advertisement
Click to comment

You must be logged in to post a comment Login

Leave a Reply

Разработка

Дневники разработчиков: Babycare №9

Babycare – приложения для ухода за новорождённым с популярной Android-версией. Теперь Максим Колпаков и компания Wachanga покоряют пользователей iOS и каждую неделю пишут об этом заметки.

Babycare

Опубликовано

/

Автор:

Прошло 11 недель челленджа. На этой неделе окончательно выпустили китайскую локализацию, а также запостили в App Store видеоролик вместо первого скриншота. Оба события принесут (или не принесут) плоды не раньше следующей недели. Тогда и опишу результаты.

Произошёл казус. Договариваясь с блогерами и сообществами о продвижении приложения, получили от некоторых следующий фидбек. Они отказываются работать с нами, так как «изображение бутылочки дискредитирует ценность грудного вскармливания». Мы знали о подобной особенности, но с точки зрения пользователей всё было в порядке в 99% случаев. Блогеры же имеют другое мнение. Думаем, что делать, готовим эксперименты с альтернативными иконками. Если и юзеры выберут другую иконку, то, конечно, сменим.

У нас в компании есть некий код, ДНК, который я сформулировал, и который мы вкладываем теперь в каждый наш новый продукт. Один из первых пунктов этого кода – «Масштабируемость». Сейчас мы делаем только продукты, которые можно легко запустить по всему миру. Обеспечивают такую возможность несколько условий:

  • Минимум контента, а если без него никуда, то UGC – User Generated Content. Это позволит дешевле переводить продукт на другие языки.
  • Минимальная зависимость от национальных особенностей. Например, грудное вскармливание – это намного ближе к физиологии и, значит, интернационально.
  • B2C-продажи. Мы убрали любые B2B-компоненты на период масштабирования, так как это снижает скорость роста. По достижении определенного уровня проникновения, конечно, есть смысл вернуть B2B обратно.
  • Простота клиентской поддержки. Например, для того чтобы это делать на десятках языков, коммуникации с клиентами нужно вести в текстовом виде. В крайнем случае, на первых порах можно на голосе оставить только первую линию, отдав её на аутсорс и обеспечив скриптами, которые нестандартные проблемы всё равно переводят на текстовую коммуникацию.
  • Наличие универсальных каналов привлечения клиентов. Facebook, Instagram, Adwords, App Store, Google Play – эти каналы есть в каждой стране. Если продукт сможет получать достаточно пользователей из них, то он проходит отбор.

Есть и другие особенности «Масштабируемости», но о них я расскажу только в том случае, если вы будете активнее в комментариях. А ещё мне нравятся лайки и репосты  ;)

Комментарии
Продолжить чтение

Новости

Интересные материалы: 21.06

В новом дайджесте когортный анализ, новые инструменты и лучшие библиотеки.

AppTractor

Опубликовано

/

Автор:

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

Комментарии
Продолжить чтение

Новости

Интересные материалы: 20.06

Дизайн и прототипирование, PWA и звуки, которые важны.

AppTractor

Опубликовано

/

Автор:

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

Комментарии
Продолжить чтение

Разработка

“Крутись и уворачивайся”: история разработки Circle vs Spikes

Немного о себе: 30 лет, программированием начал заниматься относительно поздно, всего 2 года назад. Имелся технический бэкграунд, но в целом от программирования был далек. Знакомых кодеров тоже не было, пришлось самому набивать шишки, пытаясь понять, что и как делать. Привлекла идея делать мобильные приложения, так как хотелось работать на себя. Ну а что может быть интереснее геймдева. Таким образом была поставлена цель – научиться делать мобильные игры.

AppTractor

Опубликовано

/

Автор:

Но сначала нужно было изучить основы. Решил взяться за фундаментальные вещи: теория, алгоритмы, проектирование и т.д. Промучившись месяца два понял, что нужно ставить практические задачи, а теорию изучать уже по мере надобности. Стал изучать Java, которая повсеместно используется для Android. Да и фреймворк LibGDX, о котором я уже тогда начал думать, был на Java.

Освоив на достаточном уровне Java и LibGDX, я захотел пройти весь путь от идеи игры до публикации. Хотелось начать с чего-то простого. Пришла мысль сделать 2D-аркаду, в которой надо уворачиваться от препятствий, двигаясь при этом по сложной траектории.

Итак, у меня была неплохая цель – сделать в короткие сроки простую игру, довести ее до публикации в Google Play и, таким образом, набраться опыта. В итоге “короткие сроки” растянулись более чем на полтора года. Частенько я переделывал все с нуля, тратил много времени на каждый этап, добавлял или убирал функционал. Много времени было вложено и в создание редактора уровней. Если игра будет нравится людям, включу его в игру в одном из обновлений. Вот так он выглядит сейчас.

Это был крайне интересный опыт, но, думаю, все же надо было придерживаться изначального плана – довести до конца максимально простую игру.

Но сейчас, уже опубликовав игру, предстоит новый этап – продвижение. Я уже ощутил, насколько это тяжелый и энергозатратный процесс. Но мне уже не привыкать.

Крутись и уворачивайся

В игре вы управляете кругом, который движется по орбите. При этом орбита вместе с кругом движутся вперед. Таким образом соединяются две траектории: круговая и прямолинейная. Это делает механику интересной, заставляет просчитывать наперед это сочетание. Кругом надо уворачиваться от множества разных препятствий (шипов, маятников, лазеров, блоков…). Управление при этом предельно простое – касанием экрана можно менять направление вращения по орбите.

Игра поделена на небольшие уровни, длительностью по 30-40 секунд. Это при условии, конечно, что проходите их с первого раза. Но такое будет происходить редко. Игру я сознательно сделал сложной, так как насмотрелся супер-легких игр, в которых игрокам буквально указывают, куда нажимать. Если вы любите принимать вызовы, то моя игра вам понравится.

На то, чтобы сменить направление вращения (другими словами – на каждое касание) требуется 1 заряд. Уровень вы начинаете, имея 100 зарядов. Цель – истратить как можно меньше зарядов за уровень. То есть нельзя бездумно тыкать по экрану, нужно просчитывать траекторию и использовать заряды с умом.

Чтобы пройти тяжелые участки, можно использовать замедление.

Имеется поддержка Google Play Игр:

  1. Достижения – за каждое из которых открывается новый скин или цветовая тема.
  2. Лидерборды
  3. Сохранения и синхронизация между устройствами

Музыку мне сделал друг, специально для игры, за что я ему очень благодарен. Кому интересно, вот ссылка на его страничку в Soundcloud: https://soundcloud.com/octonick.

Также я постоянно делаю новые уровни, так что пройдя все – не спешите удалять игру. Я планирую часто выпускать обновления.

Если у вас есть какие-либо вопросы, пишите, постараюсь ответить всем: ibragames.com@gmail.com.

Комментарии
Продолжить чтение

Реклама

Наша рассылка

Нажимая на кнопку "Подписаться" вы даете согласие на обработку персональных данных.

Вакансии

Популярное

X
X

Спасибо!

Теперь редакторы в курсе.