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++層をシンプルにするために,いくつかの基本的な選択を行った。
Androidプラットフォームでは,プラットフォーム固有のコードとのバインディング生成という別の問題もある。この目的のためにFacebookでは,DropboxのDjinniを使って,ビューモデルをC++からJavaに変換した。Djinniのコードジェネレータにも手を加えて,自分たちの関数型アプローチへの適合とガベージコレクションの最適化を行った。iOSについては,Objective-C++を使ってC++コードをシームレスに統合することができる。
このアプローチによって,Momentsのビジネスロジックの大部分がiOSとAndroidで共用可能となった。これはそれぞれのプラットフォーム用のコードベースに対して,おおよそ3分の1に当たる。Facebookの技術者たちは最後に,このアプローチのおかげで“新しい機能を,はるかに少ない作業と少ないバグで作成できた”と同時に,“開発時間を2つのプラットフォーム間で柔軟にやりくりできたため,同時に両方のプラットフォーム用に提供することができた”,と述べている。