Русский
Русский
English
Статистика
Реклама

Аналитика мобильных приложений

Игры, которые играют в людей что книга Игра в цифры рассказывает об игровой аналитике

10.03.2021 12:22:46 | Автор: admin
Из когда-то нишевого сегмента рынка игры сегодня превратились в высокодоходный транснациональный бизнес, опережающий по масштабам музыкальную индустрию и кинематограф. В игры уже вовлечено более 2,5 млрд человек (и это совсем не предел), а выручка ежегодно бьет новые рекорды. Причина этого не только в доступности игр и в росте свободного времени у населения: под капотом современных игр находятся технологии вовлечения, эффективно использующие математику, поведенческую экономику, психологию и дизайн. А в основе этих технологий системы игровой аналитики: именно они позволяют отследить поведение пользователей и определить наиболее цепляющие инструменты. И, в конечном счете, сделать так, чтобы люди проводили в играх как можно больше времени, получали максимум удовольствия и приносили максимум денег разработчикам.

Аналитика, таким образом, это кровеносная система современных игр, особенно в сегменте free-to-play (большинство бесплатных игр, в которых вам оставляют возможность заплатить за улучшения).

image

В конце прошлого года вышла книга Василия Сабирова Игра в цифры первое российское издание, полностью посвященное игровой (и продуктовой) аналитике. Под катом обзорный пересказ книги.

Дружелюбный гайд с небольшими недостатками


Василий Сабиров известный и опытный игровой аналитик, создатель компании devtodev, оказывающей аналитические услуги разработчикам. Главная целевая аудитория книги это те, кто интересуется механизмами создания и продвижения игр, но пока не имеет достаточной теоретической и практической базы: студенты, начинающие специалисты, стажеры и просто любители игр. Автор взял курс на дружелюбное объяснение на пальцах и выдерживает его до последней страницы, в равной степени доходчиво и терпеливо освещая большинство тем, с которыми сталкивается аналитик в повседневной работе от выбора профессии до когнитивных искажений.

Однако книга не лишена недостатков. Один из них то, что материал не вполне актуализирован. Точнее, не создает такого впечатления. По мере чтения понимаешь, что основой Игры в цифры стали статьи из корпоративного блога, публичных докладов и выступлений автора, которые дополнили и собрали под одной обложкой. На момент первой публикации, а это период с 2016 по 2019 гг., это была очевидно актуальная информация. Но сейчас скриншоты, диаграммы и примеры с 3-5-летними датами, как минимум, выглядят устаревшими: всем известно, какими темпами развивается и меняется игровая индустрия. И читатель, встретивший не очень свежую диаграмму, может и остальную информацию воспринять как устаревшую (хотя это совсем не так).

Еще один минус слегка искусственное вкрапление в книгу иллюстративных элементов. Василий Сабиров берется объяснить важные вопросы аналитики на примере условной игры про бегемотика, собирающего монетки. Для целевой аудитории это могло бы стать великолепным сквозным примером, который объединил бы все главы и всё повествование вокруг себя. Но, увы, автор использует эту игру поверхностно, в основном как сюжет для картинок. Как итог, книга выглядит менее целостной, чем могла бы быть за счет реализации единого сквозного примера.

Наконец, еще один небольшой недостаток это оформление ссылок. В общем, с этим в книге всё в порядке (есть справочный аппарат и список рекомендованных материалов), но встречаются и случаи небрежного отношения, когда ссылки просто никак не обозначены: есть название материала-источника, но не указано, где с ним можно ознакомиться.

Тем не менее, перед нами первое оригинальное российское издание об игровой аналитике, которое полностью справляется со своими задачами: дает объемное представление об этой области и понятно рассказывает, как именно применение аналитических инструментов помогает оптимизировать игровой процесс на всех его этапах.

Измеряй и властвуй!


image

В центре внимания книги free-to-play-проекты. Во-первых, потому что такими проектами занимается автор книги. А во-вторых, именно условно-бесплатные игры требуют особого подхода, именно они подразумевают аналитику, именно в применении к ним аналитика может раскрыться во всей красе, ведь жизненный цикл и экономика таких игр требуют нон-стоп-аналитики.

Первые главы книги максимально популярным языком объясняют, в чем заключается работа продуктового аналитика и его стандартный рабочий день. Автор сравнивает их с работой доктора, который ежедневно замеряет температуру и берет анализы, чтобы в итоге выписать наиболее подходящее лекарственное средство и вылечить пациента. При этом найти на рынке кандидата, идеального для роли аналитика, сложно даже по нынешним временам. По мнению автора, лучший способ это выращивать аналитиков внутри компании, руководствуясь, прежде всего, общей адекватностью кандидатов, любовью к играм и техническим бэкграундом.

Потребность в аналитике возникает сразу, как только у будущей игры появляется прототип: то, что будет делать будущий игрок, даже на ранних этапах, должно передаваться в аналитическую систему. Но не совсем всё, а те ключевые события, которые считаются значимыми для игры, и события-окружения (то, что игрок делает непосредственно до или после). К примеру, если вы отслеживаете событие внутренней покупки, то целесообразно включить в список то, что его окружает: вход в магазин, выбор товара, первое применение приобретенного товара, отзыв о покупке в социальных сетях и т.п.

Важнейший этап развития проекта soft launch (выпуск игры для ограниченной аудитории для тестирования и проверки на прочность). Наиболее популярные метрики на этом этапе:

  • 0-day Retention: доля вернувшихся в игру в течение 24 часов;
  • 1-day Retention: доля вернувшихся на следующий день;
  • Tutorial Retention и конверсия туториала: доля тех, кто прошел обучение (а также скорость его прохождения и доля тех, кто пропустил этот этап);
  • накопительный ARPU за N дней: сколько выручки в среднем приносит аудитория за период;
  • 7-day Retention: доля игроков, вернувшихся в игру через 7 дней после первого запуска.

image
Карта популярных метрик

Все метрики, при этом, в идеале должны быть основаны на определенном идейном фундаменте. И это тоже метрика, которая называется North-Star Metric (метрика Полярной звезды, NSM) и напрямую связана с уровнем лояльности пользователей. Полярная звезда объединяет доходность проекта, ценность для пользователей и измеримость. Определяя свою NSM, разработчики тем самым отвечают на вопрос для чего всё это, что в их бизнесе является ключевым.

Автор не только подробно разбирает виды метрик удержания, но и дает много советов и рекомендаций по увеличению лояльности пользователей. В частности, очень важно, чтобы уже во время первой сессии игрок дошел до совершения целевого события т.н. ага!-момента, которым, к примеру, будет прохождение уровня или победа над первым боссом. Это означает, что пользователь разобрался с приложением (говорят, что произошла активация игрока) и вернется в него на следующий день.

Одна из важных задач аналитика выявить закономерности оттока (churn rate) игроков. Причинами оттока могут быть различные факторы качество самого продукта, высокая стоимость, привлечение нецелевой аудитории, переполненный рынок, проблемы с уровнем сложности (слишком хардкорный или, наоборот, без челленджа) и т.д. Соответственно, книга предлагает несколько путей уменьшения churn rate, в том числе:

  • создать правильное впечатление во время первой сессии, от которой зависит очень многое и которая определяет retention последующих дней;
  • изучать отзывы пользователей о приложении, чтобы понять, чем они недовольны и чего не хватает, а также использовать метрику Net Promoter Scope (NPS, индекс потребительской лояльности, основанный на опросах типа какова вероятность, что вы порекомендуете нашу игру);
  • напоминать пользователям о продукте, сообщать о новых функциях, бонусах, персональных предложениях посредством push- и email-уведомлений.
  • варьировать сложность, чтобы поддерживать интерес игроков.
  • быть лучше конкурентов, изучать потребности клиентов, их изменение, развивать и совершенствовать продукт.

Как только у проекта набирается пул игроков, в ход идут метрики игровой активности. Они учитывают, сколько активных пользователей (т.е. тех игроков, у которых была хотя бы одна сессия) получает игра за определенный период как правило, за день (метрика DAU), неделю (WAU) и месяц (MAU). Дополнительные показатели CCU (Сoncurrent Users пользователи, находящиеся в приложении в данный момент) и PCCU (пиковый показатель одновременной посещаемости).
Количество активных пользователей один из важнейших показателей продукта, который косвенно указывает на его успешность, сочетая в себе и качество привлечения новых пользователей, и метрики удержания, непосредственно влияя на доход. Поэтому при анализе активных пользователей стоит обращать внимание еще и на скорость роста аудитории, ведь эта метрика является одним из самых позитивных признаков активного развития продукта.

Монетизация и как ее не упустить


Именно на эффективной монетизационной системе строится успех всех условно-бесплатных игр и, конечно же, Игра в цифры отводит этой теме центральное место. Сенсаций здесь нет: все метрики выстроены вокруг конверсионной воронки, приводящей определенный процент игроков к платежу. Тем не менее, книга дает множество практических рекомендаций по анализу и повышению конверсии.

image
Пример, показывающий суммы и количество транзакций разных сегментов пользователей

  • Конверсию в платеж нужно считать не общей массой, а отдельно для первых и повторных платежей, а также учитывать платежи в разрезе стадий или уровней игры.
  • При анализе конверсии обязательно применять когортный подход для разных партий пользователей ее показатель может заметно отличаться. В особенности это важно, если вы проводите эксперименты по привлечению пользователей и оцениваете их эффективность.
  • Важная монетизационная метрика Paying Share, т.е. доля платящих пользователей от всей аудитории за определенный период. Зачастую она очень небольшая за исключением 1-2%, пользователи f2p-игр предпочитают не платить. Платящие игроки это самые ценные в проекте, но ведут они себя очень по-разному. Поэтому аналитику необходимо правильно их сегментировать, так чтобы пребывание в продукте стало для них максимально удобным и полезным.
  • Традиционно среди платящих пользователей выделяю три основных категории по размеру платежей: киты (whales, самые крупные платежи), дельфины (dolphins, середнячки) и пескари (minnows, небольшие суммы), плюс промежуточные сегменты. Другие варианты по количеству совершенных платежей (как часто платят), по времени совершения платежа (демонстрирует скорость конвертации).
  • Киты приносят основной доход, но найти их очень непросто. Как правило, киты покупают премиум-аккаунты, дополнительные уровни, необычное оружие и игровые предметы. Одна из задач геймдизайнеров найти потенциальных китов среди уже существующих игроков и предоставить им возможность потратить ту сумму, которую они готовы отдать.
  • Отдельный инструмент сегментации RFM-анализ: пользователи делятся на группы в зависимости от давности (Recency), частоты (Frequency) и общей суммы (Monetary) их платежей. По каждому из критериев выставляются баллы, и итоговая сумма баллов относит пользователя к тому или иному сегменту. В итоге можно выделить тех, кто платит часто, много и недавно (и направить ресурсы на их удержание), тех, кто платил мало и недавно (и стимулировать их на повторные платежи), или же тех, кто платил много, часто, но давно (и попробовать вернуть их в проект через push-уведомление, бонус или скидку).
  • Хорошо известный аналитикам показатель ARPU, средний доход с приложения на одного пользователя. ARPU позволяет увидеть, насколько эффективны ценовые эксперименты, правильный ли трафик мы используем, на правильный ли сегмент мы нацелились для монетизации. Чем выше ARPU тем больше доход игры. Производные от этой метрики ARPPU (средний доход от платящих пользователей) и Cumulative ARPU (суммарная выручка за определенный период от определенной когорты пользователей). Эти метрики позволяют прогнозировать, когда и какую сумму вам принесут новые пользователи из разных сегментов.
  • Еще одна важный инструмент, предлагаемый автором, FTPUE (First Time Paying User Experience). Это анализ тех обстоятельств и событий, которые сопровождают первую покупку. Важно понять, чем руководствуется пользователь, что его стимулирует и проверить гипотезы на других пользователях.

Одним из результатов применения метрик становится воронка конверсий. Фактически это последовательность пользовательских действий, которая показывает, сколько уникальных игроков совершили каждое из них. Воронка используется для исследования поведения пользователей и слабых мест, на которых они отваливаются. С помощью воронки можно анализировать совершенно разные процессы в продукте: от прохождения туториала до совершения покупки, а также изучать и оптимизировать маркетинговые процессы: email-рассылки, привлечение трафика и, конечно, акции об их проведении автор рассказывает в отдельной главе. Не менее важны профили пользователей, хранящие информацию об истории покупок, пройденном прогрессе в игре, данные о времени установки, устройстве и т.д.

Культура аналитики


Заключительная часть книги посвящена вопросу развития data-driven-культуры подхода к управлению компанией на основе данных. Во главу угла ставится не интуиция и произвольные решения, а A/B-тест контролируемый способ проверки гипотез. В работе data-driven-компаниях выделяются несколько этапов: подготовка и анализ данных (именно это и делает аналитик); принятие решения, исходя из полученной информации (и опытный аналитик должен такое решение предложить); наконец, реализация решения, которая вновь запускает цикл процессов с начала.
Можно выделить следующие особенности data driven-культуры.

  • Руководители data-грамотны; они знают, что без отчета никуда.
  • Высокая культура A/B-тестирования. Если мы не уверены (а так чаще всего и бывает) мы проверяем гипотезу через сплит-тест.
  • Аналитики генерируют идеи, а не только предоставляют отчеты. Проактивность, запомните!
  • Совместный синтез гипотез. Аналитик в принятии решений ничуть не менее важен, чем продюсер.
  • Мы не знаем ответ, давайте найдем его с помощью анализа. Выжжем эту фразу на сердце железом раскаленным.


Заключение


В целом, Игра в цифры это отличное пособие для начинающего игрового аналитика, основательное введение в аналитическую кухню геймдева. Книгу можно рекомендовать всем, кто хочет получить представление о том, как развиваются и зарабатывают популярные современные игры и приложения, и о том, как данные из областей психологии, математики и экономики используются для того, чтобы игроки получали наслаждение, а разработчики заслуженную (или не очень) прибыль.

Подробнее..

Перевод А вы знали, что 85 смартфонов работают на Linux?

26.03.2021 12:06:50 | Автор: admin


По факту на рынке смартфонов доминирующее положение занимают именно устройства на базе Linux. Некоторые от такого заявления призадумаются, другие же преисполнятся гордостью за Linux в стиле The Sound of Music The Hills are Alive. Далее я приведу интересные факты, подтверждающие, что в основе 85% смартфонов действительно лежит ядро Linux, а также представлю ряд многообещающих новинок этого рынка.

Нередко в ходе общения с профессионалами вне рабочего пространства меня спрашивают: Чем ты занимаешься?. Когда я отвечаю, что работаю системным аналитиком Linux, многие реагируют так: А мне не особо нравится Linux, потому что в нем нельзя открывать или редактировать документы Word* или Ты имеешь ввиду ОС для настольных ПК, в которой все в виде текста, и отсутствует графический интерфейс?** и даже так Linux? Это что?. В ответ я обычно строю ехидную гримасу с вопросомА вы в курсе, что сами прямо сейчас используете смартфон, работающий на Linux?.

Да, на самом деле, как многие из вас знают, в основе дистрибутивов Android и Chrome OS изначально лежит ядро Linux.

Android-смартфоны работают на Linux



Как заявляют сами разработчики Google: Android построен на открытом Linux Kernel (ссылка содержит видео). Начиная с Android 11, эта ОС базируется на LTS-ядре (ядро с долгосрочной поддержкой) Linux, а именно его версиях 4.19 и 5.4.

Говоря конкретнее: С 2019 года при каждом размещении Линусом Торвальдсом очередного релиза или пре-релиза главная ветка Linux сливается с главной веткой Android. До 2019 года ядра Android собирались путем клонирования свежего LTS-ядра и добавления в него Android-патчей. Новая модель взаимодействия позволяет избежать существенных усилий по переадресации портов и тестированию патчей Android, реализуя все это пошагово. source.android.com

Есть очень информативное видео (правда в 240p), раскрывающее строение архитектуры Android, в котором инженер Google объясняет, что при использовании в основе Android архитектура ядра Linux дорабатывается. Есть и более свежее видео в лучшем качестве, которое отвечает на вопрос: Действительно ли Android это, по сути, Linux?. Глава подразделения открытых проектов Google, Крис ДиБона, описывает Android так: Десктопная мечта Linux, ставшая реальностью.

Убедившись, что Android-смартфоны действительно работают на базе Linux, можно вкратце ознакомиться с данными некоторых исследований, а также узнать о новых перспективных моделях устройств и некотором сопутствующем ПО.

Исследования рынка


В ноябре 2020 года компания IDC опубликовала исследование, которое показало, что системы Android занимают лидирующее положение на рынке смартфонов. Согласно собранным данным, в течение последнего квартала было продано около 261.1 миллионов устройств, 85% из которых на базе Android.

По информации Gartner и Statista эта платформа на данный момент занимает 86% мирового рынка. Взгляните на график ниже, демонстрирующий двух основных игроков индустрии Android и Apple iOS.



Многообещающие смартфоны на базе Linux


Если вас интересуют смартфоны на ядре Linux, то советую присмотреться к описываемым далее моделям, а также сопутствующему ПО.

Librem 5 безопасность и конфиденциальность



Purism, известная по разработке ноутбуков с Linux, фокусирующихся на конфиденциальности и бесплатном ПО, успешно провела краудфандинговую кампанию для создания нового смартфона Librem 5. При этом разработчикам удалось собрать на 1 миллион долларов больше, чем планировалось.

Смартфон Librem 5 основан на Debian Linux и по умолчанию оснащен механическими выключателями оборудования, гарантирующими безопасность и конфиденциальность использования. В качестве операционной системы используется GNU/Linux с поддержкой бесплатного ПО. puri.sm

Pinephone власть пользователям



PinePhone это смартфон от компании Pine64, разработавшей Pinebook Pro. Основной замысел состоит в предоставлении пользователю полного контроля над устройством. Обеспечивается это за счет использования мобильных ОС на базе стандартной Linux и оснащения корпуса 6 выключателями элементов оборудования, доступными под задней крышкой. В добавок к этому, конструкция собирается на винтах, что упрощает последующий ремонт и апгрейд. pine64.org

F(x)tec Pro обладатель полноценной QWERTY клавиатуры



Pro1 это сенсорный смартфон с выдвижной горизонтальной клавиатурой. Он разработан и производится компанией F(x)tec, базирующейся в Лондоне. Это устройство представляет собой более совершенную альтернативу клавиатуре Moto Mod Livermorium. На данный момент сообщество Pro1 уже помогло в разработке ОС на базе Linux, и вскоре также планируется поддержка Sailfish. fxtec.com

Ubuntu Touch для смартфонов и планшетов



Ubuntu Touch (ранее Ubuntu Phone) это мобильная версия ОС Ubuntu, изначально разработанная компанией Canonical Ltd. Сейчас ее разработкой занимается сообщество UBports. Спроектирована она главным образом для сенсорных мобильных устройств, а именно смартфонов и планшетов. Эта платформа полностью независима и поддерживается исключительно сообществом.

Вот список устройств, находящихся на разной стадии поддержки этой ОС, в который также входит Fairphone 3. Более зрелые устройства позволяют удобную установку системы с помощью UBports. Для тех же, что находятся на ранней стадии поддержки, обычно установка делается вручную. ubuntu-touch.io

Plasma Mobile от создателей KDE Plasma



Plasma Mobile это вариант Plasma для смартфонов. На данный момент она доступна для Nexus 5 и Nexus 5x, а также PinePhone и устройств, поддерживаемых postmarketOS. Работает Plasma Mobile на протоколе Wayland и при этом совместима с приложениями Ubuntu Touch. 1 декабря 2020 года KDE совместно с Pine64 анонсировали возможность предзаказа PinePhone KDE Community Edition. plasma-mobile.org

А какое ядро в вашем Android?


Для получения расширенного доступа к Linux потребуются рут-права, но ради чисто спортивного интереса предлагаю просто заглянуть в стандартную систему Android, чтобы узнать, какая у вас установлена версия Linux Kernel. В большинстве Android-смартфонов ее можно посмотреть в разделе Настройки > Об устройстве (иногда нужно нажать на версию Android).

Если же рут-права у вас есть, то обычно можно установить Termux, после чего запустить его и ввестиuname -a

В ответ команда вернет примерно такой вывод (на устройстве OnePlus):


Конечно же, рутованное устройство с доступом к терминалу обеспечивает много крутых возможностей. Например, с помощью top или htop можно использовать командную строку для установки пакетов, удаления приложений, запуска служб и т.д.

Заключение


Армия андроидов продолжает захватывать рынок смартфонов. Главная причина в том, что в их основе лежит открытое ПО, дающее опытным пользователям и инженерам свободу для исследования, разработки и совершения новых технических прорывов.

Надеюсь, что перечисленным в статье смартфонам удастся занять на рынке весомую долю. К другим приметным карманным устройствам на Linux можно отнести NecunOS NE_1, Fenniy, Cosmo Communicator и Volla Phone.

Напоследок добавлю, что буду рад, если с Linux познакомится как можно больше пользователей, которые оценят его преимущества и пополнят уникальное сообщество.
Даешь свободу и власть пользователям!

Сноски


* По факту Linux поддерживает просмотр и редактирование файлов Word, таблиц Excel и прочих, причем не только на настольных ПК, но также на планшетах и смартфонах.
** Для Linux есть гораздо больше вариантов графического интерфейса, чем для любой другой операционной системы. К примеру, Gnome, KDE, Xfce и многие-многие другие.

Подробнее..

Cognitive therapy и мобильные приложения против невротической депрессии

31.05.2021 20:20:52 | Автор: admin

Только примерно 20% больных реальной депрессией ищут медицинскую или психологическую помощь, причем большинство из них обращаются к участковым терапевтам и неврологам. Те, в свою очередь, не всегда готовы к правильной диагностике, вследствие чего лишь около 30% депрессий (из числа 20% обратившихся) диагностируются своевременно и из них лишь 25% пациентов, в среднем, получает необходимую антидепрессивную терапию, лекарственную или иную. Трагичность (почему бы и не да) этих цифр тем более очевидна, если учесть тот факт, что в 60-70% случаев правильное научное лечение приносит пациентам быстрый желаемый эффект.

Я не буду рассказывать дальше, как бывший детско-подростковый психиатр, про лечение психотропными препаратами (которые без плацебо только, конечно) и про другие методы физического лечения, хотя есть несколько десятков международно доказанных методик, например, определённые физические упражнения, массаж, светотерапия и т.д. (если надо, то могу потом, ибо обе диссертации именно про это были).

Скажу только, что современные антидепрессанты могут более безопасно сочетаться с другими лекарственными средствами (антигипертензивными, бета-блокаторами, антацидами, антигистаминными препаратами, оральными контрацептивами), другими психотропными препаратами (нейролептиками, транквилизаторами), они также не взаимодействуют с алкоголем и уж, конечно, во всём мире их назначают вместе с разной психотерапией (ПТ). Мне хочется рассказать про самое лучшее направление ПТ - когнитивную терапию (КТ), ибо она самая доказанная, самая краткосрочная (быстрая) и крайне прозрачная по механизму действия. На Хабре её уже частично описывали, как и депрессию вообще, поэтому мне придётся, к счастью, рассказать только про несколько конкретных приёмов КТ и мобильные приложения по профилю).

Весь прикол КТ в том, например, что известен эксперимент, в котором однажды один ученый впрыскивал в кровь испытуемым добровольцам в большой дозе адреналин, не говоря им, что это он. Люди становились психосоматически и объективно, по показаниям приборов, возбужденными, но 2/3 из них заявляли, что не испытывают никаких эмоций, а 1/3 говорила, что испытывала что-то похожее на эмоцию. Исследования других ученых показали, что одного физиологического возбуждения (или другого ощущения) недостаточно для возникновения эмоции, необходимо, чтобы человек распознал это реальное возбуждение, осознал, оценил и обозначил его словесно, мысленно, как это ему свойственно. Например, учащенное после подъема по лестнице на 10-й этаж сердцебиение ипохондричный пессимист назовет страшным приступом тахикардии, а спортивный оптимист - кайфовой тренировкой кровообращения. Изменения в организме у обоих одинаковые, но через минуту или час у первого настроение и здоровье ухудшится (приболел), а у второго - улучшится (потренил), причем не только субъективно, но и объективно, по показаниям самых современных высокоточных приборов. Получается, что отрицательные или положительные эмоции - следствие привычного (чаще наученного или наследственного) оценивания и убеждения в том, что они вызваны вредной или полезной данной конкретной причиной. Приблизить субъективное к объективному ради здоровья и успеха первоклассно помогает как раз КТ.

Начало практики когнитивной самокоррекции включает более подробное информирование о её философии (коротко повторим - эмоциональные проблемы вызывают не сами события, а их оценка) и о последовательных этапах восприятия события человеком в виде:

Ао --> Ас --> В --> C

Ао - объективное событие (как бы описанное научной группой каких-либо внешних наблюдателей), Ас - субъективно воспринятое событие (описанное вами), В - ваша система оценки, предопределяющая, какие параметры объективного события будут восприняты и будут значимы, С - эмоциональные и поведенческие последствия воспринятого события, в том числе и медицинские симптомы.

Описательные мысли, как уже отмечалось, соединены с оценочными установками связями разной степени жесткости. Начиная от абсолютно исключающих какие-либо варианты, протекающих по типу рефлекса, при которых отношение к событию уже предопределено и тогда можно говорить о наличии у вас иррациональной установки (ИУ), заканчивая многовариантными, когда при принятии решения о действии осуществляется анализ альтернативных вариантов, хотя он может протекать неосознанно, и тогда можно говорить о наличии рациональной установки. Цель КТ перевод в проблемных ситуациях с иррациональных, депрессивных и стрессовых установок на максимально рациональные и приятные.

Работа в КТ всегда строится с учетом схемы А, В, С. Сначала:

Первый этап - выяснение, прояснение слагаемых события (А), в том числе элементов, наиболее эмоционально затронувших вас, вызвавших неадекватные реакции. Фактически у всех нас на этом этапе происходит индивидуальная, личностная оценка события. Выяснение же позволяет вам различать события, которые могут или не могут быть изменены. При этом цель когнитивной СК - не поощрение вас к уходу от столкновения с событием, не резкое изменение его (например, переход на новую работу при наличии неразрешимого конфликта с начальником), а осознание системы оценочных убеждений, затрудняющих разрешение этого конфликта, перестройка ее и только после этого - принятие решения об изменении ситуации. В противном случае вы сохраняете потенциальную уязвимость в сходных ситуациях, т.к. от себя уйти никому ещё не удавалось.

Второй этап - понимание следствий (С), прежде всего эмоциональных воздействий события. Цель этого этапа - выявление всего диапазона душевных реакций на событие. Это необходимо, поскольку не все эмоции легко узнаются вами. Некоторые из них подавляются и поэтому не осознаются из-за включения рационализации, проекции, отрицания и некоторых других психологических механизмов защиты.

У кого-то из нас осознание и вербализация (проговаривание) испытываемых эмоций затруднены также из-за словарного дефицита (например, великое спокойствие - это не просто не- раздражительность), у других из-за поведенческого дефицита (нет в арсенале стереотипов и примеров поведения и мышления, обычно связанных с умеренным проявлением эмоций). И потому такие люди реагируют полярными эмоциями, например или безумно сильной любовью, или полным отвержением, без золотой середины.

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

а) самонаблюдение за мимическими проявлениями при вашем воспоминании об эмоции и предоставление письменной обратной связи вами самими,

б) высказывание предположений о чувствах и мыслях у другого человека в подобной ситуации (обычно такое высказывание соответствует вашим неосознаваемым эмоциям).

Под такими ошибками мышления имеется в виду нарушение когнитивной переработки информации, которое искажает видение объекта или ситуации. Ложные мысли путём самовнушения становятся причиной сверхценных идей и, следовательно, неадекватных эмоциональных реакций и, затем, поведения, в том числе, конфликтного. Поэтому целью когнитивной самокоррекции (и индивидуальной и семейной) является исправление неадекватных мыслей.

Выявление системы оценочных мыслей (как иррациональных, так и рациональных установок) облегчается, если два предшествующих этапа реализованы полноценно. Осознанию же их помогают также такие конкретные приемы:

a) вспоминательная фокусировка на тех мыслях, которые приходили Вам на ум в момент столкновения со стрессовым событием,

b) высказывание вами самими гипотетических предположений типа У меня в такой стрессовой ситуации возникли бы следующие мысли,

c) вопросы с проекцией в будущее время, например: Предположим, что произойдет самое худшее в ситуации стресса, что же это будет? и др.

Выявлению ИУ очень здорово помогает анализ используемых вами слов. Обычно с иррациональными установками связаны слова, отражающие крайнюю степень вашей эмоциональной вовлеченности в депрессию или стресс (ужасно, потрясающе, невыносимо и др.), имеющие характер обязательного предписания (необходимо, надо, должен, обязан и др.), а также глобальных, абстрактных оценок лица, объекта или события (совсем плохо, всегда хорошо). И все эти слова и мысли неконкретны, нереальны, неэффективны и болезнетворны. Можно доказать это. Легко.

Самая распространенная группа ИУ, создающих всеразличные проблемы - это катастрофические установки (отмечайте тут возможные ваши):

Я настолько расстроен(а) и несчастлив(а), что не могу это выдержать.

Мое будущее безнадежно, и ничто не может измениться к лучшему.

Я чувствую, что как личность, я полный(ая) неудачник(ца).

Я полностью не удовлетворен(а) жизнью и мне все надоело.

Я постоянно испытываю чувство вины.

Я чувствую себя уже наказанным(ой).

Я себя ненавижу.

Ко мне приходят мысли покончить с собой, но я не буду их осуществлять.

Я виню себя во всем плохом, что происходит.

Раньше я мог(ла) плакать, а сейчас не могу, даже если мне хочется.

Теперь я постоянно чувствую, что раздражен(а).

Я полностью утратил(а) интерес к другим людям.

Я с трудом заставляю себя сделать что-либо.

Я полностью утратил(а) сексуальный интерес.

Мой аппетит теперь значительно хуже.

Я очень обеспокоен(а) своим физическим состоянием и мне трудно думать о другом.

Если у вас даже один или более плюсов следует обратиться к врачу-психотерапевту или психологу. Есть про это опросники, вот два примера аппликаций в ГуглПлее - Тест на депрессию и моя старая модификация Тест оценки депрессии.

С другой стороны, чем чаще вы повторяете про себя, как формулу самовнушения, эти вышеперечисленные фразы и слова - установки, тем больше они имеют возможность стать депрессивной реальностью. Я всей душой желаю, чтобы у вас не было таких самоощущений и самоубеждений. А были светлые и весёлые.

Следующие же духовные враги психосоматического здоровья и эффективного развития, которых тоже желательно заменять на более оптимистичные и уверенные убеждения, менее катастрофичны и опасны, нежели предыдущие, но зато чаще встречаются у всех нас (ставьте мысленно плюсы, если есть соответствия):

Я расстроен(а).

Я все время расстроен(а) и не могу от этого отключиться.

Я чувствую, что озадачен(а) будущим.

Я чувствую, что меня ничего не ждет в будущем.

Я чувствую, что пережил(а) больше неудач, чем другие люди.

Когда я оглядываюсь на мою жизнь, я вижу в ней очень много неудач.

Я не получаю столько же удовольствия от жизни, как и раньше.

Я больше не получаю удовлетворения ни от чего.

Достаточно часто я чувствую себя виноватым(ой).

Большую часть времени я чувствую себя виноватым(ой).

Я чувствую, что могу быть наказан(а).

Я ожидаю, что могу быть наказан(а).

Я разочаровался(ась) в себе.

Я себе противен(на).

Я критикую себя за ошибки и слабости.

Я все время обвиняю себя за свои проступки.

Сейчас я плачу чаще, чем раньше.

Теперь я все время плачу.

Я более легко раздражаюсь, чем раньше.

Я меньше интересуюсь другими людьми, чем раньше.

Я почти потерял(а) интерес к другим людям.

Я чаще, чем раньше, откладываю принятие решения.

Я больше не могу принимать решения.

Я знаю, что выгляжу безобразно.

Мне необходимо сделать дополнительное усилие, чтобы начать делать что-нибудь.

Я совсем не могу выполнить никакую работу.

Сейчас я сплю хуже, чем раньше.

Я просыпаюсь на 1-2 часа раньше обычного и мне трудно заснуть опять.

Теперь я устаю быстрее, чем раньше.

Я устаю почти от всего, что я делаю.

Я не могу ничего делать из-за усталости.

Мой аппетит стал хуже, чем раньше.

Сейчас я значительно меньше интересуюсь сексуальными вопросами.

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

Я настолько обеспокоен своим физическим состоянием, что больше ни о чем не могу думать.

Результаты: 0-1 нормально, до 5 плюсов требуется помощь психолога, более 5 нужно к врачу-психотерапевту или психиатру.

Цель диагностического этапа реализована, когда в области стресса или депрессии выявлены такие или им подобные ИУ, показан характер связи между ними и отношениями в семье, на работе и т.д. Уточнение рациональных установок и целей также необходимо, поскольку они составляют ту позитивную часть отношения, которая в последующем может быть расширена. Что мы и сделаем, насколько это возможно, чуть дальше. Хотя в приложения есть хорошие для здесь и сейчас), например - Mindspa: психологическая помощь в любой момент или Психология самооценки: 6 практик. Личностный рост с BestHelp Психологическая помощь онлайн.

Если мы поняли, что восприятие любого объекта или события оценивается мышлением (внутренней речью) и, только осознав это думательное звено, можно понять и улучшить свои любые эмоциональные и поведенческие реакции, что психологические нарушения, предшествующие этапу нейрофизиологических и телесных расстройств, связаны с ошибками мышления у любого из нас, то можно начинать психокоррекцию.

Чтобы успешно уменьшить депрессию и любые неприятные мысли, обязательно нужно понять и принять базисное и наиглавнейшее положение когнитивной самокоррекции о зависимости эмоций от мышления: Если мы хотим изменять чувства, надо изменять вызвавшие их идеи. КТ уже началась сразу после осознания и принятия вами самими (и только так) некоторых ваших суждений и идей о проблемах и желаниях с постепенным переводом некоторых из них на позиции улучшения ИУ.

Работу, которую проводит когнитивный психотерапевт с клиентом, можно сравнить с коррекцией движений пальцев при игре на гитаре или пианино. Хотя можно и с самоучителем работать, без учителя игре на душе. В когнитивной самокоррекции, в любом случае, считается весьма желательным максимальное и самостоятельное применение вашего уже имеющегося личного опыта в быстром, полезном и выгодном решении прошлых жизненных задач и перенос правил их решения на существующие проблемы.

Максимально быстрое осознание способов неадекватной обработки информации и замена их правильными - таковы главные общие задачи когнитивной самокоррекции. Она наиболее показана людям с 14-16 лет со способностью к самонаблюдению и анализу своих мыслей. Т.е. сознательным товарищам.

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

Следующий этап - осознание, вербализация неадаптивных мыслей, искажающих восприятие реальности. Для этого может быть использовано несколько приемов, например экспериментальный метод. В этом случае после понимания вышеназванных основных положений о некоторых законах когнитивной самокоррекции вам следует начать более заботливо обращать особо пристальное внимание на необходимость проведения различий между объективной реальностью (чувственным уровнем обработки информации) и воспринятой реальностью (вашими мыслями).

Уровень вашего субъективного восприятия чего-либо всегда зависит от индивидуальных познавательных процессов и связан с интерпретацией - обработкой сигналов первого, физического уровня (от органов чувств). Уже на втором, психическом уровне (мышления) у вас могут появиться значительные искажения из-за сбоев, ошибок и протекания когнитивных процессов, например, из-за автоматически включающихся в этот процесс однобоко оценочных мыслей. Экспериментальный метод предполагает погружение вас в конкретные значимые ситуации, в том числе и, особенно, по принципу переживания здесь и сейчас далекого прошлого, текущего настоящего и возможного будущего.

Обращение вашего внимания на параллельно текущий поток мыслей в стрессовой ситуации, осознание этих мыслей (вплоть до записывания на бумаге) обучит вас методике последовательного анализа своего восприятия объекта или события. Распознавание неадаптивной убеждений может быть облегчено также с помощью приема коллекционирования автоматических мыслей. Кстати, термин неадаптивная установка применяется к любой авто-мысли, вызывающей неадекватные или болезненные эмоции и затрудняющей решение какой-либо проблемы.

В технике коллекционирования вам просто-напросто предлагается быстренько сосредоточиваться на мыслях или образах, вызывающих дискомфорт в проблемной ситуации или сходных с ней и запоминать их. Неадаптивные убеждения, как правило, носят характер именно автоматических мыслей. Они возникают без какого-либо предварительного рассуждения, рефлекторно, и для вас всегда имеют характер правдоподобных, вполне обоснованных, не подвергаемых сомнению. Они непроизвольны, не привлекают его внимания, хотя и направляют ваши поступки. Сфокусировавшись на них, вы можете распознать их и зафиксировать письменно, почти нотариально.

Обычно вне значимой, проблемной ситуации эти мысли осознаются с трудом, например у лиц, страдающих всеразличными страхами. Опознание их облегчается при реальном приближении к такой ситуации. Неоднократное приближение или погружение в ситуацию позволяет сначала осознать, осуществить коллекционирование их, а впоследствии вместо сокращенного, как в телеграмме, варианта, представить эти автомысли в более развернутом письменном виде. Тоже есть мобильные приложения, два из них - Дневник психологического и эмоционального здоровья и Дневник с вопросами для самоанализа и саморазвитие.

Важным этапом когнитивной самокоррекции являются самостоятельные задания, способствующие закреплению улучшенного поведения. Они также могут проводиться на уровне мышления, в воображении или на уровне прямых действий. Эффективность когнитивной самокоррекции оценивается с учетом всей информации о продвижении вас в направлении здоровья и успеха, как вы их понимаете сами. Конкретно и без базара, философии и болтовни.

Вы можете сказать - хватит указывать, кто виноват, лучше опишите что, когда и как делать!. Чрезвычайно согласен, настолько, насколько это только возможно.

Например, есть практический метод заполнения пустот тысячами людей, давно и эффективно используется в ситуациях, когда уровень испытываемых эмоций или симптомов у человека носит умеренный характер и убеждения, сопровождающие их, недостаточно оформлены, нечетки для него самого. В этом случае используется схема анализа А, В, С. где вы наблюдаете за последовательностью внешних событий (А) и эмоциональной реакцией на них (С). Последовательность становится ясной, если вы заполняет пустоту в своем сознании, которая явится связующим звеном между А и С, т. е. обозначается В. Это мысли или образы, возникавшие в этот промежуток и делающие понятной связь между А и С. Следует вновь подчеркнуть, что в когнитивной самокоррекции признается существование неадаптивных убеждений B как в словесной, так и в образной форме.

После этапа обучения вас умению идентифицировать свои неадаптивные мысли в боевой обстановке нужно обязательно научиться рассматривать их объективно. Процесс объективного рассмотрения мыслей называется отдалением. Вы рассматриваете свои неадаптивные убеждения, автоматические мысли, как, в той или иной степени, обособленные от реальности психологические явления. Про это есть тоже два мобильных приложения - Анти-депрессия и АнтиДепрессия.

Отдаление повышает способность вас проводить разграничение между мнением, которое надо обосновать (я считаю) и неопровержимым фактом (я знаю). Оно развивает умение осуществлять дифференциацию между фактическим внешним миром и своим отношением к нему. Обоснование, доказательство не-реальности ваших автоматических мыслей облегчает отдаление вашей объективности от них, формирует у вас навык видеть в авто-мыслях гипотезы, а не факты. Как на суде - вы прокурор-адвокат в одном лице и проверяете мысли (лучше письменно) на предмет их преступности. В процессе отдаления вам становится более ясным путь нереального отображения восприятия события. И наоборот усиливается ваша истинность.

Следующий этап условно получил название изменение правил регуляции поведения. Согласно когнитивной самокоррекции, люди для регуляции своей жизни и поведения других используют правила (предписания, формулы). Эта система правил в значительной степени предопределяет обозначение, истолкование и оценку любых событий. Правила регуляции поведения, которые носят чрезмерный и абсолютный характер, влекут за собой регуляцию поведения, не учитывающую реальной ситуации и поэтому создают ваши проблемы. Для того, чтобы у вас не было этих проблем, нужно изменять правила, делать их менее абстрактными, менее паранойяльными, более гибкими, больше учитывающими сиюминутную реальность.

Содержание правил регуляции поведения центрируется вокруг двух основных параметров: опасности - безопасности и боли - удовольствия. Ось опасности - безопасности включает события, связанные с физическим, психологическим или социальным риском. Хорошо адаптированный человек обладает достаточно гибким набором высокоточных правил, позволяющих соотносить их с ситуацией, интерпретировать и оценивать имеющуюся степень риска и успеха.

В ситуациях физического риска его показатели могут быть достаточно опознаны по одному или нескольким характеристикам от органов чувств. В ситуациях же психологической или социальной угрозы узнавание таких показателей затруднено. Например, человек, руководствующийся правилом Будет ужасно, если я окажусь не на высоте, испытывает трудности в общении из-за нечувственно-конкретного определения и понимания понятия быть на высоте, и с этой же неопределенностью и абстрактностью связана его оценка эффективности своих взаимодействий с ближними. Свои эмоциональные предположения о неудаче такой человек, самопрограммируясь, проецирует, как правило, и на такое же восприятие его другими.

Кратко говоря, все приемы изменения правил, имеющих отношение к оси опасности - безопасности, сводятся к восстановлению у вас контакта с когда-то избегаемой ситуацией. Такой контакт может быть восстановлен и при погружении в ситуацию в воображении и на уровне реального действия с четким осознанием (вспоминанием) новых правил регуляции, позволяющих испытывать умеренный и эффективный уровень эмоций.

Завершить этот крайне краткий (как обычно) обзор существующих технологий хочется очень простым сравнением. Все мы знаем сейчас, что уже всякая техника на грани фантастики - сегодняшняя реальность. Электричество, физика и химия сделали любого обычного человека внешне, аппаратно-приборно, всемогущим (в отношении окружающей природы). Параллельно, но, к сожалению, меньше наблюдается умножение знаний и умений также каждого из нас владеть эффективными техниками для изменения внутреннего состояния и коррекции, например, депрессии. И потому этот второй, тоже неизбежный процесс внутреннего прогресса эволюции мы и продолжим, где и когда только можно, размножать и увеличивать, с удовольствием, любыми возможными способами))

Подробнее..

Майним еще больше данных настраиваем сбор рекламной статистики TikTok за день

11.06.2021 08:06:47 | Автор: admin

Привет, меня зовут Маша, я работаю маркетинговым аналитиком в Ozon. Наша команда "питонит" и "эскьюэлит" во все руки и ноги во благо всего маркетинга компании. Одной из моих обязанностей является поддержка аналитики для команды медийной рекламы Ozon.

Медийная реклама Ozon представлена на разных площадках: Facebook, Google, MyTarget, TikTok и другие. Для эффективной работы любой рекламной кампании необходима оперативная аналитика. В данной статье речь пойдет о моём опыте сбора рекламных данных с площадки TikTok без посредников и лишних заморочек.

Задача на сбор статистики: вводные

У команды медийной рекламы Ozon есть бизнес-аккаунт TikTok, в котором они управляют всей рекламой на этой площадке. Они долго терпели, сами собирали данные из рекламных кабинетов, но всё-таки настало время, когда терпеть уже больше было нельзя. Так у меня появилась задача на автоматизацию сбора статистики из TikTok.

У нас в базах уже были данные о заказах по кампаниям из TikTok, для эффективной аналитики не хватало данных о расходах.

Итак, весь процесс от "нам нужны данные по расходам из TikTok" до "у нас есть данные по расходам из TikTok" разделился для нас на следующие этапы:

  1. регистрация аккаунта разработчика,

  2. создание приложения,

  3. авторизация бизнес-аккаунта в приложении,

  4. запрос, получение, обработка и загрузка данных.

Рассмотрим каждый из этапов подробнее.

Регистрация разработчика

Мы зарегестрировали аккаунт разработчика на нашего бизнес-менеджера. Перешли на портал TikTok Marketing API, нажали на "My Apps", далее кликнули на "Become a Developer", и началась череда заполнения форм.

TikTok не Facebook, у нас ничего ни разу не отклонял, но всё равно мы были очень внимательны при заполнении полей и не добавляли то, что нам не нужно прямо сейчас. Например, в поле "What services do you provide?" добавили только "Reporting".

Последним пунктом был "Create App". Процесс создания аккаунта разработчика и приложения в первый раз происходит вместе.

Создание приложения

Заполняем имя и описание приложение, callback-address. Далее нужно выбрать разрешения, которые приложение будет запрашивать у авторизирующегося в нем аккаунта. Так же, как и при заполнении полей для аккаунта разработчика, выбрали только пункт "Reporting". Указали ID рекламного аккаунта. После этого отправили приложение на проверку.

Как сообщает TikTok в своей документации, проверка может занять от двух до трех рабочих дней. Мы отправили приложение на проверку в пятницу, в понедельник с утра у нас уже было одобренное приложение и можно было продолжить работу.

К сожалению, у меня нет для вас советов на тот случай, если ваше приложение не одобрили. Главное, о чём нужно помнить это правильно заполнять все обязательные поля и запрашивать разрешения только на то, что действительно необходимо: ни больше, ни меньше.

Авторизация бизнес-аккаунта в приложении

Из всей рутинной работы по заполнению форм, эта часть оказалось самой интересной. У нас не было web-приложения, которое бы отлавливало редирект с авторизационным кодом, поэтому автоматическую авторизацию бизнес-аккаунта сделать не получилось. Но мы оперативно потыкали в кнопки и получили заветный Access Token, с помощью которого собираем данные всех рекламных аккаунтов нашего бизнес-менеджера.

Итак, по порядку, что мы делали не имея сайта, который бы отлавливал callback с авторизационным кодом.

  1. Зашли в приложение и указали Callback Address https://www.ozon.ru.

  2. Скопировали Authorized URL, перешли по нему, авторизовались под аккаунтом бизнес-менеджера.

  3. Согласились на предоставление разрешений для приложения, нажали "Confirm".

  4. Далее нас перекинуло на сайт Ozon, но с дополнительными аргументами в url. Получилось наподобие такого https://www.ozon.ru/?auth_code=XXXXXXXXXXX.

  5. Скопировали значение auth_code, в приложении скопировали secret и app_id и отправили запрос к TikTok на получение long-term Access Token.

curl -H "Content-Type:application/json" -X POST \-d '{    "secret": "SECRET",     "app_id": "APP_ID",     "auth_code": "AUTH_CODE"}' \https://ads.tiktok.com/open_api/v1.2/oauth2/access_token

Получили ответ такого вида:

{    "message": "OK",     "code": 0,     "data": {        "access_token": "XXXXXXXXXXXXXXXXXXXX",         "scope": [4],         "advertiser_ids": [            1111111111111111111,             2222222222222222222]    },     "request_id": "XXXXXXXXXXXXXXX"}

Важно было успеть отправить запрос на получение long-term Access Token как можно быстрее, после редиректа на сайт Ozon. Связано это с временем жизни auth_code 10 минут.

Из полученного ответа необходимо сохранить значения access_token, его нужно использовать при каждом запросе. Если access_token будет потерян или, того хуже, скомпрометирован, нужно будет заново выполнять все пункты по аваторизации аккаунта бизнес-менеджера.

Так же при запросах нам понадобиться список advertiser_ids, но его не обязательно сахранять прямо сейчас список ID аккаунтов всегда можно посмотреть в аккаунте бизнес-менеджера.

Всё, мы готовы писать запросы!

Получение статистики

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

Итак, у нас есть всё необходимое для получения данных, а именно:

  • access_token,

  • список advertiser_ids.

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

media source -> campaign -> adset -> ad_name

Значение media source всегда неизменно, так как источник один TikTok. По остальным параметрам можно запросить данные из API TikTok.

Теперь нужно было решить, с какой детализацией по времени будем тянуть данные. TikTok позволяет загружать детализацию по часу и дню. Если выгружать детализацию по часу, то, максимум, за один запрос можно получить данные только за один день; если запрашивать детализацию по дням максимум, на один запрос мы получим 30 дней. Конверсии в покупки анализируются за целый день, поэтому и расходы решили собирать за день.

В новом методе получения данных добавили фильтр по типу размещения рекламы: AUCTION и RESERVATION. Ozon использует только AUCTION в своей стратегии ведения кампаний.

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

METRICS = [    "campaign_name", # название кампании    "adgroup_name", # название группы объявлений    "ad_name", # название объявления    "spend", # потраченные деньги (валюта задаётся в рекламном кабинете)    "impressions", # просмотры    "clicks", # клики    "reach", # количество уникальных пользователей, смотревших рекламу    "video_views_p25", # количество просмотров 25% видео    "video_views_p50", # количество просмотров 50% видео    "video_views_p75", # количество просмотров 75% видео    "video_views_p100", # количество просмотров 100% видео    "frequency" # среднее количество просмотра рекламы каждым пользователем]

В документации TikTok для каждого метода API описан пример на языках Java, Python, PHP и также curl-запрос. Я использовала пример на Python с небольшими изменениями.

В примерах из документации TikTok используются две дополнительные библиотеки:

pip install requestspip install six

Библиотека requests необходима для удобной отправки get-запросов. Библиотека six используется для генерации url-адреса запроса.

И еще две библиотеки, которые я уже добавила сама для того, чтобы записать данные в базу:

pip install pandaspip install sqlalchemy

В нашей компании для хранения данных используются SQL-подобные хранилища, поэтому я использую pandas для преобразования данных в DataFrame и sqlalchemy для записи DataFrame в базу.

Я использовала функции из примера в документации TikTok для генерации url и отправки запроса.

# генерирует url на основе словаря args с аргументами запросаdef build_url(args: dict) -> str:    query_string = urlencode({k: v if isinstance(v, string_types) else json.dumps(v) for k, v in args.items()})    scheme = "https"    netloc = "ads.tiktok.com"    path = "/open_api/v1.1/reports/integrated/get/"    return urlunparse((scheme, netloc, path, "", query_string, ""))# отправляет запрос к TikTok Marketing API,# возвращает результат в виде преобразованного json в словарьdef get(args: dict, access_token: str) -> dict:    url = build_url(args)    headers = {        "Access-Token": access_token,    }    rsp = requests.get(url, headers=headers)    return rsp.json()

На вход функции get нужно передать список аргументов и access token. Список аргументов под наши цели выглядит следующим образом:

args = {    "metrics": METRICS, # список метрик, описанный выше    "data_level": "AUCTION_AD", # тип рекламы    "start_date": 'YYYY-MM-DD', # начальный день запроса    "end_date": 'YYYY-MM-DD', # конечный день запроса    "page_size": 1000, # размер страницы - количество объектов, которое возвращается за один запрос     "page": 1, # порядковый номер страницы (если данные не поместились в один запрос, аргумент инкрементируется)    "advertiser_id": advertiser_id, # один из ID из advertiser_ids, который мы получили при генерации access token    "report_type": "BASIC", # тип отчета    "dimensions": ["ad_id", "stat_time_day"] # аргументы группировки, вплоть до объявления и за целый день} 

Подробнее про page_size: ответ на запрос может содержать большое количество информации и загружать всё это за один раз не эффективно. Поэтому у TikTok есть ограничение на максимальное количество объектов в ответе 1000. Чтобы получить следующую порцию данных, нужно отправить запрос с теми же входными аргументами на следующую страницу. Подробнее о постраничных запросах ниже.

В ответ на запуск функции get получаем словарь подобного вида.

{       # маркер успешности ответа    "message": "OK",    "code": 0,    "data": {        # информация о странице данных        "page_info": {            # общее количество объектов            "total_number": 3000,            # текущая страница            "page": 1,            # количество объектов на одной странице ответа            "page_size": 1000,            # общее количество страниц            "total_page": 3        },        # массив объектов        "list": [            # первый объект            {                # метрики                "metrics": {                    "video_views_p25": "0",                    "video_views_p100": "0",                    "adgroup_name": "adgroup_name",                    "reach": "0",                    "spend": "0.0",                    "frequency": "0.0",                    "video_views_p75": "0",                    "video_views_p50": "0",                    "ad_name": "ad_name",                    "campaign_name": "campaign_name",                    "impressions": "0",                    "clicks": "0"                },                # измерения (по каким параметрам группируем результаты)                "dimensions": {                    "stat_time_day": "YYYY-MM-DD HH: mm: ss",                    "ad_id": 111111111111111                }            },...        ]    },    # id ответа    "request_id": "11111111111111111111111"}

Как я описывала выше, если в ответе получается более 1000 объектов, ответ будет разбит на несколько страниц. В данном случае поле total_page говорит о том, что для получения полного набора данных по указанным параметрам, нужны будут три страницы. Следовательно, запускаем и коллекционируем ответы пока не выгрузим все страницы.

page = 1 # сначала всегда получаем данные по первой страницеresult_dict = {} # словарь, в который будем записывать ответыresult = get(args, access_token) # первый запросresult_dict[advertiser_id] = result['data']['list'] # сохраняем ответ на запрос к первой странице# пока текущая полученная страница page меньше # чем общее количество страниц в последнем ответе resultwhile page < result['data']['page_info']['total_page']:    # увеличиваем значение страницы на 1    page += 1    # обновляем значение текущей страницы в словаре аргументов запроса    args['page'] = page    # запрашиваем ответ по текущей странице page    result = get(args, access_token)    # накапливаем ответ    result_dict[advertiser_id] += result['data']['list']

Такое необходимо повторить для каждого рекламного аккаунта из списка advertiser_ids.

В результате всех вышеописанных манипуляций мы получили для каждого рекламного аккаунта данные по рекламным метрикам. Осталось только преобразовать словарь в pandas.DataFrame и отправить их в базу.

# результирующий DataFrame, который будем записывать в базуdata_df = pd.DataFrame()# для каждого рекламного аккаунта выполнить преобразованиеfor adv_id in advertiser_ids:    # получаем накопленные разультаты для аккаунта из словаря    adv_input_list = result_dict[adv_id]    # временный список    adv_result_list = []    # для каждого объекта    for adv_input_row in adv_input_list:        # берём словарь метрик        metrics = adv_input_row['metrics']        # насыщаем этот словарь словарём измерений        metrics.update(adv_input_row['dimensions'])        # добавляем полученный объект во временный список        adv_result_list.append(metrics)    # преобразуем временный словарь в DataFrame     result_df = pd.DataFrame(adv_result_list)    # добавляем колонку со значением id аккаунта    result_df['account'] = adv_id    # добавляем получившийся DataFrame в результирующий    data_df = data_df.append(        result_df,         ignore_index=True    )## здесь пропущены некоторые манипуляции # по преобразованию строк в числа## запись данных из результирующего DataFrame в базуdata_df.to_sql(    schema=schema,     name=table,     con=connection,    if_exists = 'append',    index = False)

TikTok утверждает, что исторические данные по статистике не меняеются, а если и меняются, то это должна быть экстроординарная ситуации, наподобие аварии в ЦОД. Но на основе опыта получения данных от Facebook, я решила что всё равно буду перезаписывать семь последних дней (цифра семь появилась эмпирически).

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

Полный текст скрипта.
# импорт библиотекimport jsonfrom datetime import datetimefrom datetime import timedeltaimport requestsfrom six import string_typesfrom six.moves.urllib.parse import urlencodefrom six.moves.urllib.parse import urlunparseimport pandas as pdimport sqlalchemy# генерирует url на основе словаря args с аргументами запросаdef build_url(args: dict) -> str:    query_string = urlencode({k: v if isinstance(v, string_types) else json.dumps(v) for k, v in args.items()})    scheme = "https"    netloc = "ads.tiktok.com"    path = "/open_api/v1.1/reports/integrated/get/"    return urlunparse((scheme, netloc, path, "", query_string, ""))# отправляет запрос к TikTok Marketing API,# возвращает результат в виде преобразованного json в словарьdef get(args: dict, access_token: str) -> dict:    url = build_url(args)    headers = {        "Access-Token": access_token,    }    rsp = requests.get(url, headers=headers)    return rsp.json()# обновляет данные в базе за последние семь дней# (или, если указаны start_date и end_date, для периода [start_date, end_date])def update_tiktik_data(    # словарь с доступами к API TikTok    tiktok_conn: dict,    # словарь с доступами к базе данных    db_conn: dict,    # список id рекламных кабинетов    advertiser_ids: list,    # необязательное поле: начало периода    start_date:datetime=None,    # необязательное поле: окончание периода    end_date:datetime=None):    access_token = tiktok_conn['password']    start_date = datetime.now() - timedelta(7) if start_date is None else start_date    end_date = datetime.now() - timedelta(1) if end_date is None else end_date    START_DATE = datetime.strftime(start_date, '%Y-%m-%d')    END_DATE = datetime.strftime(end_date, '%Y-%m-%d')    SCHEMA = "schema"    TABLE = "table"    PAGE_SIZE = 1000    METRICS = [        "campaign_name", # название кампании        "adgroup_name", # название группы объявлений        "ad_name", # название объявления        "spend", # потраченные деньги (валюта задаётся в рекламном кабинете)        "impressions", # просмотры        "clicks", # клики        "reach", # количество уникальных пользователей, смотревших рекламу        "video_views_p25", # количество просмотров 25% видео        "video_views_p50", # количество просмотров 50% видео        "video_views_p75", # количество просмотров 75% видео        "video_views_p100", # количество просмотров 100% видео        "frequency" # среднее количество просмотра рекламы каждым пользователем    ]    result_dict = {} # словарь, в который будем записывать ответы    for advertiser_id in advertiser_ids:        page = 1 # сначала всегда получаем данные по первой странице        args = {            "metrics": METRICS, # список метрик, описанный выше            "data_level": "AUCTION_AD", # тип рекламы            "start_date": START_DATE, # начальный день запроса            "end_date": END_DATE, # конечный день запроса            "page_size": PAGE_SIZE, # размер страницы - количество объектов, которое возвращается за один запрос             "page": 1, # порядковый номер страницы (если данные не поместились в один запрос, аргумент инкрементируется)            "advertiser_id": advertiser_id, # один из ID из advertiser_ids, который мы получили при генерации access token            "report_type": "BASIC", # тип отчета            "dimensions": ["ad_id", "stat_time_day"] # аргументы группировки, вплоть до объявления и за целый день        }        result = get(args, access_token) # первый запрос        result_dict[advertiser_id] = result['data']['list'] # сохраняем ответ на запрос к первой странице        # пока текущая полученная страница page меньше,         # чем общее количество страниц в последнем ответе result        while page < result['data']['page_info']['total_page']:            # увеличиваем значение страницы на 1            page += 1            # обновляем значение текущей страницы в словаре аргументов запроса            args['page'] = page            # запрашиваем ответ по текущей странице page            result = get(args, access_token)            # накапливаем ответ            result_dict[advertiser_id] += result['data']['list']    # результирующий DataFrame, который будем записывать в базу    data_df = pd.DataFrame()    # для каждого рекламного аккаунта выполнить преобразование    for adv_id in advertiser_ids:        # получаем накопленные разультаты для аккаунта из словаря        adv_input_list = result_dict[adv_id]        # временный список        adv_result_list = []        # для каждого объекта        for adv_input_row in adv_input_list:            # берем словарь метрик            metrics = adv_input_row['metrics']            # насыщаем этот словарь словарём измерений            metrics.update(adv_input_row['dimensions'])            # добавляем полученный объект во временный список            adv_result_list.append(metrics)        # преобразуем временный словарь в DataFrame         result_df = pd.DataFrame(adv_result_list)        # добавляем колонку со значением id аккаунта        result_df['account'] = adv_id        # добавляем получившийся DataFrame в результирующий        data_df = data_df.append(            result_df,             ignore_index=True        )    #    # здесь пропущены некоторые манипуляции     # по преобразованию строк в числа    #        # создание подключения к базе    connection = sqlalchemy.create_engine(        '{db_type}://{user}:{pswd}@{host}:{port}/{path}'.format(            db_type=db_conn['db_type'],             user=db_conn['user'],             pswd=db_conn['password'],            host=db_conn['host'],            port=db_conn['port'],            path=db_conn['path']         )    )    # удаление последних семи дней из базы    with connection.connect() as conn:        conn.execute(f"""delete from {SCHEMA}.{TABLE}         where date >= '{START_DATE}' and date <= '{END_DATE}'""")    # запись данных из результирующего DataFrame в базу    data_df.to_sql(        schema=SCHEMA,         name=TABLE,         con=connection,        if_exists = 'append',        index = False    )

Миссия выполнена!

Подведем итоги

Итого, на всевышеописанные действия было потрачено менее одного рабочего дня (не считая времени, которое приложение было на проверке). Надеюсь, мне удалось показать, что уровень вхождения в API TikTok достаточно низкий, и для настройки автоматического сбора данных не нужно обязательно привлекать разработчика или блуждать по лабиринтам документации и запутанной логики.

К слову о лабиринтах, в Facebook тот же самый один рабочий день уходит на то, чтобы создать аккаунт разработчика, протыкать все галочки о политике конфидециальности и условий использования, создать приложение, настроить его и т.д. И в итоге к концу дня у тебя не работающий ETL по сбору данных, а очередной Permission Denied и распухшая голова, в которой крутится только одна мысль "что я делаю не так".

Конечно, сравнивать Facebook и TikTok не очень правильно: второй ещё относительно молод и ему еще только предстоит быть обвешанным хитрыми условиями, запретами и всеми возможными сложностями. Но сейчас всего этого пока нет, так что пользоваться TikTok Marketing API крайне удобно. Надеюсь, моя статья вам немного в этом поможет.

Полезные ссылки

Подробнее..

Извилистые дороги корейских ОС, или Как Tizen OS и webOS к успеху шли

19.04.2021 12:12:03 | Автор: admin

Очень сложно поспорить с утверждением, что корейская нация это одна из самых ярких народностей нашего земного шара. Одно существование двух корейских государств-антагонистов на политической карте мира как ничто лучшее тому тому подтверждение. Но сравнивая фанатически настроенных марксистов с севера и заядлых трудоголиков с капиталистического юга невольно понимаешь, что в своем стремлении к абсолюту, впадая в крайности, корейский полуостров действительно населяет один народ. В то время когда северяне достигли мирового первенства в противостоянии с глобализмом, южане по многим параметрам возглавили процесс всеобщей глобализации. Операционные системы Tizen OS и webOS стали одним из инструментов доминирования южнокорейских корпорация на мировом рынке.

Каким образом две мобильные ОС пережили эпоху глобального вымирания ознаменованного восхождением Android OS? Как так случилось, что платформы предназначенные для управления смартфонами оказались в телевизорах? Зачем корпорации LG и Samsung вдохнули вторую жизнь в угасающие Tizen OS и webOS? Какие перспективы у названных ОС совершить реванш на рынке портативных гаджетов и причем тут загадочная корейская душа? Об этом всем мы и поговорим далее в статье.

Коллеги по несчастью

Свой победоносный путь операционная система от Google - Android OS, начала в 2008 году. В это же самое время готовился к выходу в мир и первый смартфон под управлением webOS. К этому времени также мир увидела и iOS. Все эти молодые и перспективные ОС должны была вступит в бой за перераздел доли рынка дряхлеющей Symbian. С высоты сегодняшних дней реальность шансов на успех webOS многим может показаться весьма утопической, однако в то время это было далеко не так однозначно. Хотя webOS и был наиболее схож с Android OS, как в архитектуре ядра базирующемся в обоих случаях на Linux, так и в принципах проводимой политики максимальной открытости платформ, к 2009 году количество девайсов с предустановленным Android OS все еще было откровенно говоря мизерным. В то же время ОС на основе Symbian хотя и являлась монополистом на рыке мобильных ОС, но даже ее новоиспеченный владелец и главный клиент Nokia осознавала, что ОС морально устарела и замена платформы это лишь дело времени. Собственно доказательством последнего и стал активный передел рынка мобильных ОС, появлением новых и утратой позиций существующими ОС. Всего за два года детище Apple - iPhone под управлением iOS, отхватила впечатляющие 15% рынка мобильных девайсов.

Своевременная ставка корпораций Apple и Google на развитие своих магазинов во многом определила современное состояние рынка мобильных ОССвоевременная ставка корпораций Apple и Google на развитие своих магазинов во многом определила современное состояние рынка мобильных ОС

Хотя Tizen OS и не создавалась с нуля, но по многим параметрам это была действительно новая ОС. Возможно и не такая плохая и явно обладала шансами на жизнь, однако появилась она слишком поздно. Дело в том, что в Samsung озадачились разработкой собственной ОС в общем вовремя и с 2008 года успели выпустить более 20 моделей смартфонов под управлением собственной системы SHP ( Samsung Handset Platform ). Пришедшая на смену SHP операционная система Bada стала ее эволюционным развитием. Увидевшая мир аж в 2012 году Tizen OS для Samsung должна была стать уже скорее революционным развитием собственной платформы. Объединив усилия трех проектов LiMo, MeeGo, Bada новый программный продукт должен был вывести продажи смартфонов Samsung на качественно новый уровень, ведь целый ряд нововведений в ОС делал ее,опятже, чрезвычайно схожим с Android OS. Почему Tizen OS потерпела поражение на рынке смартфонов? Видимо по той самой причине, что и ряд других ОС Sailfish OS, Firefox OS, LiMo и тд. Все эти системы были достаточны подобны друг другу - политика развития в сторону открытости, упрощение жизни разработчикам ПО, кроссплатформенность, а это в свою очередь стало для них роковым фактором. Не сумев заинтересовать массового покупателя чем-то уникальным, новым в череде однотипных ОС победу одержала чуть более успешная Android OS, которая к слову также была далека от идеала в те далекие времена.

Имея такие разные биографии Tizen OS и webOS должно было объединить то, что они обе канут в лето вместе с множеством других ОС. Однако, связало их несколько другое обстоятельство.

Корейский гамбит

Удивительна история. Еще 50 лет тому назад Южная Корея являлась откровенно маргинальным, марионеточным государством. Как бы мы сейчас сказали - банановая республика. В тоже время КНДР довольно успешно строила плановую экономику советского типа. Даже еще в 70х годах большенство побегов к "оккупированному" соседу происходило именно с юга. Гонимые тотальной коррупцией и как следствие нищетой немало корейцев выбирали стабильность на "севере". Но мир не стоит на месте.

ВВП в долларах на душу населения по годам ВВП в долларах на душу населения по годам

Сейчас Южная Корея является лидером, а то и монополистом, в целого ряда важнейших секторов общемировой экономики. В разрезе ИТ невозможно не упомянуть о корпорациях Samsung и LG. Именно они то и сыграли главную роль в современном положении Tizen OS и webOS. В мире разделенном между адептами двух религий iOS и Android OS, само существование еще двух независимых, локально успешных платформ выглядит не менее интригующе как и существование коммунистической КНДР во всецело капиталистическом мире.

В 2012 году, когда webOS уже окончательно потерпела фиаско, а с ней разом и компания Palm, ситуацией как нельзя луче воспользовалась корейская корпорация LG выкупив все права на использование загибающейся ОС. Особенно подогревало интерес к этому приобретению то обстоятельство, что будучи довольно крупным производителем смартфонов LG мог бы вдохнуть новую жизнь во все еще весьма конкурентный продукт . Однако в планы корпорации вовсе не входило воскрешать из забвения павшего героя ведущего свою родословную еще из 90х. Проблема которую должна была решить покупка webOS состояла в отсутствии у LG собственной программной платформы для управления новомодными девайсами производимыми корпорацией. В свое время упустив из виду тот момент, что все чаще в названиях всевозможной техники появляется слово "Smart", LG столкнулась с необходимостью разработки с нуля собственного продукта, либо покупкой уже готового решения, для управления новомодными умными девайсами. Конечно оставался вариант пойти по пути мелких производителей и начать работу по адаптации к выпускаемой продукции Android OS, однако размеры компании, как и разнообразие выпускаемой номенклатуры товаров, диктовали необходимость создания собственной единой программой среды, которая должна была быть достаточно гибкой не только для уже существующей техники, а и для будущих перспективных разработок. Покупкой webOS остались довольны все, как получившее новые смыслы подразделение Palm так и оторвавшая за бесценок кучу патентов на полностью рабочий продукт корпорация LG.

В тоже время, как мы уже упоминали, появление новой операционной системы Tizen OS в 2012 году - во времена массового вымирания существующих ОС, было не просто запоздалым, а откровенно сказать абсурдным. Но надо заметить, это утверждение актуально только если рассматривать Tizen OS с точки зрения исключительно рынка смартфонов. Да, компания действительно выпустила на протяжении нескольких лет целую линейку смартфонов - Samsung Z, под управлением новой ОС, но как и следовало ожидать это не закончилось финансовым успехом. В то же время перед платформой стояли несколько другие задачи в решении которых ей уже скоро было суждено преуспеть.

Не смартфоном единым

Как-то довелось мне быть свидетелем повествования одного отставного военного инженера. Человек еще в 80х принимал участие в разработке "мозгов" межконтинентальных баллистических ракет. Поскольку основой безопасности страны советов были ядерные "щит и меч", внимание уделяемое разработке систем наведения, управления, принятия локальных решений "умными ракетами" было на самом высоком уровне. Со слов отставника, ресурсы выделяемые на эти программы лимитировались не более чем здравым смыслом, да и то не всегда. Но даже в таких "тепличных" условиях стоял целый ряд преград к достижению поставленных к ТТХ вооружения. Вызваны они были в первую очередь низким уровнем развития электронной компонентной базой. На то время в мире просто не существовало достаточно компактных, производительных ЭВМ для реализации всех предъявляемых к блоку управления "хотелок". Пытаясь увязать воедино уровень существующей электроники и предъявляемых требований единственным выходом для конструкторского бюро было максимально оптимизировать/упростить логику принятия решений встроенной ЭВМ. С одной стороны такая реализация изделия существенно повышала риск принятия системой управления ракеты неправильного решения, уже вовремя ее полета, что должно было приводить к провалу ее летного задания и включения системы самоликвидации, с другой стороны успешность поставленной задачи должна была достигаться за счет количества производимых запусков по выбранной цели, в общем-то достаточно рабочей системы.

В современном мире 5 нанометрового технологического процесса, где по вычислительным возможностям бюджетный смартфон превосходит суперкомпьютеры из 90х, задача по созданию максимально эффективного ПО не стоит так остро. Не ЦП, не встроенная память "железа" практически не лимитируют современные операционные системы, в то же время на первое место выходят такие вопросы к ОС как удобство использования, безопасность, универсальность, гибкость в настройке интерфейса. Как оказалось всем этим требованиям два новоиспеченных корейца вполне соответствуют.

Спектор техники с предустановленными Tizen OS и webOS весьма обширен. От упомянутых смартфонов, умных часов до фотоаппаратов, телевизоров, проекторов и холодильников. На сколько разумно, спросите вы, такое использование самой разной технике данных программных платформ? На этот вопрос может дать ответ тот коммерческий успех, который сопутствует сейчас компаниям. Обладая собственной ОС корейские корпорации не только успешно распространили свою продукцию на все континентах нашей планеты, но в значительной мере сохраняют "цифровой" суверенитет от не такой уж, как оказывается, "открытой платформы" - Android.

Неизвестно чего было больше в последних трениях между Huawei и Google политики или экономики, однако не имея сколько-то адекватной альтернативы используемой ОС и сервисам иже с нею, говорить в ближайшие несколько лет о технологическом доминировали китайских ИТ-гигантов просто не приходится.

Возможен ли "камбэк" в мир смартфонов?

В современном мире где 85% смартфонов работают под управлением Android OS, а оставшиеся 15% принадлежат iOS сложно представить появление нового успешного игрока. И дело тут не столько в "совершенстве" существующих операционных системах. Основная причина скорее лежит в плоскости отсутсвия необходимости в появлении новых ОС. Рынок мобильных программных платформ целиком и полностью удовлетворен существующими. Более того соотношение 15/85 между двумя современными монополистами также, скорее всего, существенно не изменится, даже в условиях появления новых игроков. Ведь, если более детально рассмотреть целевую аудиторию двух формальных конкурентов iOS и Android OS мы увидим, что она не слишком и конкурентна. И Google, и Apple "сожрали" своих истинных соперников еще лет 10 тому назад. Истинная борьба за клиента у iPhone развернулась, в свое время, с компанией BlackBerry, которая продвигала максимально защищенный продукт из премиум сегмента, в то время когда Symbian, Palm, Windows Mobile устанавливались в своей массе на абсолютно иного класса аппараты. Точно также и Android OS сражалась за наследие доживающей последние дни Symbian, в первую очередь, среди себе подобных открытых платформ.

Недавняя санкционная заваруха вокруг китайских ИТ-гигантов породила прецедент серьезной дискуссии вокруг необходимости создания альтернативы операционным системам так или иначе подконтрольным правительству одной страны. В этом ключе оказалось, что существующая Harmony OS не слишком и существующая. Те же Tizen OS и webOS, так же требуют доработок и существенных капиталовложении в раскрутку от их корейских владельцев, тогда как китайское правительство готово в принципе выделять на такое благое дело ресурсы, но не готово их выделять зарубежным компаниям. На данный момент публичная дискуссия вокруг альтернативных мобильных платформ замялась, как замялись и угрозы применения санкций. В то же время китайские компании сделали из происходящего выводы и пошли по пути своих корейских соседей. Развивая собственные платформы с перспективой их расширенного применения на бытовой технике, разного рода консолях, мультимедиа через какое-то время это позволит отточить саму ОС и создать целую программную среду для ее существования. Очевидно, что процесс этот также займет годы.

На этом фоне остается напомнить лишь один нюанс. В свое время, глобальное доминирование Symbian было остановлено не количественными показателями конкурентов, а качественными изменениями потребностей рынка. Актуальность Symbian обнулил прежде всего технический прогресс позволивший выйти в мир смартфонам нового поколения. Первым тут был конечно же продукту от Apple, революционный iPhone - "бескнопочный" телефон . Не оценив вовремя всех угроз целый ряд многомиллиардных компаний потерпели огромные убытки и сошли с дистанции. В этой игре на вылет Nokia, как известно, стала абсолютным лидером. Может ли нас ожидать нечто подобное? Естественно.

Куда заведут нас кривые дороги технологического прогресса одному Богу известно. В этом русле политические перипетии между двумя сверхдержавами может быть даже подтолкнут к появлению принципиально новых гаджетов, которые "обнулят" монополию существующих ОС. Главное в этой истории, что бы политика не стала ручным тормозом развития технологий и не отдаляла нас от долгожданного светлого будущего.

Подробнее..

Connected! Самое главное о дизайне VPN-приложения

10.02.2021 18:20:17 | Автор: admin

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

Так получилось, что VPN-клиенты я делал намного чаще, чем пользовался ими по прямому назначению. В 2020 году почти каждый месяц я стабильно получал предложение о создании быстрого, удобного и безопасного. Одни предлагали два сервера, оба из которых платные. Другие давали выбор из 50 стран и возможность подключаться сразу к 4. Несмотря на разный подход, у этих приложений одинаковые паттерны.

Ниже я постарался описать все самое важное, не заостряя внимание на деталях.


Privacy, разрешения

Стандартная процедура, без которой мы не можем предоставить свои услуги. Даем ее сразу после Splash screen. Чем быстрее пользователь разберется с процедурой и забудет о ней, тем раньше он воспользуется приложением. Поэтому мы делаем привычный Agree внизу экрана и нативный Allow, который отпушит в настройки и вернет назад.

Я также слышал, что Privacy принимается пользователем в момент скачивания и все эти экраны не нужны. Тем не менее, VPN-приложений без них я еще не видел.

Кнопка

Большая, заметная. Пользователь пришел к вам, чтобы нажать именно на нее. Креативные решения взамен пользовательского опыта придется окупать очень выгодными условиями встроенной покупки. В остальном, стоит ее разметить не в центре, проигнорировать акценты, не выделить и все человек тормозит, закрывает и переходит в то приложение, которое с ним на Ты. Лучше сделать стандартный круг (часто) или кнопку (редко) снизу, учесть и показать состояния, дать возможность отмены подключения.

Статус подключения. С одной стороны, это элементарно и понятно. Если подключено, напиши подключено, выдели цветом кнопку. Однако, я часто натыкался на приложения, которые отображают статус индикатором сбоку или интересной иллюстрацией, смысл которой известен только дизайнеру и заказчику. Помните, что далеко не все power users.

Одно слово и противоположный цвет. Все довольны, всем понятно.

Место подключения. Обязательный элемент. Не могу вспомнить ни одного VPN-клиента без отображения местоположения сервера. Это одна из самых значимых информаций на экране. Часто является кнопкой, что пушит пользователя на экран с выбором сервера из списка.

Список серверов

Переходим к нему только сейчас, так как, по большому счету, это уже другой экран. Делаем либо обычный ModalVC, который временами маскируется под вью (поверх кнопки), либо отдельный ViewController (другой экран). Зависит от желания и предпочтений.

Структурируем список серверов по качеству соединения, количеству доступных мегабайт, алфавиту или другому удобному показателю. Если стран 20+, имеет смысл добавить строку поиска. Можно отобразить качество соединения для пользователя, но судя по наблюдениям, это опционально. А вот показать, хотите ли Вы денег конкретно за этот сервер, очень желательно. Людям не нравится, когда их удивляют неожиданный переходом на экран встроенной покупки.

Отображение скорости. Кто-то его делает, а кто-то нет. Для массового пользователя это скорее элемент любопытства. Очень редко данная информация является необходимой. Если Вам кажется, что экран слишком пустой и нужно что-то еще, скорость загрузки и выгрузки оптимальное решение.

Время подключения.Встречал почти так же редко, как и информацию о скорости, однако в отличие от нее, практического применения таймеру я так и не нашел. Ни личный опыт, ни опросы, ни диалог с коллегами не дали мне ответ на вопрос: Эм, я подключен уже 3 минуты. Что дальше?. Жить это не мешает, но и толка от этого нет. Расскажите, что Вы думаете на этот счет, мне интересно.

Карта

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

Встроенная покупка

Этот экран есть везде. Про него нечего сказать в контексте этой статьи. Скорее всего, будет отдельный материал, посвящённый исключительно ему. С более подробной статистикой, исследованием и цифрами.

Другое

Настройки, поддержка, Q&A, восстановление покупок и далее по списку. Все, что сделает жизнь пользователя немного легче. Встречается в 90% VPN-приложений. Остальные 10% вполне обходятся без этого.

Пожалуйста

Не грузите пользователя всеми возможными разрешениями, особенно теми, что вообще не относятся к VPN. Не делайте экран подписки первым, особенно, если его нельзя закрыть. Если можно без обязательной регистрации, сделайте без нее. Старайтесь объяснить пользователю свои функции грамотным дизайном, а не постоянными всплывающими пояснениями. Учитывайте пользовательский опыт платформы.

Проигнорировав это, Вы рискуете, в лучшем случае, быть удаленным спустя 15 секунд после запуска, а в худшем получить отзывы с оценкой 2.

В заключение

Это основное, что важно знать про дизайн VPN-приложения. Мы не учитываем красивый фирменный стиль, правильные анимации и приветливый UI. Это тоже важно, и для многих пользователей может стать определяющим в выборе. У нас Starter pack. Реализовав этот список, приложение можно отправлять в App Store и Google Play.

Подробнее..

Какие ошибки совершает аналитик в первые полгода работы и как их избежать

19.05.2021 14:18:09 | Автор: admin

Хайди хо, Кайл!

Меня зовут Диана и я бизнес-аналитик в компании Surf. В прошлом году я закончила бакалавриат факультета компьютерных наук в ВГУ: это дало мне базовые теоретические знания. Однако теория мало применима без практики: теперь набиваю шишки в настоящих проектах.

Я пришла к вам для того, чтобы поделиться опытом, который получила на своём первом боевом проекте. Мы делали банковское мобильное приложение со сложной архитектурой и кучей фич.

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

Пристёгивайтесь покрепче: мы начинаем увлекательное путешествие по миру ошибок начинающего аналитика (все трюки были выполнены профессиональными каскадёрами, не повторять в домашних условиях).

Не бойтесь задавать больше вопросов и просить уточнений

Мой опыт показывает, что, когда проводишь верхнеуровневую аналитику, невозможно учесть все ключевые моменты на то она и верхнеуровневая. Понимание фичи и её реализации происходит постепенно, по мере погружения в процесс анализа. В первое время сложно определить, на что стоит обратить особое внимание, и вычленить важное среди большого количества информации, которую тебе подкидывают со всех сторон. В итоге это повлияет на время и трудозатраты разработки.

Лучше задать больше вопросов, чем что-то упустить. Например, когда работаешь над проектом, важно уточнить:

  • На чьей стороне будет реализована логика: фронта, middleware, бэка?

  • Как определять нужное состояние элемента? Как и где получать и обрабатывать нужные параметры?

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

  • Касаются ли вашей стороны эти требования или от вас никаких доработок и не потребуется?

Перед тем, как передать информацию разработчикам, нужно убедиться, что вы с клиентом поняли друг друга: обсудили все ключевые моменты и разобрались, что клиент хочет получить на выходе.

Проверяйте и перепроверяйте выполнение договорённостей

Когда в процессе проработки фичи участвует большое количество человек, это как минимум значит, что сторонам будет непросто договориться. А ещё это значит, что сложно будет уследить за всеми требованиями и договорённостями.

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

Обычно мы обсуждаем задачи в переписке или на онлайн-митингах. Нетрудно понять, что на созвоне в 20 человек легко пропустить какое-то поручение. Поэтому я записываю основную информацию, которую обсудили во время созвона. После дублирую требования в печатном виде и прошу подтверждения у коллег, чтобы убедиться, что ничего не упустила. Кроме того зафиксированные в письменном виде договорённости гарантируют, что заказчик не сможет при желании переобуться и поменять требования.

Затем я слежу за выполнением этих поручений: периодически (в зависимости от того, насколько горит фича) уточняю у исполнителей статус готовности и пинаю их по необходимости.

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

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

Пример из жизни

Мы разрабатывали фичу, которая при выполнении определённого условия отображала кнопку на главном экране. Когда обсуждали реализацию, решили, что условие будет проверяться на бэке, а фронт будет получать поле с признаком выполнения или невыполнения этого условия.

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

Из-за этого процесс задержался ещё на неделю, потому что пришлось потратить много времени на повторное обсуждение. В итоге решили кнопку отображать всегда:)

Не будьте, как я, обращайте внимание коллег на ключевые моменты, необходимые для выполнения.

Уточняйте, как сделать проще

Бывает, что бизнес-аналитику реализация фичи кажется удобной. Он предлагает её разработчику, а в ответ получает: Чё-то сложно, давай по-другому?. Это нормально: взгляды аналитика и разработчика на реализацию фичи могут разительно отличаться: разработчик понимает, что ему хотят втюхать что-то сложное и заморочное, и идёт в отказ.

Если бизнес-аналитику не хватает опыта, чтобы оценить, насколько сложен вариант реализации, лучше сразу прийти к разработчикам и посоветоваться с ними. Иначе потом придется проходить новый круг ада: обсуждать изменения. Кроме того, это может сдвинуть сроки реализации: не нужно объяснять, почему это плохо:)

Френдли ремайндер

Если встаёт вопрос, на чьей стороне должна быть реализована сложная логика, связанная со сравнениями, вычислениями, сортировкой и так далее, практически всегда логичнее вынести её на бэк. Запомните мой совет и повторяйте его как мантру на всех созвонах (и перед сном).

Будьте внимательным к потенциально проблемным требованиям

Если на этапе верхнеуровневой аналитики чуйка шепчет вам, что требования могут перерасти из маленькой задачи на день в большую и неповоротливую фичу не игнорируйте эти сигналы и не спускайте всё на тормозах, мол, прорвёмся. Обычно я составляю большой список вопросов к заказчику и к бэку по требованиям, где прописываю, правильно ли я поняла формулировку.

Уточните (если нужно, несколько раз), правильно ли вы поняли, что ваша задача просто добавить картинку котика на экран. Может оказаться, что добавить нужно обязательно чеширского кота, а ещё он должен улыбаться в момент, когда вы моргаете. Я специально привела утрированный пример.

А вот пример из жизни. Недавно мы параллельно вели две фичи от разных продакт-оунеров. Фичи были частично взаимосвязаны, но требования во многих местах противоречили друг другу. Каждый продакт видел UI по-своему: договориться было достаточно трудно. Тогда пришлось столкнуть их лбами. После этому мы наконец пришли к варианту, устраивающему всех.

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

Помните, что есть много требований, которые могут быть не видны не вооруженным опытом взглядом под толщей воды из документа с требованиями. Хорошая новость: чем опытнее становится бизнес-аналитик, тем больше потенциально проблемных мест он видит и тем тщательнее терзает заказчика вопросами и уточнениями. Поэтому сделайте глубокий вдох и наберитесь терпения! Дальше лучше.

Как определить, что перед вами задача-оборотень, которая может превратиться из человечной в дикую? По количеству непоняток. Берегитесь, если:

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

  • Не очевидна инициализация флоу и переход между экранами.

  • Нет четкого понимания логики.

Например, несколько месяцев назад мы начали обсуждение фичи без определённых требований. У продакт-оунера не было четкого понимания, что должно получиться в итоге. Это стоило нам многих часов созвонов-обсуждений и несколько раз перекроенного ТЗ.

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

Пример

Прилетают требования: нужно определять значение поля по параметрам, которые будут приходить с сервера. Значение поля должно отображаться в интерфейсе.

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

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

_______

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

Вот и всё, мои маленькие хоббиты. Я поделилась с вами своей мудростью, теперь вы сами по себе. Не дрейфте, не теряйтесь, будьте настойчивы и внимательны. В добрый путь!

Подробнее..

Подборка 150 ресурсов для управления и работы ИТ-команды

22.05.2021 16:14:00 | Автор: admin

Привет! На связи компанияKODE. Мы занимаемся разработкой мобильных приложений, голосовых интерфейсов, IoT и других цифровых решений для государства и крупного бизнеса в России и Европе с 2013 года.

Руководители наших отделов собрали полноценную библиотеку IT-компании: сайты, блоги, книги, онлайн-курсы, подкасты, Telegram- и YouTube-каналы. Подборка будет полезна менеджерам, аналитикам, разработчикам, дизайнерам и QA.

Направления:

Сохраняйте, чтобы не потерять!Используйте и совершенствуйтесь.


Проджект-менеджмент

Сайты:

Книги:

Курсы:

YouTube-каналы:

Telegram-каналы:

  • Psilonsk канал Сергея Колганова об управлении проектами и продуктами.

  • Селиховкин о проектном управлении в другом формате.

Аналитика

Книги:

Курсы:

Telegram-каналы:

UX/UI-дизайн

Сайты:

Книги:

Курсы:

Фильмы:

YouTube-каналы:

Android-разработка

Сайты:

Книги:

Курс:

Подкасты:

  • Fragmented подкаст о том, как стать лучшим разработчиком ПО.

  • Сушите вёсла о разработке, аналитике, тестировании и других аспектах создания приложений.

  • CoRecursive истории, скрывающиеся за кодом, от экспертов в мире разработки.

  • Signals And Threads интервью о тонкостях разработки с инженерами из глобальной торговой компании Jane Street.

  • Software Engineering Radio еженедельные беседы о ПО.

  • Microsoft Research Podcast о передовых технологиях Microsoft Research.

Telegram-каналы:

Twitter:

iOS-разработка

Сайты:

Книги:

Курсы:

Подкаст:

  • Подлодка еженедельное аудиошоу о разработке.

YouTube- и Telegram-каналы:

  • YouTube-каналПола Хадсонапо SwiftUI.

  • Telegram-каналdeprecated чат для новичков, где разбирают сложные для них вопросы.

Backend-разработка

Книги:

YouTube-каналы:

Telegram-каналы:

Frontend-разработка

Ресурсы и сайты:

Блоги:

  • Дэн Абрамов личный блог разработчика, одного из авторов Redux.

  • Katz Got Your Tongue статьи Иегуды Каца, соавтора Ember.js и ответственного за разработку плагинов в jQuery.

Книги:

Подкасты:

  • FrontoWeek важные события фронтенда за неделю.

  • Веб-стандарты ещё один новостной канал.

  • UnderJS обсуждения JS на Frontend и Backend, React Native, Linux.

  • Фронтенд Юность вся правда о фронтенд-разработке.

  • Frontend Weekend интервью с известными людьми из веб-разработки.

  • Пятиминутка React подкаст о React и смежных технологиях в мире JavaScript и фронтенда.

  • kamyshev.talk об архитектуре, коде и гибких навыках.

YouTube-каналы:

Telegram-каналы:

QA

Сайты:

  • ПорталSoftware Testing сотни тематических статей, подборок книг по тестированию и обзор новостей отрасли.

  • БлогQCoder концентрат полезных знаний.

Курсы:

Telegram-каналы:

YouTube-каналы:

  • Любительский канал Алексея Баренцева полезные видео для начинающих тестировщиков.

  • QAGuild об автоматизации тестирования и ИТ.

  • Heisenbug доклады с международной технической QA-конференции.

  • Канал ИТ-компанииiTechArt, где еженедельно публикуются записи выступлений разработчиков и тестировщиков.

DevOps

Книги:

Telegram-каналы:


Не забудьте поделиться с коллегами и теми, кому может быть интересна эта подборка!

Подробнее..

Подборка 150 ресурсов для управления и работы IT-команды

22.05.2021 18:12:52 | Автор: admin

Привет! На связи компанияKODE. Мы занимаемся разработкой мобильных приложений, голосовых интерфейсов, IoT и других цифровых решений для государства и крупного бизнеса в России и Европе с 2013 года.

Руководители наших отделов собрали полноценную библиотеку IT-компании: сайты, блоги, книги, онлайн-курсы, подкасты, Telegram- и YouTube-каналы. Подборка будет полезна менеджерам, аналитикам, разработчикам, дизайнерам и QA.

Направления:

Сохраняйте, чтобы не потерять!Используйте и совершенствуйтесь.


Проджект-менеджмент

Сайты:

Книги:

Курсы:

YouTube-каналы:

Telegram-каналы:

  • Psilonsk канал Сергея Колганова об управлении проектами и продуктами.

  • Селиховкин о проектном управлении в другом формате.

Аналитика

Книги:

Курсы:

Telegram-каналы:

UX/UI-дизайн

Сайты:

Книги:

Курсы:

Фильмы:

YouTube-каналы:

Android-разработка

Сайты:

Книги:

Курс:

Подкасты:

  • Fragmented подкаст о том, как стать лучшим разработчиком ПО.

  • Сушите вёсла о разработке, аналитике, тестировании и других аспектах создания приложений.

  • CoRecursive истории, скрывающиеся за кодом, от экспертов в мире разработки.

  • Signals And Threads интервью о тонкостях разработки с инженерами из глобальной торговой компании Jane Street.

  • Software Engineering Radio еженедельные беседы о ПО.

  • Microsoft Research Podcast о передовых технологиях Microsoft Research.

Telegram-каналы:

Twitter:

iOS-разработка

Сайты:

Книги:

Курсы:

Подкаст:

  • Подлодка еженедельное аудиошоу о разработке.

YouTube- и Telegram-каналы:

  • YouTube-каналПола Хадсонапо SwiftUI.

  • Telegram-каналdeprecated чат для новичков, где разбирают сложные для них вопросы.

Backend-разработка

Книги:

YouTube-каналы:

Telegram-каналы:

Frontend-разработка

Ресурсы и сайты:

Блоги:

  • Дэн Абрамов личный блог разработчика, одного из авторов Redux.

  • Katz Got Your Tongue статьи Иегуды Каца, соавтора Ember.js и ответственного за разработку плагинов в jQuery.

Книги:

Подкасты:

  • FrontoWeek важные события фронтенда за неделю.

  • Веб-стандарты ещё один новостной канал.

  • UnderJS обсуждения JS на Frontend и Backend, React Native, Linux.

  • Фронтенд Юность вся правда о фронтенд-разработке.

  • Frontend Weekend интервью с известными людьми из веб-разработки.

  • Пятиминутка React подкаст о React и смежных технологиях в мире JavaScript и фронтенда.

  • kamyshev.talk об архитектуре, коде и гибких навыках.

YouTube-каналы:

Telegram-каналы:

QA

Сайты:

  • ПорталSoftware Testing сотни тематических статей, подборок книг по тестированию и обзор новостей отрасли.

  • БлогQCoder концентрат полезных знаний.

Курсы:

Telegram-каналы:

YouTube-каналы:

  • Любительский канал Алексея Баренцева полезные видео для начинающих тестировщиков.

  • QAGuild об автоматизации тестирования и ИТ.

  • Heisenbug доклады с международной технической QA-конференции.

  • Канал ИТ-компанииiTechArt, где еженедельно публикуются записи выступлений разработчиков и тестировщиков.

DevOps

Книги:

Telegram-каналы:


Не забудьте поделиться с коллегами и теми, кому может быть интересна эта подборка!

Подробнее..

R в руках маркетолога. Делаем когортный анализ своими руками

02.05.2021 12:15:03 | Автор: admin

В маркетинге очень популярен когортный анализ. Его популярность вызвана, скорее всего, легкостью алгоритма и вычислений. Никаких серьезных математических концепций в основе нет, элементарная математика, выполняемая в excel. С точки зрения получения инсайтов гораздо интереснее анализ дожития.


Тем не менее, считаем, что есть такая задача и ее надо решить. Искать какие-либо пакеты и готовые функции неинтересно математика проста, параметров настройки масса. Ниже возможный пример реализации (без особой фиксации на скорость исполнения), всего кода на пару десятков строк.


Является продолжением серии предыдущих публикаций.


Немного кода


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


Создание тестового набора
# генерируем данные на 15 недельset.seed(42)events_dt <- tibble(user_id = 1000:9000) %>%  mutate(birthday = Sys.Date() + as.integer(rexp(n(), 1/10))) %>%  rowwise() %>%  mutate(timestamp = list(as_datetime(birthday) + 24*60*60 * (     rexp(10^3, rate = 1/runif(1, 2, 25))))) %>%  ungroup() %>%  unnest(timestamp) %>%  # режем длинные хвосты в прошлом и в будущем  filter(timestamp >= quantile(timestamp, probs = 0.1),         timestamp <= quantile(timestamp, probs = 0.95)) %>%  mutate(date = as_date(timestamp)) %>%  select(user_id, date) %>%  setDT(key = c("user_id", "date")) %>%  # оставим только уникальные по датам события  unique()

Посмотрим на получившееся интегральное распределение


ggplot(events_dt, aes(date)) +  geom_histogram()


Шаг 1. Формируем справочник пользователей


В настоящем примере справочник будет тривиальным и содержит только "дату рождения", т.е. дату, когда мы первый раз встретились с ним. Установка ключей для data.table объекта приводит к физической сортировке данных в порядке появления ключей.


Формируем справочник пользователей
users_dict <- events_dt[, .(birthday = head(date, 1)), by = user_id] %>%  # для последующей сортировки оставим дату начала недели  .[, week_start := floor_date(.BY[[1]], unit = "week"), by = birthday] %>%    # переведем даты рождения в номера когорт  .[, cohort := stri_c(        lubridate::isoyear(.BY[[1]]),         sprintf("%02d", lubridate::isoweek(.BY[[1]])),         sep = "/"), by = week_start]# посмотрим на распределение дат, нам нужен разброс для красивой картинкиas_tibble(janitor::tabyl(users_dict, birthday))


Шаг 2. Подготовим разметку в терминах когортного анализа


Совсем за скоростью пока не гонимся.


Составим справочник когорт. Для сокращения преобразований и обеспечения последующей сортировки.


Строим когортное представление в data.frame
cohort_dict <- unique(users_dict[, .(cohort, week_start)])cohort_tbl <- users_dict[events_dt, on = "user_id"] %>%  # посчитаем удаленность событий от даты рождения в терминах недель  .[, rel_week := floor(as.numeric(difftime(date, birthday, units = "week")))] %>%  # оставим только 10 недель  .[rel_week <= 9] %>%  # редуцируем до уникальных пользователей  unique(by = c("user_id", "cohort", "rel_week")) %>%  # считаем агрегаты в терминах когорт и недель  .[, .N, by = .(cohort, rel_week)] %>%  .[, rate := N/max(N), by = cohort]

Шаг 3. Визуализируем


Вариант 1. ggplot


Визуализация ggplot
# вариант ggplotdata_tbl <- cohort_tbl %>%  # вернем числовые показатели когорт для сортировки  left_join(cohort_dict)data_tbl %>%  mutate(cohort_group = forcats::fct_reorder(cohort, week_start, .desc = TRUE)) %>%  ggplot(mapping = aes(x = rel_week, y = cohort_group, fill = rate)) +  geom_tile()  +  geom_text(aes(label = N), colour = "darkgray") +  labs(x = "Недели существования когорты",       y = "Неделя появления когорты",       fill = "Количество\nпользователей",       title = "graph_title") +  scale_fill_viridis_c(option = "inferno") +  scale_x_continuous(breaks = scales::breaks_width(1)) +  theme_minimal() +  theme(panel.grid = element_blank())


Вариант 2. gt


Для оформления используем тот факт, что у нас всегда по две строки на когорту и они отсортированы в нужном порядке.


Визуализация gt
# подготовим табличку-подложкуdata_tbl <- cohort_tbl %>%  pivot_longer(cols = c(N, rate)) %>%  pivot_wider(names_from = rel_week, values_from = value) %>%  # вернем числовые показатели когорт для сортировки  left_join(cohort_dict) %>%  arrange(week_start, desc(name))odd_rows <- seq(1, to = nrow(data_tbl), by = 2)even_rows <- seq(2, to = nrow(data_tbl), by = 2)tab <- data_tbl %>%  mutate(cohort = if_else(rep(c(TRUE, FALSE), length.out = nrow(.)),                           cohort, "")) %>%  select(-name, -week_start) %>%  gt(rowname_col = "cohort") %>%  fmt_percent(columns = matches("[0-9]+"),               rows = odd_rows,               decimals = 0, pattern = "<big>{x}</big>") %>%  fmt_missing(columns = everything(),               missing_text = "---") %>%  tab_stubhead(label = "Неделя появления когорты") %>%  tab_spanner(label = "Неделя существования когорты",              columns = everything()) %>%  tab_header(title = "Развертка") %>%  data_color(columns = everything(),             colors = scales::col_numeric(palette = "inferno",                                          domain = c(0, 1),                                           alpha = 0.6,                                          na.color = "lightgray")) %>%  tab_options(    table.font.size = "smaller",    data_row.padding = px(1),    table.width = pct(75)  ) %>%  tab_style(    style = list(      cell_fill(color = "white"),      cell_text(style = "italic"),      cell_borders(sides = "bottom")    ),    locations = cells_body(      columns = everything(),      rows = even_rows)  ) %>%  tab_style(    style = list(      cell_borders(sides = "top")    ),    locations = cells_body(      columns = everything(),      rows = odd_rows)  )tab


Каркас приведен, прочее каждый может модифицировать под себя.


Предыдущая публикация R и работа со временем. Что за кулисами?.

Подробнее..

Перевод Кратко о продуктовых метриках

18.02.2021 10:20:32 | Автор: admin

Продуктовые команды часто применяют такие термины, как инструментарий и телеметрия, и не только потому, что это звучит солидно. Представьте, что вы летите на самолете ночью. Как пилот узнает, в каком направлении движется самолет, достаточно ли топлива, нет ли горы прямо по курсу? С помощью телеметрии.

А теперь представьте, что вы отвечаете за рост вовлеченности на Ютубе. У вас миллиарды пользователей, сложная экосистема. Как узнать, повышается ли вовлеченность пользователей? Почему кто-то использует ваш продукт больше, а кто-то меньше? И что вообще такое эта вовлеченность?

Согласно представлению Эндрю Гроува, изложенному в книге Высокоэффективный менеджмент, без инструментария, телеметрии и индикаторов (далее будем называть всё это метриками) наш продукт представляет собой черный ящик, в котором есть вход (код, дизайн, оборудование, время) и выход (доход, пользователи продукта). Метрики помогают количественно оценить выход и прорезать окна в черном ящике, чтобы понять, почему мы получаем тот или иной выход. Метрики помогают:

  • Измерять выход (например, успешность продукта): количественно оценивать движение в направлении бизнес-цели.

  • Анализировать выход: получать ответ на вопрос, почему мы видим тот или иной выход.

  • Принимать решения: проводить эксперименты и решать, как должен развиваться продукт.

  • Реагировать и адаптироваться: метрики предупреждают о проблемах с работоспособностью продукта и о тенденциях, которые ставят под угрозу наши цели.

  • Концентрировать усилия: направлять работу команды в одном направлении.

Типы метрик для продуктовых команд

Использование метрик определяется отраслью, компанией и конкретной задачей. Я не буду пытаться охватить всё, а лишь сосредоточусь на основных понятиях, применимых к наборам продуктовых метрик в большинстве случаев.

Успех, эмпатия и работоспособность

  • Успех (измерение выхода). В правильном ли направлении движется продукт? В чем причины?

  • Эмпатия. Можем ли мы определить смысл метрик? Знаем ли мы, что пользователи думают о продукте?

  • Работоспособность. Контролируем ли мы состояние продукта? У какого процента пользователей он работает надежно?

Истинный север, указатели и контрольные метрики

Истинный север: должен остаться только один.Истинный север: должен остаться только один.

Истинный север единственная метрика, используемая для отслеживания успеха продукта (или выхода в аналогии с черным ящиком). Она должна быть только одна, но ее можно дополнить указателями и контрольными метриками. Метрика истинный север обычно представляет собой воронку поздних этапов, т. е. кульминацию, включающую в себя множество различных шагов, поэтому повлиять на нее сложно. Вот пару примеров из наверняка известных вам сервисов:

  • Spotify общее время прослушивания.

  • Facebook количество активных пользователей в месяц (MAU).

  • Slack количество активных пользователей в день (DAU).

Указатели это метрики, которые не определяют успех продукта, однако (вспомним аналогию с черным ящиком) помогают понять, почему истинный север или иные важные части продукта, которые нужно отслеживать, движутся в определенном направлении. Например, если истинный север для Spotify общее время прослушивания, то указателями могут быть (1) количество уникальных пользователей, (2) количество уникальных композиций, прослушанных одним пользователем, и (3) средняя продолжительность композиции.

Контрольные метрики используются при проведении A/B-экспериментов: они позволяют следить за тем, чтобы вносимые в одну часть продукта изменения не повлияли отрицательно на другую часть. Например, можно провести эксперимент по увеличению количества купленных подписок, предложив значительную скидку за первый месяц. Контрольной метрикой в этом случае может быть удержание пользователей на протяжении двух месяцев этот показатель поможет выяснить, достаточно ли удовлетворены пользователи, чтобы продолжать пользоваться вашим продуктом. Если значение контрольной метрики оказывается удовлетворительным, можно продолжать инвестировать в привлечение пользователей.

Факты и смысл

  • Количественные метрики характеризуются высокими объемами и низкой связью с контекстом; они дают фактические данные и помогают понять поведение пользователей: это количество активных пользователей в день (DAU), отток, вовлеченность, объем продаж ит.д.

  • Качественные метрики это низкие объемы и высокая связь с контекстом; они придают смысл количественным данным и ставят их в определенный контекст: это могут быть беседы с клиентами, записи экрана, результаты опроса фокус-групп.

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

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

Практические советы по работе с метриками

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

Слепо используемые в качестве целей метрики утрачивают смысл

Изменение метрики не должно быть целью. Цель это достижение бизнес-результата или определенного выхода для продукта, а метрика это способ количественно оценить, достигнута ли обозначенная цель. Представьте, что вы запускаете новый интерфейс входа в систему, чтобы привлечь больше пользователей. Вам нужно определить метрику истинного севера, которая покажет, лучше или хуже новый интерфейс. У вас два варианта:

  1. Коэффициент показ сеанс: процент вошедших в систему пользователей относительно количества открывших экран входа.

  2. Коэффициент попытка входа сеанс: процент вошедших в систему пользователей относительно количества воспользовавшихся интерфейсом экрана входа.

Как и на любую общедоступную веб-страницу, сюда могут заходить боты. Количество просмотров страницы ботами (показы) большое, при этом их трудно отделить от пользователей, но боты редко взаимодействуют с интерфейсом (попытки входа) и никогда не выполняют вход. Учитывая это, можно предположить, что более точной метрикой успеха будет показатель попытка входа сеанс, верно?

Давайте разберемся. Представьте, что ваши пользователи делятся на две категории взрослые и пожилые:

  • взрослые технически грамотны, показатель попытка входа сеанс для них составляет 71%,

  • пожилые ориентируются хуже, поэтому в их случае это будет 50%.

Вы запускаете эксперимент, который увеличивает количество попыток входа в систему пожилыми. Их доля увеличится, но только 50% таких попыток будут успешными, поэтому используемая в качестве истинного севера метрика попытка входа сеанс снизится с 65% до 63%:

Метрика истинного севера снизилась, а значит, внедрять новый интерфейс не стоит, правильно? Неправильно. Ваша цель не увеличение количества успешных попыток входа, а привлечение большего числа людей в продукт, и в эксперименте этот показатель поднялся на 12%:

Значит ли это, что метрика показ сеанс лучше? Необязательно: на нее по-прежнему влияет трафик от ботов. Редко можно найти идеальную метрику, и структурный сдвиг, проиллюстрированный выше, один из примеров сложностей, с которыми можно столкнуться. Здесь важно понимать, где метрики могут вводить в заблуждение, и устанавливать соответствующие контрольные показатели. Повторюсь: цель не изменение метрики, а достижение бизнес-результата или определенного выхода.

Метрики должны быть понятными

Метрики не только оценивают прогресс в достижении цели они помогают сплотить команду и позволяют сотрудникам действовать с большей автономностью. Для этого метрика должна быть понятна большой группе самых разных людей иначе это плохая метрика. Для высокотехнологичных команд (например, работающих над поиском) есть исключения, но, как правило, чем проще, тем лучше. Подумайте, сможете ли вы быстро объяснить суть метрики генеральному директору?

В основе самых важных решений почти никогда не бывает идеальных данных

Данные и метрики не существуют сами по себе они встроены в более широкую экосистему принятия решений. В сфере разработки продуктов у метрик есть два родственника: чутье и эмпатия. Обычно про них вспоминают реже, но от этого они не становятся менее важными. Иногда их называют продуктовой интуицией это интуитивное ощущение относительно того, как должен выглядеть идеальный продукт.

  • Чутье сложно выразить количественно, но это важный элемент в принятии решений: оно представляет собой кульминацию предыдущих решений и петель обратной связи. И, к счастью, чутье со временем обостряется.

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

  • Каждое наше решение это результат взаимодействия метрик, чутья и эмпатии. Если хороших метрик нет, приходится полагаться на эмпатию и наоборот.

Продуктовые команды часто хотят получить как можно более точные данные, и я понимаю это желание: они боятся принять неправильное решение. Но бездействие в ожидании данных тоже стоит денег, поэтому, принимая сложные решения в отношении продукта, всегда помните о двух факторах:

  1. Обратимость. Насколько обратимо это решение? Превышает ли цена принятия неправильного решения издержки от ожидания точных данных?

  2. Эмпатия. Можно ли заменить нужные данные эмпатией? Без одного из этих ориентиров обойтись можно но без обоих обойтись нельзя.

Резюме. Десять важных вопросов

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

  1. Какой цели вы пытаетесь достичь? Какие у вас миссия и видение?

  2. Как узнать, что цель достигнута?

  3. Как оценивать прогресс в достижении этой цели?

  4. Какие действия вам нужны от пользователей и как оценить, выполняются ли они?

  5. Как измерить совокупное поведение пользователей, определить контекст и выработать эмпатию?

  6. Метрики абсолютные или относительные? Цель привлечь определенное количество пользователей или определенный процент?

  7. Как понять, что продукт надежно работает у 99,9% пользователей?

  8. Можете ли вы объяснить выбранный истинный север максимум двумя предложениями?

  9. Какие контрольные метрики вы отслеживаете в экспериментах?

  10. Как пользователи относятся к продукту?

Здесь есть над чем подумать. Тема продуктовых метрик очень широкая, и в ней множество нюансов. Однако одно из самых эффективных действий, которые может предпринять продуктовая команда, вложить ресурсы и время в определение и построение правильных метрик.

Если статья оказалась полезной можете ознакомиться с остальными в блоге reeve.blog, которые появляются там регулярно (более-менее).


О переводчике

Перевод статьи выполнен в Alconost.

Alconost занимается локализацией игр, приложений и сайтов на 70 языков. Переводчики-носители языка, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов.

Мы также делаем рекламные и обучающие видеоролики для сайтов, продающие, имиджевые, рекламные, обучающие, тизеры, эксплейнеры, трейлеры для Google Play и App Store.

Подробнее..

Как мы делали SM Lab Analyst Day первый митап по системной аналитике в Sportmaster Lab ( видео всех докладов)

25.03.2021 14:07:14 | Автор: admin

Всем привет. Меня зовут Кирилл Капранов, я руководитель направления системного анализа в компании Sportmaster Lab. 10 марта 2021 года мы с коллегами сделали первый митап по системному анализу, и я хочу поделиться с вами тем, как это было.

Что первым приходит в голову, когда слышишь фразу: "работаю в Спортмастере"? Уверен, у 90% людей промелькнет в голове: "Хм, наверное, продаёт кроссовки". Почему именно эти стереотипы?

Всё просто: в прошлом компания "Спортмастер" делала упор на развитие розничной сети, создание собственного производства, налаживание сети поставок, и, хотя ИТ в этом играло большую роль, знали об этом только внутри компании.

С каждым годом развивающая роль ИТ увеличивалась, но существующая структура компании не позволяла покрывать потребности бизнеса, и в компании началась цифровая трансформация. Внутри цифровой трансформации мы проделали и продолжаем делать большую работу, подробнее можно почитать тут и тут. Мне бы хотелось выделить 2 значимые вехи трансформации:

  • Создание продуктовых команд;

  • Создание центров компетенций.

Когда мы трансформировались, было сформировано отдельное ИТ-подразделение, которое получило название Sportmaster Lab. В это подразделение вошли центры компетенции разработки, системного анализа, QA и методологии.

На этом я подведу черту и перейду к теме статьи. Подробнее о трансформации и роли ЦК аналитики можете послушать в выступлении Сергея Павлова, руководителя направления системного анализа в Спортмастере.

Как мы делали SM Lab Analyst Day

Как появилась идея провести митап?

Центр компетенции (далее - ЦК) аналитики появился меньше года назад. За это время ЦК объединил больше сотни сотрудников из 30 разных команд. Мы выработали стандарты, процессы, подходы и до сих пор прорабатываем решения, которые помогают развивать сотрудников и поддерживать развитие компании.

Однажды мы задали себе вопрос : "А кто об этом знает?". Ответ был неприятный, но честный : "Никто, кроме нас".

Ну что ж, приняли. Пора действовать.

Как спланировали

Любая идея начинается с плана. Наш случай не исключение. Мы оформили план в виде следующего списка:

Цель митапа: Формат проведения: Продвижение: Целевое количество людей: Количество докладов: Тайминг: Этапы подготовки: Договоренности:

План готов, а что с ним делать дальше?

Подготовка к митапу

Для себя мы выделили такие этапы подготовки:

  • Анонс о проведении митапа на сотрудников ЦК, призыв к действию

    На данном этапе важно донести до сотрудников ценность проведения митапа, а также прояснить все оставшиеся вводные:

    • Формат проведения

    • Количество докладов

    • Дата проведения

    • TO-DO list

Эту активность провели в корпоративных чатах и на встречах с сотрудниками. А потом начался этап сбора заявок на выступление.

  • Сбор заявок на выступление

Часто бывает, что на старте подготовки к митапу докладов нет, а есть только идея и желание. Но как же понять суть доклада, его мессадж? Инструменты для выполнения этой задачи можно объединить в такие структурные блоки*:*

  • Идея доклада. Это опыт, трудности или факап, который вдохновил сделать эти выводы.

  • Описание. Краткое изложение материала.

  • Почему это интересно слушать.

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

В нашем случае удалось немного прочитерить :)

В SM Lab у нас регулярно проходят внутренние клубы, предназначенные для того, чтобы делиться опытом или показывать полезные инструменты, упрощающие жизнь. Поэтому на старте мы имели порядка 8 тем с готовыми докладами.

Ну всё: считай, дело сделано, расходимся! Но нет...

  • Отбор докладов

Когда хочешь пойти в кино, то вряд ли пойдёшь на фильм, которые тебе неинтересен, ведь так же?

То же самое происходит и при проведении ИТ мероприятий. Нужно заинтересовать своего слушателя.

О чем интересно слушать:

  • Улучшение процессов (с цифрами)

  • Как я могу переиспользовать полученную информацию

  • Практический опыт, разбор примера

  • Факапы и какие выводы из этого были сделаны

  • Как увеличить личную или командную эффективность

О чем слушать не хочется:

  • Мы придумали штуку, но мы её не попробовали

  • Я прочитал статью или книгу, теперь я вам её перескажу

  • Мы тут сделали у себя локальную штуку, послушайте

  • Я расскажу всем известную информацию

Мы взяли бритву Оккама и применили эти списки к своим 8 докладам. Таким образом, у нас осталось 6 докладов и 4 спикера. Так как у каждого из двух спикеров было по два доклада, то мы отдали право выбора им. Так получился тот список докладов, который решили рассказывать на нашем митапе. Теперь пора подумать о продвижении.

  • Начало продвижения

    Для продвижения любого мероприятия нужны деньги ... на самом деле, не cовсем :). Деньги нужны, но не так много, как вы могли бы подумать, особенно в 2021 году, в эру онлайна.

    Для продвижения мероприятия важно подсветить следующие пункты:

    • Где будет проходить запись на мероприятие

    • Целевая аудитория

    • Инструмент проведения мероприятия

    Для своего мероприятия мы выбрали площадкой Timepad. Сначала мы рассматривали его только как инструмент записи на мероприятие, но, изучив его, поняли, что Timepad идеально подходит для нашего мероприятия, так как позволяет делать трансляции на 500 человек.

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

    И вот теперь, кажется, всё готово! Но нет...

    Заходя в анонс мероприятия, человек должен понимать, какую ценность он получит на выходе. Для этого необходимы тезисы краткие и емкие, отражающие суть доклада.

    Мы их сформулировали, теперь пора переходить к следующему этапу.

  • Тестовые прогоны

    Кажется, что тут всё просто: собирай встречи на спикеров и всех заинтересованных людей и проводи прогоны. Исправляй неточности, предлагай улучшения по презентации и докладу, задавай вопросы. Но много репетиций и правок совсем не гарант того, что финальный результат понравится публике. Мы посовещались и выбрали два прогона необходимым максимумом для митапа. И не прогадали.

Проведение митапа

Митап SM Lab analyst day состоялся 10 марта 2021 года. Пик слушателей составлял 200 человек. Среди участников митапа были cотрудники Сбербанка, Tinkoff, Райффайзенбанка, Альфа-Банка, МТС, EPAM, банка Открытие и РТЛабс и многих других компаний.

О чём мы рассказывали:

Пантелеева Елизавета -Работа в Спортмастере на примере проекта "Новый интернет магазин"

Лиза работает системным аналитиком в команде "Новый интернет магазин", которая состоит из 20 сотрудников (системные аналитики, бэкенд и фронтенд-разработчики, тестировщики).

В докладе Лиза затронула следующие моменты:

  • Как устроена работа продуктовой команды в компании Спортмастер

  • Как мы пришли к продуктовому подходу и какую проблему хотели решить

  • Кто и как проводит декомпозицию задач

  • Как задача переходит в работу и какие стадии она проходит

  • Какова роль системного аналитика

Полуян Артем -Практический кейс замещения аналитиками роли Тестировщик.

Когда ключевой сотрудник уходит из компании, это становится головной болью команды. Думаю, что многие из вас сталкивались с этой неприятной ситуацией. Появляются вопросы, требующие незамедлительного решения что же с этим делать, кто возьмёт на себя роль этого человека.

В докладе Артёма есть ответы на эти вопросы:

  • Как команда может остаться без одной из компетенций

  • Кто и каким образом может забрать на себя работу в момент поиска специалистов

  • Какие подходы в команде опробовали при замещении компетенции

  • Как происходил онбординг и обучение новых сотрудников

  • Какие выводы сделала команда и сам Артем

  • Практические советы по онбордингу нового сотрудника

Заев Артем -Ходим с разработчиками налево!Или Как уменьшить потери на пробелах в бизнес-постановках

Как мы знаем, cистемный аналитик выступает связующим звеном между бизнесом и командой, но зачастую аналитик смотрит на задачу верхнеуровнево и не может задать вопросы бизнесу, которые возникают из-за специфики слоев разработки. Системный аналитик становится "лишним звеном" в цепочке: бизнес-аналитик-разработчик. Как же построить прямой диалог?

Артем поделился кейсом о том, как смогли сначала наладить диалог между командой разработки и заказчика, а потом и уменьшить количество прямого общения c помощью интерактивных досок Miro. Он рассказал о функционале Miro применимо ко Спортмастеру, о том, как общаются с помощью инструмента участники команды, и о профитах от внедрения.

Хахарев Иван -Как мы пришли к Figma или зачем учиться готовить вкусно

Однажды к Ивану в команду пришли новые разработчики и сказали, что макеты это уже прошлый век, и будущее за прототипированием. Так как Ваня человек, который любит изучать новое, он загорелся идеей исследования инструментов прототипирования. В своем докладе он рассмотрел 3 популярных инструмента Axure, Adobe XD и Figma, сравнил их между собой, а также объяснил, почему он выбрал один из них. Бонусом Ваня устроил мини-воркшоп по созданию прототипа.

Заключение

Это был наш первый митап по системному анализу: не всё прошло гладко, как это бывает в первый раз, но мы получили классный опыт проведения подобных мероприятий и рассказали миру инсайдерской информации о системной аналитике в крупном спортивном ритейлере :)

На этом мы не заканчиваем. 20-21 мая мы участвуем в конференции Analyst Days, где выступим с докладами и пообщаемся с единомышленниками на стенде компании.

Нам нравится открыто рассказывать о своей работе. Увидимся на наших новых мероприятиях!

Подробнее..

Дайджест интересных материалов для мобильного разработчика 389 (5 11 апреля)

11.04.2021 14:15:43 | Автор: admin
В новом выпуске делаем таб-ба с нестандартной кнопкой и кастомные переходы, эволюционируем декларативные фреймворки и готовимся к I/O 2021, доказываем разработку и отказываемся от стандартных теней. Все это и многое другое в этом дайджесте!



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

Настало время офигительных историй. Кастомные транзишены в iOS. [2/2]
Как реализовать таб-бар с нестандартной кнопкой: CAShapeLayer и UIResponderChain
Работа с Bluetooth в iOS
5 секретов, о которых iOS-разработчики вам не скажут
Понимаем параллельную разработку в iOS
SwiftUI: как сделать снимок экрана с содержимым ScrollView?
Создание системы лицензирования для платных приложений на Swift
Плавный скроллинг в iOS
Hive: игра Улей для iOS
IrregularGradient: анимированные градиенты

Android

Rust включили в список основных языков для разработки платформы Android
Android 12 Developer Preview: готовим приложение к новым обновлениям
Эволюция декларативных UI-фреймворков: от динозавров к Jetpack Compose
Жизнь без AppStore и Google Play: работаем с Huawei Mobile Services и AppGallery
MotionLayout + RecyclerView = красивые анимированные списки
Разбираем ELM архитектуру в рамках мобильного приложения
Простой вариант разношерстного recycler view на шаблоне Посетитель
Конференция I/O 2021 пройдет в мае в виртуальном формате
Google Play Store обновил дизайн
Android Broadcast: GraphQL для мобильных разработчиков. Стоит ли использовать REST?
Android Broadcast: новости #8
Мой опыт работы с Flutter как Android-разработчика
Изучение Jetpack Compose создание простого приложения с таймером
Создание уровня данных репозиторий с помощью корутин в Kotlin
Решайте мобильные продакшен проблемы как Шерлок
GitHub Actions: автоматизируйте рабочий процесс сборки и выпуска Android-приложений
Запомните {mutableStateOf ()} шпаргалка
Шумный код с Kotlin Scopes
10 отличных идей для улучшения времени сборки Gradle
Switch Snake: змейка из переключателей
Holi: цвета Jetpack Compose
Uinspector: иерархия представлений

Разработка

Доказательная разработка или как data-driven подход добавил смысла работе
Как мы изменили пайплайн создания контента в PvP-шутере и забыли про кранчи
Почему мы отказались от стандартных теней Unity для мобильных шутеров и вместо этого написали свои
Вам звонок. Как выстроить отношения между QA и техподдержкой
Как написать плагин для Фигмы: проблема, MVP, решение
История одного видео редактора
Как сократить стоимость мобильной разработки
Как мы сделали мобильное приложение для курьеров ВкусВилл за 9 дней
Синтезатор на Unity 3D
Снова про UI\UX дизайн в 1С или как ускорить разработку мобильных приложений
Podlodka #210: технический консалтинг
7 из 10 программистов жалуются на переработки
Objective-C выпал из топа рейтинга TIOBE, а Fortran вернулся
Zoom выпустил Video SDK
Mail.ru Group запустила совместный редактор кода
Google представил аудиокодек Lyra на основе ИИ
4 ошибки, которые я сделал как программист, но мне пришлось стать техническим директором, чтобы увидеть их
Почему изучение программирования не поможет сохранить ваше рабочее место
Дизайн приложений: примеры для вдохновения #39
Рекомендации по проектированию автозаполнения (autosuggest)
10 лучших UI-китов в Figma для вашего проекта
30 самых популярных вопросов на собеседовании по программированию в Apple (с решениями)
Почему менеджеры по-прежнему хотят писать код
Как мы сделали из членов команды Airbnb мобильных инженеров
Как добиться успеха на кодинг-интервью в 2021 году
Лучший технический стек для разработки мобильных приложений в 2021 году
Эволюция написания современных мобильных приложений
8 обязательных расширений для Flutter-разработчиков
5 лучших навыков Senior-программистов
Маркетинг для инди-разработчиков: исследование рынка
Ежедневный стендап пустая трата времени
Ключевой фреймворк, который я использовал, чтобы изучать любые новые технические навыки
5 лучших практик для создания эффективных кнопок
Дизайн взаимодействий это больше, чем просто пользовательские потоки и клики
Прекратите добавлять комментарии к вашему коду
Полезный фреймворк для именования ваших классов, функций и переменных
Как зарабатывать на программировании
Создание красивого интерфейса во Flutter
Архитектура технологического стартапа, состоящего из одного человека

Аналитика, маркетинг и монетизация

Гайд по мобильной рекламе для тех, кто задумался о монетизации
Как мобильное приложение помогло ВкусВиллу стать лидером по количеству заказов продуктов онлайн
Разработка, аналитика и атрибуция. Какие сервисы нужны для мобильного приложения в 2021?
Маркетологи в мобайле: Николай Липкин (Яндекс.Медиасервисы)
Epic и Apple готовятся к суду
Mem получает $5.6 млн на ведение заметок
Bunch: ассистент по лидерству
Charles получает инвестиции на разговорную коммерцию
Самые скачиваемые приложения в марте 2021
Supercell делает еще три Clash-игры
Руководство по продуктовым метрикам

AI, Устройства, IoT

HMM: ловим мошеннические транзакции
Wi-Fi розетка с управлением через Интернет за 60 минут
Чем мобильные разработчики заряжают девайсы: 10 новых качественных аксессуаров с AliExpress

< Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку пришлите, пожалуйста, в почту.
Подробнее..

Как мы просто сократили объем входящего в дата-центр трафика на 70

03.02.2021 22:16:57 | Автор: admin

Хочу рассказать о том, как довольно простым лайфхаком мы радикально сократили объем входящего в дата-центр трафика, одновременно сделав жизнь пользователей нашего мобильного приложения чуть лучше и даже уменьшив расход заряда их батареи.

Единственное, о чем мы пожалели что не применили это решение раньше.

Наша команда придерживается принципов Data-Driven, то есть решения о развитии продуктов принимаются на основе метрик, а внедрение любых новых фич начинается с проверки гипотез. Для этого мы собираем и агрегируем колоссальное количество данных о том, что происходит внутри.

Два года назад, когда мы переходили с RedShift на ClickHouse, количество собираемых аналитических событий (приложение открылось, приложение запросило ленту контента, пользователь просмотрел контент, пользователь поставил смайл (лайк) и так далее) составляло около 5 млрд в сутки. Сегодня это число приближается к 14 млрд.

Это огромный объём данных, для хранения и обработки которого мы постоянно придумываем решения и лайфхаки, а сервис, их агрегирующий один из самых сложных среди всех наших инфраструктурных сервисов.

Но перед тем, как агрегировать, сохранить и обработать столько данных, их надо сначала принять и с этим есть свои проблемы. Часть описана в статье о переходе на ClickHouse (ссылка на неё была выше), но есть и другие.

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

Во время брейншторма по поводу одного из таких инцидентов прозвучала идея: раз мы создаём этими событиями такой колоссальный объём трафика, может быть нам начать его сжимать на клиентских устройствах? Отличная идея, но она была отвергнута как неконструктивная. Ведь это не избавит нас от катастрофы, а лишь оттянет её на какое-то время. Поэтому идея отправилась в специальный ящичек для неплохих идей.

Но ближе к лету непростого 2020 года ей нашлось применение.

Протокол HTTP, помимо сжатия ответов (о котором знают все, кто когда-либо оптимизировал скорость работы сайтов), позволяет использовать аналогичный механизм для сжатия тела POST/PUT-запросов, объявив об этом в заголовке Content-Encoding. В качестве входящего обратного прокси и балансировщика нагрузки мы используем nginx, проверенное и надёжное решение. Мы настолько были уверены, что он сумеет ко всему прочему ещё и на лету распаковать тело POST-запроса, что поначалу даже не поверили, что из коробки он этого не умеет. И нет, готовых модулей для этого тоже нет, надо было как-то решать проблему самостоятельно или использовать скрипт на Lua. Идея с Lua нам особенно не понравилась, зато это знание развязало руки в части выбора алгоритма компрессии.

Дело в том, что давно стандартизированные алгоритмы сжатия типа gzip, deflate или LZW были изобретены в 70-х годах XX века, когда каналы связи и носители были узким горлышком, и коэффициент сжатия был важнее, чем потраченное на сжатие время. Сегодня же в кармане каждого из нас лежит универсальный микрокомпьютер первой четверти XXI века, оборудованный подчас четырёх- и более ядерным процессором, способный на куда большее, а значит алгоритм можно выбрать более современный.

Выбор алгоритма

Требования к алгоритму были простыми:

  1. Высокая скорость сжатия. Мы не хотим, чтобы приложения тормозили из-за второстепенной функции.

  2. Небольшое потребление процессорной мощности. Не хотим, чтобы телефоны грелись в руках пользователей.

  3. Хорошая поддержка, доступность для основных языков программирования.

  4. Permissive лицензия.

Сразу отбросили Brotli, предназначенный для одноразового сжатия статического контента на стороне сервера. По схожей причине решили отказаться от bzip, также ориентированного на статику и большие архивы.

В итоге остановились на алгоритме Zstandard, по следующим причинам:

  • Высокая скорость сжатия (на порядок больше, чем у zlib), заточенность на небольшие объёмы данных.

  • Хороший коэффициент сжатия при щадящем уровне потребления CPU.

  • За алгоритмом стоит Facebook, разрабатывавший его для себя.

  • Открытый исходный код, двойная лицензия GPLv2/BSD.

Когда мы увидели первым же в списке поддерживаемых языков JNI, интерфейс вызова нативного кода для JVM, доступный из Kotlin мы поняли, что это судьба. Ведь Kotlin является у нас основным языком разработки как на Android, так и бэкенде. Обёртка для Swift (наш основной язык разработки на iOS) завершила процесс выбора.

Решение на бэкенде

На стороне бэкенда задача была тривиальная: увидев заголовок Content-encoding: zstd, сервис должен получить поток, содержащий сжатое тело запроса, отправить его в декомпрессор zstd, и получить в ответ поток с распакованными данными. То есть буквально (используя JAX-RS container):

// Обёртка над Zstd JNIimport org.apache.commons.compress.compressors.zstandard.ZstdCompressorInputStream;// ...if (  containerRequestContext    .getHeaders()    .getFirst("Content-Encoding")    .equals("zstd")) {  containerRequestContext    .setEntityStream(ZstdCompressorInputStream(      containerRequestContext.getEntityStream()    ))}

Решение на iOS

Решили сначала попробовать сжатие аналитических событий на iOS. Команда разработки была свободнее, ну и клиентов на iOS у нас несколько меньше. На всякий случай закрыли этот функционал при помощи feature toggle с возможностью плавной раскатки.

import Foundationimport ZSTDfinal class ZSTDRequestSerializer {    private let compressionLevel: Int32    init(compressionLevel: Int32) {        self.compressionLevel = compressionLevel    }    func requestBySerializing(request: URLRequest, parameters: [String: Any]?) throws -> URLRequest? {        guard let mutableRequest = (request as NSURLRequest).mutableCopy() as? NSMutableURLRequest else {            return nil        }        // ...        mutableRequest.addValue("zstd", forHTTPHeaderField: "Content-Encoding")        if let parameters = parameters {            let jsonData = try JSONSerialization.data(withJSONObject: parameters, options: [])            let processor = ZSTDProcessor(useContext: true)            let compressedData = try processor.compressBuffer(jsonData, compressionLevel: compressionLevel)            mutableRequest.httpBody = compressedData        }        return mutableRequest as URLRequest    }}

Осторожно включив фичу на 10% клиентов прямо в процессе раскатки очередной версии, затаив дыхание, стали смотреть в логи, метрики, индикатор крашей и прочие инструменты. Проблем не обнаружилось, полёт был нормальный.

Впрочем, и снижение объёма трафика было не сильно заметно. Дождавшись, пока новая версия клиента раскатится пошире, мы врубили сжатие на 100% аудитории.

Результат нас, мягко говоря, удовлетворил:

График падения трафика на iOSГрафик падения трафика на iOS

Входящий трафик упал аж на 25%. На графике представлен весь входящий в наш дата-центр трафик, включающий и штатные запросы клиентов, и закачиваемые ими картинки и видео.

То есть мы на четверть сократили весь объём.

Решение на Android

Воодушевлённые, мы запилили сжатие для второй платформы.

// Тут перехватываем отправку события через interceptor и подменяем оригинальный body на сжатый если это запрос к eventsoverride fun intercept(chain: Interceptor.Chain): Response {   val originalRequest = chain.request()   return if (originalRequest.url.toString()               .endsWith("/events")) {      val compressed = originalRequest.newBuilder()            .header("Content-Encoding", "zstd")            .method(originalRequest.method, zstd(originalRequest.body))            .build()      chain.proceed(compressed)   } else {      chain.proceed(chain.request())   }}// Метод сжатия, берет requestBody и возвращает сжатыйprivate fun zstd(requestBody: RequestBody?): RequestBody {   return object : RequestBody() {      override fun contentType(): MediaType? = requestBody?.contentType()      override fun contentLength(): Long = -1 //We don't know the compressed length in advance!      override fun writeTo(sink: BufferedSink) {         val buffer = Buffer()         requestBody?.writeTo(buffer)         sink.write(Zstd.compress(buffer.readByteArray(), compressLevel))      }   }}

И тут нас ждал шок:

График падения на AndroidГрафик падения на Android

Так как доля Android среди нашей аудитории больше, чем iOS, падение составило ещё 45%. Итого, если считать от исходного уровня, мы выиграли суммарно 70% от, напомню, всего входящего трафика в ДЦ.

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

В этот момент мы только могли пожалеть, что не нашли время на внедрение такой рационализации раньше.

Также стало видно, что наши опасения относительно батарейки не оправдались. Наоборот, потратив немного процессорной мощности телефона на сжатие данных, мы экономим намного больше электричества на передаче этих данных в эфир, как на Wi-Fi, так и по сотовой сети.

Два слова, что ещё можно улучшить

У Zstandard есть очень интересная возможность использования предобученного словаря. Если взять достаточно большой объём типичных данных и прогнать по нему сжатие, то можно получить на выходе словарь наиболее высокочастотных вхождений, который затем использовать и при сжатии, и при распаковке.

При этом коэффициент сжатия увеличивается от 10-15% на текстах до 50% на однообразных наборах строк, как у нас. А скорость сжатия даже несколько увеличивается при размере словаря порядка 16 килобайт. Это, конечно, уже не приведёт к такому впечатляющему результату, но всё равно будет приятно и полезно.

Подробнее..

Приложение Роскомнадзора кому полезно и насколько хорошо защищает данные

12.03.2021 14:20:14 | Автор: admin

В феврале 2021 года РКН представил собственное приложение для защиты интернет-пользователей от социально опасного контента. Сервис стремится к мультифункциональности и в скором времени планирует значительно расширить инструментарий.

Функционал: сегодня и завтра.

Созданный в РКН цифровой инструмент повысит эффективность защиты интернет-пользователей от вредоносного контента. Мобильное приложение сделает более оперативным механизм удаления из Сети противоправной информации, имеющей отношение к детской порнографии, пропаганде суицидов, наркотических средств и т.д. Такие материалы сегодня включаются в Единыйреестрзапрещенных сайтов.

До февраля 2021 года пользователи могли подать жалобу на противоправный контент только на сайте РКН. Кстати, по этому каналу обратной связи с ноября 2012 года получено более 2,7 млн сообщений об информации в интернете, нарушающей российское законодательство.

За восемь с небольшим лет в ведомство поступило и рассмотрено более 315 тыс. сообщений о детской порнографии, почти 643 тыс. о незаконном обороте наркотиков, 211,5 тыс. о призывах к самоубийству, около 1,5 млн о нелегальных азартных играх.

В мобильном приложении помимо подачи жалобы на запрещенный контент также можно будет:

  • отследить этапы ее рассмотрения;

  • проверить, ограничен ли доступ к интернет-ресурсам и т.д.

Также инструменты сервиса позволяют провайдерам хостинга и владельцам сайта своевременно получать сведения от Роскомнадзора в отношении их сайтов в части размещенного на них запрещенного контента.

По словам одного из создателей проекта, руководителя подразделения проведения экспериментальных работ Научно-технического центра ФГУП Главный радиочастотный центр (ГРЧЦ) Владислава Минакова, в ближайшее время будут расширены опции приложения:

  • расширение функционала в части реализации кабинета СМИ и вещателя;

  • введение новых групп пользователей (учредители СМИ, вещатели, главные редакторы);

  • реализация возможностей оперативного получения используемой в деятельности СМИ информации;

  • расширение способов доставки до поднадзорных лиц юридически значимых документов.

Предложения пользователей учитываются.

Увеличение функциональных возможностей приложения будет основано не только в связи с новыми полномочиями подразделений РКН, но и на основании опыта подписчиков.
Обратная связь с ними сегодня осуществляется посредством отзывов в магазинахGoogle PlayиApp Store, а также по электронной почте ermp@grfc.ru.

В. Минаков сообщил, что уже поступил ряд конструктивных предложений от пользователей по новым опциям. Это, в частности:

1) адаптация интерфейса;

2) рассмотрение возможности по расширению способов авторизации (по номеру телефона, госуслуги Москвы mos.ru).

Пока доступ к сервису РКН осуществляется через Единую систему идентификации и аутентификации (портал Госуслуг) и не требует дополнительной регистрации.
Начавшееся в феврале бета-тестирование приложения будет проходить до возможного выявления и устранения проблем в его работе. Вероятно, стабильный релиз будет уже в марте, рассказал эксперт ГРЧЦ. Также он сообщил, что обновления сервиса выходят по мере необходимости. За период бета-тестирования было сделано несколько таких доработок приложения. Масштабные обновления же с новым функционалом планируются 1-2 раза в год.

Запуск такого мобильного ПО это один из элементов цифровой трансформации, которую РКН активно ведет, начиная с 2020 года, в соответствии с утвержденной в декабре 2020 года ведомственной стратегией.

Насколько защищена конфиденциальность.

Мобильное приложение РКН было написано с нуля, без применения зарубежных решений, уточнил В.Минаков.

В ходе разработки было использовано много отечественных IT-кейсов, например, модуль шифрования openssl-gost.

Сервис, по словам его автора, отвечает всем современным требованиям и соединил многие актуальные технологии.

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

Перед запуском был проведен полный внутренний аудит самого приложения и серверных компонентов, произведена имитация DoS и DDoS атак.

Конфиденциальность данных пользователей также в приоритете. Мобильный сервис поддерживает минимально необходимое количество соединений, которые устанавливаются:

  • с сервером приложения это касается обновления данных и статусов;

  • сервером Госуслуг (авторизация);

  • сервером Firebase Cloud Messaging (для push-уведомлений;

  • сервером Я.Метрика. Данное взаимодействие будет только в период бета-тестирования, в дальнейшем функционал будет отключен.

Подробнее..

Дайджест интересных материалов для мобильного разработчика 385 (8 14 марта)

14.03.2021 20:05:08 | Автор: admin
В этом дайджесте ускорение отладчика и увеличение размера приложений, увеличение скорости и автоматизация тестирования, координация релизов, объективно субъективный улучшатель, модальные окна и многое другое!



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

Как мы ускоряли работу отладчика Swift
DI в iOS: Complete guide
Запуск игры на Unity из приложения SwiftUI для iOS
Средний размер игр в App Store вырос на 76% за 5 лет
Telegram объявил конкурс на создание приложения для WatchOS 6+
Кастомные UIButtons тени, анимации, Lottie и т.д.
SwiftGen: генератор Swift кода
Почему ссылочные типы Swift плохо влияют на время запуска приложения
Самый заминусованый вопрос Stack Overflow о Swift
Как разработать приложение для стриминга для iOS на SwiftUI за 7 дней
Создание панели поиска на чистом SwiftUI
Осваиваем превью SwiftUI
5 способов хранить пользовательские данные в iOS-приложении
SwiftVideoBackground: фоновое видео для UIView
XUI: архитектуры SwiftUI

Android

Как мы в 2 раза увеличили скорость формирования ленты в UGC-приложении
Reaction обработка результатов методов в Kotlin
Kotlin. Лямбда vs Ссылка на функцию
Как реализовать отслеживание местоположения андроид устройства на своем сайте
Получаемрезультатправильно(Часть 1). ActivityResultAPI
Играем с CLIP. Создаем универсальный zero-shot классификатор на Android
Kotlin Best Practices
Jetpack Activity Result API. Часть 1. Практическое использование
Сказка об изогнутом Recycler View
Как создать приложение для Android на Raspberry Pi за 7 шагов
Navigation Rail для Android
Навигация в Jetpack Compose
Кеширование данных в Android
Ускоряем CI-конвейер для Android с помощью модульных проверок в Github Action
Переход с Mac на Ubuntu в разработке под Android
Внедрение Kotlin в Prime Video для большего удовлетворения разработчиков и меньшего количества кода
Пока LiveData, привет SharedFlow
StackExpandableView: стек, как на iOS
MarkdownText: разметка для Jetpack Compose

Разработка

Как выйти на китайский рынок с mini-app для WeChat, чтобы не прогореть
Автоматизация тестирования мобильных приложений. Часть 1: проверки, модули и базовые действия
Как устроена библиотека дизайн-системы Авито в Фигме
World of Tanks Blitz: Автоматизированное тестирование производительности
Flutter 2: что нового
Тупые способы сэкономить на мобильной разработке
2 шага к построению адаптивной верстки Flutter-приложения
Как я навел порядок страниц вФигме
Кроссплатформенные OpenGL + Python при помощи Kivy
Сушите вёсла #13: сделай мне красиво
Podlodka #206: Clojure
Руководство для инженеров о том, как сказать нет
Дизайн приложений: примеры для вдохновения #35
Runway помогает координировать релизы приложений
Руководство для инженеров по рефакторингу кода
Мобильные модальные окна: 8 лучших примеров использования
Наушники для программиста: поток и защита
От робота-рекрутера до UGC-приложения голосовых пародий для 2 млн пользователей. Личный опыт и немного аутстаффа
Разработка идеального поиска для Википедии под Android
Верхняя или боковая навигация: что лучше для вашего продукта?
Упростите развертывание с помощью Continuous Delivery и GitHub Actions
Прощай Electron, здравствуй Flutter
Новый революционный UI не за горами вот признаки
3 книги для развития карьеры разработчика
Aurora UI новый визуальный тренд на 2021 год
История переписывания любого ПО
Как писать ужасные комментарии к коммитам

Аналитика, маркетинг и монетизация

Игры, которые играют в людей: что книга Игра в цифры рассказывает об игровой аналитике
Мобильные игроки 45+ в 2020 показали наибольший прирост
Как разработчики приложений меняют стратегию и добиваются успеха в новых условиях
Как эксперименты с ценой увеличили мой доход на 500%
Step: банк для молодежи
Самые скачиваемые приложения в феврале 2021

AI, Устройства, IoT

Вкусовщина и AI: как мы в Prisma Labs делали объективно субъективный автоматический улучшатель фотографий
Оживление портрета с помощью Realistic Neural Talking Head Models
Сказ о том, как я Home Assistant настраивал

Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку пришлите, пожалуйста, в почту.
Подробнее..

Выходим на рынок Huawei, или Как мы адаптировали приложение для работы с HMS

15.03.2021 12:08:42 | Автор: admin


Привет, Хабр! Меня зовут Георгий Гигаури, я разрабатываю Android-приложение Delivery Club. Эта статья появилась после доклада на конференции Mobius 2020, где мы выступали вместе с Павлом Борзиковым. Для тех, кто любит видео, ищите его в конце статьи.

Почему мы вообще обратили внимание на Huawei-устройства? Всё началось с того, что Huawei теперь не может распространять свои устройства с сервисами Google Play. Да, они могут использовать ОС Android, так как это открытая операционная система, но чтобы распространять устройства с сервисами Google Play, необходимо иметь лицензию. К сожалению, Huawei не может получить её из-за разногласий между Китаем и США. Поэтому Huawei приходится разрабатывать свои собственные Mobile Services. Справедливости ради, они этим занимались уже давно, но теперь им приходится расширять кодовую базу, активно увеличивать количество сервисов.

Почему стоит обратить внимание на экосистему Huawei


Смартфоны Huawei очень популярны: в 2020 году в России они занимали почти 18% рынка (Рис.1), а в мире 11% (Рис.2), (источник). Huawei заявила, что более 490 млн человек в более чем в 170 странах мира пользуются AppGallery (источник). Поскольку аудитория у Huawei-устройств огромная, мы не можем это игнорировать и решили поддержать пользователей нашего приложения. Далее поэтапно рассмотрим, что же нужно сделать.


Рис.1


Рис.2

Этап 1: проверка наличия Services


Если у вас в приложении при входе есть проверка наличия Google Services, то придётся от этого отказаться, и проверять наличие соответствующих сервисов только по мере необходимости.

fun Context.getMobileServiceSource(): MobileServicesSource {    val googleApi = GoogleApiAvailability.getInstance()    if (googleApi.isGooglePlayServicesAvailable(this) == com.google.android.gms.common.ConnectionResult.SUCCESS) {        return MobileServicesSource.GOOGLE    }    val huaweiApi = HuaweiApiAvailability.getInstance()    if (huaweiApi.isHuaweiMobileServicesAvailable(this) == com.huawei.hms.api.ConnectionResult.SUCCESS) {        return MobileServicesSource.HMS    }    return MobileServicesSource.NONE}enum class MobileServicesSource {    GOOGLE,    HMS,    NONE}

Пример реализации: добавляем extension, возвращающий конкретный доступный сервис, а в момент использования функциональности проверяем, что на устройстве есть нужные нам сервисы.

Этап 2: карты


В приложении Delivery Club три основные страницы:

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

На устройствах Huawei все эти карты не работают. Чтобы это исправить, можно просто заменить зависимости: вместо пакета com.google.android.gms использовать com.huawei.hms:





Конечно, есть нюансы, но мы уже сделали большую часть работы. Huawei сделала Maps SDK с контрактами, по большей части соответствующий Google Maps SDK. Однако у Google есть deprecated-методы, если вы их используете, то аналогов у Huawei может и не найтись. Например, для получения местоположения пользователя мы используем:

LocationServices.FusedLocationApi.getLastLocation(googleApiClien)

Такой подход считается deprecated, и если мы просто скопируем код для Huawei Maps и заменим зависимости, то работать не будет. Нужно поменять так:

LocationServices.getFusedLocationProviderClient().getLastLocation().addOnSuccessListener()

PolyUtil. Расшифровка с помощью Polyline


Теперь нам нужно отображать перемещение курьера. Для этого нам нужно расшифровывать строку, которая приходит с сервера. Для этого воспользуемся тем же алгоритмом от Google, с помощью которого строка кодировалась.



После расшифровки мы получили список координат курьера.

Реализация поддержки двух карт


Для поддержки нескольких карт необходимо создать обёртку для самих карт и для объекта.

Добавляем общий интерфейс, например, IMapWidget. Не забываем сделать общий класс для LatLng список координат курьера. У Google он лежит в пакете com.google.android.gms.maps.model.LatLng, а у Huawei в com.huawei.hms.maps.model.LatLng. Кладём список в PolyLineOptions и задаём ширину и цвет линии маршрута.

interface IMapWidget {    void animateCamera(...);    void setListener(OnMapEventListener listener);    void setMapPadding(...);    MapMarker addMarker(...);    ...}

Добавляем Custom Map View реализующего интерфейс IMapWidget:



Добавляем обёртку, которая позволяет нам указать, где мы хотим отрисовывать карту:

class MapWrapper : FrameLayout() {    fun setupMap(widget: IMapWidget) {        removeAllViews()        addView(widget as View)    }}

И в нужном месте вызываем метод добавления карты.

override fun onCreateView(...) {    ...    val map: IMapWidget = MapFactory.createMap()    viewMapWrapper.setupMap(map)    ...}

Такие обёртки класса нужно создать для всего: объектов, маркеров, PolyUtil, PolyLine и т.д.

Проблема: Карта не работает




Однажды нам сообщили о баге. Пользователь с устройством Huawei, находившийся в центре Москвы (Рис.3), открыл приложение, нажал на кнопку Переместиться на своё местоположение, и его перенесло в пустоту (Рис.4). Пользователь не видит, ни улиц, ни зданий, и он решил, что карта не работает.

Мы попробовали воспроизвести у себя эту проблему. И действительно попадали в неопределённое пространство. Когда попробовали чуть-чуть уменьшить масштаб карты, то оказалось, что мы попали в пригород Мариуполя (Рис.5). То есть из московских координат (55.819207, 37.493424) перенеслись в мариупольские (47.187447, 37.593137). Мы были в полном недоумении. Может быть, где-то у нас с числами что-то не то происходит. Возможно, происходят некие вычитания наших координат. Очень долго искали решение этой проблемы или хотя бы причину. Оказалось, что мы заменили импорты из Google-карт, и поэтому всё перестало работать. В конце концов мы добрались до paddingа.



Давайте быстро вспомним, что такое padding у карты. На (Рис.6) показан экран авторизации, карта занимает всю область экрана, даже под плашкой ручного ввода адреса. В таком случае, если мы не добавим padding карте, её центр будет находиться на месте зелёного треугольника, но мы хотим, чтобы он был в центре рабочей области карты. Padding сужает рабочую область (Рис.7). Не видимую, а именно рабочую. Карта будет по-прежнему занимать весь экран, но размер её рабочей области изменится. И когда вы будете переходить в новую координату, она будет принимать положение новой рабочей карты. Как оказалось, баг был именно из-за этого.

Первое решение: убрать padding. Как вы понимаете, такой вариант нам не подошёл. Мы хотели, чтобы всё отображалось красиво.

Второе решение проблемы: использовать анимированное перемещение, но с масштабированием.

val zoom = map.cameraPosition.zoommap.animateCamera(CameraUpdateFactory.newLatLngZoom(position, zoom))

При переходе с изменением масштаба карты всё работало правильно. Здорово! Мы подумали, что это нам подходит. На самом деле нет. У нас ещё есть третий экран, на котором нужно увеличивать карту относительно двух маркеров, чтобы zoom сам рассчитывался, поэтому мы не можем задать какое-то константное масштабирование. То есть такой вариант нам тоже не подошёл. Начали думать дальше и нашли новое решение.

Третье решение проблемы: вообще отказаться от анимации. Как оказалось, если вместо animateCamera сделать просто move, то перемещение будет происходить правильно. Так мы и сделали. Надеемся, в скором времени Huawei устранит эту проблему.

Этап 3: push-сервис


Идём дальше. На Huawei-устройства не приходят уведомления нашего приложения. Дело в том, что мы не можем получить токен. Давайте его получим. В Google мы получаем задачу и извлекаем токены так:

FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->    if (task.isSuccessful) {        val token = task.result    }}

Наше решение:

class ImplementationHuaweiMessagingService : HmsMessageService() {    override fun onNewToken(token: String?) {        val commonApi = getComponentFactory().get(CommonApi::class.java)        commonApi.settingsManager().setPushToken(token)    }    override fun onMessageReceived(message: RemoteMessage?) {        message?.let {            val appManagersComponent = getComponentFactory().get(AppManagersApi::class.java)            appManagersComponent.pushManager().handle(it.dataOfMap)        }    }

Выглядит всё так же, как и с реализацией FirebaseMessagingService(), даже есть callbackи onNewToken и onMessageReceived. Однако без нюансов не обойтись. Случается, что на некоторых редких устройствах onMessageReceived вызывается в главном потоке, поэтому лучше не использовать здесь долго выполняющиеся задачи.

Получаем токены на Huawei:

val token = HmsInstanceId.getInstance(context)    .getToken(appId, com.huawei.hms.push.HmsMessaging.DEFAULT_TOKEN_SCOPE)public static final String DEFAULT_TOKEN_SCOPE = "HCM";

Обратите внимание, что метод выполняется в главном потоке. И для получения токена нужно отдельно реализовать поток. У Google такой подход уже считается устаревшим, возможно, Huawei придёт к тому же.

Мы можем вообще не использовать getToken, а прописать в манифесте автоматическую инициализацию или в коде методом setAutoInitEnabled() и всегда получать token в onNewToken (подробнее). Это решит ещё одну проблему: getToken в версиях EMUI ниже 10 вообще возвращает null.

<meta-data    android:name="push_kit_auto_init_enabled"    android:value="true"/>

Этап 4: Chrome Custom Tabs


Наше приложение при запуске регулярно вылетает с ошибкой ActivityNotFoundException. Чтобы от этого избавиться, нужно обработать отсутствие Chrome Tabs.

fun Context.openLink(url: String, customTabsSession: CustomTabsSession? = null): Boolean {    try {        openLinkInCustomTab(url, customTabsSession)        return true    } catch (throwable: Throwable) {        Timber.tag("Context::openLink").e(throwable, "CustomTabsIntent error on url: $url")    }    return openLinkInBrowser(url)}@Throws(Throwable::class)fun Context.openLinkInCustomTab(url: String, customTabsSession: CustomTabsSession? = null) {    CustomTabsIntent.Builder(customTabsSession)        .build()        .launchUrl(this, Uri.parse(url))}private fun Context.openLinkInBrowser(url: String): Boolean {    val intent: Intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply {        addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY or Intent.FLAG_ACTIVITY_NEW_DOCUMENT)    }    if (intent.resolveActivity(packageManager) != null) {        startActivity(intent)        return true    }    return false}

Мы просто обернули openLinkInCustomTab() в try catch и в случае ошибки пытаемся открыть в браузере. Но бывает такого, чтобы на устройстве не было подходящего браузера, способного обработать наш неявный intent. Поэтому если метод openLinkInBrowser() возвращает false, мы открываем страницу в webview.

Этап 5: аналитика


Аналитика у Huawei похожа на Google Analytics. Покажу замену на примере Firebase. Сначала инициализируем: HiAnalytics.getInstance(context). Затем с помощью HAEventType.STARTCHECKOUT копируем все наши события из Firebase в отдельный файл huaweiAnalytics:

huaweiAnalytics.onEvent(name, bundle)

Системные параметры: HAParamType.PRICE, HAParamType.CURRNAME

Даже если у вас нет Firebase, добавить аналитику в Huawei очень просто. У них отличная документация, контракт соблюдается. Также у Huawei есть отличные инструменты для исследования аудитории.

Этап 6: crashlytics


Следующий инструмент, который нам тоже стало интересно попробовать, это Crashlytics от Huawei, которая называется AGConnectCrash. Она позволяет с минимальными усилиями собирать и анализировать информацию о падении приложения.

Инициализируем crashlytics:

AGConnectCrash.getInstance().enableCrashCollection(true)

Добавляем свои ключи и журналируем нужные события:

AGConnectCrash.getInstance().setUserId("testuser")AGConnectCrash.getInstance().log(Log.DEBUG, "set debug log.")AGConnectCrash.getInstance().log(Log.INFO, "set info log.")AGConnectCrash.getInstance().log(Log.WARN, "set warning log.")AGConnectCrash.getInstance().log(Log.ERROR, "set error log.")AGConnectCrash.getInstance().setCustomKey("stringKey", "Hello world")AGConnectCrash.getInstance().setCustomKey("booleanKey", false)AGConnectCrash.getInstance().setCustomKey("doubleKey", 1.1)AGConnectCrash.getInstance().setCustomKey("floatKey", 1.1f)AGConnectCrash.getInstance().setCustomKey("intKey", 0)AGConnectCrash.getInstance().setCustomKey("longKey", 11L)

Этап 7: покупки в приложении


Если в вашем приложении есть встроенные покупки, вы должны подписать согласие на передачу персональных данных, и отослать письмом в конверте или через курьера в московский офис Huawei. И только через пару дней они вам дадут доступ для реализации этой функциональности.

Всё очень похоже на реализацию Google. При запуске приложения запрашиваем все прошлые покупки пользователя:

fun getOwnedPurchases(    activity: Activity,    ownedPurchasesResultOnSuccessListener: OnSuccessListener<OwnedPurchasesResult>,    failureListener: OnFailureListener) {    val ownedPurchasesReq = OwnedPurchasesReq()    // priceType: 0: consumable; 1: non-consumable; 2: auto-renewable subscription    ownedPurchasesReq.priceType = IapClient.PriceType.IN_APP_SUBSCRIPTION    // To get the Activity instance that calls this API.    val task: Task<OwnedPurchasesResult> = Iap.getIapClient(activity)        .obtainOwnedPurchases(ownedPurchasesReq)    task.addOnSuccessListener(ownedPurchasesResultOnSuccessListener)        .addOnFailureListener(failureListener)}

Если какой-то товар был куплен, мы разблокируем его функциональность. Потом запрашиваем подробности по товарам, доступным для продажи цену и описание:

fun loadProduct(    context: Context,    productInfoResultOnSuccessListener: OnSuccessListener<ProductInfoResult>,    onFailureListener: OnFailureListener) {    // obtain in-app product details configured in AppGallery Connect, and then show the products    val iapClient: IapClient = Iap.getIapClient(context)    val task: Task<ProductInfoResult> = iapClient.obtainProductInfo(createProductInfoReq())    task.addOnSuccessListener(productInfoResultOnSuccessListener)        .addOnFailureListener(onFailureListener)}private fun createProductInfoReq(): ProductInfoReq {    val req = ProductInfoReq()    // 0: consumable ; 1: non-consumable ; 2: auto-renewable subscription    req.priceType = IapClient.PriceType.IN_APP_SUBSCRIPTION    val productIds = ArrayList<String>()    productIds.add("PRODUCT_ID")    req.productIds = productIds    return req}

Когда пользователь кликает на товар, мы открываем страницу с оплатой. Она не такая красивая, как у Google, и не выезжает снизу.

fun gotoPay(activity: Activity, productId: String, type: Int) {    val client: IapClient = Iap.getIapClient(activity)    val task: Task<PurchaseIntentResult> = client.createPurchaseIntent(createPurchaseIntentReq(type, productId))    task.addOnSuccessListener { result ->        result?.let {            val status: Status = result.status            if (status.hasResolution()) {                try {                    status.startResolutionForResult(activity, PAY_RESULT_ARG)                } catch (exception: SendIntentException) {                    Timber.e(exception)                }            } else {                Timber.d("intent is null")            }        }    }.addOnFailureListener { exception ->        Timber.e(exception)    }}

Так как это Activity, мы передаём ему аргумент, по которому можно отловить OnActivityResult и понять, успешно ли прошла оплата и как закончилась транзакция:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {    super.onActivityResult(requestCode, resultCode, data)    if (resultCode == PAY_RESULT_ARG) {        val purchaseResultInfo: PurchaseResultInfo = Iap.getIapClient(this).parsePurchaseResultInfoFromIntent(data)        when (purchaseResultInfo.returnCode) {            OrderStatusCode.ORDER_STATE_SUCCESS -> {                successResult(purchaseResultInfo)            }            OrderStatusCode.ORDER_STATE_CANCEL -> {            }            OrderStatusCode.ORDER_PRODUCT_OWNED -> {            }        }    }}

У нас есть специальные статусы: ORDER_SUCCESS, CANCEL, OWNED. Первый означает успешную оплату. Второй пользователь просто закрыл страницу без покупки, тогда мы обрабатываем этот callback и предлагаем скидку, чтобы уговорить на покупку. А третий статус означает, что товар уже куплен пользователем. Если товар разовый или подписочный, то на этом моменте нужно остановиться, в противном случае виртуально доставить покупку.

В случае успешной оплаты доставляем пользователю купленный товар:

private fun successResult(purchaseResultInfo: PurchaseResultInfo) {    val inAppPurchaseData = InAppPurchaseData(purchaseResultInfo.inAppPurchaseData)    val req = ConsumeOwnedPurchaseReq()    req.purchaseToken = inAppPurchaseData.purchaseToken    val client: IapClient = Iap.getIapClient(this)    val task: Task<ConsumeOwnedPurchaseResult> =        client.consumeOwnedPurchase(req)    task.addOnSuccessListener {        // Consume success    }.addOnFailureListener { exception ->        Timber.e(exception)    }}

Если не сделать доставку, то функциональность товара будет у пользователя заблокирована, а деньги возвращены. В Google Play Billing Library до третьей версии этого делать не нужно было, но потом Google тоже это добавил, и если мы не доставим товар, через 48 часов покупка отменится, а деньги вернутся пользователю. То есть в Huawei покупки реализованы как в третьей версии Google Play Billing.

Выводы


На реализацию поддержки Huawei-устройств не уйдёт много времени. Даже без реальных устройств вы сможете проверить работоспособность вашего приложение: у Huawei есть своя тестовая лаборатория с виртуальными устройствами наподобие Samsung Remote test lab. Количество пользователей быстро растёт, и бизнесу может оказаться выгодным вложиться в доработку продуктов, а отличная документация поможет разработчикам всё сделать быстро. Поддержка HMS активно отвечает на любые вопросы, если вы не сможете в документации что-то найти.

Видеозапись доклада с конференции Mobius 2020.

Полезные ссылки


Подробнее..

Разработка, аналитика и атрибуция. Какие сервисы нужны для мобильного приложения в 2021?

08.04.2021 10:11:09 | Автор: admin

Дисклеймер: я знаю отличные продукты, которые не пользуются никакими сервисами и зарабатывают сотни тысяч долларов в месяц. По моему опыту, это скорее исключение, чем практика, и если у вас такой продукт вам повезло и это очень круто.

Понятно, что любые сервисы аналитики нужны, когда все идет не слишком хорошо: если LTV/CAC > 10, аналитикой можно и не пользоваться. Ниже рассмотрим полезные сервисы для freemium приложений на iOS, которые пригодятся почти любой команде для разработки и продвижения приложения.


Привет, меня зовут Виталик, сейчас я основатель Adapty.io, а до этого был iOS разработчиком и дата саентистом. Я поделюсь своим опытом по работе с сервисами для мобильных приложений.

Подавляющее большинство мобильных приложений монетизируются через трафик, то есть, через закупку рекламы. По моей оценке, у большинства приложений нет сайта или веб-версии, да и платформа часто одна iOS. Если нет у компании нет доступа ксильному органическому ресурсу (SEO, блог и т.д.), то все, что доступно компаниям для контролируемого продвижения это App Store Optimization (ASO) и реклама.

Сервисы, которые пригодятся для разработки и продвижения, можно разделить на шесть категорий:

  1. Атрибуция трафика. Поможет ответить на вопрос откуда (с какой рекламы) пришли пользователи и построить юнит-экономику.

  2. Продуктовая аналитика. Поможет собрать событий (events) пользователей и профили. Посчитать любые метрики, включая воронки.

  3. Отправка пуш-уведомлений. Опционально email.

  4. Подключение платежей (in-app purchases), сбор аналитики подписок и их роста. Подключить платежи на любой платформе это всегда тяжело, собрать данные и не ошибиться, это еще сложнее.

  5. ASO-инструменты. Аналитика и оптимизация органического роста в App Store.

  6. Крэшлитика. Аналитика крэшей приложения.

Ниже разберемся какие есть сервисы на рынке, сколько они стоят и в какой момент времени их стоит внедрять.

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

Атрибуция

Зачем нужна

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

Атрибуция традиционно является основной компонентой в закупке платного трафика. Так как большая часть рекламы на приложения закупается в Facebook, то нужен такой сервис, который может этот трафик атрибутировать. К сожалению, таких сервисов мало и они дорогие. Причина простая получить статус маркетингового партнера Facebook очень сложно.

Кого выбирать

На рынке есть несколько основных игроков, которые умеют атрибутировать Facebook: AppsFlyer (70% рынка), Adjust, Tenjin, Branch.

Сколько стоит

Практически все игроки скрывают ценники, но эмпирическим путем можно узнать, что все равняются на AppsFlyer и средняя цена будет 6 центов за атрибуцию платного трафика. То есть, если сервис по конкретному пользователю выдал вам не органическую атрибуцию, то за это надо заплатить. Обычно органический трафик не идет в стоимость.

В целом, эта цена абсолютно адская в соотношении к предоставляемой полезности, поэтому с ростом объемов стоимость сервиса будет расти медленнее. Более того, вы обязаны будете заплатить даже если трафик не сконвертируется и не окупится, то есть по факту вы платите за установку. Такая стоимость может легко увеличить стоимость за установку (CPI) на 10%.

Вывод простой торгуйтесь, если хотите сэкономить.

Легко посчитать, сколько примерно будет стоить AppsFlyer. Предположим, вы покупаете трафик на $10 000 в месяц при стоимости установки $2 -> 5 000 атрибуций -> 5 000 * 0.06 = $300.

Отмечу, что если вы не получаете данных об атрибуции при выключенном доступе к IDFA, то вы не платите за атрибуцию. Я официально спросил AppsFlyer об этом и получил ответ Да, если у клиента включен LAT, мы не получаем IDFA/GAID и установка может уйти в органику. Но мы также попытаемся сделать атрибуцию через вероятностное моделирование. И если не получится, тогда уйдет в органику.

Продуктовая аналитика

Зачем нужна

Продуктовая аналитика это возможность аналитически изучить что именно делают ваши пользователи в приложении. Проще говоря, она отвечает на вопрос Какой фичей пользуются больше пользователей?. Вариантов ответа может быть масса, включая когортный анализ и сегментации.

Фактически, любая система аналитики состоит из двух частей:

  1. Хранилище данных. Сюда попадают сырые события о действиях пользователя.

  2. BI или визуализация данных, построение отчетов поверх сырых данных. Это то, с чем работает пользователь.

Кого выбирать

В отличие от атрибуции, где нет альтернативы сторонним сервисам, в продуктовой аналитике можно не только пользоваться внешними решениями, но и собрать свое решение из готовых open-source сервисов.

Свой стек традиционно собирают на реляционной колоночной базе данных, например, Clickhouse + Tableau для BI. Дополнительно для сбора данных я рекомендую использовать Cube.js. В качестве слов для гугления накидаю: AWS Lambda, Redash, Google Big Query, Serverless.

В целом свое решение это хорошо, но сделать его сложно, даже при всей кажущейся простоте. Всегда захочется чего-то дополнительного, на это будет уходить время разработки и поддержки. Добиться хорошей производительности также нетривиальная задача. Самое страшное, что можно не заметить ошибку в данных и делать неправильные выводы. Короче, если у вас есть возможность собрать дата-команду, тогда это ваш вариант.

Из сервисный решений традиционно выделяют Amplitude и Mixpanel. Дополнительно сюда можно добавить App Metrica и Firebase Analytics (Google Аналитика для мобильных устройств).

Традиционно выбирают несколько аналитик, чтобы сравнить точность. Обычно берут бесплатную и платную.

Разработка и внедрение любой системы аналитики начинается с составления карты/списка событий, которые вы хотите отслеживать. После двух недель плотной работы над таблицей событий, вы получаете примерно такой вариант:

Который в дальнейшем добавляется в приложение и тестируется.

Сколько стоит

Стоимость своей реализации посчитать сложно. За оценку возьмите работу трех человек в течение 4-6 месяцев.

Прикинем для сервисов:

  • App Metrica и Firebase Analytics бесплатные.

  • Amplitude бесплатно до 10 миллионов событий в месяц.

  • Mixpanel бесплатно до 100 тысяч уникальных пользователей в месяц.

Многие компании, которые я знаю, делают так: сначала отслеживают все подряд, а когда становится дорого убирают лишние события, оставляя минимум.

Все сервисы аналитики зарабатывают на больших компаниях, поэтому дают такие большие бесплатные лимиты.

По моему опыту, обычно платный план начинается с $2000 в месяц.

Отправка пуш-уведомлений

Зачем нужна

У отправки пуш-уведомлений бывает две цели:

  1. Продуктовая. Например, вы получили уведомление о том, что такси уже приехало.

  2. Маркетинговая. Когда вы пытаетесь что-то (до)продать пользователю.

Более того, пуши можно разделить по:

  1. Триггерные и вызванные руками.

  2. Таргетированные или не таргетированные.

Большая часть продуктовых пушей относятся к формату триггерных, то есть, когда происходит триггер, вызванный действиями пользователя, тут все события в продуктовой аналитике берутся из таблички выше в продуктовой аналитике.

Маркетинговые пуши бывают как триггерные например, пользователь отписался, а мы ему сразу даем скидку, так и ручные. Например, отправим уведомление всем пользователям в Москве о скидке на продукты в оффлайн-магазине.

Кого выбирать

Как и в сервисах аналитики, тут есть вариант сделать свое решение, либо использовать сервисы. И то, и другое так или иначе работает через APNS (Apple Push Notifications Service).

Как и многое в экосистеме Apple для разработчиков, работать с APNS напрямую не очень просто и удобно. Есть как технические задачи (очередь пушей, скорость отправки и т.д.), так и чисто продуктовые придется матчить юзера и его пуш-токен самому.

Обычная схема использовать провайдера для рассылки пушей и обращаться к нему со своего сервера через удобный SDK/API. Как пример таких сервисов AWS SNS и Firebase Cloud Messaging. В FCM есть общая система с Android и аналитика по отправке и доставке, это приятное дополнение.

Самая готовая и хорошая система отправки пушей позволяет строить кампании рассылок, где вы указываете цепочки пушей, триггеры, задержки отправок, аудитории и тд. Это сложные и не дешевые системы, такие как Intercom, Push Woosh, OneSignal. Они поддерживают не только пуши, но также email, in-app сообщения и многое другое.

Сколько стоит

Firebase Cloud Messaging бесплатно.

AWS SNS один миллион бесплатно, дальше $0.5 за 1 миллион.

OneSignal сколько угодно сообщений, но 10 тысяч подписчиков.

Цена растет быстро и странно, поэтому если у вас 100К и больше MAU, я бы готовился к ценнику от $1 000 в месяц

ASO

Зачем нужно

ASO (App Store Optimization) аналог SEO, только для приложений, когда пользователь ищет что-то в поиске в App Store/Google Play. С помощью ASO можно:

  • Отслеживать ранжирование по ключевым словам

  • Отслеживать конкурентов

  • Прокачивать ранкинг, в том числе для локализации

И другие смежные задачи.

Есть гайдлайны Apple для улучшения ранкинга. В целом, оптимизация ASO и SEO это похожие вещи, которыми надо заниматься постоянно. Можно найти гайды и рекомендации, они есть в открытом доступе.

Кого выбирать

Я даже близко не эксперт в ASO, но знаю хорошие отзывы про AppFollow и AsoDesk. Как вариант, можно написать самописное решение на GitHub много библиотек, которые помогут с этим, например, здесь.

Сколько стоит

Сервисы стоят плюс-минус одинаково, я бы целился в несколько сотен долларов в месяц для небольшого приложения.

Подключение платежей и подписок

Зачем нужно

Сходу может показаться неочевидным, но подключение платежей почти в любую систему, в том числе в мобильные приложения это сложная задача. Если говорить по пунктам, то это:

  • Корректно валидировать и проводить покупку. Поддерживать восстановление.

  • Привязывать покупку к пользователю.

  • Отслеживать серверные события подписки. Они могут происходить даже если пользователь удалил приложение.

Добавим к этому интеграции с внешними сервисами аналитики и атрибуции, рекламными сетями, аналитику по подпискам, синхронизацию подписок между платформами и многое другое. Получится новый сервис.

Кого выбирать

По аналогии с аналитикой, тут есть два варианта:

  1. Сделать самому.

  2. Взять сервис.

По моему опыту, старые приложения обычно используют свои решения, так как такой тип сервисов стал появляться относительно недавно. Для самых базовых вещей, вроде проведения покупки без валидации ресипта, можно воспользоваться open-source библиотеками.

Количество сервисов за последний год резко выросло. Среди них Adapty, AppHud, RevenueCat, Qonversion, Purchasely и если я подумаю, то еще парочку точно найду. Все сервисы объединяет базовое решение задач разработки, но некоторые ушли далеко вперед по маркетинговым фичам. Как показывает практика, техническая проблема проведения платежей самая простая во всей этой истории. Гораздо сложнее все корректно измерять и проводить A/B тесты платежных экранов.

Сколько стоит

В целом, все сервисы имеют похожую систему ценообразования: это фикс с порогом выручки, которая проходит через SDK + какой-то процент от выручки свыше определенного порога (около 0.05%). Для среднего приложения на объемах $50 000 в месяц можно ориентироваться на $250 долларов.

Разработка своей системы, в зависимости от сложности, у команды в 3-4 человека может легко занять 4-6 месяцев.

Крэшлитика (аналитика крэшей приложения).

Зачем нужно

Аналитика крэшей помогает понять, из-за каких причин или необработанных исключений в коде ваше мобильное приложение упало, то есть сломалось и пользователя из него выкинуло. По факту, это базовый функционал, который используют почти все разработчики.

Кого выбирать

AppMetrica

Firebase де-факто стандарт.

Выбирайте любой.

Сколько стоит

Бесплатно.


Главный вопрос делать свое или пользоваться сервисом? По моему опыту ответ такой если сервис закрывает действительно важную часть бизнеса (например, платежи), делать их самому нет никого смысла, это будет и дороже и дольше.

Я пишу про новости из мира мобильной разработки и маркетинга в канале Apple Developer News в Телеграм.

Подробнее..

Перевод Мобильные приложения перестали быть подходящей идеей для стартапов

09.05.2021 14:14:20 | Автор: admin
image

В феврале 2009 года СМИ по всему миру начали рассказывать о вундеркинде девятилетнем сингапурском мальчике по имени Лим Динг Вен, ставшем самым юным разработчиком приложений для iPhone.

Он создал приложение Doodle Kids, позволяющее рисовать пальцами на экране iPhone. За две недели его скачали более четырёх тысяч раз.

Разумеется, этому способствовало то, что его отец был CTO местной технологической фирмы и мальчик играл с компьютерами с двух лет. К семи годам он уже знал шесть языков программирования.

Спустя восемь лет, выпустив более двадцати бесплатных приложений для смартфонов, это юное дарование всё ещё в деле. Он пишет диплом по информационным технологиям и мечтает стать разработчиком игр.

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

COVID спас мобильные приложения на какое-то время


Вундеркинд попал в самую точку. Когда статья с его заявлением вышла в январе 2017 году, тренд рынка мобильных приложений и в самом деле шёл вниз.

С четвёртого квартала 2016 года ежеквартальная скорость роста количества приложений в Apple App Store впервые начала становиться отрицательной.


Рост количества доступных мобильных приложений в Apple App Store по всему миру со второго квартала 2015 года по третий квартал 2020 года. Источник: Statista

Похожий тренд заметен и в Google Play Store, хотя и растущая популярность телефонов под Android и выпуск разработчиками iOS-приложений версий для Android удержала его от начавшегося резкого падения.


Рост количества доступных мобильных приложений в Google Play по всему миру со второго квартала 2015 года по третий квартал 2020 года. Источник: Statista

Этот тренд стал подтверждением моей точки зрения. В конце 2016 года я опубликовал в LinkedIn пост под названием "Мобильные приложения скоро исчезнут", ссылаясь на тот факт, что рынок уже достигал насыщения и что многие приложения в ближайшие годы уйдут в забвение или консолидируются.

В октябре 2018 года я дополнил и перепечатал статью в Medium. Она понравилась редакторам и её начали рекомендовать под новым названием "Близится конец мобильных приложений". Статья стала виральной, породила множество подражаний и откровенного пиратства. Один читатель даже предложил мне поспорить на 1000 долларов, что я окажусь неправ.

Судьбе было угодно, что он бы выиграл эту ставку благодаря чистой удаче. Показатели демонстрировали мою правоту до прихода в 2020 году COVID-19, благодаря снижению физической активности и взаимодействий придавшего мобильным приложениям мощный стимул.

Из-за вновь возникшего роста количества новых приложений и скачиваний многие в отрасли приложений снова начали делать сильно оптимистичные прогнозы на будущее.

Но действительно ли из-за этого сейчас подходящее время для реализации идеи стартапа разработки мобильных приложений?

Я считаю, что нет. Большинство людей, с энтузиазмом предполагающих подобное в онлайн-блогах и отраслевых отчётах это те, кто делает деньги на предоставлении издателям приложений таких услуг, как аналитика или цифровой маркетинг.

Если вы задумались о создании приложения, то я рекомендую вам учесть следующие факторы

Числа могут вводить в заблуждение


Во-первых, следует различать рост интереса к экономической деятельности и экономическую жизнеспособность этой активности в качестве бизнеса, особенно если это стартап!

Хотя можно заявить, что общее количество приложений в мире растёт, в реальности многие мобильные приложения публикуются, проваливаются, а затем долгое время остаются заброшенными онлайн, прежде чем их удаляют (как это происходит и с веб-сайтами и блогами). Магазины приложений заполнены приложениями-зомби, низкокачественными приложениями и клонами игр, переполненными рекламой, из-за чего общая сумма не является точным отражением экономической жизнеспособности бизнеса разработки приложений.

Приверженцы отрасли приложений также указывают на рост количества пользователей смартфонов и скачиваний приложений. Но данная статистика также искажена тем, что большинство этих скачиваний составляют уже существующие и очень популярные социальные, сервисные и игровые приложения. Даже бесплатные новые приложения часто с трудом завоёвывают внимание. У платны приложений ситуация ещё хуже.

Обширные аудитории и потенциал их роста обеспечивают впечатляющую статистику, но Потребители избалованы выбором и ожидают приложения, полностью отвечающие их требованиям и имеющие для них настоящую ценность. Всё остальное для них шум. App Trends 2020, Adjust

Даже если приложение скачивают, показатели удержания пользователей (retention) ужасны. В 2020 году средний показатель удержания пользователя в течение первого дня составлял всего 25,2%. Это означает, что трое из четырёх пользователей, скачавших приложение, больше никогда не будет использовать его всего спустя день. Спустя 30 дней этот показатель снижается до 3,5%.*

* Liftoff 2020 Mobile App Trends Report

Затраты значительно повысились


Кроме того, рынок приложений за короткое время ужасно заматерел. Чтобы иметь возможность конкурировать и правильно масштабировать приложение для значительной базы пользователей сегодня требуется серьёзный капитал. Для создания и поддержки ИТ-инфраструктуры корпоративного уровня нужны очень глубокие карманы, а также непрерывные инвестиции в маркетинг для привлечения, активизации и удержания пользователей.

Про инфраструктуру достаточно спросить любого технаря, работавшего в сформировавшемся стартапе, поддерживающем приложения, которыми пользуются миллионы людей. Требуемые технологический стек и знания простираются намного дальше возможностей нескольких кодеров с базовым опытом программирования.

Опрос 12 ведущих компаний, занимающихся разработкой мобильных приложений за 2015 год, проведённый Clutch, выявил, что медианный диапазон затрат на разработку приложения для iPhone "составляет от 37913 до 171450 долларов и может доходить до 500000 долларов или даже больше".

Однако интереснее здесь то, что самым большим компонентом у всех компаний были затраты на инфраструктуру (а не на фичи, тестирование или дизайн), составлявшие более трети общей стоимости. Помните, что инфраструктура часто является постоянной, а не единоразовой статьёй расходов.


"Опрос: стоимость создания мобильного приложения", Clutch

В качестве простого показателя расходов на маркетинг давайте возьмём среднюю Cost Per Install (CPI, стоимость одной установки) за 2020 год. Для приложений на iPhone она составляет 0,86 доллара; для приложений на Android 0,44 доллара. Теперь умножьте это на количество пользователей, которое надеетесь получить, и вы получите представление о том, сколько это может вам стоить (если предполагать, что вам не понадобятся другие затраты на маркетинг).

Помните также о том, что CPI гораздо выше для рынков развитых стран, например, США (iOS 2,07 доллара, Android 1,72 доллара), и что популярные платформы стоят дороже (Facebook 1,80 доллара, Twitter 2,53 доллара, Instagram 2,23 доллара).

На этом этапе начинающие основатели стартапов могут подумать: у меня есть отличная идея, я могу начать с малого, а затем, когда приложение продемонстрирует потенциал, получить венчурный капитал, необходимый для финансирования стартапа. На самом деле, ситуация такова: большинство идей приложений в наши дни не являются новинкой. Инвестирование в приложения больше не привлекательно для большинства венчурных капиталистов.

А на случай, если вы ещё не знаете, как венчурные капиталисты работают на самом деле, прочитайте мою статью "Правда о том, как венчурные капиталы выбирают стартапы".

Но если несмотря на всё это вам всё-таки удастся стать одним из миллиарда, создавшего новое приложение-единорога, то потенциально вы можете столкнуться с препятствием, которое серьёзнее, чем статистика или деньги.

Рынок мобильных приложений и в самом деле навсегда изменился.

Приложения как экономическое и политическое оружие


Успех мобильных приложений как глобального продукта и социального инструмента также привёл к возникновению в этой отрасли проблемы приложения стали мишенью для экономических и политических обсуждений.

Всё началось с попыток администрации Трампа ввести санкции против китайских технологических компаний и их продуктов, в том числе и мобильных приложений, оправдывая это обеспокоенностью национальной безопасностью. Однако попытки бана китайских приложений в США всё ещё подвергаются бюрократическим проверкам и балансировке перед введением в силу.

Однако такой проблемы нет у Индии.

В 2020 году Индия выпустила три заявления о том, что уже забанила как минимум 220 китайских приложений, в том числе чрезвычайно популярные Tik Tok, WeChat и AliExpress, тоже под предлогом защиты национальной безопасности.

Большинство наблюдателей считает, что баны, введение которых началось с июля 2020 года, стали результатом двусторонних трений после столкновения на границе в Гималаях месяцем ранее, при котором погибло 20 индийских солдат.

Тем временем, правительство Китая в декабре 2020 года объявило об удалении из магазинов приложений страны 105 приложений, в основном разработанных внутри страны и имеющих незаконное или оскорбительное содержимое. Странно, что большинство наблюдателей не смогло понять, почему в списке внезапно оказался и TripAdvisor, владельцы которого находятся в США.

Станет ли это самым началом появления большего количества геополитических барьеров для технологических бизнесов и приложений?

Это покажет только время

Двигаемся дальше


Мы можем быть уверены только в следующем: мобильные приложения продолжат свой рост в общих показателях, пока не наступит стагнация количества владельцев смартфонов. Но поле игры для стартапов уже никогда не будет прежним. Считаете ли вы, что пара ботанов, собирающих в гараже персональные компьютеры, сегодня имеют те же шансы стать многомиллиардной международной компанией, как это было в 70-х?

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

Всё сводится к трём словам время не ждёт.

Технологии и инновации быстро движутся вперёд. Как только сектор становится зрелым, он превращается в поле для больших и мощных компаний. На нём по-прежнему могут появляться нишевые игроки, но шансы сильно не в вашу пользу.

Кстати, а чем занимается наш вундеркинд сегодня?

Согласно его профилю в LinkedIn и Twitter, Динг Вен перешёл от создания мобильных приложений к производству трёхмерных VR-приложений и игр.



На правах рекламы


VDSina предлагает VDS в аренду под любые задачи, огромный выбор операционных систем для автоматической установки, есть возможность установить любую ОС с собственного ISO, удобная панель управления собственной разработки и посуточная оплата тарифа, который вы можете создать индивидуально под свои задачи.

Подробнее..

Когортный анализ подписок как понять, что экономика сходится?

15.06.2021 10:13:02 | Автор: admin

Когортный анализ это способ отследить плотность метрики для определенных групп пользователей. В отличие от обычных графиков, когорты показывают именно stickiness пользователей, распределенный во времени.

Звучит сложно, на деле понять проще. Возьмем конкретный пример: попробуем понять как ведет себя база подписчиков в мобильном приложении: как они платят, отписываются и как долго живут. Ответы на эти вопросы я покажу на примере нашей реализации в Adapty.

Пример когортного анализа подписокПример когортного анализа подписок

При построении когорт важно указать, как они формируются, что показывать в ячейках и что измерять. В нашем случае когорты формируются по месяцу установки, в ячейке показываем выручку, подписчиков и среднюю выручку на подписчика за каждый месяц (ARPPU).

То есть, в строчках у нас когорты (группа) пользователей, которые установили приложение в определенный месяц, а в столбцах значения метрик по каждому месяцу с месяца установки (этот месяц первый или М1). В выделенной строчке М1 это январь, М2 февраль и тд. Каждый месяц количество подписчиков в данной когорте не возрастает, даже если пользователь установил в январе, а подписался в феврале, то он будет отнесен в когорту января. Нам кажется такой способ правильным для оценки сходимости.

Идея оценивать экономику так кроется в том, как работает привлечение пользователей. При закупке рекламы разработчик так или иначе платит за установки, а не за целевые действия. Даже в CPA кампания, все будет связано со стоимостью установки (CPI). Следовательно, чтобы оценить эффективность закупки трафика надо смотреть как именно люди установившие приложение в этот период будут монетизироваться. При этом, если пользователь установил приложение, но месяц не платил, он попадет только в М2.

Видим, что когорта пользователей января принесла нам суммарно до текущего момента времени $2900 выручки от 73 подписчиков.

Далее мы видим динамику затухания когорты, то есть как быстро пользователи отписываются. В январе у нас было 67 подписчиков, в феврале уже 38, а на июнь осталось 10 (штрихованная ячейка означает, что подписчики еще могут добавиться, так как месяц не закончился).

Сойдется ли экономика?

Теперь, пусть мы заплатили за рекламу $4000 за январь, наш вопрос такой окупятся пользователи или нет?, то есть будет ли выручка с них больше чем $4000 в разумное время.

Посмотрим внимательно на динамику подписчиков когорты января.

Когорта января в разбивке по месяцам (первая колонка установки)Когорта января в разбивке по месяцам (первая колонка установки)

На текущий момент приложение заработало $2900 до комиссии Apple, или $2465 после вычета 15% (приложение находится в программе Apple для SMB). Также будем считать, что мы продаем недельные подписки в среднем по $10.

Мы видим, что количество активных подписчиков после первого месяца упало почти в 2 раза, дальше на 20%, потом всего на 10% до 24. Так как на момент написания заметок месяц еще не кончился, возьмем лучший сценарий пусть все 24 подписчика будут с нами всегда. И даже пусть они в среднем платят $15.48 дальше, то есть их ARPPU не меняется.

Чтобы добить до $4000 нужно чтобы подписчики заплатили больше $1500, даже при сохранении выручки за месяц в $372 и нулевой отписке, когорта сойдется в лучшем случае через 4-5 месяцев непрерывных платежей. На практике, учитывая предыдущую динамику, и зная, что трафик закупается равномерно, когорта вряд ли сойдется меньше, чем за пару лет, а по факту скорее всего будет в убыток. Причина такая, что недельные подписки постоянно напоминают о себе и пользователи реже остаются в долгосрочных платежах, ведь если приложение хорошее, гораздо выгоднее купить год. Но даже с подписками на месяц при такой динамики на вряд ли стоит ожидать положительной прибыли.

Сходимость экономики подписок это долгосрочный процесс, я сделал инструмент для проверки сойдется ли экономика на ваших цифрах Калькулятор Подписок. Попробуйте его, чтобы оценить как зарабатывать на мобильных приложениях.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru