Airbnb iOSチームはモバイルアプリのコードベースの肥大化と複雑化の課題に対応した。この対応は、最新のビルドシステム、モジュールタイプ、開発アプリなどの新しいツールとプロセスの採用によって可能となった。
Airbnbチームが回避しなければならなかった最初のハードルはXcodeの速度低下だ。特にファイルのインデックス作成とコードの構築時である。そして、コードバージョン管理システムの「不親切さ」であった。
Xcodeプロジェクトファイルはプルリクエストでレビューするのが難しいだけではありません。これらのプロジェクトファイルでのマージの競合や競合状態の発生率は、より大規模なエンジニアチームが高速に作業することで増加しました。
Xcodeは非常に強力で、AppleによるiOSや他のツールとインテグレーションを比類ないレベルで提供する。しかし、Airbnbのエンジニアにとって重要な機能が欠けている。ビルドアーティファクトのネットワークキャッシュ、ビルドグラフのクエリインターフェイス、依存関係としてカスタムステップを追加する方法などである。
これらの全ての機能を開発者に提供するために、AirbnbはFacebook Buckを選択した。これは、GoogleのBazelで使われているものと同じStarlark言語をベースとするビルドシステムである。Buckを使うと、宣言型ビルドグラフからXcodeワークスペースを生成できる。そのため、iOS開発エコシステムとの最適な統合レベルが保証される。アーティファクトキャッシングのメリットを享受できないXcodeネイティブビルドシステムを使う代わりに、Airbnbは、ビルド用にBuckをシームレスに呼び出すXcodeプロジェクトを生成するようにBuckを拡張した。これにより、Buck HTTPキャッシュが有効になっている場合、ビルドステップが最大5~6倍速くなる。
Airbnbのエンジニアは、インフラストラクチャを改善するだけでなく、モジュールをモジュールタイプと呼ばれるグループとして編成することで、コードベースの発見指向の組織構造を設計した。各モジュールタイプには一式の可視性ルールがある。それは、そのタイプのモジュール間で許可される依存関係を定義しているものである。
たとえば、モジュールタイプがUIViewController
というfeatureの場合、子としてUIViewController
を含む場合があるが、他のfeatureは含まない。featureは、より広い可視性を備えた別のモジュールタイプであるfeatureインターフェイスを介してのみ相互に通信できる。
Airbnbのエンジニアによると、モジュールタイプはコードベース全体の目次として機能し、即座にその意味を提供してくれるものである。
Airbnb iOSインフラストラクチャの3番目のイノベーションは、Dev Appsだ。これは、単一モジュールとその依存関係のためのオンデマンドの一時的なXcodeワークスペースである。
AndroidとiOSの両方のDevAppsの人気と成功は、単純な原理によるものです。つまり、IDEスコープを編集中のファイルのみに最小化することで、開発ループが短くしたことです。
Dev Appsは、コマンドラインツールを使用して生成されます。そのツールにより、Buckを使って、要求されたモジュールを構築するために、どのファイルが必要かを見つけ出される。このツールは、featureをホストして実行可能にするコンテナーアプリも生成する。Airbnbのエンジニアによると、ほとんどのDev Appsは2分以内にビルドできる。
この全体を通したアプローチにより、約1,500のモジュールが定義され、コードの所有権を効果的に適用し、テストカバレッジを改善することもできるようになった。
iOSアプリを大規模に構築するためのAirbnbのアプローチには、説明してきたこと以上をここで見つけることができる。興味があれば元の記事をお見逃しなく。