- 《架构师》2021年6月
- InfoQ中文站
- 4477字
- 2021-07-22 14:30:32
历时2年、投入100+工程师,Coinbase全面迁移到React Native
移动应用分iOS和Android两个平台以前要分别进行开发,通常很是费时费力。React Native是Facebook在F8大会开源的JavaScript框架(2015年9月15日发布),可以让广大开发者使用JavaScript和React开发跨平台的移动应用。在短短不到一年的时间里,它成为手机端必不可少的开发模式之一。本文作者介绍了Coinbase如何从原生开发迁移到React Native,以及绿地法和棕地法的优劣之处。绿地法就是从零开始使用一个全新的系统,而不掺杂任何过去的东西,就像一片绿地,从未受到过任何以往开发的影响。而棕地法,是从现有系统开始的,只是一些重要的部分有所更改。
Coinbase的iOS和Android应用程序从2021年1月开始从原生开发过渡到React Native,现在所有的移动工程师都在一个代码库中协同工作。为帮助那些正在考虑从原生过渡到React Native的人们,我们想要告诉他们,我们是如何做到这一点的,从原生到React Native的过渡并非一蹴而就。具体地说,我们希望分享我们深思熟虑的、系统的测试和观察结果的过程,然后通过越来越多的有影响力的实验来增加赌注,因为这些实验对于迁移的成功至关重要。
Coinbase正确地看待了这项技术变革的影响,它为5600万用户提供金融服务,仅在2021年第一季度就创造了18亿美元的收入。功能性的退步或者性能的下降都会给客户和业务带来严重的影响。
同样值得注意的是我们原生代码库的规模。向React Native迁移意味着重新实现超过200个屏幕,其中很多包含大量业务逻辑。这种迁移也包括对30多个原生工程师进行再培训,同时继续在开发新功能和淘汰遗留应用方面取得进展。尽管移动的部分很多,但是我们能够在迁移的每个阶段都提供显著的产品性能改善。
2012年Coinbase成立时,它只有一个网站。2013年,我们启动了移动项目。首先发布的iOS和Android应用是原生的,它们分别由Objective-C和Java编写。
到2017年,我们拥有一支由Android和iOS工程师组成的小团队来开发这些应用程序,但是尽管我们竭尽全力,却仍然难以实现扩展。在这一年内,我们只雇佣了一半的移动和网络工程师。另外,尽管网络工程师的生产率显著提高,但移动工程师的平均工作速度仍处于停滞状态。在2018年,随着我们的扩展努力继续产生令人失望的结果,我们需要提高移动平台的增长速度和迭代速度,这一点变得越来越明显。
因为我们需要改变战略,所以决定退后一步,从第一原理的角度出发,考虑如何构建产品。在Coinbase,主要功能由跨职能团队构建和维护,通常由2个后端工程师和2个前端工程师组成,每个支持的平台(网页、iOS和Android)都有。这个结构需要很多工程师来维持我们产品的垂直结构。它还意味着,工程师们与在同一平台上工作的其他工程师之间存在一定的隔阂,因此难以协调更大的系统变革。
考虑到这一点,我们提出了这样一个问题:如果能够将一个健全的功能团队从8个(每对客户工程都独立于一个平台)减少到5个,那么多个客户工程师就能够在这三个平台上工作,情况会怎样?
这将大大减少我们对人才的需求,提高团队的工作效率,并在我们的客户平台上增加工程师之间的联系。与此同时,我们也相信提高效率不能是唯一的目标,任何技术上的改变都必须提供给我们的客户更好的品质和性能。这一思想指导我们研究各种跨平台技术。
在这个阶段,我们已经拥有了一个运行良好的网络工程平台,该平台基于React。经过对多种不同跨平台技术平台的研究,我们认为React Native将是最好的选择。它利用了我们已知的技术栈,为移动和网络的进一步整合提供了一条清晰的路径。
当我们在技术平台上达成一致后,就制定了在产品表面进行逐步探索的计划。我们希望从风险较低的领域开始,减少迁移的风险,然后随着能力和信心的提高,范围和影响会逐渐扩大。在数月的初步研究之后,我们确定了一个由以下三部分组成的策略:
• 从绿地探索开始。我们决定,实验React Native的第一个地方是一个完整的绿地环境,在这里我们无需React Native集成复杂性 <> React Native集成就可以评估技术。从前端的角度来看,Pro是我们性能最密集、最复杂的产品,并且在很长一段时间里,用户一直要求开发移动应用程序。这看起来是我们探索的完美候选者。假如React Native能够处理Pro移动应用的需求,包括技术挑战,比如实时价格和深度图(depth chart),那么我们就会对它能满足其他产品的需求充满信心。这个项目也让我们能够评估开发者的速度,并确保能够对网络工程师进行交叉培训,从而成为高效的React Native工程师。
• 探索棕地重写会是什么样的。接下来我们要探讨的领域是棕地整合,它将React Native整合到现有的原生应用程序中。通过React Native,我们重建了登录流程,然后将这些流程分享给Pro移动应用(React Native)和主要的iOS和Android应用(都是原生的)。目前,Coinbase支持100多个国家,而且由于不同的司法管辖区有不同的监管要求,我们的注册体验需要动态变化:适应每个用户的地点和身份信息。在我们的移动应用程序中,这些过程是最古老、最复杂的部分;即使是增量更改,实施起来也非常昂贵。重新实施这些功能将花费巨大,因为随着独立的Pro产品的发布,这将是一个很好的机会,因为我们可以在棕地环境中探索React Native,并在两个应用程序之间创建一个共享的登录流程。
• 基于这些绿地和棕地解决方案的开发经验,全面重写我们的核心产品。在前两个阶段中,如果成功了,就假定我们能够在React Native中完全重写Coinbase的主要应用。在最初指定战略时,我们不能确定这次重写是增量的棕地重写(逐步重写屏幕)还是绿地重写(从零开始)。这一实施细节就留给了我们在前两个阶段中所学的东西。
在制定了长期战略之后,我们开始开发Pro移动应用程序。在六个月的构建之后,Pro移动应用程序在2019年10月发布,超出了我们的预期。在这一过程中,我们看到了积极的业务成果,对平台上的性能挑战以及解决方案有了很好的理解,并开始充分意识到React Native可能带来的开发者生产力的阶跃函数变化。它还让我们看到,网络工程师能够在相对较短的时间内成为高效的React Native开发者。
受Pro移动应用程序成功的鼓舞,我们开始了第二阶段,对登录流程进行棕地重写。这个从2019年年中开始,6个月后交付的项目,又一次实现了我们所设定的质量和商业目标。由于登录模块是用React Native编写的,因此可以在Coinbase和Pro移动应用程序之间进行共享。
尽管登录重写的结果无疑是积极的,但棕地方法也存在挑战。举例来说,每次对登录模块的修改都需要重建带有原生绑定的包,然后使用共享模块重建原生应用程序,并进行手工测试。如果工程师仅有网络或原生经验,那么这一过程尤其令人沮丧,因为对共享代码的迭代可能要求他们了解这三个平台。而且,因为这种开发方式可能比完全的原生开发更耗时,所以它让一些工程师(包括网络工程师和原生工程师)开始思考为什么我们会为React Native而烦恼。
如果读过Airbnb优秀的Sunsetting React Native文章,你可能会对这些挑战感到熟悉。为了学习Airbnb的工程师们的经验教训,我们花了很多时间和他们交流。非常感谢该团队分享了他们这一旅程的细节,因为这些信息对确定Coinbase的最佳路线是非常有价值的。其中一个主要收获就是棕地法似乎是他们面临的众多挑战的核心。增量迁移的想法最初看起来是有吸引力的,它可以利用React Native的优势实现新功能,而无需完全重写全部的前期成本,但是从长期来看,它带来了技术和文化迁移的重大风险。
以这些观察为背景,加上我们的两个成功项目,我们相信Coinbase移动应用程序的平台重建将会取得进展。我们决定:
1.首先我们要重写Android应用。我们认为Android是这两个平台中更困难的,并且认为如果我们能够在质量、性能和速度的角度来完成它,就会有一条清晰的路径来在iOS上快速推广。首先建立Android系统也使我们能够继续全速推进原生iOS系统,确保我们的客户在重写过程中能看到体验的改善。
2.我们会进行完整的绿地重写,而不是采取棕地 / 零碎的方法。基于我们自己的经验(Pro版和登录模块)以及Airbnb等公司的经验,我们得出结论,棕地项目增加了复杂性,引入了“陷入”中间状态的风险,并为不同平台上的工程师之间长期存在的文化分歧创造了空间。
以目前使用React Native的速度,我们估计能在6个月内完成对产品的全面重写。同时,我们也相信,在重写之后拥有一个统一的平台的好处大于最终决定放弃这个项目的代价。我们在2020年3月开始重写Android应用平台,并在将近6个月之后交付了完全重写的Android应用。我们将重写工作作为一项实验推出,并对其结果进行测量,结果表明,它在我们所针对的关键指标上有积极的影响。
由于Android系统取得了积极的成果,我们决定对Coinbase的iOS应用程序进行平台重建。在接下来的一个季度里,我们“追赶”了iOS团队与Android重写同步构建的关键功能。作为实验,我们将新的React Native代码库发布给iOS客户,并与2021年1月下旬完成了发布工作。和Android类似,我们也看到关键指标对我们的目标产生积极影响。通过在iOS发布React Native,我们已经完成了产品到这个新技术平台的全面迁移。
在2020年中期,我们大约有7名Android工程师和18名iOS工程师在从事Coinbase的移动应用程序的开发。Coinbase的React Native至今已有113个贡献者,包括许多网络工程师,这些人以前不能在移动端做出贡献。对于交叉培训原生移动工程人才,我们也看到了积极的成果,技术变革并没有引起减员现象。来自iOS和Android背景的工程师已经做出了高影响力的贡献。
我们的团队也已经开始按照在2018年的预期进行结构化,组建了统一的客户团队,在三个平台上开展工作。当前,这些客户团队在网络和移动领域还不能完全融合,但我们正在逐步实现这一目标。并且我们认为,过渡到React Native仅仅是为所有Coinbase应用程序创建一个统一的单一客户平台的第一步。
目前,我们已从3个应用平台减少到2个:React Native和React Web,但我们希望减少到1.5个,并且已为2021年制定了实现这一目标的雄心勃勃的路线图。我们正在构建跨平台的设计系统,一个基于GraphQL的通用数据层,以及融合网络和移动工具所需的基础。我们想象这样一个世界:工程师们能够为我们的网络和移动应用交付一种功能,而只需进行最少的上下文切换,就能重新将效率方面的提高体现在我们的应用质量上。
从想法到最终在iOS上推出,我们用了两年的时间进行探索、实验和执行。同时,我们也认为,在统一的客户端平台上所完成的工作仍处于起步阶段。以下是我们的研究和里程碑的时间线:
2018年12月:Coinbase的一项提案被一位工程师所分享,旨在探索React Native作为移动平台的可能性。
2019年3月:Coinbase团队的成员研究了跨平台的几个技术方向,并决定使用React Native来推进。
2019年4月:开始开发Coinbase Pro移动应用程序。
2019年7月:统一移动登录(Unified Mobile Onboarding)项目启动。
2019年10月:Coinbase Pro移动应用在App Store 发布。
2019年11月:在Coinbase.com和Pro上推出统一的移动登录服务。
2020年3月:开始全面重写Coinbase Android应用程序。
2020年7月:Coinbase的所有Android和iOS工程师都可以选择通过内部培训计划来提高React Native的能力。
2020年10月:重写后的Coinbase应用在Android系统上推出,Coinbase承诺将重建Coinbase.com iOS应用。
2021年1月:Coinbase的iOS应用程序已经推广到100%的用户。
未来几个月,我们将发布更多关于我们的经验的文章,对一个全球5600多万用户使用的移动应用进行平台重建。我们将发表文章,探讨React Native所面临的技术挑战以及我们一路走来的经验教训。但愿我们的应用程序能够为那些考虑使用React Native大规模构建产品的人们提供一个重要参考。
Coinbase简介:
Coinbase成立于2012年,美国比特币和其他数字货币交易平台。2015年1月21日上午,据美国《财富》报道,比特币公司Coinbase C轮融资7500万美元,这是比特币公司截止2015年1月21日获得的最大一笔融资。截至2021年3月,Coinbase是美国交易量最大的加密货币交易所。2021年4月14日,Coinbase在纳斯达克成功上市。
原文链接:
https://blog.coinbase.com/announcing-coinbases-successful-transition-to-react-native-af4c591df971