С января 2021 года приложения Coinbase для iOS и Android перешло от нативной разработки к React Native, и все мобильные инженеры теперь совместно работают в единой кодовой базе. Переход от натива к React Native не произошел в одночасье, и в интересах помощи тем, кто обдумывает такое решение, мы хотим рассказать историю того, как мы пришли к этому. В частности, мы хотим поделиться нашим осознанным и методичным процессом тестирования и наблюдения за результатами, а затем повышения ставок с помощью все более эффективных испытаний, поскольку этот подход был критически важным для успеха миграции.
Чтобы оценить влияние этого технологического сдвига в перспективе — Coinbase предоставляет финансовые услуги 56 миллионам пользователей и принесла 1.8 миллиарда долларов дохода только в первом квартале 2021 года. Ухудшение функций или низкая производительность серьезно повлияли бы на наших клиентов и наш бизнес.
Также стоит обратить внимание на размер нашей собственной кодовой базы. Переход на React Native означал повторную реализацию более 200 экранов, многие из которых содержали существенную бизнес-логику. Переход также включал переподготовку наших 30+ нативных разработчиков, которые продолжали при этом работать над созданием новых функций и поддержкой работы наших устаревших приложений. Было много разных факторов, но мы смогли значительно улучшить производительность продукта на каждом этапе миграции.
Когда Coinbase была основан в 2012 году, у него был только веб-сайт — мы начали нашу мобильную программу в 2013 году. Первые выпущенные нами приложения для iOS и Android были нативными, написанными на Objective-C и Java соответственно.
К 2017 году над этими приложениями работала небольшая команда Android и iOS инженеров, но, несмотря на все наши усилия, у нас были проблемы с масштабированием. В течение того года мы смогли нанять вдвое меньше мобильных разработчиков, чем веб-инженеров. Более того, хотя веб-инженеры стали работать заметно более производительно, средняя производительность мобильного инженера оставалась неизменной. По мере того как наши усилия по масштабированию продолжали приносить разочаровывающие результаты в 2018 году, становилось все более очевидным, что нам необходимо увеличить темпы роста и скорость итераций на мобильных платформах.
Требовалось изменение стратегии, поэтому мы решили сделать шаг назад и подумать о том, как мы создаем продукты с точки зрения основных принципов. В Coinbase основные функции создаются и поддерживаются кросс-функциональными группами, обычно состоящими из 2-х инженеров и 2-х фронтенд-инженеров для каждой поддерживаемой платформы (веб, iOS и Android). Эта структура требовала большого количества инженеров для поддержания единой вертикали нашего продукта. Это также означало, что инженеры были несколько изолированы от других разработчиков, работающих на той же платформе, что затрудняло координацию более крупных системных изменений.
Подумав над этим, мы задались вопросом: а что, если бы мы могли сократить нормальную функциональную команду с 8 — по два изолированных разработчика на каждую платформу — до 5 инженеров, где несколько клиентских инженеров могли бы работать на всех трех платформах.
Мы предположили, что это может значительно снизить наши общие кадровые потребности, повысить эффективность нашей команды и увеличить взаимосвязь инженеров на наших клиентских платформах. В то же время мы также считали, что повышение нашей эффективности не может быть единственной целью — любое технологическое изменение, которое мы вносили, также должно было улучшить качество и производительность для наших клиентов. Такое мышление привело нас к рассмотрению различных кроссплатформенных технологий.
На этом этапе у нас уже была хорошо работающая платформа веб-инженерии, построенная на React. Изучив ряд различных кроссплатформенных технологических платформ, мы решили, что React Native будет для нас лучшим выбором. Он использовал уже знакомый нам стек технологий и предлагал четкий путь к еще большей консолидации как для мобильных устройств, так и для веба.
После того, как мы достигли согласованности в отношении технологической платформы, мы разработали план, чтобы постепенно исследовать ее на всех наших продуктовых “поверхностях”. Мы хотели снизить риски миграции, начав с областей с более низкими запросами, а затем постепенно увеличивать масштабы и влияние по мере развития компетентности и уверенности. После нескольких месяцев предварительных исследований мы пришли к стратегии, состоящей из трех частей:
- Начинаем с чистого листа. Мы решили, что лучший подход для экспериментов с React Native — это полностью новая среда, в которой мы могли бы оценить технологию без сложных переходов натив <> React Native. С точки зрения фронтенда, Pro был нашим самым сложным и требовательным к производительности продуктом, и пользователи уже давно просили мобильное приложение. Он казался идеальным кандидатом для наших исследований. Если бы React Native мог справиться с требованиями мобильного приложения Pro — которые включали технически сложные аспекты, такие как графики цен и глубины в реальном времени — у нас была бы высокая степень уверенности, что платформа сможет удовлетворить потребности других наших продуктов. Проект также позволит нам оценить скорость разработки и быть уверенным, что мы сможем обучить и превратить наших веб-инженеров в эффективных React Native разработчиков.
- Исследуем, как изменения будут выглядеть в работающем проекте. Следующей областью, которую мы решили исследовать, была интеграция с React Native в существующее нативное приложение. Мы решили перестроить наши процессы онбординга с помощью React Native, а затем поделиться ими между мобильным приложением Pro (React Native) и основными приложениями Coinbase для iOS и Android (оба являются нативными). Coinbase в настоящее время поддерживает более 100 стран, и, поскольку в разных юрисдикциях действуют разные нормативные требования, наш опыт регистрации должен быть динамичным — адаптироваться к местоположению и профилю личности каждого пользователя. Эти потоки были одними из самых старых и сложных частей наших мобильных приложений. Внедрение даже простых инкрементальных изменений могло быть дорогостоящим. С запуском автономного Pro продукта повторная их реализация была бы чрезвычайно дорогостоящей, поэтому мы увидели возможность здесь как изучить React Native в среде работающих приложений, так и создать общий поток онбординга между двумя приложениями.
- Основываясь на уроках, извлеченных при разработке этих новых и старых решений, полностью переписываем наш основной продукт. Если мы добьемся успеха на первых двух этапах, мы предположили, что сможем полностью переписать основное приложение Coinbase на React Native. Когда мы изначально создавали стратегию, мы не были уверены, будет ли это переписывание постепенным переписыванием частей старых приложений (когда мы переписывали экраны постепенно) или переписыванием с нуля. Мы оставили эту деталь реализации открытой исходя из того, что бы мы узнали на первых двух этапах.
Сформировав такую долгосрочную стратегию, мы начали с мобильного приложения Pro. После 6 месяцев разработки, мобильное приложение Pro было выпущено в октябре 2019 года и превзошло наши ожидания. Мы увидели положительные бизнес-результаты, получили хорошее представление о проблемах производительности (и решениях) платформы и начали в полной мере оценивать пошаговое изменение функций в производительности разработчиков, возможное с помощью React Native. релиз также показал нам, что веб-инженеры могут стать эффективными разработчиками React Native за относительно короткий период времени.
Воодушевленные нашим успехом с мобильными приложениями Pro, мы приступили к этапу 2 — переработке старых процессов онбординга. Проект стартовал в середине 2019 года и был выпущен через 6 месяцев, что снова соответствовало целям, которые мы поставили в отношении качества и бизнес-показателей. Поскольку модуль онбординга был написан на React Native, его можно было использовать совместно с Coinbase и мобильным приложением Pro.
Несмотря на то, что результат переписывания онбординга был, несомненно, положительным, у подхода с внедрением в работающие приложения были свои проблемы. Например, каждое изменение модуля онбординга требует перекомпоновки пакета с нативными биндингами, а затем пересборки нативных приложений с использованием общего модуля для ручного тестирования. Это может быть особенно неприятным процессом для инженеров, у которых был только опыт работы в вебе или нативной среде, поскольку для работы с общим кодом потенциально требовалось понимание всех трех платформ. Более того, поскольку такой способ разработки может занимать даже больше времени, чем полностью нативная разработка, это заставило некоторых инженеров — как веб-разработчиков, так и нативных — задуматься, почему мы вообще стали возиться с React Native.
Если вы читали отличную статью на Airbnb “Закат React Native”, эти проблемы могут показаться вам знакомыми. Мы много часов разговаривали с инженерами Airbnb и пытались извлечь уроки из их опыта. Мы благодарны команде за то, что они поделились подробностями своего приключения, поскольку информация была бесценна при выборе наилучшего пути для Coinbase. Один из наших ключевых выводов заключался в том, что подход с постепенным внедрением в работающие приложения, казалось, был ключевым для решения многих проблем, с которыми они столкнулись. Хотя идея постепенной миграции на первый взгляд привлекательна — использование преимуществ React Native для новых функций без первоначальных затрат на полное переписывание — она представляет собой значительный технический и культурный риск в долгосрочной перспективе.
С учетом этих наблюдений и двух успешных проектов за плечами у нас была уверенность в том, что мы сможем продвинуться вперед и перепрограммировать основное мобильное приложение Coinbase. Мы решили, что:
- Сначала мы перепишем Android-приложение. Мы считали, что Android будет более сложным из двух платформ, и полагали, что если мы сможем сделать это правильно с точки зрения качества, производительности и скорости, то у нас будет четкий путь к быстрому развертыванию на iOS. Первоначальная разработка на Android также позволила бы нам продолжить работу над нативной версией iOS-приложения, гарантируя, что наши клиенты продолжат видеть улучшения опыта, пока мы работаем над переписыванием.
- Мы полностью переписываем с нуля, вместо того, чтобы использовать подход с частичной заменой уже существующих функций. Основываясь на собственном опыте (с Pro и модулем онбординга) и уроках, извлеченных в таких компаниях, как Airbnb, мы пришли к выводу, что проекты на основе старых приложений увеличивают сложность, создают риск «застрять» в промежуточном состоянии и создают пространство для длительных культурных разногласий между инженерами на разных платформах.
Учитывая скорость разработки, которую мы до сих пор наблюдали с React Native, мы подсчитали, что сможем полностью переписать наш продукт за 6 месяцев. Мы также чувствовали, что преимущества наличия единой платформы в конце этого переписывания перевешивают затраты в том случае, если мы в конечном итоге решим свернуть проект. Мы начали перепрограммировать приложение для Android в марте 2020 года и почти ровно через 6 месяцев выпустили полностью переписанное приложение для Android. Мы развернули переписанное приложение как эксперимент и измерили результаты, которые показали положительное влияние на ключевые показатели, которые были важны для нас.
Получив положительный результат на Android, мы решили перейти на новую платформу с iOS-приложением Coinbase. Следующий квартал мы потратили на то, чтобы «наверстать упущенное» в ключевых функциях, которые команда iOS создала параллельно с переписыванием Android. Затем мы развернули новую базу кода React Native для наших клиентов iOS в качестве эксперимента и завершили это развертывание в конце января 2021 года. Как и в случае с Android, мы увидели положительное влияние на ключевые показатели, на которые мы нацеливались. С запуском React Native для iOS мы завершили полную миграцию нашего продукта на эту новую технологическую платформу.
В середине 2020 года над мобильными приложениями Coinbase работали примерно 7 инженеров Android и 18 инженеров iOS. На сегодняшний день репозиторий React Native на Coinbase насчитывает 113 участников, в том числе большое количество веб-инженеров, которые раньше не могли вносить свой вклад в мобильные устройства. Мы также увидели положительные результаты в обучении наших талантливых нативных инженеров с небольшим оттоком в результате изменения технологий. iOS и Android инженеры теперь вносят значительный вклад в общий продукт.
Наши команды также начали реструктурироваться, как мы и предполагали в 2018 году, в объединенную клиентскую команду, которая работает на трех платформах. В настоящее время эти клиентские команды не являются полностью взаимозаменяемыми в вебе и на мобильных устройствах, но мы приближаемся к этому. И мы считаем, что переход на React Native — это только первый шаг на нашем пути к созданию единой унифицированной клиентской платформы для всех приложений Coinbase.
Сейчас у нас есть 2 платформы приложений вместо 2 — React Native и React Web, — но мы хотели бы спуститься до 1.5, и у нас есть амбициозная дорожная карта на 2021 год. Мы создаем кроссплатформенную систему проектирования, универсальный уровень данных на основе GraphQL и основы, необходимые для объединения веб-и мобильных инструментов. Мы представляем себе мир, в котором инженеры могут внедрять функцию в наши веб и мобильные приложения с минимальным переключением контекста, реинвестируя повышение эффективности в качество наших приложений.
От идеи до окончательного развертывания на iOS мы потратили два года на постепенное изучение, эксперименты и реализацию. Мы также считаем, что мы все еще находимся в начале того, чего мы можем достичь с помощью этой унифицированной клиентской платформы.
В ближайшие месяцы мы опубликуем больше о нашем опыте смены платформы мобильного приложения, которым пользуются более 56 миллионов пользователей по всему миру. Мы будем публиковать статьи, в которых исследуются технические проблемы React Native и уроки, которые мы извлекли на этом пути. Мы надеемся, что наше приложение может стать отличным справочником для всех, кто хочет создавать масштабные продукты с помощью React Native.