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
170
Rails アプリ地図考 Flush Cut
makicamel
February 06, 2025
Tweet
Share
More Decks by makicamel
See All by makicamel
PicoRuby on Rails
makicamel
2
140
Take a small step beyond the api
makicamel
2
120
Road to RubyKaigi: Making Tinny Chiptunes with Ruby
makicamel
4
1.5k
Road to RubyKaigi
makicamel
3
460
ErdMap: Thinking about a map for Rails applications
makicamel
2
3.4k
dRuby 入門者によるあなたの身近にあるdRuby 入門
makicamel
4
1.2k
BulletmarkRepairer: auto corrector for N+1 queries
makicamel
10
7.5k
How to say goodbye to technical debt
makicamel
9
3k
circuit_switch: small start to create gem
makicamel
3
2.7k
Other Decks in Programming
See All in Programming
The Niche of CDK Grant オブジェクトって何者?/the-niche-of-cdk-what-isgrant-object
hassaku63
1
610
顧客の画像データをテラバイト単位で配信する 画像サーバを WebP にした際に起こった課題と その対応策 ~継続的な取り組みを添えて~
takutakahashi
4
1.3k
The Modern View Layer Rails Deserves: A Vision For 2025 And Beyond @ RailsConf 2025, Philadelphia, PA
marcoroth
2
730
NPOでのDevinの活用
codeforeveryone
0
900
チームで開発し事業を加速するための"良い"設計の考え方 @ サポーターズCoLab 2025-07-08
agatan
1
470
GPUを計算資源として使おう!
primenumber
1
250
テストから始めるAgentic Coding 〜Claude Codeと共に行うTDD〜 / Agentic Coding starts with testing
rkaga
15
5.6k
イベントストーミング図からコードへの変換手順 / Procedure for Converting Event Storming Diagrams to Code
nrslib
2
1.1k
チームのテスト力を総合的に鍛えて品質、スピード、レジリエンスを共立させる/Testing approach that improves quality, speed, and resilience
goyoki
5
1.1k
Git Sync を超える!OSS で実現する CDK Pull 型デプロイ / Deploying CDK with PipeCD in Pull-style
tkikuc
4
350
可変変数との向き合い方 $$変数名が踊り出す$$ / php conference Variable variables
gunji
0
180
MCPを使ってイベントソーシングのAIコーディングを効率化する / Streamlining Event Sourcing AI Coding with MCP
tomohisa
0
170
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Building Applications with DynamoDB
mza
95
6.5k
Being A Developer After 40
akosma
90
590k
Bash Introduction
62gerente
613
210k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Adopting Sorbet at Scale
ufuk
77
9.5k
What's in a price? How to price your products and services
michaelherold
246
12k
The Pragmatic Product Professional
lauravandoore
35
6.7k
The Cult of Friendly URLs
andyhume
79
6.5k
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!