Replica: как мы создали собственную библиотеку и с ее помощью упрощаем Android-разработку

Наш лид команды Android-разработки Артур Артиков придумал и реализовал библиотеку для организации сетевого взаимодействия Replica. Сколько времени нужно, чтобы создать библиотеку, и почему провал — это тоже победа — читайте в нашем материале.

Артур, сколько времени прошло от идеи до реализации библиотеки?

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

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

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

И вот на прошлой неделе мы подключили библиотеку Replica на рабочий проект. Волнительное чувство, конечно, когда то, над чем ты работал так долго, наконец находит свое применение.

Replica — это Android-библиотека для организации сетевого взаимодействия. Существующие библиотеки (Retrofit, Kotlin Serialization) помогают в выполнении сетевых запросов, то есть реализуют протокол HTTPS и сериализацию данных. Replica же решает другие задачи. Она позволяет не делать лишних запросов, но при этом отображать актуальные данные. С ее помощью можно улучшить UX, практически не усложняя разработку

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

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

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

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

Репликация данных — ключевая идея, на которой основано автоматическое поведение библиотеки Replica

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

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

Звучит неплохо, правда? Но какие сложности могут возникнуть? Когда столько всего выполняется автоматически, программист теряет контроль над тем, что происходит. Ему не понятно, какие сетевые запросы сейчас запущены, сколько данных загружено. Через UI приложения этого не видно, поэтому нужен отладочный инструмент.

Давай, поговорим про инструмент отладки в библиотеке Replica. На этом этапе тебе помогала команда. Расскажи, как строилась работа?

С Replica DevTools мне помогал мой коллега Егор.

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

Сначала мы думали написать плагин для Android Studio. Чтоб использовать плагин, его нужно было бы устанавливать на компьютеры разработчиков. Но потом у нас появилась идея лучше. Вспомните, как работают веб-сайты. Чтоб открыть сайт, нужен только веб-браузер, сам сайт не нужно устанавливать. Мы решили пойти тем же путем — сделать отладочный инструмент в формате веб-страницы. Но как поместить веб-страницу в Android Studio? Оказалось, что у Android Studio есть встроенный мини веб-браузер. Шикарно!

Отладочный инструмент Replica DevTools, встроенный в среду разработки Android Studio

Получается, нужно было сделать веб-страницу. Опыта веб-разработки у Android-команды практически не было, все таки, мы пишем нативные приложения. Конечно, мы могли бы потратить время, вспомнить JavaScript, изучить основы React, Vue или Angular, и это тоже был бы интересный опыт. Но все мы обожаем Kotlin. А на Kotlin тоже можно писать веб-приложения с помощью технологии Kotlin/JS. К тому же, относительно недавно компания JetBrains (разработчик Kotlin) выпустила UI-фреймворк Compose for Web, который мы бы с радостью хотели попробовать. Так выбор пал на Kotlin/JS + Compose for Web.

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

На Kotlin/JS я писал лабы в университете, и этот опыт мне очень помог. Но Compose for Web применять нелегко, особенно если нет опыта в веб-верстке. Многое пришлось изучать с нуля. Плюс, технология довольно свежая и мало документации. Это был очень интересный челлендж.

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

Теперь и мне стал интереснее сам процесс создания новых технологий: от идеи до реализации.

Егор Белов, Android-разработчик MobileUp

Разработка заняла две недели. Егор показывал мне на разных этапах, что у него получается. Я в основном давал подсказки по usability инструмента, а с кодом Егор и так хорошо справлялся.

Я знаю, что ты постоянно следишь за новостями Android-сообщества. Поделись, как мотивировать команду следить за технологиями?

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

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

У тебя была гипотеза, как должна работать новая библиотека, и ты начал разработку. А если бы ничего не получилось? Если бы силы были потрачены впустую?

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

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

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

Через несколько недель будет релиз библиотеки. Ты ждешь вопросов? Хочешь, чтобы другие разработчики использовали Replica в своих проектах?

Релиз – это громко сказано 🙂. Я допишу документацию и добавлю больше примеров. Но пока что библиотека будет в статусе alpha. Я не ожидаю, что разработчики тут же начнут ее использовать на боевых проектах. Поймите меня правильно, одно дело, когда библиотеку использует команда, которая сама же ее разработала. Она хорошо знает, как работает библиотека, и в любой момент может при необходимости что-то в ней поменять. И совсем другое дело, когда библиотеку подключает кто-то другой — тут намного больше риска. С релизом stable-версии лучше не спешить. Он будет, но не так скоро.

Тем не менее, я считаю, что рассказывать про библиотеку уже пора. Например, я делал доклад про Replica на внутреннем митапе нашей компании Mobile Up. В нем я рассказал и про принцип работы библиотеки, и про UX-паттерны, и про удобство разработки. На мой взгляд, получилось интересно, поэтому решил опубликовать. Доклад будет понятен даже не программистам. А Android-разработчиков может заинтересовать github-страница библиотеки.

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

Подробнее о библиотеке – на видео

Интервью – Арюна Иванова

Фотографии – Мария Артикова

0
17 комментариев
Написать комментарий...
Сергей Мазур

идея интересная. Желаю удачи в развитии продукта.

Ответить
Развернуть ветку
Мобилуп

Спасибо за добрые слова!

Ответить
Развернуть ветку
Денис

жду версию на хабре с техническими подробностями)

а пока действительно больше вопросов:

1. библиотека не замена Retrofit, а надстройка?

2. "если пользователь ушёл с экрана, то запрос будет отменён" - для этого же есть корутины с viewModelScope. или тут что-то интереснее?

3. "выгружает старые ненужные данные" - это же просто кэш, для работы с которым уже есть все инструменты. или тут что-то интереснее?)

за то что сразу написали плагин для отладки плюс в карму)

Ответить
Развернуть ветку
Артур Артиков

Спасибо за интересные вопросы.

Чтоб раскрыть тему "чем же так полезна Replica", определенно потребуется целая статья, а то и не одна. Но если вкратце, задача библиотеки - полная автоматизация сетевого взаимодействия. Разработчику больше не нужно думать, в какой момент вызвать тот или иной запрос. Он просто задает настройки: откуда скачивать данные, как быстро данные устаревают, какой размер у кеша и др. Об остальном библиотека заботится сама: запускает и отменяет запросы, удаляет старые данные. И делает это оптимальным образом.

Что касается ваших вопросов

1) Да, Replica это надстройка поверх библиотеки для выполнения сетевых запросов. Причем, это может быть хоть Retrofit, хоть Ktor, хоть Apollo GraphQL. Ограничений нет.

2) и 3) Отмена сетевого запроса и LRU-кеш это частные случаи. Для таких отдельных задач в Android-сообществе есть решения. А вот комплексного решения (такого как Replica) для широкого спектра задач я не встречал.

Ответить
Развернуть ветку
Exey Panteleev

1. Если это надстройка то ей не помешает то, что сетевой слой сгенерен с помощь OpenAPI generator или подобного?
2. Если можно с ktor использовать, возможно ли ее добавить в KMM код, который будет под iOS работать?

Ответить
Развернуть ветку
Артур Артиков

1. Да, без проблем. В качестве загрузчика данных можно указать любую suspend-функцию.

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

Ответить
Развернуть ветку
Илитный Иксперт

Написали собственную библиотеку? Молодцы, это достижение. Ждем статью про собственный листенер на кнопку

Ответить
Развернуть ветку
Мобилуп

Что плохого в том, чтобы написать библиотеку?

Ответить
Развернуть ветку
Илитный Иксперт

Ничего, каждый второй джун такое делает. А вы подаете это как какуюто сверхзадачу

Ответить
Развернуть ветку
Мобилуп

Не

Ответить
Развернуть ветку
Rnatery

Как будто легко Listener написать?

Ответить
Развернуть ветку
Jeen 99

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

Ответить
Развернуть ветку
Мобилуп

Это гуманитарная, тизер библиотеки. Техническая на Хабре будет чуть позже.

Статья для ребят, которые следят за MobileUp и в том числе рассматривают нашу компанию как будущее место работы – рассказываем о нашей внутренней культуре и о подходе. Например, ребята так познакомятся с Артуром, своим будущим лидом.)

Ответить
Развернуть ветку
Nikolay Kapustin

Еще никогда звезда на гит-хабе не стоила так дорого

Ответить
Развернуть ветку
Мобилуп

Сколько?)

Ответить
Развернуть ветку
Nikolay Kapustin

Какая ставка Сеньора андроида у вас?

Ответить
Развернуть ветку
Мобилуп

Цель рассчитать стоимость библиотеки или статьи?

Если статьи, то полчаса заняло интервью + полчаса вычитка автором.
Если библиотеки, то расчет сложнее, конечно. Но и цель создания библиотеки была не в погоне за звездами на гите.)

Ответить
Развернуть ветку
14 комментариев
Раскрывать всегда