flowchart LR
    subgraph Input["💭 曖昧な設計"]
        D[設計説明]
    end

    AI[🤖 AI]

    subgraph Output["🔍 可視化された問題"]
        F1[矢印多すぎ]
        F2[責務重複]
        F3[循環依存]
    end

    D --> AI
    AI --> F1
    AI --> F2
    AI --> F3

    style Input fill:#fff3e0
    style Output fill:#ffebee
  

コードは書けるのに、説明できない

「ここの処理、図にしてもらえますか?」

設計レビューでこう頼むと、意外と固まる人が多い。

コードは書ける。動いている。テストも通っている。でも「図にして」と言われると、急に手が止まる。

ホワイトボードの前で、マーカーを持ったまま「えーと、まずここからリクエストが来て…いや、その前にこっちの処理があって…」と迷走が始まる。

私は長年、業務システムの設計レビューをやってきた。そして気づいたことがある。

図を書けない設計は、だいたいその人自身も理解していない。

コードは書ける。動く。でも「なぜそう書いたのか」「何がどこに依存しているのか」が頭の中で整理されていない。だから図にできない。

最近、私はAIに図を書かせるようになった。ClaudeやChatGPTに「この設計を図にして」と頼む。Mermaid記法で出力させて、プレビューする。

そうしたら、面白いことが起きた。

設計の粗が、残酷なほど可視化されるのだ。


なぜ「図」にすると粗が見えるのか

言葉で説明するときと、図にするときでは、要求される「理解の精度」が違う。

言葉は曖昧さを許容する。

「このサービスがデータを処理して、結果を返します」

これで説明が通ってしまうことがある。聞き手も「なんとなく分かった」気になる。

でも図にしようとすると、曖昧さが許されない。

  • 「このサービス」とは何か? 四角を1つ書くのか、3つ書くのか?
  • 「データを処理して」の「データ」はどこから来るのか? 矢印をどこから引くのか?
  • 「結果を返す」のは誰に? 矢印の先は?

図は、構造を強制的に明示させる。曖昧なままでは、四角も矢印も書けない。

言葉と構造のズレ

よくあるのが、「言葉では1つに見えるものが、実際は3つだった」パターンだ。

「注文サービスがあって…」

図にしようとすると、

  • 注文を受け付けるAPI
  • 注文データを保存するロジック
  • 注文完了を通知する処理

これ、全部「注文サービス」の中に入っているのか? それとも別々のコンポーネントなのか?

言葉だと1つに聞こえていたものが、図にすると「これ、分けるべきでは?」という疑問が湧いてくる。

境界が曖昧な責務

もう1つよくあるのが、「責務の境界が図にすると重なる」問題だ。

「認証サービスと、ユーザーサービスがあって…」

図にしようとする。

  • 認証サービスはログイン処理を担当
  • ユーザーサービスはユーザー情報を管理

でも、「ユーザーのパスワード」はどっちが持つ? 「ログイン履歴」は? 「セッション管理」は?

図を書こうとすると、2つの四角の間に置くべきか、どちらかに入れるべきか、判断を迫られる。そして、その判断ができないということは、設計段階で責務の境界が曖昧だったということだ。


AIに図を書かせると、何が起きるか

ここでAIの出番だ。

私は最近、設計を説明するときに「まずAIに図を書かせる」というプロセスを入れている。自分の設計をAIに説明し、「これを図にして」と頼む。

AIは素直だ。人間のように「なんとなく察する」ことをしない。

AIは「理解したふり」をしない。

だから、設計の穴がそのまま図に出る。

違和感1:矢印が多すぎる

AIが出力した図を見て、最初に感じることが多いのがこれだ。

「矢印、多くない?」

自分では「シンプルな設計」だと思っていたのに、図にすると矢印が縦横無尽に走っている。AがBを呼び、BがCを呼び、CがまたAを呼んでいる。

これは「依存関係が複雑になりすぎている」というサインだ。

矢印の数は、コンポーネント間の結合度を可視化する。矢印が多いということは、1つを変更したときの影響範囲が広いということ。

自分で図を書くと、無意識に矢印を省略してしまうことがある。AIは省略しない。だから現実が見える。

違和感2:責任範囲が重なっている

AIは、説明された通りに四角を描く。

「注文サービスが在庫を確認して…」と言えば、注文サービスから在庫への矢印を引く。 「在庫サービスも注文データを参照して…」と言えば、在庫サービスから注文への矢印を引く。

結果、双方向の矢印が発生する。

これを見て「あれ、これって責務が重なってないか?」と気づく。

どちらが「データの所有者」なのか。どちらが「問い合わせる側」で、どちらが「答える側」なのか。

双方向矢印は、設計の責務境界が曖昧なサインだ。

違和感3:登場人物が多すぎる

AIに図を書かせると、自分が説明の中で言及したコンポーネントが全部出てくる。

「APIゲートウェイがあって、認証サービスがあって、注文サービスがあって、在庫サービスがあって、通知サービスがあって、ログ収集があって、監視があって…」

図にすると、四角が10個並ぶ。

「これ、1つの画面に収まらないな」と思った時点で、設計が複雑すぎる可能性がある。

もちろん、大規模システムなら登場人物が多いのは当然だ。でも「この機能を説明するのに10個のコンポーネントが必要」なら、それは抽象化のレベルを間違えているかもしれない。


実際に気づける設計の問題

AIに図を書かせて気づいた、具体的な設計問題をいくつか紹介する。

問題1:Producer / Consumer の責務混在

あるバッチ処理の設計をAIに図にしてもらった。

出てきた図を見ると、1つのコンポーネントから矢印が5本出ていた。データを取得し、加工し、キューに入れ、結果を保存し、通知を送る。全部1つの箱の中でやっていた。

「これ、Producerの責任範囲を超えてないか?」

Producerは「キューにメッセージを入れる」までが責任のはずだ。その後の処理はConsumerの仕事だ。

図を見て初めて、「この設計、責務が混在している」と気づいた。言葉で説明しているときは、流れを追うのに必死で、責務の境界を見失っていた。

問題2:同期・非同期の境界が不明

別の設計をAIに図にしてもらったときのこと。

出てきた図は、全部の矢印が同じスタイルだった。でも実際には、ある部分は同期呼び出し、ある部分はキュー経由の非同期処理だった。

「この図、同期と非同期の区別がつかないな」

AIに「同期呼び出しと非同期呼び出しを区別して」と頼んだ。すると、図の中に2種類の矢印が現れた。

そこで気づいた。同期と非同期が混在しすぎている。

ユーザーのリクエストを受けて、一部は同期で処理し、一部は非同期でキューに流す。でもその境界が明確じゃない。どこまでが「ユーザーを待たせる処理」で、どこからが「バックグラウンドに回していい処理」なのか。

図にしたことで、この境界を意識的に設計し直す必要があると分かった。

問題3:循環依存

これは図にしないと絶対に気づかなかった問題だ。

サービスA → サービスB → サービスC → サービスA

矢印が一周して戻ってきている。

言葉で説明しているときは気づかなかった。「AがBを呼んで」「BがCを呼んで」「Cは結果を返すためにAの情報を参照して」——それぞれは自然に聞こえる。

でも図にすると、明らかに循環している。

循環依存は、デプロイの順序問題、テストの困難さ、変更影響の予測困難など、あらゆるトラブルの温床になる。図にしていなければ、本番で障害が起きるまで気づかなかったかもしれない。


人間がやること、AIに任せること

AIに図を書かせることの価値が分かったところで、役割分担を整理しておこう。

AIに任せること:可視化

AIは「説明を図に変換する」作業が得意だ。

  • 言葉で説明した設計をMermaid記法に変換する
  • 複数の説明から一貫した図を作る
  • 「もっと詳細に」「もっと抽象的に」とレベルを変えた図を作る

これらは人間がやると時間がかかる。AIなら数秒だ。

私は最近、設計ドキュメントを書くときに「まずAIに図を3パターン出させる」ことをやっている。概要レベル、詳細レベル、データフローレベル。そこから良いところを組み合わせて、最終的な図を作る。

人間がやること:判断

AIが出した図を見て「これはおかしい」と判断するのは人間の仕事だ。

  • 「矢印が多すぎる」→ 設計を見直すべきか判断する
  • 「責務が重なっている」→ どう分割するか決める
  • 「循環している」→ どこを切るか選択する

AIは問題を可視化してくれる。でも「それが本当に問題なのか」「どう解決すべきか」は人間が決める。

これは設計レビューの本質と同じだ。レビューアは問題を指摘する。でも最終的にどうするかは、設計者が判断する。

AIは「疲れないレビューア」として使える。何度でも図を書き直してくれる。何度でも指摘してくれる。遠慮もしない。


私の使い方

具体的に、私がどうAIを使っているか紹介する。

ステップ1:雑に説明する

まず、設計を口頭で説明するように、雑にテキストで書く。

    注文が入ったら、在庫を確認して、OKなら決済して、
完了したらメール送って、分析用のログも残したい
  

これをAIに投げて「図にして」と頼む。

ステップ2:出てきた図を見て違和感を探す

AIが出した図を眺める。

「あれ、全部同期処理になってる」 「メール送信が注文APIの中に入ってる」 「分析ログへの矢印、ここから出るの変じゃない?」

違和感を言語化する。

ステップ3:設計を修正して、もう一度図にする

違和感をもとに設計を見直す。

「メール送信は非同期にしよう。キューを挟む」 「分析ログは別のConsumerにしよう」

修正した設計を再度AIに説明し、図を出させる。

ステップ4:図がすっきりするまで繰り返す

図を見て、まだ違和感があれば繰り返す。

最終的に「この図なら、人に説明できる」と思えたらOK。

このプロセス自体が、設計のブラッシュアップになっている。AIと対話しながら、自分の理解を深めている。


まとめ:図を書かせる=設計をテストすること

AIに図を書かせることは、設計のテストだ。

コードを書いたらテストを走らせる。設計を考えたらAIに図を書かせる。

テストが失敗したら、コードに問題がある。図が変になったら、設計に問題がある。

AIは正直だ。「なんとなく良さそう」で誤魔化してくれない。説明が曖昧なら、曖昧な図が出てくる。責務が混在していれば、矢印がぐちゃぐちゃになる。

図を書けない設計は、たぶん動かない。動いても、保守できない。

だから私は、設計を考えたら必ずAIに図を書かせる。それが、一番手軽で、一番正直な設計レビューだから。


やってみよう

今日からできることを1つ提案する。

今作っている機能の設計を、AIに図にしてもらおう。

やり方は簡単だ。

  1. AIに「以下の設計を図にして」と頼む
  2. 自分の設計を、説明するように書く
  3. 出てきた図を眺める

違和感があったら、それが設計の粗だ。

違和感がなければ、その設計は少なくとも「図にできる程度には整理されている」ということ。

5分でできる。でも、その5分で「本番障害の芽」を1つ潰せるかもしれない。

試してみてほしい。


設計判断の背景

手書きや専用ツールではなく「AIに図を書かせる」という方法を選んだのには理由がある。手書きは早いが、無意識に都合の悪い部分を省略してしまう。専用ツールは綺麗だが、図を整えることに時間を使いすぎて本来の目的を見失いやすい。AIに任せると「説明した通りにしか書かない」ので、自分の理解度がそのまま図に出る。設計のセルフチェックとしては、この「容赦のなさ」が一番役に立つ。

現場での判断基準

設計レビューでは「図を書いてもらえますか」を最初の質問にしている。これは意地悪ではなく、お互いの時間を節約するためだ。図にできない設計は、言葉で説明してもらっても結局どこかで齟齬が生じる。逆に、図がすっきり書ける設計は、実装時のトラブルも少ない傾向がある。経験上、図にするのに10分以上かかる設計は、実装にも想定外の時間がかかることが多かった。

見るべきポイント

図を見るときは、まず「矢印の方向」と「矢印の数」を確認する。双方向の矢印は責務境界の曖昧さ、1つのボックスから出る矢印が3本以上なら責務の集中を疑う。次に「図に出てこなかったもの」を考える。エラー処理、リトライ、タイムアウトなど、正常系だけで図を書いていないか。これらが図に含まれていない設計は、異常系で破綻することが多い。