DOU Проектор: Movie Expert — рекомендації фільмів за вашими інтересами
У рубриці DOU Проектор всі охочі можуть презентувати свій продукт (як стартап, так і ламповий pet-проект). Якщо вам є про що розповісти — запрошуємо взяти участь. Якщо ні — можливо, серія надихне на створення власного made in Ukraine продукту. Питання і заявки на участь надсилайте на [email protected] .
Мене звуть Володимир Бондаренко, я співвласник компанії Mauris та один з творців мобільного сервісу Movie Expert . Наш додаток допомагає за 15 хвилин створити список фільмів та серіалів для перегляду на півроку вперед.
Ідея
Напевно, кожному відоме почуття «хочу подивитися щось, не знаю що, і ніхто мені не допоможе. Думка про створення кіносервісу приходила до нас неодноразово, але сформувался остаточно в 2013 році. Трудові будні хотілося скрасити хорошою підбіркою фільмів на вечір, в черговий раз стало зрозуміло: не всі ті подобається, чому надавати високі оцінки. Ні рейтинг «Імхонет», ні «КиноПоиск» та IMDb не змогли допомогти в пошуку відповідних фільмів. Кінострічки з високим рейтингом або були переглянуті раніше, або не цікаві, що, власне, ставило в ступор. А фільми із середнім рейтингом було важко оцінити і відібрати. По-перше, коментарі і рецензії ділилися на два повноцінних табори: за і проти. По-друге, сам процес підбору фільмів займав досить багато часу (адже щороку тільки в Голлівуді випускають більше 800 фільмів і серіалів), і в більшості випадків годині на перегляд кінострічки просто не залишалося.
Так і прийшла думка створити сайт зі спеціальним алгоритмом, метою якого є:
- відображення ТОПу класних фільмів згідно з інтересами конкретного користувача, базуючись на оцінках раніше вподобаних фільмів;
- надати можливість ранжування рекомендацій фільмів з огляду на додаткові параметри.
Однак, приступивши до роботи, ми відразу ж зіткнулися з нижчою проблем. Ті, що зручно розробнику, не завжди комфортно для користувача: програмування зайняло всього 2 дні, а перетворення в зрозумілий для користувача сервіс — більше року.
Спочатку користувачеві необхідно було авторизуватися на сайті за допомогою ВК або ФБ. Далі він бачив сторінку з 9 фільмами, з яких потрібно було обрати ті, які він вже бачив, та оцінити. Якщо користувач відмічав більше 2 фільмів на сторінці, список фільмів для оцінки оновлювався. Із запропонованих фільмів можна було обирати ті, які хочеш подивитися, а також побачити список вже оцінених. На сайті також була доступна функція «подивитися фільм з одним», яка дозволяла визначити фільм, який не дивився ні користувач, ні його друг.
Проблема 1. Розробка зручного і зрозумілого інтерфейсу для користувача.
Спочатку потрібно було відтворити в пам'яті переглянуті фільми. Коли ресурс вимагав ввести в пошуковий рядок 10 улюблених фільмів, половина користувачів впадала в ступор: вони просто не могли їх пригадати.
Рішення. Швидкий хотфікс з постійно оновлюваною підбіркою фільмів з найкращим рейтингом — гарна підказка для забудькуватих.
Проблема 2. Функція «перегляд фільму з одним» не спрацювала: на FB або ВК обиралася сторінка користувача, по ній робився перехресний аналіз — які фільми не дивилися ні ви, ні один. Сервіс добре підбирав фільми в одиночному режимі, але при перехресному аналізі виникала проблема: система видавала фільми, які в більшості випадків були нецікаві обом користувачам. В результаті комбінацією з двох списків не користувався практично ніхто.
Рішення. Відключілі функцію, вирішивши залишити її доопрацювання до кращих часів, коли сервіс матиме постійну аудиторію.
Злет і падіння
Після анонсу про вихід сервісу в закритому співтоваристві результати перевершили всі очікування. За перший тиждень було зібрано більше мільйона оцінок фільмів. Але була й зворотна сторона медалі: наші сервери впали. На той момент у нас не було достатнього досвіду роботи з великою аудиторією: при одночасному заході на сайт більше 500 користувачів скрипт не витримав і впав.
Весь back-end був написаний на PHP, а в якості БД використовували MySQL. Для виправлення ситуації потрібно було максимально прискорити ресурс, тобто:
- оптимізувати запити в БД;
- змінити алгоритм;
- змінити конфігурацію сервера;
- дати можливість використовувати частково попередньо згенеровані дані (batch process) і кеші даних.
... до чого ми і приступили.
Виконану роботу можна розділити на кілька етапів:
1 етап. Сайт був багатомовним: мав російську і англійську локалізації. Нам довелося впровадити Memcached — систему кешування, в якій було заклалося переклад контенту, а також інтерфейсу. У підсумку, всі сторінки почали відображатися вдвічі швидше — за рахунок вивантаження з оперативної пам'яті і усунення запитів до БД на переклад інтерфейсу.
2 етап. Об єднав декілька операцій:
- Зміна алгоритму отримання даних.
- Розбивка складних запитів на підзапити.
- Застосування табличних індексів.
- Оптимізація обробки рядків (якщо просто з'єднання єднати таблиці між собою через JOIN, не факт, що БД обере оптимальний варіант роботи).
- Використання memory-таблиць. Щоб з автоматичного JOIN a таблиць використовувати ручне з'єднання єднання, ми нікого ряд простих запитів — вони отримували ті ж дані, але в певному порядку. Це зменшило кількість оброблюваних даних.
Після цього ми зайнялися перекладом індивідуального рейтингу фільмів зі звичайної таблиці в memory (розташованої в оперативній пам'яті) — в результаті отримали хороший приріст швидкості, з якою працював алгоритм перерахунку рейтингу. Вона збільшилась у 10 разів.
Схема оптимізації була такою: після кожних трьох оцінених фільмів відбувається перерахунок — дані генеруються дуже часто, і в нас немає необхідності їх зберігати. Навіть якщо база обнулитися або щось трапиться з сервером, ми просто наново згенеруємо для користувача ці дані (здебільшого вони є службовими).
Також ми застосували ручне партиціювання БД: нікого розбиття — оцінки фільмів певних груп відвідувачів зберігалися в різних таблицях. Тобто ми горизонтально розбивали оцінки за n-ій кількості таблиць в залежності від зростаючої бази користувачів. Розмір кожної таблиці був обмежений 1 мільйоном записів: це дозволяло виконувати SQL-запити з необхідною нам швидкістю.
3 етап. Оптимізація сервера. На той момент ми використовували VPS, ресурси якого були обмежені, але після конфігурації результат не змусив себе чекати. Ми збільшили кількість одночасних підключень до БД і запитів на сервер.
4 етап. Ми запустили перерахунок оцінок. Після перших днів роботи сервісу стало зрозуміло, що динамічний підрахунок рейтингу фільму уповільнює час завантаження сторінки: моніторились сотні записів і по них виводилися середні оцінки. Написань нами новий скрипт щодоби о 2 годині ночі запускав оновлення даних по рейтингах, за рахунок чого час завантаження сторінки скоротився.
Виконання цих робіт зайняло кілька днів. У підсумку, все закінчилося добре: після перезапуску сайту все запрацювало.
Зміна концепції
Веб-сервіс — це не тільки питання розробки та технічної підтримки. З'єднання явилася проблема різкого падіння кількості користувачів. Усе відбувалося так: користувач заходив на сайт, провівши 2-3 години за оцінкою фільмів та зникав. У кращому випадку повертався ще кілька разів. Це дало нам привід замислитися над тим, що в такому форматі сервіс себе вичерпав.
Сервіс повинен був стати більш зрозумілим за форматом і мотивувати користувача до наступних відвідувань. Для цього було потрібно:
- оптимізувати шлях користувача при роботі з сервісом (ввести навчання);
- розробити алгоритм за «утриманню» і залученню користувача.
Ми почали роботу, паралельно виконуючи аутсорс-замовлення в інших галузях — а їх було дуже багато. Минуло кілька місяців, потім ще і ще, і через 2 роки ми усвідомили: замовлень стає тільки більше, ми працюємо на піку. Якщо не реалізувати наш власний проект зараз, цього не станеться ніколи.
Отож, у грудні 2016 року ми знову провели перезапуск сервісу, змінивши його формат. Вирішили замість сайту створити додаток під дві платформи — iOS і Android .
Ми бачили, що перспектива розвитку проекту на мобільному пристрої значно вища:
- є можливість нагадати про себе за допомогою push-повідомлень;
- список фільмів завжди в кишені користувача;
- мобільний продукт цілком успішно здатний відучити користувача напружувати пам'ять (за аналогією з Tinder) і спокійно «вести» його.
Принцип роботи програми такий: користувачеві динамічно подаються 10 карток фільмів для оцінки. Після 5 відмічених фільмів йде перерахунок рейтингу і завантажуються наступні 10 карток з урахуванням нових оцінок. Якщо користувач відмічає фільм як «не визначився», кінострічка може бути запропонована повторно для оцінки через кілька тижнів.
Щоб спростити інтерфейс програми, за основу взяли принцип Tinder. На головному екрані користувач повинен оцінювати фільми за допомогою свайпів вправо та вліво. У додатку доступні такі розділи: «Хочу подивитися», у якому зібрані фільми, які планує переглянути користувач; «Ми рекомендуємо» — рекомендації додатка; «Пошук фільмів» — де можна знайте фільми та серіали.
На початковому етапі втіленням в життя своєї ідеї я займався самостійно. Пізніше підключився друг, який налаштовував сервері. Потім у зв'язку з переробкою концепції, переходом від веб-сайту до мобільного додатку і розширенням функціоналу до розробки долучили серверного та мобільних розробників.
Складнощі
Крос-платформа. Одна з проблем полягала в тому, що ми хотіли випустити мінімально життєздатний продукт (MVP) на крос-платформі, щоб протестувати актуальність проекту і перенести його на Native. Тоді, коли почали розробка програми, з'єднання явився React Native. З огляду на ті, що хотіли запустити проект у найкоротші терміни, вирішили використовувати Cordova. Після реалізації низки проектів на React, побачили, що ця технологія більш продуктивна.
Зараз ми хочемо домогтися гарної статистики, щоб упевнитися в раціональності перенесення програми на іншу платформу, адже цей процес позику близько 4 місяців. Потрібно буде або заморозити проект, або паралельно розробляти проект на Native.
Інтерфейс. Як поєднати свайпи вліво і вправо з великою кількістю функцій програми (дивився, не дивився, хочу подивитися і т. д.)? Варіант «хочу подивитися — свайп вправо, не хочу — вліво», а внизу «оцінка» не виправдав надій: плей-тест показував, що люди не розуміють, чого від них хочуть. Від бездумних свайпів та оцінок навмання алгоритм починав працювати гірше.
Рішення прийшло тоді, коли ми цього зовсім не очікували. Влаштувавши виїзні пайові канікули з катанням на лижах в австрійських Альпах, мі, 3 кіномани, підключивши дизайнера і пляшку віскі, знайшли рішення.
Концепт ставши трохи складнішим, але можливість зробити помилку була зведена до мінімуму. Свайп вправо — користувач позначає, що фільм вже дивився, і йому пропонують поставити оцінку за десятибальною шкалою. Свайп вліво — фільм не був переглянутий раніше, тому потрібно вибрати один з 3 пунктів («не хочу дивитися», «хочу подивитися», «не визначився»). Ми пожертвували зручністю інтерфейсу заради того, щоб відсоток нерозуміння механіки звівся до нуля. У підсумку, користувач ставши розуміти, що і навіщо він робить, більш усвідомлено приймати рішення, після чого алгоритм видавав йому відповідні фільми.
Розчарування у фільмах. Перша підбірка для оцінки складалася з фільмів з високими балами топових рейтингів — і при цьому більшість з них люди просто не дивилися. Після 3 свайпів «не дивився» вони розчаровувалися і закривали додаток. Спочатку для вирішення проблеми просто поставили фільтри (стали коказувати фільми останніх 10 років), але це не допомогло.
Проблему довелося вирішувати вручну: зібралися командою розробників і за один вечір сформували перелік з 52 фільмів, які бачила більшість. Саме їх користувачі оцінюють у першій видачі.
Підбірка була складена з фільмів різних жанрів, щоб по їх закінченні в людини сформувалася різнорідна картина, і додаток міг направити її у будь-яке русло, в залежності від уподобань. Після цього кількість користувачів, які «пройшли перші 5 фільмів, склала 95%.
Зі специфічних проблем:
- У додатку ми використовуємо трейлери фільмів з YouTube. Щомісяця 10% YouTube-роликів стають недоступні, тому довелося розробити алгоритм аналізу і швидкої заміни недоступних відеороликів.
- Однойменні фільми. Як виявилося, їх існує досить багато. Доводиться ретельно аналізувати контент.
- Існує низка трейлерів, які захищені авторськими правами. Вирішуємо проблему автоматичним відсіюванням таких трейлерів.
- Основна частина проблем була юридичного характеру, а саме пов'язана з авторським правом на постери, які використовуються в додатку. Нам довелося витратити багато часу на складання звернення до правовласників, підбір постерів з певним типом ліцензії, а також розробка механізму, який допомагає швидко виключити фільм у разі запиту від правовласника.
Після випуску першого масштабного оновлення аудиторія Movie Expert почала активно зростати (наразі є близько 18 тис. користувачів). Ми ретельно аналізували всі коментарі, а також побажання людей. І тоді побачили, що у деяких користувачів iOS-пристроїв (з Android проблем немає) відбувається автоматичний вихід з облікового запису. Почалася активна робота над пошуком і відтворенням цього бага.
Нам вдалося з'єднання з'ясувати, що коли пам'ять iPhone переповнена, вночі відбувається очищення всіх локальних даних нашого сервісу. І зайшовши наступного разу, людина бачить порожній додаток. До речі, відтворити таку ситуацію вийшло досить випадково: один з наших співробітників завантажив велику кількість музики, чим заповнив всю пам'ять свого iPhone. А на наступний ранок відкрив Movie Expert і побачив, що не авторизований у додатку. Щоб вирішити цю проблему, ми впровадили перевірку користувача за ідентифікатором пристрою і не показуємо інтро та першу вступну підбірку.
Як виявилося, ця проблема вирішується на старих айфонах, але в останніх версіях операційних систем iOS ввели налаштування відображення рекламного ідентифікатора для додатків (за замовчуванням він прихований). За рахунок цього ми не можемо отримати ідентифікатор пристрою, тому нам доводиться генерувати йому свій ідентифікатор, який зберігається локально. А в разі, якщо iPhone очищає дані, ідентифікатор теж зникає, і для пристрою створюється новий ідентифікатор. Над вирішенням цієї проблеми ми все ще працюємо. В цілому, розробникі прагнуть збільшувати пам'ять на нових смартфонах, тому проблеми з авторизацією у користувачів зустрічаються все рідше.
Що в результаті
Перша версія додатку була доступна у липні 2017 року. Ми провели бета-тестування, зібрали фідбек, впровадили ряд доробок і в кінці січня 2018 року випустив оновлену версію, яка вже доступна в Google Play та AppStore. З iOS-версією все виявилося складніше — нам довелося пережити 5 перевірок від прискіпливих модераторів: співробітники компанії Apple ретельно тестують кожен додаток на всіх iOS-гаджети. Вони змогли відловити баг при запуску iPhone додатку на iPad, який полягав у тому, що при свайпі картка не зникала, її потрібно було вести пальцем до кінця екрану.
Додаток безкоштовний. Можна придбати одну з підписок на 3, 6 або 12 місяців. Вона дає доступ до всіх фільмів без перегляду реклами.
В оновленій версії користувачів очікують такі фічі:
- Щоденні підбірки фільмів на різноманітні тематики — відмінна альтернатива свайпам і рекомендаціям. Ми очікуємо, що це вмотивує людей частіше користуватися додатком.
- Розширений профіль зі статистикою за своїми оцінками і визначенням улюблених жанрів, а також система досягнення користувача з бонусами (критик, кіноман, сценарист, експерт).
- Тепер видачу можна додати серіали.
- Пошук фільму: можна відразу знайті кіно і додати його в список «хочу подивитися» або оцінити переглянуті раніше фільми. Додана функція «поділитися фільмом з одним» (посилання, при переході на яке відкривається сторінка фільму).
- PRO-режим — можливість отримати повний доступ до фільмів зі списку «Рекомендації», які обирає для користувача система на основі його оцінок. Деякі картки фільмів у цьому списку знаходяться під знаком питання. Якщо хочеш дізнатися, який це фільм, можна або подивитися рекламу, або купити один з PRO-режимів, і всі фільми будуть відкриті. Також можна побачити розширену статистику за своїми оцінками.
У найближчих планах:
- випустити оновлення з фільтрацією фільмів за актора;
- додати можливість коментувати фільми і серіали;
- створити стрічку, в якій можна буде стежити за оновленнями і оцінками друзів.
Завантажуйте додатки в AppStore і Google Play , оцінюйте, залишайте відгуки. Будемо вдячні за будь-який зворотній зв'язок про виконану нами роботу!
Опубліковано: 27/03/18 @ 10:58
Розділ Різне
Рекомендуємо:
Робота вночі: як висипатися і треба ставати жайворонком
Scala дайджест #8: перша версія Hydra, пререлиз Scala-2.13-M3, конференція ScalaUA
Кейс: Снижение стоимости конверсии в два раза и увеличение их числа в 2,2 раза для оптового интернет-магазина бижутерии
QA дайджест #33: інструменти тестування на JS, 12 найбільших програмних збоїв 2017 року і переклад книги "Node Hero"
Як стати хорошим ментором