Архитектура А/Б тестирования: сделай сам

63
Архитектура А/Б тестирования: сделаи5 сам Сергеи5 Аверин Badoo

Upload: sergey-xek

Post on 14-Dec-2014

618 views

Category:

Technology


0 download

DESCRIPTION

Badoo — это большая социальная сеть с более чем 180 млн. пользователей. Большинство новых фич в нашей компании мы предварительно оцениваем посредством A/B тестирования. Вот уже примерно год мы используем собственный высоконагруженный фреймворк тестирования, при этом по моему мнению он очень прост, понятен, и не требует огромных ресурсов на разработку и поддержку. В докладе я расскажу вам о том, почему мы пришли к собственному решению, его архитектуру и принципы работы. Я уверен, каждый из вас может сделать что-то подобное для своего проекта и начать принимать более обоснованные решения. Тезисы: * Как мы раньше тестировали * Почему мы сделали свой инструмент * Архитектура: API, граф. интерфейсы, транспорт, скрипты, БД * Структура теста * Основные правила А/Б тестирования * Оценка результатов, примеры отчетов * И заключительная часть про то, что от человека с головой полностью не избавиться Для кого доклад: Для разработчиков и техн. менеджеров соц. сетей, сайтов объявлений, блогов с рассылками, проектов, продающих что-то через e-mail расслыки, разных коммьюнити-сайтов, банков и вообще проектов, где взаимодействие с каждым клиентом долгосрочное. Сложность: Несмотря на то, что конференция называется Highload++, я уверяю, что представленную здесь архитектуру может потянуть проект с посещаемостью в 1000 чел в день и тремя программистами в штате. Закодить все, что здесь рассказано на PHP займет меньше недели одного человека. А результат, между прочим, пожно вполне изменрять в живой прибыли.

TRANSCRIPT

Page 1: Архитектура А/Б тестирования: сделай сам

Архитектура  А/Б  тестирования:  сделаи5  самСергеи5  Аверин  

Badoo

Page 2: Архитектура А/Б тестирования: сделай сам

• Социальная  сеть  для  знакомств  • 195  миллионов  зарегистрированных  пользователей  • 10  миллионов  пользователей  в  день  • 2000+  серверов  • 50  тыс.  динамических  запросов/сек  • Разработка  в  Москве  и  Лондоне  • MySQL,  PHP,  C/C++,  Linux,  nginx,  memcached  • Много  своего,  в  т.  ч.  PINBA,  PHP-­‐FPM,  патчи  PHP,  PHPUnit,  MySQL

Page 3: Архитектура А/Б тестирования: сделай сам

Для  кого  доклад?

Для  сайтов,  где  • пользователи  идентифицированы  • есть  возможность  долгосрочно  отслеживать  пользователя  • пользователи  нужны  надолго,  и  заходят  на  сайт  периодически  • нужны  более  сложные  методики  оценки  успеха,чем  единоразовая  покупка/регистрация/заказ/звонок

Page 4: Архитектура А/Б тестирования: сделай сам

Сложность

• Выше  среднего,  но  ничего  космического  тут  нет  • Я  уверен,  что  вы  можете  сделать  то  же  самое  за  3  неделисилами  2—3  разработчиков  • Для  небольших  сайтов  архитектура  будет  сильно  похожа  • Результат  можно  измерять  в  реальной  прибыли

Page 5: Архитектура А/Б тестирования: сделай сам

Зачем  нам  понадобились  A/B  тесты

Раньше  мы  запускали  фичу  в  маленькой  стране  и  сравнивали  показатели  с  цифрами  до  запуска  или  в  соседних  странах  Но…  мы  растем:  • Для  всех  идей  стран  не  хватит  • Нужно  выбрать  из  нескольких  похожих  вариантов  • Хочется  более  достоверной  методики  оценки  • В  самом  худшем  случае  урон  невелик

Page 6: Архитектура А/Б тестирования: сделай сам

Почему  мы  сделали  свое

Page 7: Архитектура А/Б тестирования: сделай сам

Мы  пробовали  чужое

• Смотрели  несколько  сторонних  продуктов  • Выбрали  и  использовали  Optimizely…

Page 8: Архитектура А/Б тестирования: сделай сам
Page 9: Архитектура А/Б тестирования: сделай сам
Page 10: Архитектура А/Б тестирования: сделай сам

Проблемы  Optimizely  и  подобных  систем

• jQuery  • Внешний  CDN  • JS-­‐совместимость  с  нашим  кодом  • «Прыгающие»  страницы  • Нет  локализации,  поддержки  разных  языков  • Выбор  пользователей  по  языку,  полу  —  все  сам,  в  PHP-­‐коде  • Ограниченное  применение  —  нет  API,  только  JS-­‐код

Page 11: Архитектура А/Б тестирования: сделай сам

Но  главное  —  не  это

Page 12: Архитектура А/Б тестирования: сделай сам

А  то,  что  анализируем  только  клики

Большинство  докладов  про  А/Б  тестирование  —  из  мираe-­‐commerce:  • анализируем  посещаемость  трех  страниц  —  главной,  каталога  товаров,  страницы  товара  • анализируем  воронку  продаж  (где  пользователь  уходит)  • улучшаем  продажи  (клики  по  кнопке  «заказать»)  • Купил?  Следующий!

Page 13: Архитектура А/Б тестирования: сделай сам

Мы  —  не  интернет  магазин

• Анализируем  поведение  —  частота  заходов,  время  на  сайте,  кол-­‐во  чатов,  заливка  фото…  • Нужна  статистика  по  большему  количеству  параметров  • И  за  больший  срок,  чем  от  момента  захода  на  сайт  до  клика  по  цели  • Продажи  —  не  самое  важное

Page 14: Архитектура А/Б тестирования: сделай сам

Чем  свое  лучше  и  хуже

Плюсы  • Большая  применимость  • Большие  нагрузки  • Никакого  JS  с  внешнего  CDN  • Весь  ваш  функционал  локализации/переменных  доступен  !!

Минусы  • Надо  кодить  • Нагрузка  теперь  наша  • Статистику  считать  самим  • Сделать  свой  WYSIWYG-­‐интерфейс  редактирования  сложно  (но  и  не  нужно)

Page 15: Архитектура А/Б тестирования: сделай сам

Как  у  нас  устроены  тесты

Page 16: Архитектура А/Б тестирования: сделай сам

Письмо  с  плохим  кликрейтом

Page 17: Архитектура А/Б тестирования: сделай сам

Вариант  для  всех

Page 18: Архитектура А/Б тестирования: сделай сам

Вариант  для  мальчиков

Page 19: Архитектура А/Б тестирования: сделай сам

Вариант  для  девочек

Page 20: Архитектура А/Б тестирования: сделай сам

Структура  теста

Тест

Группа

Вариант Контрольный вариант Вариант

...

...

Группа

Вариант Контрольный вариант Вариант ...

Одно  исследование  с  определенными  срокамиНабор  критериев,  

описывающих  аудиторию  с  одинаковым  поведением  (группы  не  пересекаются)

Измененный  вариант  шаблона/поведенияИсходный  вариант  шаблона/поведения

Page 21: Архитектура А/Б тестирования: сделай сам

Структура  теста

Тест

Мальчики

Красная кнопка

Контрольный вариант

Зеленый заголовок

Девочки

Красная кнопка

Контрольный вариант Котики

Page 22: Архитектура А/Б тестирования: сделай сам

РезультатыГруппа Вариант Отправлено Кликов Кликрейт

Мальчики  

Контрольный 2000 100 5  %

Красная  кнопка 2000 110 5,5  %  (+0,5  %)

Зеленый  заголовок 2000 130 6,5  %  (+1,5  %)

Девочки

Контрольный 1000 35 3,5  %

Красная  кнопка 1000 30 3  %  (−0,5  %)

Котики 1000 50 5  %  (+1,5  %)

Page 23: Архитектура А/Б тестирования: сделай сам

С  высоты  птичьего  полета

Page 24: Архитектура А/Б тестирования: сделай сам

Хотелось,  что  бы  это  работало  так:

1)  Заходим  на  страницу,  выбираем  на  ней  текст,  создаем  несколько  версий  текста.  Или  выбираем  где-­‐то  в  бекофисе  константу,создаем  тест  с  несколькими  значениями  этой  константы.

Page 25: Архитектура А/Б тестирования: сделай сам

Хотелось,  что  бы  это  работало  так:

1)  Заходим  на  страницу,  выбираем  на  ней  текст,  создаем  несколько  версий  текста.  Или  выбираем  где-­‐то  в  бекофисе  константу,создаем  тест  с  несколькими  значениями  этой  константы.  

1)  Подготавливаем  несколько  шаблонов/css-­‐файлов/значений  2)  Настраиваем  параметры  теста  в  бекофисе  3)  Вписываем  в  код  выбор  шаблона  и  привязку  его  к  пользователю  4)  Выбираем  метрику,  по  которой  мы  будем  оценивать  результат  5)  Прогоняем  тест,  собирая  эту  метрику  и  кто  какой  шаблон  видел  6)  Берем  кого-­‐то  умного  и  анализируем  результаты

Page 26: Архитектура А/Б тестирования: сделай сам

А  теперь  архитектура

Page 27: Архитектура А/Б тестирования: сделай сам

А  теперь  архитектураСделаем  сначала  систему  сбора  статистики

Page 28: Архитектура А/Б тестирования: сделай сам

API Scribe-транспорт Разборщик статистики

База данных

Page 29: Архитектура А/Б тестирования: сделай сам

API

Функция  посылки  событий  • просто  пакует  данные+текущую  дату,  и  передает  в  транспорт  !

Stats::sendEvent($event_type, $user_id)Stats::sendEvent($event_type, $user_id, $param)

тип  события,  строка значение,  например,  «проголосовал  за»  —  1  «проголосовал  против»  —  0

Page 30: Архитектура А/Б тестирования: сделай сам

Scribe-­‐транспорт

не  теряем  данныефайлы  с  данными,  новый  файл  каждые  2  минуты,  каждое  событие  в  отдельной  папке

PHP-бекенды

Scribe-коллектор

100  000  000+  записей  в  день

Page 31: Архитектура А/Б тестирования: сделай сам
Page 32: Архитектура А/Б тестирования: сделай сам
Page 33: Архитектура А/Б тестирования: сделай сам
Page 34: Архитектура А/Б тестирования: сделай сам

Скрипт-­‐процессор  статистики

• Разбирает  эти  файлы,  и  кладет  в  БД  • Мультипоточный  разбор  с  блокировками  файлов  (в  PHP  —  flock())  • События  каждого  типа  —  в  отдельные  таблицы  • По  одной  таблице  на  день  • Выкидываем  повторные  события  там,  где  это  можно  • Там,  где  нельзя  —  делаем  BULK  INSERT’ы  • Для  некоторых  —  агрегируем  в  памяти/файлах  и  пишем  результат

Page 35: Архитектура А/Б тестирования: сделай сам

Скрипт-­‐процессор  статистики

Page 36: Архитектура А/Б тестирования: сделай сам

БД

• Подойдет  обычная  SQL-­‐СУБД,  например,  MySQL  или  Postgres  • Желательно  отдельный  сервер,  с  большим  кол-­‐вом  ядер  • Для  MySQL  лучше  использовать  XtraDB

Page 37: Архитектура А/Б тестирования: сделай сам

API Scribe-транспорт Разборщик статистики

База данных

Page 38: Архитектура А/Б тестирования: сделай сам

Дополним  схему  до  архитектуры  А/Б  тестирования

Page 39: Архитектура А/Б тестирования: сделай сам

API статистики

Scribe-транспорт Разборщик статистики

БД статистики

Page 40: Архитектура А/Б тестирования: сделай сам

API статистики

Scribe-транспорт Разборщик статистики

БД статистики

БД тестов

Page 41: Архитектура А/Б тестирования: сделай сам

БД  тестов

Тест

Группа

Вариант Контрольный вариант Вариант

...

...

Группа

Вариант Контрольный вариант Вариант ...

• id  (сквозная  нумерация)  • имя  • даты  начала-­‐конца  • статус

• id  (сквозная  нумерация)  • имя  • критерии  выбора  пользователей(пол,  страна,  язык…)

• id  (сквозная  нумерация)  • имя  • значение  переменной/имя  шаблона

Page 42: Архитектура А/Б тестирования: сделай сам

API статистики

Scribe-транспорт Разборщик статистики

БД статистики

БД тестов Бекофис-интерфейс

Page 43: Архитектура А/Б тестирования: сделай сам

Бекофис-­‐интерфейс

Создание/редактирование  тестов  • проверяет  непересекаемость  групп  • требует  указать  дату  начала/конца  

Управление  тестами  Дебаг:  • покажи  мне  как  выглядит  вариант  X?  • какой  вариант  был  для  юзера  Z?  • попадет  ли  в  тест  юзер  Y?

Page 44: Архитектура А/Б тестирования: сделай сам
Page 45: Архитектура А/Б тестирования: сделай сам
Page 46: Архитектура А/Б тестирования: сделай сам
Page 47: Архитектура А/Б тестирования: сделай сам
Page 48: Архитектура А/Б тестирования: сделай сам

API статистики

Scribe-транспорт Разборщик статистики

БД статистики

БД тестов Бекофис-интерфейс

API тестов

Page 49: Архитектура А/Б тестирования: сделай сам

API статистики

Scribe-транспорт Разборщик статистики

БД статистики

БД тестовMemcached Бекофис-интерфейс

API тестов

Page 50: Архитектура А/Б тестирования: сделай сам

API статистики

Scribe-транспорт Разборщик статистики

БД статистики

БД тестовMemcached Бекофис-интерфейс

API тестов

Page 51: Архитектура А/Б тестирования: сделай сам

API  тестов

ABTests::hit($User, $page)

• Выбирает  тест/группу/вариант  для  пользователя  и  страницы,где  он  находится  (если  есть  подходящие)  • Отправляет  эти  данные  в  статистику  как  факт  просмотра  определенного  варианта  • Возвращает  либо  null  (не  в  тесте),  либо  заданное  в  варианте  значение  —  имя  шаблона/тип  поведения/значение  переменной  • У  нас  доходит  до  3  млн  вызовов  в  день,  где  возвращается  не  null

Page 52: Архитектура А/Б тестирования: сделай сам

API  тестов

Тест

Группа

Вариант Контрольный вариант Вариант

...

...

Группа

Вариант Контрольный вариант Вариант ...

Равномерное  распределение

Пользователь  может  попасть  только  в  одну  группу,

т.  к.  они  не  пересекаются

сравнивать  результаты  можно  только  с    пользователями  той  же  группы,  а  не  со  всеми  остальными

Выбирает  пользователю  тест

Page 53: Архитектура А/Б тестирования: сделай сам

API  тестов:  выбираем  тест

!!Тестировать  надо  так,  чтобы  не  было  взаимовлияния  тестов  • $test_id  =  $user_id  %  $num_running_tests  —  плохо  

При  изменении  кол-­‐ва  запущенных  тестов  пользователи  должны  как  можно  меньше  перемещаться  между  тестами  • consistent  hashing  • заранее  сделать  несколько  наборов  пользователей  • выбирать  и  помечать  тех,  кто  еще  ни  в  каком  тесте

Тест Тест ...

Page 54: Архитектура А/Б тестирования: сделай сам

API  тестов:  выбираем  вариант

!!• по  остатку  от  деления  $user_id  %  $num_variants  —  не  хорошо  • по  crc32($user_id)  %  $num_variants  —  вполне  хорошее

Вариант Контрольный вариант Вариант ...

Page 55: Архитектура А/Б тестирования: сделай сам

Скрипт-­‐процессор  статистики

• Дорабатываем  скрипт  для  создания  таблицы  фактов  участия  в  тесте  в  БД  статистики  • Можно  сделать  подсчет  хитов

Page 56: Архитектура А/Б тестирования: сделай сам

API статистики

Scribe-транспорт Разборщик статистики

БД статистики

БД тестовMemcached Бекофис-интерфейс

API тестов

Page 57: Архитектура А/Б тестирования: сделай сам

Делаете  скрипт  копирования  тестов  в  базу  со  статистикой

API статистики

Scribe-транспорт Разборщик статистики

БД статистики

БД тестовMemcached Бекофис-интерфейс

API тестов

Page 58: Архитектура А/Б тестирования: сделай сам

API статистики

Scribe-транспорт Разборщик статистики

БД статистики

БД тестовMemcached Бекофис-интерфейс

API тестов

Интерфейс анализа

Page 59: Архитектура А/Б тестирования: сделай сам

Интерфейс  для  аналитика

• Программа-­‐клиент  для  MySQL  • JOIN  статистики  с  таблицей  фактов  WHERE  test_id  =  2  GROUP  BY  variant_id  

• Скрипт-­‐генератор  отчетов  • Бекофис-­‐страница  с  графиками  • Система  бизнес-­‐аналитики  • …

Page 60: Архитектура А/Б тестирования: сделай сам

Как  это  работает

Page 61: Архитектура А/Б тестирования: сделай сам

Как  это  работает

• Распихиваете  по  коду  сбор  статистики  • В  коде  обработки  запроса:  • дергаете  функцию  выбора  варианта  • null  и  контрольный  вариант  —  показываете  то  же,  что  и  обычно  • другое  —  показываете  новый  шаблон/вариант  поведения  

• Настраиваете  тест  в  интерфейсе,  прогоняем  тест  • В  БД  получаем  таблицы  со  статистикой,  фактами  просмотра  пользователями  вариантов  и  таблицы  с  описаниями  тестов  • Анализируем  результаты

Page 62: Архитектура А/Б тестирования: сделай сам

Оценка  результатов

• Условия  теста  не  должны  меняться  от  начала  до  конца  • Проверяйте  достоверность  результатов  (G-­‐test  confidence)  • Переводы  часто  портят  результаты  —  делайте  группы  по  языкам  • Проверяйте  гомогенность  групп  по  2—3  параметрам  • Иногда  для  разных  аудиторий  побеждают  разные  варианты  —  не  стесняйтесь  слать  мальчикам  одни  письма,  а  девочкам  другие  (только  без  фанатизма)  • Идея  смотреть  только  кликрейт  —  так  себе,  выбирайте  несколько  параметров

Page 63: Архитектура А/Б тестирования: сделай сам

@ryba_xek

ryba.xek

Много  интересного:  http://habrahabr.ru/company/badoo/blog/

Слайды, mind map, предыдущие доклады:

http://averin.ru/slides/[email protected]

Спасибо!  Вопросы?