FacebookのMomentsアプリがクロスプラットフォーム開発をC++で実現

Facebookの最新アプリのひとつであるMomentsでは,iOSとAndroidでビジネスロジックを共用するためにC++を使用した – 同社エンジニアのAshwin Bharambe, Zack Gomez, Will Ruben各氏は,このように説明している。ここではFacebookの技術者たちによる選択の根拠と,その成果を検証する。

Momentsアプリ開発において同社の技術者たちは,“クライアントのみに注目することで,開発-実行-テストのサイクルを可能な限り短縮するために”,サーバロジックをクライアントに移行する決定をした。この選択の欠点は,最初にターゲットとしていた2つのプラットフォーム – iOSとAndroid – のため,開発しなければならないコード量が増加することだった。

プラットフォームでコードの共有を可能にする方法は数多くあるが,その中からFacebookの技術者たちは,“UIをプラットフォーム専用のコードで記述して,ビジネスロジックはC++を使って共用する”方法を選択した。C++はハイパフォーマンスを実現できる一方で,高いレベルの抽象化に欠けていて,プログラマにメモリ管理を強いる言語である,という評価が一般的だ。それでもFacebookの技術者たちは,std::shared_ptrやラムダ,auto宣言などの新しいC++機能を使うことで,“ハイパフォーマンスでメモリ安全性の高いコードを短期間に開発”できたのだ。

Facebookの技術者たちは,C++層をシンプルにするために,いくつかの基本的な選択を行った。

  • 関数型コーディング,すなわち“生のデータオブジェクトを不変(immutable)のビューモデルにデフォルトで変換する”。
  • “ファイア・アンド・フォーゲット型の変更処理によって,それぞれのビューが必要とするビューモデルを計算する”一方向データフロー。
  • キャッシュ,検討の結果,“変更されていない中間結果の再計算を避けるため”,この方法が適当であることが分かった。

Androidプラットフォームでは,プラットフォーム固有のコードとのバインディング生成という別の問題もある。この目的のためにFacebookでは,DropboxのDjinniを使って,ビューモデルをC++からJavaに変換した。Djinniのコードジェネレータにも手を加えて,自分たちの関数型アプローチへの適合とガベージコレクションの最適化を行った。iOSについては,Objective-C++を使ってC++コードをシームレスに統合することができる。

このアプローチによって,Momentsのビジネスロジックの大部分がiOSとAndroidで共用可能となった。これはそれぞれのプラットフォーム用のコードベースに対して,おおよそ3分の1に当たる。Facebookの技術者たちは最後に,このアプローチのおかげで“新しい機能を,はるかに少ない作業と少ないバグで作成できた”と同時に,“開発時間を2つのプラットフォーム間で柔軟にやりくりできたため,同時に両方のプラットフォーム用に提供することができた”,と述べている。