Slide 1

Slide 1 text

GoにおけるCall Graphを用いた 大規模コードベースの影響調査 Go Conference mini 2023/12/02

Slide 2

Slide 2 text

藤兼 由生(ふじを) 所属 ● 株式会社サイバーエージェント 2022 新卒 ● ABEMA -> Developer Productivity室 ● PIpeCD maintainer 特徴 ● 関西人 フジカネ ヨシキ @ffjlabo @ffjlabo

Slide 3

Slide 3 text

データマイグレーション における影響調査 本日のお話

Slide 4

Slide 4 text

データのマイグレーションとは 「データをある場所から別の場所に、 ある形式から別の形式に変更する」

Slide 5

Slide 5 text

実行理由は様々 ● 新機能を今のデータモデルでは実現ができない ● パフォーマンス向上のため ● 技術的負債の回収 ● etc…

Slide 6

Slide 6 text

マイグレーションのプロセス データモデルの設計 マイグレーション実行 影響調査

Slide 7

Slide 7 text

マイグレーションのプロセス データモデルの設計 マイグレーション実行 影響調査

Slide 8

Slide 8 text

マイグレーションのプロセス データモデルの設計 マイグレーション実行 影響調査

Slide 9

Slide 9 text

マイグレーションのプロセス データモデルの設計 マイグレーション実行 影響調査

Slide 10

Slide 10 text

マイグレーションのプロセス 影響調査 ✅ ✅ データモデルの設計 マイグレーション実行

Slide 11

Slide 11 text

ʕ◔ϖ◔ʔ> Let’s≡Go

Slide 12

Slide 12 text

● 影響調査の難しさ ● ケーススタディ ● Call graphによる依存関係調査 ● まとめ アジェンダ

Slide 13

Slide 13 text

影響調査と難しさ

Slide 14

Slide 14 text

影響調査と難しさ

Slide 15

Slide 15 text

難しさ = 調査範囲を絞る

Slide 16

Slide 16 text

● 変更するデータがどんな機能に影響するかを想定したい ● そのデータがどこで使われているかを知っている必要あり ● 長年そのシステムを運用している人に作業が偏りがち サービスのシステムに深い知識が必要 属人化せず、いかに調査範囲を絞り込むか

Slide 17

Slide 17 text

ケーススタディ

Slide 18

Slide 18 text

回遊体験の向上のため、コンテンツ体系を再定義 コンテンツモデルリニューアル 再グルーピング ※画像は2023年時点

Slide 19

Slide 19 text

コンテンツモデルリニューアル コンテンツ1 ビデオA ビデオB コンテンツ2 ビデオC ビデオD Newコンテンツ ビデオA ビデオB ビデオC ビデオD

Slide 20

Slide 20 text

影響範囲はざっくりと「サービス全体」 コンテンツモデルリニューアル

Slide 21

Slide 21 text

様々な部分に影響がある可能性あり ● 回遊 ● 広告 ● レコメンド ● etc、etc… コンテンツモデルリニューアル

Slide 22

Slide 22 text

どうしたものか…🤔

Slide 23

Slide 23 text

チャレンジ ● 固有名でコードベースを検索 ● entityに着目して絞り込み ● 関数の依存関係に着目して絞り込み

Slide 24

Slide 24 text

チャレンジ ● 固有名でコードベースを検索 ● entityに着目して絞り込み ● 関数の依存関係に着目して絞り込み

Slide 25

Slide 25 text

● サービス特有の用語を使いGitHubでorg内検索 ● 引っかかったrepoを影響範囲とみなす 固有名でコードベースを検索 対象repoをざっくりと絞り込み

Slide 26

Slide 26 text

チャレンジ ● 固有名でコードベースを検索 ● entityに着目して絞り込み ● 関数の依存関係に着目して絞り込み

Slide 27

Slide 27 text

前提: DDDライクなレイヤードアーキテクチャ handler usecase infra entity

Slide 28

Slide 28 text

前提: DDDライクなレイヤードアーキテクチャ handler usecase infra entity entityにドメインに関する知識を持つ

Slide 29

Slide 29 text

前提: DDDライクなレイヤードアーキテクチャ handler usecase infra entity entityの参照に着目すればビジネスロジック部分にたどり着ける!

Slide 30

Slide 30 text

entityに着目して絞り込み IDEなどでentityの参照元を一覧化 handler usecase infra entity

Slide 31

Slide 31 text

人力で絞り込むには量が多すぎる… コードベースの規模によっては かなりの時間がかかってしまう 課題 handler usecase infra entity … … …

Slide 32

Slide 32 text

どうしたものか…🤔

Slide 33

Slide 33 text

Call Graphを用いた 影響調査

Slide 34

Slide 34 text

● 固有名でコードベースを検索 ● entityに着目して絞り込み ● 関数の依存関係に着目して絞り込み チャレンジ

Slide 35

Slide 35 text

● 関数同士の呼び出し関係を表現した有向グラフ CallGraphとは main() b() c() a()

Slide 36

Slide 36 text

Call Graphの作成 handler usecase infra entity

Slide 37

Slide 37 text

グラフの探索 handler usecase infra entity

Slide 38

Slide 38 text

GoにおけるCall Graph https://pkg.go.dev/golang.org/x/tools/go/callgraph ● 複数のアルゴリズムを選択できる ○ cha ○ vta ○ rta ○ static ● 型の関係性などに着目して近似的に関係性を類推する https://golang.org/x/tools/go/pointer ● SSAをベースにしたポインタ解析でもCall Graphを作成可能 ● ポインタに着目して関係性を類推する

Slide 39

Slide 39 text

手順 ● Call Graphの作成 ● グラフ探索

Slide 40

Slide 40 text

go-callviz 推しポイント ● vtaを除く先程の形式全 てに対応! ● グラフの可視化可能 ● グラフ分析に特化した 形式でグラフを作成! ○ dot形式 ○ 他の分析ツールに読み込ま せる事ができる! https://github.com/ondrajz/go-callvis

Slide 41

Slide 41 text

go-callviz https://github.com/ondrajz/go-callvis 利用時の工夫 ● ポインタ解析を用いた Call Graphを採用 ● 画像生成に時間がかかる ので 該当部分をコメントアウ ト

Slide 42

Slide 42 text

Call Graphの例

Slide 43

Slide 43 text

グラフ探索 ● グラフ理論研究などで使われる pythonのライブラリ ● dot形式をサポート [1] Aric A. Hagberg, Daniel A. Schult and Pieter J. Swart, “Exploring network structure, dynamics, and function using NetworkX”, in Proceedings of the 7th Python in Science Conference (SciPy2008), Gäel Varoquaux, Travis Vaught, and Jarrod Millman (Eds), (Pasadena, CA USA), pp. 11–15, Aug 2008 github: https://github.com/networkx/networ, 論文: [1]

Slide 44

Slide 44 text

全体の流れ main() b() c() a() GET /hoges POST /hoge Get /fugafuga … Get /piyo

Slide 45

Slide 45 text

さらなる改善ポイント entityの参照一覧取得を自動化 ● 現状はIDEを使って手動でリストを作成 ● 何らかの方法でここも自動化したい ● LSPの「参照元へのジャンプ」のロジックを元に実現できるかも?

Slide 46

Slide 46 text

まとめ ● データのマイグレーションは様々な理由で発生する ● 影響調査では「調査範囲を絞り込む」ことが難しい ● Call Graphを使って影響範囲の絞り込みを効率化