ソフトウェアアーキテクチャ図の描き方(2022)
(terrastruct.com)- 優れたアーキテクチャ図は、装飾よりも適切な抽象化レベル、最新性、曖昧さの排除によって、アイデアの伝達とコラボレーションを長く維持できるようにする
- つながっている要素を近くに置く近傍距離の最小化が基本であり、図が大きくなるほど、消して描き直す反復が必要になる
- 対称性は見た目の良い印象を作るだけでなく、入力と出力を別々の側に配置するような形で意味の伝達も強化する
- 図形の中央揃えを保つと、複雑な概念もそれほど複雑に見えず、新しい要素を追加するときにも全体の配置が崩れにくい
- ラベル付きのコンテナグループは、AWS と Azure のような環境の区分、ReaderWriter の実装のような抽象化、Cores のような関連オブジェクトのまとまりを一目で示す
長く残る図の条件
- 優れた図は会議が終わった後も消されず、その後の議論や質問の基準点として使われ続けることができる
- 長く使われる図には、いくつかの共通条件がある
- 要素が適切な抽象化レベルにあること
- 最新の状態を保っていること
- 曖昧さがないこと
- 同じエンティティと関係でも複数の描き方があるが、ある配置はプロジェクト期間中のコラボレーションを助け、別の配置は会議が終わると消えてしまう
- ここでいう美しさは、影や角丸のような装飾ではなく、考えを効果的に伝える機能的な美しさである
読みやすい配置を作る原則
-
近傍距離の最小化
- 互いにつながっているノードは近くに描くのが基本である
- 小さな図では簡単だが、図が大きくなり新しい接続が追加されるほど、この性質は崩れやすい
- コードでエッジケースを見つけたら関連部分を直し、文書で抜けている項目を見つけたら文章を修正するように、文書用の図も必要なら消して描き直すべきである
- 面接の場では描き直すコストが負担になり得るが、複数人や複数チームが使う文書であれば、反復的な修正がより良い図につながる
-
対称性を見つける
- 対称性は図の美的な印象に大きく寄与し、人間の脳は顔のような視覚的な対称性を好む傾向がある
- すべてのノードが隣接ノードにできるだけ近くても、対称性が不足していると少し歪んだ図のように見えることがある
- あるノードの近傍距離が少し伸びたとしても、対称性を合わせたバージョンのほうが見やすい場合がある
- 入力を一方に、出力をもう一方に置く方法は、対称性とともに図の意味も強化する
-
中央揃え
- 整列は図をすっきり見せる大きな要素である
- すっきりした図は概念をより明確にし、乱雑な図は概念をより複雑に見せる
- 最初から空のキャンバスに図形をランダムに置くと、その後の配置もランダムになりやすい
- 整列は2つ以上の図形の間でのみ意味を持つため、新しい要素を追加するたびに整列を保てば、図は自然にすっきりしていく
- 対称性から整列が生まれる場合は多いが、必ずしもそうとは限らない
-
コンテナグループを使う
- ラベル付きの複数の領域に図を分けると、見る人が構造をより理解しやすくなる
- コンテナは図に次の情報を加えられる
- 「これらのサービスは AWS にあり、これらのサービスは Azure にある」のように文脈を追加する
- 「これらはすべて ReaderWriter の実装である」のように抽象化を示す
- core 1、2、3、4 を「Cores」コンテナにまとめるように、関連オブジェクトをグループ化する
次回に続く項目
- Part 2 では次のテーマが続く
- エッジ経路の描画
- ラベルのサイズと位置
- 色
- アイコン
1件のコメント
Hacker Newsのコメント
D2で図を作るのをよく使っている。mermaid.jsに似ているが、書式設定のオプションが多く、個人的には構文もより良いと思う
関連して短い記事も書いた: https://victorbjorklund.com/build-diagrams-as-code-with-d2-d...
見栄えの悪いソフトウェア図が見ていて楽しくないのは分かるが、装飾するのは折れ線グラフに曲線を入れるようなものだ。視覚的には良く見えても、伝えたいデータの邪魔になる
最初の例
x -> yをSVGにレンダリングしてからSVGだけをブラウザで開き、出力の向きを変える方法をドキュメント全体で探したが見つからなかったドキュメントの説明と実際の結果が違っていたので使うのをやめた。
"d2lang connection left to right"で検索して https://d2lang.com/tour/layouts/ にたどり着いたが、概要ドキュメントからはリンクされていないようなので、反映すると訪問者の役に立つと思うフローチャートに限れば、これまで使ったテキストベースの図作成ツールの中で最も簡単で速い部類だと思う
システムが変わり始めると、きれいな図は維持するのが非常に難しい。すでに複雑な図の真ん中に新しいボックスを追加することを考えると、すべてを再整列するのに1時間かかることもある
2020年代の開発者の時間は、図をコードとして管理することに使ったほうがいい可能性が高い: https://www.ilograph.com/blog/posts/its-time-to-drop-drag-an...
でも実際には冗談ではない気がする
さらに悪かったのは、新しいボックスを追加すると通常すべての矢印を再整列しなければならなかった点だ。その結果、図は継続的に最新の状態を保てなかった
シーケンス図ではplantMLを使ったときのほうが良かった。作業自体がより簡単で、インタプリタの出力も通常は手動介入なしで十分使えた
見栄えの悪いUIと似ている。見栄えが悪くても、使っている人たちはすでに慣れている。「整理」した瞬間に彼らのメンタルモデルを壊し、学び直させることになる
ときには考えを整理するために、20分後に捨てるスケッチをするだけのこともある
しかしオンボーディングや、他チームにシステムを説明するための参考資料なら、より理解しやすいものを作るのに費やした1時間は十分に報われる
こういうものを描くときはyEdを使っている。ボックスと矢印をめちゃくちゃにしても、メニューから数回クリックすれば自動で整えてくれる
ただし妥協は必要だ。ボックス内のボックスは、いつも良い結果になるとは限らない。それでもはるかに速くドキュメント化でき、何度かやってみると何がうまくいき何がうまくいかないかの感覚がつかめるので、自分には良い折衷案だ
関係をTGFとして抽出して取り込み、階層型レイアウトを適用すればいい
from, to, relation形式で十分だこれには電気回路図、回路ダイアグラム、その他の工学図面との強い類似性がある。唯一の「正しい」方法はない
コードと同じように、良い抽象化と表現方法を選ぶ能力が、理解可能なアイデアと後悔するような混乱を分ける。美しさや美学の問題ではなく、設計に能動的な思考と努力を必要とするツールだ
無限ズームアニメーションのように、図の中へ簡単にズームインしていけるツールがあるといい
まもなく https://VisualFlows.io v1.0 をリリース予定
親会社の SaaS のアニメーション付き「アーキテクチャ」マップを数分で作れた: https://app.visualsitemaps.com/user_flows/share/e64da8ed-2ef...
主な機能は Smart Sections、Smart Edges、Smart Node Deletion、ダーク/ライトモード、埋め込み、画像/SVG/GIF のドラッグ&ドロップ、AWS/Windows/Google アイコン、来週予定の Markdown など
Smart Sections について: https://support.visualsitemaps.com/en/articles/6477269-how-t...
この記事は本当に良かった。アーキテクチャ図を描くときでも、ドキュメントやコードを書くときでも、仕事で何かをするときには少し時間を取って「見栄えよく」しようとしている
なぜそうするのか説明するのは難しいが、見た後のほうが気に入ることは分かっている
それが時間の最も有効な使い方ではないのではと少し心配していたが、やめろと言われたことはない
この記事が良いのは、勘でやっていたことを、何かをより美しくするための実践的な方法として説明してくれるところにある
コードの視覚的な感覚がないように見えるチームメンバーを見ると困惑する。関数の終わりと次の関数宣言の間に空行を入れなかったり、関数シグネチャで引数を1行に1つずつ書いたかと思えば複数個ずつ書いたりと一貫しない。自分の目には非常に目立つのだが、彼らは気にしていないようだ
時間がかかることもあるが、何かが満たされる感じがある。自分に技術的なアートの才能がある程度あることは分かっていて、高校のころは製図工になりたかった
まさに可視化の目的そのものだ
こういう用途には D2 が良い。以前の役割で、すべての
serverless.ymlファイルをパースして巨大な D2 図を自動生成するプログラムを書いたAWS でマイクロサービスをやっていて、システムが大きくなるにつれて自動更新されるのが良かった。SNS topic を基準に分けるなど、各サブシステムごとの小さな図に分割できるようにした
最初の例が理解できない。筆者は計画外のノードについて話しながら、実際には「I was unplanned」と名付けておいて、「事前に計画していたなら」と言っている
図の文脈で計画外のものをどうやって事前に計画できるのか分からない。すべてのノードの周囲に十分な余白を残すべきという意味なのだろうか
また、提案された改善案は「something」と「I was unplanned」が「engine」と相互作用するとき、同じチャネルやメカニズムを使っているように見せている
Miro を使っているが、高レベルの内容やアイデア出しには付箋ツールとしてかなり良い。ただし中レベルを超えるものではない
コンポーネントやシステムが固まった後には、その作業にもっと適したツールがある
プロジェクトのドキュメントが Markdown なら、別のバイナリではなく ```plantuml ブロックを入れて図を埋め込めばよい
GitLab ではブラウザで
.mdファイルを見るときにきれいにレンダリングされる。GitHub にはまだその機能がないhttps://docs.github.com/en/get-started/writing-on-github/wor...
https://pikchr.org/home/doc/trunk/doc/usepikchr.md