Bye, React Native. Hello Native!
This blog post is co-authored by Santhosh Nageshwar (Principal Software Engineer) Prateek Kohli (Staff Software Engineer) and Farhana Mustafa (Software Engineer II) at Intuit
At Intuit, our data exchange technology securely connects thousands of financial institutions to our global financial technology platform, powering products and services that help more than 100 million consumer and small business customers stay on top of their finances with TurboTax, Credit Karma, QuickBooks, and Mailchimp.
In this blog, we’ll share our Intuit Data Exchange (IDX) organization’s migration journey from React Native to native app development, including lessons learned along the way. If your company is considering such a migration, we hope our firsthand experiences with sunsetting our React Native libraries, and rewriting functionality with native technologies will provide valuable insights into what you can expect on your own journey.
React Native. A dream come true (at first).
Back in 2017, Intuit formed mission teams across the company to explore its benefits of React Native to speed development velocity. We asked ourselves, “How much faster could we ship product to production?”
Our IDX front-end engineering team was one such mission team. Since the React-based web module was available in production, we took the opportunity to build iOS and Android libraries with React Native. Within 6 months, we released the iOS and Android frameworks with QuickBooks Self-Employed. With the Dynamic Dispatch Method Architecture the team re-used 70% of the web codebase for going mobile quickly.
With the principle of “write once and run anywhere,” any new feature could be built and shipped for web, iOS, and Android. It was a dream come true for businesses, embodying the mantra, “speed as a habit.”
Reality sets in: the challenges
That is, until we began to experience some challenges. A few notable ones:
- Upgrading Intuit’s AppFabric micro frontend architecture for web, native, and React Native all at the same time
- Navigating a tough balancing act across products for version upgrades
- Discovering that “write once, run anywhere” wasn’t applicable for unit and UI tests
- Tackling a complicated CI/CD (continuous integration and delivery) setup
- Lacking a tool for React Native crash reporting
- Managing difficulties with Objective-C
- Maintaining a costly bridge for communicating between Native and React Native
Due to these challenges and many more, the team opted to stop any new development in React Native. In 2020, we began to migrate existing functionality with Swift and Kotlin for iOS and Android, respectively.
Our migration journey: a principled approach
Once we decided to migrate to pure native, we put a set of principles in place for this multi-quarter initiative to guide our journey and inform any mid-course corrections we might need to make along the way.
- Build a native (iOS & Android ) version of IDX widgets on par with the current React Native version.
- Keep the integration API signature the same, as much as possible, so that upgrades can be a drop-in change.
- Abstract changes, as much as possible, so that the hosting app simply needs to be upgraded to a new version of the library.
- Develop native and web features, and releases, independently to effectively manage differing concerns and to speed development.
- Don't proceed with any new feature development in React Native except for supporting high priority (P0, P1) bugs.
We also took stock of all IDX features implemented over the past several years and put together a gameplan to achieve parity with the existing implementation (before adding new features), which is a must for any upgrade.
Building a framework for end-to-end coverage
Initially, we set out to build the native version of our widgets in phases, beginning with the first screen a user interacts with. Theoretically, the rest of the functionality would be invoked from the existing React Native library, which would enable the mobile app to onboard to the newer native widgets, while the IDX team continued to build the rest.
Unfortunately, things didn’t go as planned. But, we persisted.
We pivoted to a longer-term strategy for building an entire native framework over four quarters to achieve end-to-end coverage, beyond what was possible with React Native.
By strictly following the principles we set in place, the IDX team completed the migration in 2022, and leveraged branded components from the Intuit Design System to create delightful end user experiences.
To date, we’ve integrated and released the new IDX native code in the following Intuit mobile applications. This has reduced the overall size of our apps and enhanced our ability to debug, improve customer interactions resulting in continuous improvement.
- Mint (iOS & Android)
- Money by QuickBooks (iOS & Android)
- QuickBooks Accounting (iOS & Android)
- QuickBooks Self-Employed (iOS & Android)
Along the way, we also did the following:
- Identified features no longer in use, and documented it as “dead code” that wouldn’t be migrated to Native.
- Reviewed and updated API signatures with the integrated applications.
- Applied a template-based design architecture for easy configuration.
- Leveraged Intuit’s CI/CD pipeline for building, testing, and releasing.
- Documented every feature developed in native.
- Icecreamed (aka dogfooding) native frameworks’ integration into an app to identify ease-of-use issues and pain points; performed unit and UI testing internally before asking teams to upgrade.
Brainstorming and documenting our principles helped us to build a durable plan for our migration journey, enabling us to persist, even when it was necessary to make a mid-course correction at the outset:
- Planning everything into sprints over four quarters helped with setting goals and expectations with our team and executive management.
- Building in comprehensive test coverage and “icecreaming” into our plan was pivotal to achieving a high confidence release.
It takes a village!
Many thanks to Prateek Kohli Ankur Agrawal Farhana Mustafa Gerald Carvalho Pallav Roxy Apparna Ramadoss, our IDX Front-End engineering team, and the entire IDX organization for their contributions to our success with our migration to native app development.
If our journey has piqued your interest in tech platform innovation at Intuit, visit here to join our talent community. We’re hiring!