Local first — это подход к разработке приложений, когда данные обрабатывают в первую очередь на устройствах пользователей, а не в облаке. Обсудим ключевые принципы подхода и примеры в контексте организации совместной работы.
Автономность — важнее
С приложениями на базе local first подхода можно работать, даже если подключение нестабильно или вовсе отсутствует, — данные синхронизируются позже. Это может быть музыка, подкасты, карты и сервисы совместной работы. В последнем случае избежать проблем с синхронизацией чуть сложнее, однако решений может быть несколько: от предупреждений о конфликте (с предложением сохранить вариант документа) до альтернативного способа, когда правки будут рекомендациями для других пользователей.
В целом local first стали широко обсуждать всего несколько лет назад. В 2019 году группа разработчиков во главе с исследователем из Кембриджского университета опубликовала статью о его ключевых принципах. Первый из них — быстрый отклик на внесение изменений. Авторы пишут, что в local first приложениях пользователь не должен видеть спинер загрузки и ждать, пока данные синхронизируются с сервером. Еще один принцип — синхронизация данных между разными устройствами пользователя, а чтобы обеспечить автономную работу без подключения, авторы рекомендуют воспользоваться Service Worker'ами — прокси для кеширования между клиентом и облаком.
Также исследователи обращают внимание на то, что local first подход обеспечивает конфиденциальность, защищая пользователей и вендоров от массовых утечек, а также сохранность личной информации на устройствах в случае ухода того или иного local first сервиса с рынка. Однако некоторые разработчики идут дальше и предлагают обмениваться информацией через P2P-сеть. Сейчас на рынке можно найти ряд открытых инструментов для проектирования таких приложений. Обсудим некоторые из них.
Решения и протоколы
Объединяя local first подход и возможности P2P-решений, разработчики запускают демо-аналоги известных сервисов: для планирования задач, совместной работы над дизайном и других. Среди таких приложений можно выделить, например, Trellis — клон Trello с открытым исходным кодом, с помощью которого команда может вести общую таблицу заметок и выставлять задачи для участников команды. Trellis построен на фреймворке Electron. В настольном приложении разработчики реализовали MPL (Magic Persistence Layer) — P2P-систему для автоматического слияния версий документов.
Ещё есть сервис PushPin — интерактивная доска, на которой можно размещать файлы, диаграммы, а также оставлять комментарии. Чтобы избежать конфликтов синхронизации, разработчики одного и второго решения использовали Automerge (развернутый материал по теме на английском). Она работает с реплицируемыми типами данных (CRDT) и отвечает за их сжатие и подготовку к передаче вносимых изменений по сети.
Другой примечательный проект — Affine. Это — local first платформа для управления базой знаний. Основная идея заключается в том, что у пользователя есть полный контроль над данными, и он может работать с ними локально, сохраняя изменения. Основная отличительная особенность — фокус на алгоритмах операциональных преобразований (Operational Transformation, OT), позволяющих поддерживать согласованность данных. Близкий по смыслу проект для разработчиков представила команда Dendron.
Некоторые из энтузиастов разрабатывают инструменты для проектирования подобных сервисов, например, p2panda для local first приложений. Он представляет собой SDK и реализацию узла — aquadoggo. Последний обрабатывает запросы с помощью GraphQL, позволяет находить узлы и устанавливать P2P-соединения, поддерживает репликацию.
На p2panda построено приложение Meli на Android. Оно представляет собой базу данных для обнаружения и категоризации пчел Meliponini в Амазонии. Meli запустили совместно с НКО, которая занимается вопросами изменения климата, также в 2020 году проект выиграл грант Евросоюза. Еще один пример — платформа Holochain для разработки P2P-приложений с прицелом на local first. Здесь нет стремления к консенсусу, и вместо этого каждое приложение проверяет поступающие к нему данные, ориентируясь на заданные правила. Такой подход должен решить проблему масштабирования. Однако пока есть всего пара проектов на платформе, например, P2P-хостинг Holo и соцсеть Hylo.
Из других известных платформ для создания приложений с акцентом на local first стоит выделить Replicache. С его помощью можно проектировать сервисы, которые работают даже при нестабильном подключении к интернету, используя смешанный подход: синхронизировать данные с одним или несколькими серверами. На основе Replicache был разработан, например, аддон для создания карт в Figma — Placemark, а также сервис инвентаризации оборудования — Assetbots. Их основная фишка — стабильная работа в оффлайне и быстрая синхронизация данных после восстановления подключения.
Что дальше
Local first — это не только про совместную работу без доступа к сети, но и про контроль над собственными данными. Облачные сервисы в любой момент могут пострадать от атак или санкций, и данные будет уже не вернуть. Поэтому хранение информации на устройствах делает ситуацию более управляемой. Для проектирования систем подход local first создаёт чуть сложнее классических, и в особенности это касается проектов с моделью P2P. Их авторам приходится искать способы разрешения конфликтов, однако готовые платформы и SDK появляются все чаще и помогают с внедрением local first.
Есть мнение, что подход local first станет новым open source с точки зрения его повсеместного распространения и влияния на развитие ниши разработки.
Дополнительное чтение
The Cloud Is a Prison. Can the Local-First Software Movement Set Us Free. Авторы статьи считают, что local first способствует созданию более эффективных приложений и позволяет и позволяет использовать новые возможности аппаратного обеспечения. Это — достаточно простой материал для знакомства с концепцией и ее перспективами.
The forgotten 8th Principle of Local First. В материале описаны ключевые принципы local first приложений: мгновенный отклик, возможность пользоваться без подключения, удобство совместной работы, безопасность, сохранность и доступность данных. К этим принципам автор добавляет экологичность (в прямом смысле этого слова): от снижения объемов передаваемых данных и используемых для этого ресурсов мобильных устройств и сетевой инфраструктуры до оптимизации энергопотребления в дата-центрах.
CRDTs solve distributed data consistency challenges. Автор рассказывает о реплицируемых типах данных (CRDT) как о способе решить проблему с синхронизацией изменений. Главное преимущество CRDT — децентрализация и масштабируемость, но упоминаются и ограничения, такие как небольшой набор допустимых операций и требования к ресурсам. Указаны различные области применения, также примеры реализации. Еще автор объясняет, как Google Docs использует операциональные преобразования (OT) для управления правками и их синхронизации. В статье также подробно описывается, как работают операциональные преобразования для разрешения конфликтов.
Some notes on Local-First Development. Автор объясняет, почему активно развивается local first разработка, и рассуждает, останется ли эта концепция нишевой или заменит традиционные подходы. Также он рассматривает проблемы, связанные с обработкой CRUD-операций при синхронизации на основе CRDT и предлагает способы их решения.
Local-first sync for Postgres from the inventors of CRDTs. Это подробных разбор новой версии ElectricSQL для приложений, ориентированных на локальное хранение данных, — слоя синхронизации с двунаправленной репликацией. Решение позволяет разрабатывать приложения с мгновенным откликом и многопользовательским взаимодействием.
Developing local-first software. Материал от разработчиков ElectricSQL, в котором они рассказывают о перспективах и особенностях local first подхода с примерами. В частности о том, как переход к local first влияет на безопасность приложений, бизнес-логику и работу с базой данных на клиентской стороне. Также затронуты вопросы асинхронной обработки данных, их согласованности и динамической репликации.
Towards Trustworthy and Explorable CRDT Applications with the Automerge Model Checker. Исследователи подсвечивают проблемы, связанные с CRDT: непредсказуемые конфликты с синхронизацией документов и сложности с созданием подходящих моделей данных. Для их решения авторы представляют Automerge Model Checker (AMC на GitHub).