Dropboxは先頃、同社がAndroidのカメラアップロードプロセスの高速化と信頼性向上を実現したプロセスについて発表した。AndroidとiOSで共有していたC++コードを廃止して、Kotlinによるプラットフォームネイティブな実装に置き換えたのだ。これによってエラー率が低下し、アップロードのパフォーマンスも大幅に向上したとして、同社のエンジニアらは、プロセスを書き直すという決定に満足している。
ブログ記事の中で、同社ソフトウェアエンジニアのSarah Tappon、Andrew Haigh両氏は、今回のような書き直しを実行する上では、"労力を正当化できるメリットを保証できることが重要"だとアドバイスしている。"結果的にそれが、望んだ結果を得られたかどうかを判断する一助になるのです。" さらに氏らは、リスクのあるプロジェクトについては、最初に"成功を評価するデータを得るために必要十分な規模"の少数ユーザに提供し、"その結果を観察した上で、作業の継続に自信を持つことのできるデータが得られるまで待つ"ように推奨する。
リリース後のエラーインタラクションの減少と、"all done"インタラクションの増加を示す測定結果
出典: https://dropbox.tech/mobile/making-camera-uploads-for-android-faster-and-more-reliable
カメラアップロードプロセスに関する設計上のおもな制約のひとつは、バックグラウンドで実行可能なアプリケーションの頻度と能力に関するAndroidの大きな制限に対処することだ。"例えば、Dropboxアプリがしばらくフォアグラウンド実行されていない場合、バックグラウンドでのネットワークアクセスがApp Standbyによって制限されるのです。" この制限によってアプリは、24時間に1回、10分間隔でのみ、ネットワークへのアクセスを許可されるようになる可能性がある。クロスプラットフォーム版はプラットフォーム特有の制限に対処していなかったため、それがエラーの原因となることが少なくなかった。新たなKotlinの実装では、このような制限にも対処している。
書き直しの一環として、Dropboxのエンジニアらは、パフォーマンスを改善する新たなネイティブプロセスを設計した。最初に着手したのは、並列アップロードの使用だ。C++バージョンでは、1度にアップロードするファイルはひとつのみだった。Kotlinのコルーチンを活用した並列アップロードを実装することで、C++で直接スレッドを管理する方法に比較して、はるかに管理が容易になった。次に、"利用可能なシステムメモリの容量に基いた同時アップロード数の動的な変更"と、ByteArrayバッファの再利用によるガベージコレクタのプレッシャ回避によって、メモリ使用を最適化した。
書き直されたプロセスが意図通り動作していることを評価するため、Dropboxの開発チームは、いくつかの手法を取り入れた。重要なテクニックのひとつが、"多数の低レベルのコンポーネントを、対応するC++実装とともに実際の環境で実行して、その出力を比較することによって"検証する、という方法だ。これによって、新しいコンポーネントが正しく動作することを確認した上で、その実行結果を利用することが可能になった。
もうひとつのテクニックは、システムの状態遷移を従来よりも厳密にすることだ。アップロードされた写真には状態がアサインされているので、それぞれの状態遷移を、許容される遷移のリストと照らし合わせることで、積極的な状態検証を行うようにした。Tappon、Haigh両氏は、その成果を次のように説明する。
これらをチェックすることで、ロールアウトの早い段階で、難しいバグを見つけることができました。カメラのアップロードが写真のステータスをDONEからDONEに移行しようとしているのが、ログに大量の例外が見られるようになったことで分かったのです。これによって、一部の写真が複数回アップロードされていることが明らかになりました!
写真のアップロードによる状態遷移
出典: https://dropbox.tech/mobile/making-camera-uploads-for-android-faster-and-more-reliable
新たな実装のロールアウト時には、C++実装へのロールバックが可能であることを事前に確認した上で、オプトインしたベータ版ユーザを対象に最初のロールアウトを行った。"このユーザ集団は、頻度の低いエラーを表面化させたり、アップロード成功率のようなパフォーマンスメトリクスを収集したりする上で、十分な規模がありました。" この集団を対象に数か月間、重要なメトリクスをモニタすることによって、より広範に公開する準備ができたという確証を得たのだ。予定より早くプロジェクトを完成できたことから、ベータ版で過ごした数か月間は十分に価値のあるものだった、と開発チームは結論付けている。