7 важных факторов PHP-приложения

7 важных факторов PHP-приложения

Инженеры платформы Heroku (https://www.heroku.com/) на основе собственного опыта создали методологию (https://12factor.net/ru/) для разработки SaaS-приложений.

Эта методология учитывает три важных аспекта:
— расширяемость — развитие кодовой базы и функционала;
— сопровождаемость и возможность командной работы над проектом;
— масштабируемость.

12 факторов приложения стали шаблоном для многих разработчиков и Ops-инженеров, а мы постарались адаптировать самые важные из них для приложений на PHP.

Кодовая база (https://12factor.net/ru/codebase). Забота о коде начинается с принципов его версионирования и хранения. Используйте Git Flow или его адаптацию с учетом специфики работы ваших команд.

Зависимости (https://12factor.net/ru/dependencies). Используйте менеджер зависимостей Composer (https://getcomposer.org/) и его основные операции install и update для манипуляций c composer.json (https://getcomposer.org/doc/04-schema.md) и composer.lock.

Конфигурация (https://12factor.net/ru/config). Предпочтительным методом обработки конфигурации является использование переменных среды. Для работы с ними мы применяем компонент symfony/dotenv (https://github.com/symfony/dotenv).

Параллелизм (https://12factor.net/ru/concurrency). Выполняйте процессы в фоне, тем самым снижая время отклика при взаимодействии с вашим сервисом. Выделяйте веб-процессы в реальном времени и рабочие процессы. Первые принимают http-запросы от клиента, а вторые — выполняют фоновые задачи, например, с помощью брокера сообщений RabbitMQ (https://github.com/rabbitmq).

Паритет разработки/работы приложения (https://12factor.net/ru/dev-prod-parity). Для того чтобы обеспечить схожесть сред разработки, тестирования и продакшена, мы используем виртуализацию на основе Docker и специально подготовленные образы, содержащие одинаковые наборы и версии библиотек. Промышленные и тестовые среды отличаются лишь степенью масштабирования, на основе технологий K8S и Swarm.

Журналирование (https://12factor.net/ru/logs). Фактор утверждает, что приложение должно просто писать в STDOUT и STDERR, а среда должна отвечать за маршрутизацию этих сообщений в хранилище. Технология PHP-FPM позволяет производить вывод логов в STDOUT, что крайне полезно при работе с Docker-контейнерами. Для организации процесса логирования на уровне приложения мы используем сторонние внешние библиотеки, например Monolog (https://github.com/Seldaek/monolog) или компоненты фреймворков.

Задачи администрирования (https://12factor.net/ru/admin-processes). Реализовать сценарии администрирования приложения можно с помощью внешних библиотек, например Symfony Console (https://github.com/symfony/console). Большинство современных фреймворков имеют встроенные средства для организации запуска консольных команд для служебных целей и миграций. Например, в Yii Framework есть понятие консольного приложения (https://www.yiiframework.com/doc/guide/2.0/en/tutorial-console) и команды.

Gmail: про эксклюзивность

Gmail: про эксклюзивность

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

В 2004 году Google запускает бета-тестирование своего почтового сервиса Gmail, но делает это весьма интересно. Чтобы получить доступ, тебя должны пригласить. У одного пользователя было только одно приглашение.

Вокруг сервиса образовалась такая шумиха, что дело доходило до безумия. Народ продавал инвайты на Ebay от $65 до $125 за штуку. Те, кто получал заветное приглашение, чувствовали себя избранными.

По итогу сервис привлек большую аудиторию и выпустил версию для всех.

Мясо

Прием эксклюзивности или чего-то "закрытого" применяется часто. Из известных у меня на памяти: Лепра и Аура Яндекса. Помню, как в ленте фейсбука все клянчили друг у друга приглашения.

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

Посмотрите на свои продукты. Можно ли к ним применить принцип эксклюзивности?

57% опрошенных считают, что машинное обучение не сможет заменить дизайнера интерфейсов в ближайшие 10 лет. Что ж, посмотрим.

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

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

Всё это при условии, что машины нас за это время не успеют поработить и люди сами друг друга не уничтожат. ¯\_(ツ)_/¯

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

let el = document.querySelector(".someClass");
el.innerText // текстовое содержимое
el.innerHTML // HTML-разметка содержимого
el.outerHTML // полная HTML-разметка
el.offsetWidth // ширина, аналогично Height
el.offsetLeft // координата левого угла
// и так далее

Назначенные узлу стили можно узнать через свойство sytle:

el.style.color // цвет текста

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

getComputedStyle(el).color // цвет текста

Если захотите узнать более сложные свойства, то не забудьте преобразовать их названия в camelCase. Например: background-color → backgroundColor;

Подробнее в видео: https://youtu.be/kM8YAhsaHfE
И в примере с кодом: https://codepen.io/detepr/pres/mQqKZO

Почему пользователи уходят

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

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

А вот ситуацию, которая попадает во вторую категорию, анализируем, находим истинную причину неудовлетворенности и извлекаем из этого максимальную пользу. За пользователей из этой категории стоит побороться, узнав, что им не нравится. Если цена, то предложите скидку. Если не хватает функционала, то узнайте, как улучшить продукт. Но не забываем про положительный ROI. Нелогично тратить $50к на разработку нового функционала, чтобы вернуть одного пользователя LTV c которого будет $1к.

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

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

В Usethics написали о том, как объединить подход персонажей и Jobs to be done

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

Во подходе персонажей первое место занимает персонаж: как Х, я хочу Y, чтобы Z. «Как турист (X), я хочу быстро узнать направление (Y), чтобы прийти, куда нужно (Z)». Персонажи рассказывают о пользователях продукта, а «работы» сообщают об их ключевых целях.

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

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

Объединённый подход:

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

2. Проводим интервью, где оцениваем участников с точки зрения выделенных свойств, узнаём контекст, делим работу на составляющие («подработы»). Например: Подготовка ко сну → Планирование подъёма утром → Засыпание → Сон → Пробуждение → Подъём. Это не обязательно должна быть последовательность.

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

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

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

6. Profit (выявляем инсайты о проектируемом продукте).

https://medium.com/usethics-doc/b35d4174cea3