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
Rails アプリ地図考 Flush Cut
Search
makicamel
February 06, 2025
Programming
1
150
Rails アプリ地図考 Flush Cut
makicamel
February 06, 2025
Tweet
Share
More Decks by makicamel
See All by makicamel
Take a small step beyond the api
makicamel
2
96
Road to RubyKaigi: Making Tinny Chiptunes with Ruby
makicamel
4
1k
Road to RubyKaigi
makicamel
3
410
ErdMap: Thinking about a map for Rails applications
makicamel
2
3.3k
dRuby 入門者によるあなたの身近にあるdRuby 入門
makicamel
4
1.1k
BulletmarkRepairer: auto corrector for N+1 queries
makicamel
10
7.4k
How to say goodbye to technical debt
makicamel
9
3k
circuit_switch: small start to create gem
makicamel
3
2.7k
Ganbaranai wo ganbaru
makicamel
5
4.7k
Other Decks in Programming
See All in Programming
事業KPIを基に価値の解像度を上げる
nealle
0
190
ruby.wasmとWebSocketで遊ぼう!
lnit
0
150
AI時代のリアーキテクチャ戦略 / Re-architecture Strategy in the AI Era
dachi023
0
180
PT AI без купюр
v0lka
0
170
"使いづらい" をリバースエンジニアリングする UI の読み解き方
rebase_engineering
0
100
TypeScript製IaCツールのAWS CDKが様々な言語で実装できる理由 ~他言語変換の仕組み~ / cdk-language-transformation
gotok365
7
350
primeNumberでのRBS導入の現在 && RBS::Traceでinline RBSを拡充してみた
mnmandahalf
0
240
ビカム・ア・コパイロット
ymd65536
1
190
Building an Application with TDD, DDD and Hexagonal Architecture - Isn't it a bit too much?
mufrid
0
370
マテリアルって何者?RealityKitで扱うマテリアル入門
nao_randd
0
130
iOSアプリ開発もLLMで自動運転する
hiragram
6
2k
AIエージェントによるテストフレームワーク Arbigent
takahirom
0
250
Featured
See All Featured
Six Lessons from altMBA
skipperchong
28
3.8k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
180
53k
The Power of CSS Pseudo Elements
geoffreycrofte
76
5.8k
Visualization
eitanlees
146
16k
Why Our Code Smells
bkeepers
PRO
336
57k
How to Ace a Technical Interview
jacobian
276
23k
Into the Great Unknown - MozCon
thekraken
38
1.8k
The Pragmatic Product Professional
lauravandoore
34
6.7k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
123
52k
How GitHub (no longer) Works
holman
314
140k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Docker and Python
trallard
44
3.4k
Transcript
Rails アプリ地図考 Flush Cut @makicamel Omotesando.rb #106 スポンサー LT 2025.02.06
自己紹介 @makicamel / 川原万季 Ruby とビール とお酒が好き 好きな言葉は「エイってやってバーン」 ㈱アンドパッド
東京 Ruby 会議 12 https://regional.rubykaigi.org/tokyo12
東京 Ruby 会議 12 楽しかったですね!
東京 Ruby 会議 12 前夜祭でトークもさせてもらいました https://regional.rubykaigi.org/tokyo12/talks
東京 Ruby 会議 12 今日はこのトークの LT 版 https://regional.rubykaigi.org/tokyo12/talks
東京 Ruby 会議 12 気になった方は元資料を見たり懇親会で声をかけてもらえると嬉しいです https://speakerdeck.com/makicamel/thinking-about-a-map-for-rails-applications
「地図」
地図 株式会社アンドパッド 秋葉原オフィスに初めて来た人 地図を見てきましたね
地図 道しるべ[^1] [^1]: もちろんそれ以外のたくさんの役割があります
Rails アプリの地図 アプリを歩くための道しるべがほしい
Rails アプリの地図 道しるべがないと 新しいメンバー オンボーディングで教わる以外のアプリの知識の獲得は手探り 慣れたメンバー 普段触るサービスにアプリの知識が閉じがち いつの間にか知らないドメインが増えている
Rails アプリの地図 といえば ER 図
Rails アプリの地図 全 ER 図
Rails アプリの地図 主要 ER 図の手動メンテ
つくった https://github.com/makicamel/erd_map
地図 https://www.google.com/maps ズームインすると詳細が見える ズームアウトすると全体が見通せる
ErdMap https://github.com/makicamel/erd_map ズームインすると詳細が見える ズームアウトすると概要が見える
ErdMap 最初は 3 つの"重要"なモデルのみ表示 ズームインすると次に重要なモデルを表示 重要度の高いモデルは大きく、重要度の低いモデルは小さく表示 モデルを"コミュニティ"ごとに色分け
ErdMap ErdMap づくりに必要なこと モデルの"重要"度の評価 "コミュニティ"分割
ErdMap のつくり方
ネットワーク分析
ネットワーク分析 ネットワークとは ノード(点)とエッジ(線)で構成されるデータ構造 e.g. SNS のユーザー関係 ノード: ユーザー、エッジ: フォロー関係
ネットワーク分析 Rails アプリをひとつのネットワークとして捉える ノード: モデル エッジ: 関連
ErdMap に必要なこと モデルの"重要"度の評価 "コミュニティ"分割
重要度の評価指標 次数中心性 固有ベクトル中心性 媒介中心性 etc
重要度の評価指標: 次数中心性 直接関連している他モデルの数(次数)を評価 シンプルで高速
重要度の評価指標: 固有ベクトル中心性 どれだけ重要なモデルと関連しているか[^2]を評価 次数中心性の「数」の評価に対し「質」を評価 e.g. 請求データ ユーザーや注文といった中核モデルと紐づくため固有ベクトル中心性が高い 紐づくモデルが少ないため次数中心性が低い e.g. 履歴データ
中核モデルと紐づいても関連の終端になりやすく固有ベクトル中心性が低い 多数の関連を持つため次数中心性が高い [^2]: 関連する重要モデルの数ではなく相手モデルのスコアの合計
重要度の評価指標: 媒介中心性 他のモデル間の最短経路にどれだけ頻繁に登場するかを評価 e.g. 請求データ ユーザーや注文といった中核モデルと紐づくため固有ベクトル中心性が高い 他のノード間の最短経路にあまり登場しないため媒介中心性が低い
固有ベクトル中心性のアルゴリズム
固有ベクトル中心性のアルゴリズム 初期化 すべてのノードに初期スコアを与える 1. スコアの更新 各ノードのスコアの「接続先ノードのスコアの合計」を算出し正規化する 2. 繰り返し スコアが収束するまで 2
の計算を繰り返す 3.
固有ベクトル中心性のアルゴリズム 例えば「A-B」「A-C」が接続するネットワークで考えてみる
固有ベクトル中心性のアルゴリズム 1. スコアの初期化 2. スコアの更新 スコアの算出 → 正規化
固有ベクトル中心性のアルゴリズム 3. スコアの更新の繰り返し
固有ベクトル中心性のアルゴリズム スコアの更新を繰り返すと スコアがほとんど変化しなくなり 最終的に収束する
ErdMap に必要なこと モデルの"重要"度の評価 "コミュニティ"分割
コミュニティ分割 とは?
コミュニティ分割 重要なモデルとそれに関連するモデルを知りたい ひとつのモデルはひとつの概念を表す ビジネスロジックは複数のモデルから成ることが多い
コミュニティ分割 Mastdon の Account モデルの隣接モデル 情報が多くて情報を読み取りづらい 我々はもっと細かい単位で 概念を認識しているはず
コミュニティ分割 Mastdon のモデルの Account モデルが所属するコミュニティ Accountにまつわる概念が抽出されていそう
コミュニティ分割 モデルのグループをいい感じに分割して可視化したい
コミュニティ検出 アルゴリズム Louvain 法 Girvan-Newman 法[^3] etc [^3]: Louvain法は高速、Girvan-Newman法は計算コストが高いですが、 Railsアプリのモデルデータくらいなら関係なさそうです
コミュニティ検出: Louvain 法 ネットワーク内でつながりの強いコミュニティを発見するアルゴリズム モジュラリティを最大化するようノードを移動・統合し、最適化を繰り返すこと で自然なまとまりに分割する モジュラリティ = つながりの密度
コミュニティ検出: Louvain 法 6つのノード、7つのエッジを持つネットワークがあるとする 初期状態ではすべてのノードは独立したコミュニティ
コミュニティ検出: Louvain 法 複数のノードを同じコミュニティにした場合のモジュラリティの変化を見て モジュラリティが高くなるノードグループをコミュニティとして確定する
コミュニティ検出: Louvain 法 この操作を繰り返すと以下のコミュニティに分割される
実装 自分で実装しなくていい NetworkX が提供するメソッドをコールするだけ
NetworkX ネットワーク分析用パッケージ Python 製 Rails から呼びたい NetworkX https://github.com/networkx/networkx
PyCall.rb Ruby - Python ブリッジライブラリ Python オブジェクトを Ruby から触れる Ruby
オブジェクトを Python 側に見せられる mrknさん作 PyCall https://github.com/mrkn/pycall.rb PyCall があれば Ruby で機械学習ができる https://magazine.rubyist.net/articles/0055/0055-pycall.html
固有ベクトル中心性 networkx = PyCall.import_module("networkx") graph = networkx.Graph.new # ... graphにノードやエッジを追加
... centralities = networkx.eigenvector_centrality(graph) # => {ノード名: 中心性} のハッシュが返る これだけのコードで 固有ベクトル中心性が得られる
Louvain 法 whole_communities = networkx_community .louvain_communities(whole_graph) .map { |communities| PyCall::List.new(communities).to_a
} これだけのコードで Louvain 法でコミュニティ分割できる
ErdMap デモ(Redmine の ErdMap) Redmine https://github.com/redmine/redmine Sample HTML https://github.com/makicamel/erd_map/blob/main/sample/redmine.html
ErdMap を使ってみて
ErdMap 初見の小規模アプリ(モデル数 100)の場合 重要な概念がわかる アプリの機能や構造・データフローのイメージが湧く
ErdMap 触り慣れている中規模アプリ(モデル数 1,400)の場合 発見が多い 最近こんなモデルが作られていたのか、とか 気になっていたあのモデルはこういうものだったのか、とか あのサービスの主要モデルの関連はこうなっているのか、とか
ErdMap 楽 並列に並ぶファイル名から概念や構造を見出すのは困難 重みづけされグルーピングされて可視化されているとかんたん 発見がある 最新の状態の簡易的な ER 図がいつでもそこにある 可視化面白い 見えるようにすると何かが見える(かも)
設計の改善点、ボトルネック...
Rails アプリの地図 ぜひ試してみてください https://github.com/makicamel/erd_map
Special Thanks @youchan
None
We're hiring!