Здравствуйте, уважаемые жители Хабры! Хочу поделиться с вами некоторым опытом организации сплит-тестирования на проекте, с которым мне довелось поработать, также прошу не судить строго, так как это моя первая статья и на огромную прибыль рассчитывать особо не стоит. .
Как мы все знаем, сплит-тестирование (A/B) на веб-сайте — это экспериментальный подход, целью которого является повышение конверсии любого процесса на ресурсе за счет отображения разного контента разным группам пользователей.
Целью задачи было организовать достаточно сложное тестирование разных вариантов контента (как статических, так и динамических), с возможным неограниченным количеством экспериментов и вариантов на каждой странице ресурса.
После некоторого анализа доступных готовых решений проблемы нам удалось найти несколько вариантов — это GWO (больше не существует как отдельный сервис, интегрированный в GA), решение на базе nginx И Визуальный оптимизатор веб-сайта .
Но ни один из них не подошел по ряду причин: внешние сервисы переносят рендеринг на клиентскую сторону, что может быть очень неудобно для сложных тестов, а nginx доступен не везде, плюс у разработчиков не всегда есть доступ к конфигурации веб-сервера.
и это также создает проблему размывания логики.
Поэтому я решил реализовать свой вариант велосипеда, на примере реализации модуля nginx. Мне также не понравились стандартные советы по реализации (остаток внесения последней цифры IP-адреса клиента и т.п.
), поэтому для определения вариантов я решил использовать контрольные суммы из тестируемого ключа - выгода от варианта заключается в использование абсолютно любых буквенно-цифровых клавиш, возможность создания огромного количества вариантов тестирования с любым процентом.
Выбор хеш-функции пал на МурмурХэш2 , так как он отличается очень хорошим распространением и, честно говоря, используется для хеширования в модуле nginx. Проект, над которым я работаю, реализован на PHP, для реализации хэш-функции я рекомендую использовать данный расширение.
Теперь коснемся подробнее реализации.
Чтобы определить ценность тестового примера для конкретного эксперимента, я реализовал класс SplitTestModel, используя его как синглтон:
Информацию о каждом эксперименте я помещаю в конфиг, который в моей реализации представляет собой массив вида:class SplitTestModel { public static function getInstance($key = ''){.
} private function __construct( $key ){.
} public function getSplitVariantByExperiment( $experimentName ){.
} }
array(
'Experiment1' => array(
'Variant1' => 50,
'Variant2' => 50
),
'Experiment2' => array(
'Variant1' => 15,
'Variant2' => 35,
'Variant3' => 12,
'Variant4' => *
)
);
Где ключ верхнего уровня — это название эксперимента, вложенные ключи — это имена вариантов, а соответствующие им значения — это процент показов, «*» означает все оставшиеся проценты.
Как уже стало понятно, ключ хешируется с помощью MurmurHash2. В примере, приведенном в первом эксперименте, со значениями хеш-функции от 0 до 50% от максимально возможного значения хеш-функции, пользователь получит вариант значения, равный «Вариант1», от 50% от максимально возможного значения до 100%.
- соответственно значение «Вариант2».
Удобство метода заключается в том, что теперь в любом месте кода для конкретного пользователя мы можем получить значения его варианта для любого из экспериментов и в зависимости от варианта выдать клиенту тот или иной контент любая часть страницы.
Пример использования: $variant1 = SplitTestModel::getInstance($user_id)->getSplitVariantByExperiment('experiment1');
$variant2 = SplitTestModel::getInstance($remote_addr)->getSplitVariantByExperiment('experiment2');
Все предельно просто!
Спасибо большое за внимание и еще раз прошу не судить строго.
Если кому-то интересно, буду рад выслать вам исходный код класса.
УПД: связь реализовать класс на github Теги: #php #A/B-тестирование #сплит-тестирование #php
-
Мальбранш, Никола
19 Oct, 24 -
Создание Самодостаточного Кластера Docker
19 Oct, 24 -
Thermalright X-Silent 140
19 Oct, 24 -
Moose: Ооп В Perl
19 Oct, 24 -
Простая Игра Sfml
19 Oct, 24 -
Как Мы Сделали Робота-Футболиста
19 Oct, 24