React Nativeを採用すべきか〜Shopifyに学ぶ

## はじめに

この記事は、2020年4月15日に配信されたpodcast,[ShopifyのVP Engineeringのインタビューセッション](https://podcasts.apple.com/us/podcast/shopify-react-native-with-farhan-thawar/id1019576853?i=1000471534717) の内容を元に、自分が注釈やメモを加えたものになります。

## まえおき：技術選定とは何か

技術選定は、興味本位でやるべきではありません。またどの技術にもメリット・デメリットはあります。重要なのは自分の組織が何を得たいのかを考えることです。

### 技術選定とは何らかをレバレッジすること

何らかの組織課題を明確にバレッジすることが出来なければ、技術選定をするべきではありません。例えば、下記のようなものを目的としておくべきです。

- プロダクト開発のDX
- プロダクトのパフォーマンス
- 欲しい人材のタイプ
- 開発コスト
- etc...


### React Nativeへの技術投資とは

RNの技術投資におけるレバレッジしたいものは何でしょうか。組織によりけりですが一例としては次のようなものがあります。

- Android, iOSを同時に開発することによるコスト及びデリバリーの効率化
- JavaScriptに強いエンジニアの採用強化
- Webエンジニアとネイティブエンジニアを兼務させることによる社内リソースの効率化
- 基盤として必要な技術を絞ることによるエキスパータイズの最適化

## ShopifyのRN投資

Shopifyは世界最大のオンラインショップのプラットフォームです。彼らの顧客にとってShopifyはインフラなので、信頼性を高く要求されるものです。そんなShopifyが何故React Nativeを採択したのでしょうか。

### Shopifyの技術投資哲学

podcast内で語られていますが、彼らが技術投資時に考えることは下記の３つです。

1. 新しいからと言う理由では決して採用しない。実際のEfficiencyやユーザーへ届くアウトプットの品質向上などのオピニオンを持つ
2. **サイドプロジェクトだけで入れるということはせず、全会社のプロジェクトがその技術に移行する**
3. 選んだ技術に関して、エコシステムの一員になる

2の観点は実は非常に重要なのかもしれません。ShopifyといえばかつてJavaからRuby on Railsに舵切りをしたことで有名ですが、その時も同じように全社的な移行をしたようです。

### RNへの投資

**RN登場当初は採用せず**

ShopifyはRN誕生前からアプリがあり、当然ネイティブベースでした。そしてReact Nativeが誕生した2015年に最初のDeep Diveをしています。しかし、当時はAndroidサポート、ツール周り、パフォーマンス等に問題があり、採用によって開発効率が上がったり、プロダクトの品質向上はないと判断されました。

**RN採用へ(2018年末〜)**

2019年以降にRNは大きく進歩したとFarhnanは語ります。

- エコシステムの強化（FacebookによるReact Native再投資、Microsoftのエコシステム参画）
- 本格的なAndroidサポート
- パフォーマンス改善
- RN製の実際に有名なアプリの登場

中でも、エコシステムが強化されてことが大きな採用の後押となったようでした。

### RN採用のねらい

- クロスプラットフォームによるコードシェア（Android, iOSでのシェアは95~99%シェアできているとのこと）
- デスクトップ、Webエンジニアをアプリエンジニアとしてコンバートできること(learn once, write anywhere)

ShopifyでのRN採用の狙いは一般的であり、特別変わった理由はなさそうです。

### ShopifyのRN製アプリ

現在３つのRN製Appがあるということです。２つがプロダクションで既に使われていてネイティブAppからRNへ書き換えたもの、１つは2020年にローンチ予定ということです。

## RNを辞めたAirbnb、RNを採択したShopify

AirbnbがReactを辞めた記事が出たのは2018年1月です。そしてShopifyがReact Nativeへの投資を決めたのは2018年末です。podcastでは何故AirbnbではRNはうまくいかず、Shopfiyではうまく行ったのかという話があり、３つの理由が挙げられていました。

### 1. タイミングの違い

AirbnbがRNを辞めたのは、FacebookがRNの諸問題を見直し、再投資し、リアーキテクチャリングする直前だった。Shopifyはその再投資を見てRN導入を判断した。

### 2. カルチャーの違い

Airbnbでは、ネイティブエンジニアvsReactエンジニアという対立が生まれてしまった。ネイティブを強く信じるエンジニアは、RNを許容できなかった。

Shopifyでは、ネイティブエンジニアはReact Nativeを学ぶのは、今までネイティブアプリを作るのよりも楽しいことだったと語っているとのこと（詳しい理由は話されてなかったです）

### 3. アーキテクチャの違い

Airbnbでは、既存のネイティブアプリの上にRNを搭載した、いわゆるBrownfield Appだった（訳が思いつきませんでしたが、日本ではキメラ構造とも言いますね）。これは、React Nativeの知識と、ネイティブの知識と、そしてそれらを組み合わせる知識を要求するので、調和させるのが非常に難しくなる。

一方でShopifyはGreenfield App、つまり完全にReact Nativeベースのアプリなのでそのような問題がないということになります。

## まとめ

自分は、元々Reactエンジニアとして長くWebアプリを作っていましたが、去年初めてReact Nativeのアプリを触り、以降Expoベースのものや生React Nativeも含めていくつかアプリを開発してきました。Airbnbの記事も読んでいたので懸念もありましたが、リアーキテクチャの事もあってか今の所とても満足しており、今回ShopifyのVP Enginnerの話を聴いたことは今後のRN採択の後押しになるものでした。

また、実際に語られているコードシェアについても、95~95%をAndroidとiOSでシェアできるというのは自分の経験と照らし合わせても妥当と思います。しかもシェアできない部分というのは`if Platform === 'ios' ? foo : bar`という些細な違いか若しくはcofigurationですむところがほとんどなので、大して問題になることはありません。

React Nativeの経験がない人は、まだRNの採用を躊躇することも多いと思います。RNは思っている以上に年々進歩を重ねており、Shopify, MS, Amazonなどのビッグプレイヤーがエコシステムに加わっていく中で今後よりネイティブ開発の重要な選択肢になっていくのではないでしょうか。


## おまけ

会話としてはあったがそこまで深い話をしていないものをいくつかピックアップしました。

### 現状RNでまだあるデメリットは？

- デバッグ体験はネイティブより低い（RNではネイティブアプリよりもコールスタックが深くなり、面倒なバグを追うのが大変になったりする）
- パフォーマンス（完全にネイティブと同じパフォーマンスは出ない時がある）

### FacebookメッセンジャーでRNを使わない理由は？

- チームがでかすぎる
- まだObjective-Cを使っている（SwiftよりもObjective-Cのほうがパフォーマンスが高いから）

### まだRNを使わないほうが良いアプリは？

1. ハードウェアがマルチコアだけど、個々のCPUは遅い場合、そのアドバンテージは使えない
2. 多くのハードウェアモジュールを使う場合

### 今React Nativeで起きてる変化は？

多くの企業がRNを採用し始めていること。coinbase, microsoft, amazon...