← AIバイブコーディングTips 一覧へ Architecture / ZOZO TECH BLOGより

人間とAIを、同じスキーマで縛る

アーキテクチャのルールをドキュメントに書いても、AIは過去の望ましくない実装パターンを律儀に再現してくる。ZOZOTOWNのiOSチームが選んだのは「努力目標」をやめ、コンポーネントの型・依存・命名・禁止パターンをスキーマとして定義し、そこからコードを自動生成する設計だった。

この記事で手に入るもの

「ドキュメントのルールが守られない」問題をスキーマ化してコード生成に組み込むという解決策と、レビューの焦点を"書き方"から"プロダクト品質"へ移す設計思想を、個人開発でどう小さく再現するかまで。

01 — 何が課題だったか

「努力目標」のドキュメントは、AIには効かない

ZOZOTOWNのiOSアプリ開発チームが直面していたのは、アーキテクチャのルールを文章で書いても守られないという壁だった(ZOZO TECH BLOG)。ViewModelやRepositoryの責務分割、命名規則、依存の向き——これらをドキュメントに丁寧に書いても、実装のばらつきは消えない。

そこにAIコーディングが加わると、この問題はさらに悪化する。AIは学習・参照したコードベースの中に残っている過去の望ましくない実装パターンまで、律儀に再現してしまうからだ。人間なら「ここは古いやり方だから今は使わない」と文脈で判断できるところを、AIは指示されない限り区別しない。ドキュメントという「努力目標」は、人間に対してすら弱いのに、AIに対してはほぼ無力に近い。


02 — どう仕組み化したか

ルールを「文章」から「スキーマ」に変える

解決の軸は一つ。「守ってほしいルール」を人間が読む説明文ではなく、機械的に検証・生成できる構造として定義し直すことだ。

01

2枚の基幹ドキュメントに分ける

architecture-guidelines.mdが「何が正しい構造か」——ViewModelやRepositoryなど各コンポーネントの型・依存・命名・禁止パターンをスキーマとして定義する。もう一枚のarchitecture-templates.mdは「そのスキーマからどうSwiftコードを導くか」という生成ルールを持つ。ルールの定義と、ルールからコードへの変換を、はっきり別レイヤーに分けている。

02

仕様からYAML、YAMLからコードへ

運用は2段のコマンドで回る。/architectureコマンドが、Confluenceの仕様書やFigmaのデザインからYAML形式の画面設計(APIエンドポイント・ユーザーアクション・データモデルなど)を自動生成する。次に/codegenコマンドが、そのYAMLからView・ViewModel・Repository・モック・テスト雛形までのSwiftコード一式を導出する。

03

型システムと同じ発想をアーキテクチャに広げる

Swiftの型システムがコンパイル時に不正な状態を弾くのと同じ発想を、アーキテクチャのレイヤーにまで広げている——という言語化がこの記事の核心だ。文章のルールは読み飛ばせても、生成パイプラインを経由したコードは、最初からそのスキーマの形でしか出てこない。

ここが核心。ルールを守らせるのではなく、ルールから外れたコードがそもそも生成されない構造にした。人間へのお願いから、AIも人間も逃れられない仕組みへの転換。


03 — 得られた効果

レビューの焦点が「書き方」から「中身」に移った

効果として挙げられているのは「AIの書くコードがレビューを通る水準になった」という変化だ。命名・配置・レイヤー構成がプロジェクト標準に自動的に揃うため、AIコードにありがちなハルシネーション的な構造の逸脱が消えたという。

この設計が興味深いのは、副次効果としてレビュー文化そのものが変わった点にある。命名や配置、責務分割といった「コード品質」はスキーマが自動的に揃えるので、レビュアーはUX・エッジケース・ビジネスゴールとの整合性という「プロダクトとしての品質」に時間を使えるようになった。以前このブログで扱ったAIの「できました」を信じない検品文化の話と同じく、検品の対象を人間が判断すべき部分に絞り込む発想が根っこにある。


04 — 個人開発に持ち帰る

ドキュメントを書く前に、スキーマ化できないか考える

ZOZOTOWN規模のパイプラインをそのまま真似る必要はない。効いている考え方だけを抜き出すなら、次の3点になる。

ルールを文章で書く前に、構造で表現できないか考える「〜という命名にする」より、YAMLやJSON Schema、型定義として書けないかを先に検討する。
「定義」と「生成」をレイヤーで分ける何が正しいかを決めるファイルと、そこからコードを導くルールを一枚に混ぜない。分けておくと、生成ロジック側だけを後から差し替えられる。
レビューの対象を絞るスキーマで担保できる部分(命名・配置・型)はレビューで再確認しない。人間が見るべきはUXやビジネスゴールとの整合性だけ、と最初から線を引く。

本記事執筆時点のZOZO側の報告も、モデルの使い分けで費用を下げる話と同じく「劇的な数字」より「仕組みの設計思想」に価値がある内容だった。個人開発でCLAUDE.mdやrulesファイルを育てているなら、まず一つのコンポーネント種別(フォーム・API呼び出し・モデル定義など)だけをスキーマ化してみる、というのが最初の一歩になる。