はじめに
こんにちは。令和トラベルで「NEWT(ニュート)」のAndroidアプリ開発を担当している赤池です。
2023年7月現在、NEWTはローンチから1年と3ヶ月ほど経ちました。ローンチからこれまでに、ホテル単体予約や、未ログイン状態での利用の開放、各種マーケティング施策に応じたDeeplinkの増加など、利用の幅が広がってきています。
当初想定されていなかった機能が追加されていくにつれ、コードベースの複雑性が増し、QAフェーズで発見されるバグも増加してきました。また、カスタマーも増え続けており、インシデントがもし発生した場合に与える影響も大きくなってきています。
そして今後も機能は拡張し、カスタマーは増え続けていくことが予想されます。
そういった背景から、将来にわたって生産性高く安心した開発ができるよう、NEWT-Androidの品質向上への取り組みを始めました。
現状分析と対策の検討
バグ抑制という面での品質にスコープし、バグの発生を予防すること、発生したバグに適切に対処できるようにすることを目指しました。
バグ発生の予防
現状どういったバグがどれくらい(QA時も含め)発生しているのかをまず把握するため、プロジェクト管理ツールのバグチケットを集計しました。全体傾向としては、四半期単位の比較で20%ほど増加傾向にあることがわかりました。
続いてバグチケットをざっと眺め、カテゴリごとに分類して集計してみると、デザイン系バグが最も多く、続いて画面遷移まわり、認証状態まわりと続くことがわかりました。
さらにカテゴリごとにバグチケットの内容を一つ一つ見ていきながら、なぜ発生したのかの原因を深掘っていき、対策の方向性を出していきました。
ㅤ | カテゴリ | 原因 | 対策 |
1 | デザイン | • 状態ごとに異なる画面のパターンを確認しきれていない
• PR上で差分を確認しにくく見落としがち | • Composable Previewの拡充
• スクリーンショットテストの導入 |
2 | 画面遷移 | • Navigationの定義箇所が横断的になっている
• Deeplinkの変更頻度が高い
• 画面が増えて遷移のパターンも複雑に | • Navigationのリファクタリング
• NavigationのUIテストの導入
• Deeplinkのリファクタリング |
3 | 認証状態 | • 状態管理がバグを生みやすい作りになっている
• Compose(LaunchEffect)上のロジックが複雑化 | • 状態管理のリファクタリング
• 状態管理のUnitテストの強化 |
4 | WebView | • WebとネイティブのUIの挙動が干渉しあうケースがある
• OSバージョン・機種依存を確認しきれていない | (ネイティブ化予定もあり保留) |
5 | 検索 | • 検索条件の追加・変更による影響箇所が複数にわたる
• 検索画面への経路ごとの仕様が複雑化 | • 検索機能のリファクタリング
• 検索機能のUnitテストの強化 |
※ NEWT-Androidのアーキテクチャ概要
発生したバグへの対処
NEWTではFirebase Crashlyticsでクラッシュやエラーログをモニタリングできるようにしています。新規で発生したログはSlackチャンネルに通知されるようにもしています。
ただ、発生した小さなバグの取り扱いはルール化できておらず、対応が漏れていることもあったので、モニタリング体制の強化をおこないました。
- アプリチームの定例での週次レビュー
- 必要に応じたチケット化と優先順位づけ
- 送信するエラーログの整備
優先順位づけと計画
品質向上への対策は、リソース的に機能開発と並行して実施していく必要がありました。これらを着実に実行していくにあたって、コスパの高い対策を優先しつつ、できるだけ機能開発にのせることを意識しました。
コスパの高い対策から
バグが多かったカテゴリほど効果は大きくなりますが、かかるコストにも気を払う必要があります。出した対策案をインパクトエフォートマトリクスにおとしてみて、大まかな優先度(行動方針)を決めていきました。
機能開発にのせる
Unitテストがない箇所を改修した場合、挙動に変更がないリファクタリングでも、基本的にはQAを通すようにしています。リファクタリングを機能開発にのせられれば、QAの二度手間などが避けられて効率的なので、できるだけ機能開発のロードマップに合うようにスケジューリングしました。
成果
紹介した取り組みは現在進行形のものも多く、数値での効果測定や総括はまだ少し先なのですが、体感としての成果はいくつか出はじめています。
スクリーンショットテスト(Visual Regression Test)
UIに改修が入った場合、以前はGitHubのプルリクエストに手動で撮ったスクリーンショットを貼る運用をしていました。作業の負担もあり、適切な状態のUIでなかったり、抜け漏れが多かったりしていました。
スクリーンショットテストの導入によって、画像の取得と貼り付けの作業は自動化され、デザイン系バグの検知が早くなり、開発効率は向上しました。
スクリーンショットテストは、Compose Previewを元にShowkaseやPaparazziを利用して構築しています。(チームメンバーに対応してもらったので僕自身はほとんど何もしていませんが。笑)
AGP8.2ではAndroid公式でも提供されるようなので注目です。
リファクタリングとUnitテストの強化
先日完了した検索機能のリファクタリングとUnitテストに関しては、以前は改修のたびQA時にバグが複数発見される状態でしたが、直近の改修ではバグチケット0を達成できました。
リファクタリング
例えば検索機能では、「検索条件の追加・変更による影響箇所が複数にわたる」ことがバグの原因として強かったので、以下のようなリファクタリングをおこなっています。
- 元々は検索画面のUiStateとしてフラットに保持していた各種フィールドを、検索条件はそれのみのdata classとして切り出す
- さらにその中で異なる振る舞い(Homeに戻ったらクリアさせるなど)を持つフィールドは、子data classに「絞り込み条件」としてまとめて切り出す
- ユーティリティとして処理していたDeeplink経由時に必要な検索条件のパースなどを、検索条件のdata class内での処理するよう変更
- class初期化時のデフォルト引数を削除し、条件フィールドを追加・変更した際に必要な処理を書いていない場合はコンパイルエラーにさせることで、初期化している全箇所での追加フィールドへの値セットの記述を強制
Unitテスト
開発当初からドメインのロジックやユーティリティ系では書くようにしていましたが、ViewModel等ではほとんど書けていませんでした。テストを書くことは以下のようなメリットがあると考えているので、今後も効果の高そうなところから拡充していければと考えています。
- 改修やリファクタリングによるデグレの防止
- 仕様に意識がいき、考慮漏れが抑制される
- 自動化による開発効率の向上(持続的プロダクトの場合)
- 会社の資産として残る(テスト次第で負債にもなり得るが)
おわりに
以上、NEWT-Androidの品質向上への取り組みの紹介でした。
今回は主にバグの抑制に向けてアプローチしていますが、ゆくゆくはパフォーマンス向上などにも取り組んでいければと考えています。
そんな令和トラベルでは、一緒にNEWTを発展させていく仲間を募集しています。ご興味がある方はぜひ採用ページをご覧ください。
また、7/25(火)には令和トラベルオフィスにてBackendエンジニアによるLT会を予定しています。エンジニアリングの最前線で働く令和トラベルのエンジニアたちの話を聞きに、ぜひお越しください。懇親会のテーマはハワイ料理となっているので、ハワイの最新トレンドを聞きたいという方もぜひお気軽にご参加ください!
勉強会だけでなく、定期的に令和トラベルの技術や組織に関するイベントも開催予定です。connpass にてメンバー登録して最新情報をお見逃しなく!
それでは次回のブログもお楽しみに!Have a nice trip!!