Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

2023/12/01
Go Conference mini 2023 Winter IN KYOTO

Yoshiki Fujikane

December 01, 2023
Tweet

More Decks by Yoshiki Fujikane

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  10. マイグレーションのプロセス
    影響調査
    ✅ ✅

    データモデルの設計 マイグレーション実行

    View full-size slide

  11. ʕ◔ϖ◔ʔ> Let’s≡Go

    View full-size slide

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

    View full-size slide

  13. 影響調査と難しさ

    View full-size slide

  14. 影響調査と難しさ

    View full-size slide

  15. 難しさ = 調査範囲を絞る

    View full-size slide

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

    View full-size slide

  17. ケーススタディ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  22. どうしたものか…🤔

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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



    View full-size slide

  32. どうしたものか…🤔

    View full-size slide

  33. Call Graphを用いた
    影響調査

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  36. Call Graphの作成
    handler
    usecase
    infra
    entity

    View full-size slide

  37. グラフの探索
    handler
    usecase
    infra
    entity

    View full-size slide

  38. 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を作成可能
    ● ポインタに着目して関係性を類推する

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  42. Call Graphの例

    View full-size slide

  43. グラフ探索
    ● グラフ理論研究などで使われる
    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]

    View full-size slide

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

    Get /piyo

    View full-size slide

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

    View full-size slide

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

    View full-size slide