Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
緊急Ques 「食べログの品質ダッシュボード」-コードのメトリクスに基づくリファクタリング戦略
Search
Tomoki Kuriyama
September 29, 2022
Technology
0
21
緊急Ques 「食べログの品質ダッシュボード」-コードのメトリクスに基づくリファクタリング戦略
大規模なコードベースのリファクタリング戦略を、コード自体のメトリクスを元にして立案しているプラクティスを紹介します。
Tomoki Kuriyama
September 29, 2022
Tweet
Share
More Decks by Tomoki Kuriyama
See All by Tomoki Kuriyama
食べログのモジュラモノリス化戦略
weakboson
8
3.9k
食べログのデッドコード解析基盤の裏側 - TECH Street Ruby勉強会
weakboson
0
140
Other Decks in Technology
See All in Technology
アプリエンジニアのためのGraphQL入門.pdf
spycwolf
0
110
Shopifyアプリ開発における Shopifyの機能活用
sonatard
4
260
SDN の Hype Cycle を一通り経験してみて思うこと / Going through the Hype Cycle of SDN
mshindo
1
130
rootlessコンテナのすゝめ - 研究室サーバーでもできる安全なコンテナ管理
kitsuya0828
3
390
Zennのパフォーマンスモニタリングでやっていること
ryosukeigarashi
0
230
Flutterによる 効率的なAndroid・iOS・Webアプリケーション開発の事例
recruitengineers
PRO
0
120
TypeScriptの次なる大進化なるか!? 条件型を返り値とする関数の型推論
uhyo
2
1.7k
適材適所の技術選定 〜GraphQL・REST API・tRPC〜 / Optimal Technology Selection
kakehashi
1
710
DynamoDB でスロットリングが発生したとき_大盛りver/when_throttling_occurs_in_dynamodb_long
emiki
1
450
なぜ今 AI Agent なのか _近藤憲児
kenjikondobai
4
1.4k
"とにかくやってみる"で始めるAWS Security Hub
maimyyym
2
100
AGIについてChatGPTに聞いてみた
blueb
0
130
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
655
59k
Bash Introduction
62gerente
608
210k
Site-Speed That Sticks
csswizardry
0
33
Into the Great Unknown - MozCon
thekraken
32
1.5k
Become a Pro
speakerdeck
PRO
25
5k
A Tale of Four Properties
chriscoyier
156
23k
Designing for Performance
lara
604
68k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Building an army of robots
kneath
302
43k
Writing Fast Ruby
sferik
627
61k
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Transcript
© Kakaku.com Inc. All Rights Reserved. 1 コードのメトリクスに基づく リファクタリング戦略 株式会社カカクコム
⾷べログシステム本部 技術部 マイクロサービス化チーム 栗⼭ 友樹 2022年09⽉29⽇(⽊)
© Kakaku.com Inc. All Rights Reserved. 2
© Kakaku.com Inc. All Rights Reserved. 3
© Kakaku.com Inc. All Rights Reserved. 4 栗⼭ 友樹 (weakboson)
マイクロサービス化チームリーダー兼テックリード ⾷べログではサービス開発、DevOpsを経て2019年からマイクロサービス 化チーム マイクロサービス化チームの最近の公開活動 • ⾷べログのレストラン検索を⽀える Debezium と Apache Kafka ‒ Qiita • ⾷べログの内製Pub/Subメッセージング基盤をApache Kafkaにリプレイスした 話 ‒ Qiita • Qiita Night〜モノリスからの脱却って実際どうなの?マイクロサービス化につい て⾚裸々に語る〜
© Kakaku.com Inc. All Rights Reserved. 5 ⽬次 1. ⾷べログの紹介と現在の課題
2. お掃除の効果をスコアリングするた めのメトリクスの検討 3. 計測⽅法と結果 4. まとめ
© Kakaku.com Inc. All Rights Reserved. 6 ⾷べログの紹介と現在の課題
© Kakaku.com Inc. All Rights Reserved. 7 ⾷べログについて ⽇本最⼤級のレストラン検索・予約サイト •
約9,300万 MAU (2022年6⽉) • レストランの⼝コミ、写真 • レストランのネット予約 • 飲⾷店DX (予約台帳、⾷べログオーダー、⾷べログ仕⼊) • お取り寄せEC (⾷べログモール)
© Kakaku.com Inc. All Rights Reserved. 8 ⾷べログのシステム課題 ⾷べログは今年で16年⽬のサービスで、Railsになってからは14年 が経過しています。
© Kakaku.com Inc. All Rights Reserved. 9 ⾷べログのシステム課題 ⾷べログは今年で16年⽬のサービスで、Railsになってからは14年 が経過しています。
Windows OSがVistaから11まで4回代替わりする年⽉です。 バージョン ⽇本語版発売⽇ Windows XP 2001年9⽉6⽇ Windows Vista 2006年11⽉30⽇ Windows 7 2009年9⽉1⽇ Windows 8 2012年8⽉16⽇ Windows 10 2015年7⽉29⽇ Windows 11 2021年10⽉5⽇
© Kakaku.com Inc. All Rights Reserved. 10 ⾷べログのシステム課題 これだけ歴史があればあちこちにガタが来ているのは当然で、そ の問題の⼀つに密結合で低凝集な保守性の悪いアプリケーション
のコードが継続的開発の速度を下げ、不具合を増加させていると いう実感があります。
© Kakaku.com Inc. All Rights Reserved. 11 ⾷べログのシステム課題 独⽴してそうで独⽴してないRailsアプリ郡 (サブシステム)
Railsアプリ間で共有されるコード 分散されたモノリス システムがコードやDBを共有することで結合していてる状態
© Kakaku.com Inc. All Rights Reserved. 12 ⾷べログのシステム課題 ⾷べログのコードを⾼凝集・疎結合で保守性の⾼いコードにリ ファクタリングしたい!
© Kakaku.com Inc. All Rights Reserved. 13 この発表のスコープは……
© Kakaku.com Inc. All Rights Reserved. 14 この発表のスコープは……内部品質です!
© Kakaku.com Inc. All Rights Reserved. 15 リファクタリングの前にお掃除が必要 密結合で技術的負債が溜まったアプリケーションというのは散 らかった部屋のようなものです。散らかった部屋を⾒て「よし、
部屋を分けよう!」なんていきなり⾔いだす⼈はあまりいなく て、まずはいらないものを捨てたり、ホコリや汚れをキレイに 掃除したり、収納グッズを買って⽤途ごとに置き場所を決めた りするなどして、部屋を整理しようと考えるのが⾃然です。
© Kakaku.com Inc. All Rights Reserved. 16 お掃除の前に優先順位づけが必要 ⾷べログのコード量は⾮常に多いので、全体を満遍なく掃除して いては、メリットを得られる時期が遅くなります。メリットを最
⼤化できるように、どの部屋を先にお掃除するかの優先順位を付 ける必要があります。
© Kakaku.com Inc. All Rights Reserved. 17 お掃除の効果をスコアリングするた めのメトリクスの検討
© Kakaku.com Inc. All Rights Reserved. 18 コードのメトリクスで品質を可視化する先⾏事例 • 堀⽥圭佑・佐野
由希⼦・肥後芳樹・楠本真⼆: 修正頻度の⽐較に基づ くソフトウェア修正作業量に対する重複コードの影響に関する調査, 情 報処理学会論⽂誌 Vol.52 No. 9 2788‒2798 (Sep. 2011) • Aki Asahara (Sider): Siderに強⼒な新機能が追加。コード品質の可視 化、リファクタリングすべきファイルの可視化が可能に, Sider社ブロ グ (Jun. 2021) お掃除の優先順位を考えるにあたりいくつかの先⾏事例を参考にした。
© Kakaku.com Inc. All Rights Reserved. 19 コードのメトリクスで品質を可視化する先⾏事例 • 鷲崎弘宜:
品質ダッシュボードを含むアジャイル品質保証の技術とパターン, Test Engineers Meetup #4 (March 30, 2022) から引⽤
© Kakaku.com Inc. All Rights Reserved. 20 スコアリングするためのメトリクスを検討 難易度 メリット:開発速度の向上・不具合の低減
コードの⾒通し改善効果 ビジネス的重要性
© Kakaku.com Inc. All Rights Reserved. 21 スコアリングするためのメトリクスを検討 難易度 メリット:開発速度の向上・不具合の低減
コードの⾒通し改善効果 ビジネス的重要性 抽象度が⾼い 直接計測できない
© Kakaku.com Inc. All Rights Reserved. 22 スコアリングするためのメトリクスを検討 難易度 メリット:開発速度の向上・不具合の低減
コードの更新回数 実⾏されないコードの量 (以下デッドコード量) • 多いほど効果が⼤きい • 多いほど難易度が⾼い コードの⾒通し改善効果 ビジネス的重要性 開発案件の数 抽象度が⾼い 直接計測できない 具体性が⾼い 直接計測できる
© Kakaku.com Inc. All Rights Reserved. 23 スコアリングに使いたいメトリクスと計測できるメトリクスの関係 デッドコード量 更新回数
ビジネス的により重要 ⾒ 通 し 改 善 効 果 が ⼤ き い 難 易 度 が ⾼ い • 細い⽮印: 計測可能なメトリクス • 先の太い⽮印: スコアリングに使いたいメトリクス
© Kakaku.com Inc. All Rights Reserved. 24 計測⽅法と結果
© Kakaku.com Inc. All Rights Reserved. 25 デッドコード量 Rubyの標準ライブラリCoverageを使ってproduction環境で実際に 実⾏されたコードを計測して算出。
有効⾏数 - 実⾏された⾏数 = デッドコード⾏数
© Kakaku.com Inc. All Rights Reserved. 26 コードの更新回数 gitのマージコミット間の統計情報から算出。 追加・削除のどちらかあれば1回更新にカウント。
追加 削除
© Kakaku.com Inc. All Rights Reserved. 27 スコアリングするためのコードのグループ化 課題の説明で触れた「サブシステム 」をグループ単位とした。
独⽴してそうで独⽴してないRailsアプリ郡 (サブシステム) 共有コードは優先順位をつけづらいので除外
© Kakaku.com Inc. All Rights Reserved. 28 サブシステム単位でメトリクスをプロット ※ 管理系機能は除外
~たまにしか使われない機能があり、計測中に実 ⾏されてないコードが本当に不要である信頼性が 低い
© Kakaku.com Inc. All Rights Reserved. 29 サブシステム単位でメトリクスをプロット 更新回数とデッドコード⾏数には強い相関が⾒え る。
© Kakaku.com Inc. All Rights Reserved. 30 サブシステム単位でメトリクスをプロット ビジネス的により重要 ⾒
通 し 改 善 効 果 が ⼤ き い 難 易 度 が ⾼ い デッドコード量 更新回数
© Kakaku.com Inc. All Rights Reserved. 31 サブシステム単位でメトリクスをプロット デッドコード量 更新回数
ビジネス的重要性を最重視して、プロットの右側 の集団をスコアリングすることにした。 ビジネス的により重要
© Kakaku.com Inc. All Rights Reserved. 32 ICEスコアリング ICEスコア =
影響⼒ (Impact) x 信頼度 (Confidence) x 容易性 (Ease) • 影響⼒: 改善対象の成果やKPIに与える効果の量 • 信頼度: 成功する可能性や確率 • 容易性: 実⾏しやすさ それぞれ1~10の相対基準で付ける ICEスコア (ICE score) とは、改善案や着⼿すべき施策が多い際に優 先すべきものを順序づける⼿法のこと。
© Kakaku.com Inc. All Rights Reserved. 33 ICEスコアリング ICEスコア =
影響⼒ (Impact) x 信頼度 (Confidence) x 容易性 (Ease) • 影響⼒: コードの更新回数、デッドコード量 (多いほど⾒通し改善効果⼤) • 信頼度: いまの段階で差異なし • 容易性: デッドコード量 (少ない程容易) ICEスコア (ICE score) とは、改善案や着⼿すべき施策が多い際に優 先すべきものを順序づける⼿法のこと。
© Kakaku.com Inc. All Rights Reserved. 34 影響⼒・容易性を決める 優先 順位
サブシステム 更新 回数 デッド コード 影響⼒ 容易性 ICEスコア SP版 51 K 11.0 K PC版レストラン機能 38 K 8.6 K スマホアプリAPI 32 K 3.5 K 飲⾷店向け管理機能 31 K 4.2 K
© Kakaku.com Inc. All Rights Reserved. 35 影響⼒・容易性を決める 優先 順位
サブシステム 更新 回数 デッド コード 影響⼒ 容易性 ICEスコア SP版 51 K 11.0 K 10 3 PC版レストラン機能 38 K 8.6 K 7 4 スマホアプリAPI 32 K 3.5 K 3 8 飲⾷店向け管理機能 31 K 4.2 K 3 6 体制を考慮して ⾼め
© Kakaku.com Inc. All Rights Reserved. 36 ICEスコアを算出 優先 順位
サブシステム 更新 回数 デッド コード 影響⼒ 容易性 ICEスコア SP版 51 K 11.0 K 10 3 30 PC版レストラン機能 38 K 8.6 K 7 4 28 スマホアプリAPI 32 K 3.5 K 3 8 24 飲⾷店向け管理機能 31 K 4.2 K 3 6 18 ICEスコアは「SP版」が最⼤
© Kakaku.com Inc. All Rights Reserved. 37 ICEスコアを元に優先順位を決める 優先 順位
サブシステム 更新 回数 デッド コード 影響⼒ 容易性 ICEスコア 2 SP版 51 K 11.0 K 10 3 30 3 PC版レストラン機能 38 K 8.6 K 7 4 28 1 スマホアプリAPI 32 K 3.5 K 3 8 24 4 飲⾷店向け管理機能 31 K 4.2 K 3 6 18 ⼩さく PoC をしたいので、ICEスコアは「SP版」が最⼤ですが「スマホアプ リAPI」から取り掛かることにした。
© Kakaku.com Inc. All Rights Reserved. 38 お掃除の進捗がわかるダッシュボードを⽤意 継続的に⽇次集計(毎朝9時)して デッドコードの推移がわかるダッ
シュボードを⽤意。 お掃除の進捗が確認できる。
© Kakaku.com Inc. All Rights Reserved. 39 お掃除の進捗がわかるダッシュボードを⽤意 実はまだ本格的にお掃除を開始して ないので、時間経過で減って⾒える
のは残念ながら改善の進捗ではない はず。 おそらくproductionでもまれにしか 実⾏されないコードが新たに計測さ れてデッドコードが減って⾒える。
© Kakaku.com Inc. All Rights Reserved. 40 お掃除の進捗がわかるダッシュボードを⽤意 SP版のデッドコードがたまに⼤き く増加するのは、おそらく前⽇の
遅い時間に⼤きなコード変更が あったせい。 集計時刻の朝9時までに実⾏され てないコードが増⼤したせいだと 想定される。 (そして翌々⽇朝9時までには実⾏ されて、デッドコード量は同程度 の数値に落ち着く。)
© Kakaku.com Inc. All Rights Reserved. 41 まとめ
© Kakaku.com Inc. All Rights Reserved. 42 まとめ できたこと •
2つのメトリクス「デッドコード」と「コードの更新回数」が計 測できた • メトリクスからICEスコアを付け、スコアを元にお掃除の優先順 位が決められた これから • ソースコードと統計数値化する前のデッドコードをマッピングし て、お掃除できるコードを可視化・削除 • デッドコードをお掃除した内部品質改善効果を計測して仮説を検 証