Slide 1

Slide 1 text

Безболезненная победа над legacy Anton Zhukov

Slide 2

Slide 2 text

Боль, через которую мы прошли, чтобы больше ее не испытывать

Slide 3

Slide 3 text

Что такое ManyChat? Платформа для автоматизации маркетинга Помогаем бизнесам расти, выстраивая осмысленные отношения со своими пользователями

Slide 4

Slide 4 text

1 млн. пользователей используют ManyChat для маркетинга, продаж и поддержки 500 млн. подписчиков взаимодействуют с ботами наших клиентов 8 млрд. сообщений ежемесячно отправляют с помощью ManyChat 190+ Стран в которых используют ManyChat 100+ человек команда ManyChat 65 человек команда разработки 2 офиса в Москве и Сан-Франциско

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Архитектурные особенности ManyChat ● Авторизация основана на Facebook OAuth2 ● Без подключенной страницы Facebook ничего не работает ● Ядро базы завязано на IDs сущностей Facebook Ехал Facebook через Facebook, видит Facebook в Facebook Facebook, сунул Facebook Facebook в Facebook, Facebook Facebook Facebook Facebook

Slide 8

Slide 8 text

Что в итоге случилось ● Апрель 2019 - а давайте попробуем SMS и Email ● Июнь 2019 - а давайте это будет главной фишкой для конфы ● Сентябрь 2019 - а давайте всё это будет работать без Facebook ● Декабрь 2019 - а давайте полностью изолируемся вы находитесь здесь ● ------ 2020 - а давайте легко будем добавлять любые каналы ● ------ 2020 - любая фантазия на ваш вкус ● ------ 2020 - а можно я уже посплю, пожалуйста...

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

Внезапно. Legacy

Slide 12

Slide 12 text

Тревожные звоночки ● Код, который больше нигде не используется ● Унаследованный код, не устойчивый к изменениям ● Грязный код, который дорого поддерживать ● Ресурсоемкий код ● Избыточно распределенный по проекту код

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

План рефакторинга

Slide 15

Slide 15 text

План рефакторинга 1. Поиск жесткой связности кода компонента 2. Покрытие тестами этой связности 3. Снижение уровня связности 4. Замыкание вызовов на Facade или Manager 5. Фиксация метрик потоков, конверсии, производительности, etc Вы закончили, если в текущем состоянии компонент можно вынести в отдельный репозитарий и использовать как вендорную зависимость

Slide 16

Slide 16 text

API тесты

Slide 17

Slide 17 text

API тесты 1. Покрываем тестами все public методы компонента 2. State и context не нужно создавать, если их нет 3. Mocks создаются только на внешние API, нужно проверить консистентность вызовов и состояния в хранилищах 4. Сбор метрик и аналитики также покрываются тестами

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

Новая версия компонента

Slide 21

Slide 21 text

Новая версия компонента 1. Фиксируем facade получившегося компонента через interface 2. Создаем его полную копию 3. Рефакторим новую версию, опираясь на ранее написанные тесты 4. Если позволяют ресурсы, создаем тесты на полную эквивалентность возвращаемых данных Вы закончили, если тесты эквивалентно проходят и на старой и на новой версии компонента

Slide 22

Slide 22 text

Тоже лает Тоже бегает Тоже ест корм Но трогать уже не страшно V1 V2

Slide 23

Slide 23 text

Идем на PRODUCTION

Slide 24

Slide 24 text

Понемножку покатились... 1. DevOps перекрестился перед деплоем 2. Пользователям не нравится, что кнопка “Удалить бота” удаляет бота 3. Не получается заново привязать страницу в 1 клик 4. 1 аккаунт = 1 бот, иначе нарушение консистентности базы 5. “Дуров верни стену!” 6. etc А это всего лишь 1%...

Slide 25

Slide 25 text

Как же всего этого избежать? 1. ManyChat EarlyAccess Community 2. ManyChat Community 3. Target accounts 4. Пошаговая медленная раскатка по схеме шардинга

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

Катимся очень нежно 1. Фиксируем версию компонента в метриках 2. Балансируем работу 2-х компонентов 3. Выдаем точечно 4. Регулярно общаемся с саппортом

Slide 28

Slide 28 text

На выходе

Slide 29

Slide 29 text

Что получилось 1. Привели кодовую базу в порядок 2. Написали верхнеуровневые тесты на консистентность 3. Изолировали и реорганизовали ряд компонентов 4. Раскатали это на пользователей без серьезных проблем 5. Схема раскатки выросла в общий паттерн sensitive deploy

Slide 30

Slide 30 text

Anton Zhukov