Graphvizで依存関係
初めに
お久しぶりです。砂子です。もう年末ですね。前回はFF7のメモリ解析でしたか。光陰矢の如しとは言いますが、本当に時間がたつのが早く感じる今日この頃です。
弊社では機械学習やDeepLearning、FPGA、CUDAなどに関連した業務も増えてきましたが、わたくしは栃木でWEBのフロントエンド開発などをしております。Web開発は初ということもあり、HTML、CSSなど勉強することも多い毎日です。
業務で遭遇する依存関係
さて、業務を遂行していると時節依存関係に出くわすことがあります。
- 関数の呼び出しを説明する
- 要求仕様で記述されている機能群の関係を把握したい
- etc
大半の方が業務で使用できるツールといえばMicrosoftのOfficeシリーズになりますが、それを使って依存関係を記述、描画するにはかなり骨がおれます。非常に単純なものであればExcelやPowerPointなどを使用すればよいのですが、ドキュメントの中に所々ある依存関係の記述を拾い集めて管理するのは大変な作業となります。
今回業務で遭遇したのが、200ページ位のPowerPointドキュメントに記述された要求仕様でした。機能ごとに整理されており、各機能が依存する機能はわかるのですが俯瞰して依存関係が記述されていません。それほど依存関係が複雑というわけではないはずが、いくつかの箇所に”機能Aは機能Bを呼び出す”などと記述されている状態です。
プログラミングの依存関係の例
プログラマーであれば依存関係ということばより、Makeやコールグラフが思い浮かべるかもしれません。
makeは有名なUnixツールで複数のソースコードを成果物にまとめ上げるためのツールです。makeを詳しく知らなくともUnixライクなシステム(Linux, cygwinなど)で下記のようなコマンドを実行したかたもいるかもしれません。
./configure
make
make install
コールグラフはIDEやドキュメント自動生成などでみることがある関数の呼び出し関係を記述したグラフです。私はDoxygenを利用してソースコードからドキュメントを作ったとこがありますが、その時関数の関係が描画されていました。
Graphvizについて
Graphvizは上記のDoxygenがコールグラフを生成する際に使用するツールです。これはdot言語で記述されたグラフ構造を描画するツールになります。 ここでグラフ構造とはノード(節点)とエッジ(辺)を構成要素とし、ノードとエッジの関係を記述した構造です。ノードn1とn2があり、エッジとしてn1とn2を結ぶe1があるとすると下図のようになります。
graph G {
n1 -- n2;
}
エッジにn1からn2への方向を持たせると下図になります。
digraph G {
n1 -> n2;
}
依存関係描画
さて、依存関係は”機能Aが機能Bに依存している”というように記述されます。これを下記のように描画します。
digraph G {
FuncA -> FuncB;
}
ドキュメントに出てくるページをコメントで書いて、次のように書けば依存関係のグラフ構造が描画できます。
digraph G {
// P.10
FuncA -> FuncB
// P.13
FuncA -> FuncC
// P.20
FuncB -> FuncC
// P.50
FuncD -> FuncC
// ... until P.200
}
ドキュメントの各ページで記述されている依存関係を描画できました。納品や客先での説明資料としては物足りないかもしれませんが、見積もりの資料としてはある程度の意味をもつと思います。
終わりに
実際の業務では専門領域以外の複雑性に直面することが多々あります。マッチングするツール等があればよいですが、高級であったりライセンスの関係で利用できないこともしばしばです。また、個人的に業務の複雑性をその都度解消できてもチーム内で共有できなくてはせっかくの効率化も失われてしまいます。Officeなどの汎用的なツールで完結できればそれが一番なのですがね。 もっと大枠で業務の改善などを提案、定着できるように配慮して開発を進める必要を感じます。 では次回の記事で。次は英語で書いてみようかな。