Kaigi on Rails 2022 にて『森羅万象に「いいね」するためのデータ構造』の発表をしました

メディアプロダクト開発部で Rails を書いているなどやま ( @pndcat ) です。業務では、広告基盤の開発、運用から新規サービス開発など、マーケティングソリューション領域に関する開発をしています。趣味は、スプラトゥーンと推し活動をがんばっています。

Kaigi on Rails 2022 にて、森羅万象に「いいね」するためのデータ構造 というタイトルで発表をしました。この記事では、Twitter などで寄せられた質問に回答したいと思います。発表中にあった「いいね」のリファクタリングについてのさらなる詳細については、後日公開する予定です。

After Kaigi on Rails イベントの開催のお知らせ

本日 (10/31) の19時から Cookpad Lounge #15 After Kaigi on Rails を開催します!イベントでは、Kaigi on Rails に登壇した3人の振り返りや、発表では話せなかったことにも触れます。また、惜しくもプロポーザルが落ちてしまった社員による発表もありますので、ぜひ遊びに来てください!(アーカイブもあるのでよろしくお願いします)

cookpad.connpass.com

資料

speakerdeck.com

動画

www.youtube.com

Q&A

以下、今回の発表に関して Twitter などで寄せられた質問への回答です。いろいろな感想や質問があり、とても嬉しかったです。ありがとうございました!

リファクタリングはどうやって進めたのか?リファクタリングの工数はどうしているのか?

メーカーズタウン(今回の発表の題材となったサービスです)の開発チームでは、週に1回、モブプロをする日を作っています。 モブプロには、開発メンバー4人に加え、えにしテック@darashi さんと、@cafedomancer さんにも参加していただき、6人で行っています。 モブプロでは、

  • リリース後に真の仕様がわかったため、より良いデータ構造に変更したい
  • リファクタリングをしたくても、コードが難しい上に、テストもないが、どうにかしたい
  • リリースが迫っているタスクをモブプロで行い、マージまでの時間を短くしたい

など、いろいろなテーマに取り組んでいます。
「いいね」テーブルの種類が増えていき、そろそろ実装が辛くなってきたという段階でリファクタリングのモブプロを行いました。

「いいね」のモブプロでは、現状の仕様や振る舞いの理解を深め、リファクタリングの戦略を検討し、実際に1種類の Like / AnonymousLike を移行しました。そこまでをモブプロで行い、その他の「いいね」は普段の開発をしながら移行していきました。

大規模なリファクタリングは、一人でコツコツ取り組むのは難しいものです(気持ち的にも、正しいリファクタリングができているのかという点においても)。モブプロにおいて議論しつつ移行戦略を確立させたことで普段の開発をしながら移行を進めることができたため、大きな問題もなく移行することができました。

匿名いいねの like_identifier ってなに?

like_identifier は、ログインをしていないユーザーに対して発行するランダムな文字列です。これを Cookie に保存して、匿名いいねに利用しています(文字通り、like をしたユーザーの識別のみが目的の値です)。

like_identifier はユーザーのブラウザのみにある情報であり、Cookie が有効な間は、そのユーザーの「いいね」の情報を取得することができます(Cookie が切れた場合は、「いいね」の取得ができないのですがそれを仕様としました)。

何で中間テーブルを使う方法がリファクタリングの候補になかったの?

今回は、「いいね」の対象が増えるたびにテーブルが増えて、開発やメンテナンスが難しくなっていたので、テーブル数やモデル数は減らしたいという方向に考えていました。また、今後も「各いいねの振る舞いを同じ」にするという制約をおいたため、ポリモーフィック関連か STI でのリファクタリングを検討しました。

「ポリモーフィック関連で if 文を書くと破綻する」の例は?

ポリモーフィック関連のモデルのタイプ別に、異なる振る舞いを持たせたくなった時が典型的な例でしょう。例えば、商品やトピックが「いいね」されたときだけ購入導線を出すとした場合、いいねメソッドを呼び出す側でその実装を意識する必要に迫られ、どんどん複雑になっていきます。ポリモーフィック関連のモデル、つまり、Like には if 文は絶対に書かない=異なる振る舞いはさせない、という強い意志を持ちリファクタリングを行いました。

おわりに

本記事では、森羅万象に「いいね」するためのデータ構造 の発表の Q&A の解説をしました。発表では話せなかったリファクタリングの詳細についても別途記事を書くので、次回作もお待ちください。

クックパッドでは、データの設計やリファクタリングについて熱く話し合う人を募集しています!もし少しでも興味があればカジュアル面談も実施していますので、ぜひご応募ください。

cookpad.jobs