はじめに
ロコガイドでバックエンドエンジニアをしている高江洲(たかえす)と申します。普段はトクバイの開発をしながらエンジニア採用などのマネジメント業務をおこなっています。もしご興味あれば是非ご応募お待ちしています。
さて、今回はトクバイの機能のひとつとして「PRチラシ」という機能のリファクタリングを含めた機能追加についてどのように考えて、進めていったかについて書いていきます。
トクバイの概要とお店の情報を見る体験
まずPRチラシを説明する前にトクバイのサービス概要を説明します。
トクバイは全国のスーパー、ドラッグストアなどのチラシや商品・クーポンが利用できるアプリやWebサイトを展開しています。
トクバイのサービスをご利用いただいているユーザーは好きなお店をお気に入りに登録する(フォローする)ことができます。
自分が1番知りたいお店の情報を発見しやすく、更新に気づきやすくする仕掛けや機能を展開しています。お気に入りのお店の情報を簡単に閲覧でき、買い物へ活かせるということでユーザーの方に評価いただいているポイントでもあります。
しかし裏を返すと、お気に入りに登録していないお店(新しくオープンしたお店など)はユーザーに気づかれにくいという課題があります。そのためお気に入り以外のお店でもおすすめしたいお店や新しいお店に気づいてもらいやすくする仕組みが必要です。その機能の1つとしてPRチラシという機能があります。
PRチラシとは
トクバイではチラシの表示において専用のチラシ画面があります。以降はチラシビューアと呼びます。
チラシビューア画面の上部にはお気に入りのお店を選択するタブがあり、お店の切り替えがスムーズにできるようになっています。
その店舗タブの中にお気に入り登録されていない、新店や近くにあるなど複数の条件をもとに価値のある情報と判定されるお店を重みづけし、ユーザーに対して最適なお店とチラシを選定しPRチラシとして情報を届けています。
今回はそのPRチラシの機能に対して新しい機能の追加、それに伴い掲出されるお店の対象を大幅に増やすというプロジェクトに取り組みました。
PRチラシ関連のソースコードの課題
トクバイは2023年2月で10周年となる歴史の長いサービスです。
チラシビューアはトクバイの中でもメインの機能のひとつでこれまでに機能の追加や削除などの改良がいくつか積み重なり、コードの保守性の観点で難しい箇所になっていました。
Rspecによる自動テストは存在するのですが、テストとしての網羅性が担保されていないという状況でした。
その課題をクリアするためにまずリファクタリングを行い、機能を追加していき、段階的なリリースをして進めていきました。
PRチラシの機能追加とリファクタの進め方
主に以下のような順番で進めていきました。
- PRチラシへのテストの追加
- PRチラシプロダクションコードのリファクタリング
- 1次リリース
- PRチラシへの新しい機能の追加
- 2次リリース
- テストのリファクタリング
- 最終リリース
1. PRチラシへのテストの追加
まずは、PRチラシの機能追加を進める前に不足しているテストケースを追加しました。
仕様については、過去に関わったエンジニアやディレクターなどに確認を行い想定される仕様となっているかの確認するテストを追加しました。
この段階で一部のクリティカルではない仕様バグ・漏れのようなものに気づくことができました。テストを書くのは良いですね!
2. PRチラシプロダクションコードのリファクタリング
既存の呼び出し側のインタフェースは変えずコードをリファクタリングしていきました。
変更前のコードでは以下のようなことを1つのクラスでおこなっていました。
- データの取得
- データの加工
- 選定プロセス
それらを目的にあった3つのクラスに分けました。SOLID原則でいう単一責任の原則に沿ったイメージです。
3. 1次リリース
1,2の実装が完了したのでこのタイミングで1次リリースをしました。挙動は変えずに内部実装の変更をおこなった状態既存の機能として変更がないかを確認し、問題なかったので完了としました。
4. PRチラシへの新しい機能の追加
ここからは新しい機能の実装に入りました。新しい機能の導入に伴い、掲出されるお店が大幅に増えるのでパフォーマンス観点での改善も一部行いました。
実装そのものは「2. PRチラシプロダクションコードのリファクタリング」の3つのクラスに対して機能追加をしました。
ステージング環境等でのパフォーマンスを計測するテストを行い、問題ないことを確認しました。ここでパフォーマンス懸念があれば別途データをキャッシュするような仕組みを入れることも頭に入れていましたが、パフォーマンス影響はほとんどなかったのでそのまま進めていきました。
5. 2次リリース
「4. PRチラシへの新しい機能の追加」の実装を含めてリリースしていきました。このタイミングから、一部のクライアントに対して機能を解放し、実際の本番環境で検証しながら数値などの状況を確認していきました。
その時に起きた課題
2次リリースで段階的に機能をリリースしていく中で、一部のログの収集と集計の考慮漏れが発覚しました。そのタイミングでバックエンドエンジニア・アプリエンジニア・ディレクターとで認識と仕様の調整を行い、アプリはホットフィックスで新バージョンをリリースする形で進めることになりました。
段階的に確認できたことと、ホットフィックスとして進めた結果、大きな問題とはならずに進めることができたのは良かったです。
6. テストのリファクタリング
「1. PRチラシへのテストの追加」にてテストケースを追加しましたが、この段階ではRailsのコントローラー層から呼び出すような統合的なテストとして追加した状態でした。「2. PRチラシプロダクションコードのリファクタリング」にて3つのクラスに分けたのでそれぞれのクラスのユニットテストの位置付けとなるようにテストをリファクタリングしていきました。
ここまでで一通りのリファクタリングと機能実装が完了しました。
7. 最終リリース
最新のコードをリリースし、全てのクライアントに対して本追加機能が有効になる日付を迎えて、1つのプロジェクトが完了となりました。
このあとはディレクターを中心にPVなどの数値の変動をみて意図していないものや機能としてエラーが多発していないかをウォッチしています。
おわりに
現在、トクバイは月間利用者数が約1,700万人規模のサービスでユーザー規模としては大きめなサービスかと思います。そのようなサービスの1つのプロジェクトにおいてリファクタリングを行いながら、機能開発する流れを説明していきました。
成熟したサービスのプロジェクトやリファクタリングの進め方として、少しでも参考になってくれると幸いです。
合わせて、10周年を迎えたトクバイを一緒に開発してくれるメンバーも募集していますので、リクルートページからのご応募お待ちしています。