はじめに
この記事は Globee Advent Calendar の13日目の記事です。
こんにちはGlobeeでAndroidエンジニアをしています屋代です。
皆さんは、ライブラリを有効活用して開発していますでしょうか?
運用期間が長くなっていくと、使用していたライブラリのバージョンアップを行うことがあるかと思います。
何事もなくすっとアップデートが完了すれば良いのですが、ライブラリ内で依存しているライブラリと、別ライブラリ内で依存しているライブラリが競合してしまう場合があります。
そうなると依存の解決地獄、場合によってはアップデートを断念するなんてことも。
今回は、そんな状況に陥っていたAndroid版abceedが健全性を取り戻せた方法をご紹介します。
最初に結論
- 大きいライブラリを使う場合は、依存を閉じ込めよう
- 場合によっては、そのライブラリをラップするandroidライブラリを作るのも手
- テストを書いてロジックの恒常性を担保しよう
Android版abceedで何が起きていたか
弊社ではabceedという英語教育アプリを開発していますが、その機能の一つに、英語の発音の正確性をチェックする機能があります。
通常、Androidで音声認識を使うのであれば SpeechRecognizer
を使用しますが、abceedでは機能要件からSpeechRecognizerではなく、 Google Cloudの speech-to-text
で実装されています。
Android標準で使用しているライブラリと同じライブラリが、speech-to-text内では別リポジトリで提供されていたため、名前空間の競合が発生していました。
名前空間の競合をどう解決したか
結論にある通り、speech-to-textを分離して、別Androidライブラリに閉じ込めました。
大変だったこと
abceedアプリ内でspeech-to-textが提供する型を引き回しており、ライブラリとアプリが密接に結合していました。
そのため、
- ライブラリの設計
- アプリ内で引き回す用の型の再定義
- それらを使用するように該当機能を再設計
という手順を踏む必要がありました。結果として、アップデートができる状況にするために、既存のリファクタリング+新規開発以上のコストを必要としました。
今後発生しうる同様事象にむけて
アプリケーションが存続する限り、事業が軌道に乗れば乗るほどに依存問題はつきまといます。
事業の継続的インテグレーションを達成するためには、ドメインのバウンダリを見極めて、適切にモジュール化していくことが重要だと、思いを新たにした次第です。