Предыстория. Мы обрабатываем финансовые транзакции. Возникла задача профилирования. Решили записать путь прохода транзакции по системе и построить граф связей между модулями - кто кого вызывает. Два способа построения: на основе статического анализа исходников и через трассировку реальных вызовов во время выполнения.
Итак, связи зафиксированы. Теперь их надо их как-то представить и построить граф, визуально.
Вроде не самая тривиальная задача, но оказывается, решается весьма просто.
Есть такой язык представления графов, называется DOT. Прелесть его в предельной простоте. Например, простейший граф:
graph name {
a -- b
b -- c
b -- d
}
Натравливаешь на это дело специальную программу и получаешь:
Все! Картинка на выходе в SVG. Можно хоть на стену вешать.
К сожалению, лучший софт, что я нашел для визуализации DOT - это Graphviz. Вроде и работает неплохо, строя весьма большие графы, и есть на всех платформах, благодаря Java, но по интерфейсу - это запредельный и неописуемый кусок говна. Увы.
Если кому интересно, я выложил пример реальной трассировки (по понятным причинам, имена изменены). В целом дает представление о простоте исходника и о возможностях визуализации - PNG и SVG.
Повторюсь - процесс формализации графа крайне прост - нужно только задать пары связанных вершин. Можно делать направленные графы, можно задавать вершинам и дугам разные атрибуты.
В целом, отличная технология.