2026-01-19

spec駆動開発の流れ、自分はだいたいこんな感じでやってるんだけど、これであってるのかなぁ?

CLAUDE.md や rules / skills みたいな形で、重要コーディングルールはあらかじめかなり固めておく。

たとえば repository 層や Entity 層は具体的にどう書くのか、テストケースはどういう書き方をして、どういう観点で項目を洗い出すのか、みたいな AI への指示は最初から用意しておく。

あと、linter や ArchUnit、dependency-cruiser みたいなアーキテクチャ制約も、自分なりの定石を持っておく。

割と過剰なレベルガチガチに固める感じで、アーキテクチャルールも「◯◯は XXX に依存できない」みたいなブラックリスト式じゃなくて、「◯◯は XXX だけに依存できる」みたいなホワイトリスト式の方が良いと思っている。

ts 前提だと eslint や tsconfig は一番厳しい水準に設定する、流石にきつい部分でてきたらそこだけ緩める、という運用

おすすめなのは、何かしらの小規模案件個人開発アプリを1つオーバーエンジニアリング上等でガチガチ構成で作っておく。

そこで出てきた linter 設定やプロンプト設定を、別案件に横展開する感じ。

正直、ガチガチすぎると MVP とかレベルだとコード量は増えるけど、メンテする前提の案件ならバイコーディング時代だと普通にペイすると感じている。

まずは仕様書作りから入る。

アイディアを思いついたら、AI と壁打ちしながら仕様を洗い出していく。

手書きドメイン図を書いて、それを写メ撮って画像認識仕様整理、みたいなのも割とアリだと思っている。

どういう画面があって、どういう入力項目や表示項目が存在するか、バックエンドはどういうエンドポイント必要か、この辺りは最初に一通り洗い出しておく。

それに加えて、ユーザーが初めてトップページを開いてから登録ログインして実際にサービスを一通り使うまで、みたいな流れをそのまま Playwright のシナリオテストに落とせそうな形で何パターン仕様書にしておく。

全体の仕様書としては、あまり細部まで踏み込まない。

大枠が共有できていれば OK というスタンス

開発に入ったら、最優先はドメインオブジェクト作成

ここは最重要だと思っているので、あまり作業を並列化しない。

フロントエンドで、DDD における集約みたいな概念がそのまま当てはまらない領域についても、設計時点で洗い出せているなら Entity 的なものドメインサービス的なロジック用のレイヤを作って、ドメインオブジェクトとして実装していく。

最初に作った基本設計ベースに、◯◯Entity、XXEntity、△△Entity……を作るためのプランチェックリスト形式TODO を 1つの md ファイルに吐き出してもらう。

フェーズごとにフォーマッタ、linter、アーキテクチャルールなど一括実行したコマンド実行させて失敗してたら成功するまで修正繰り返させる。

ある程度わかりやす単位AI に依頼する感じで、出来上がったコードレビューする前提なので、実装プランmd 自体はよほど分かりやすツッコミどころがない限り細かくレビューしない。

mdフォーマットは skills 側で事前に用意しておく。

フロントエンド用、バックエンド用の両方でドメイン層のファイルを作る。

当然、足りないロジックは後から絶対に出てくるけど、最初から完璧は目指さない。

TODO 一覧の中から自分認知負荷が許す単位で「チェックリストのここからここまで実装して」と指示を出し、実装が終わったら TODO 項目のチェック状態更新してもらう、mdファイルコミットに含める。

コミット前にはlint ルール無効化していないか意図通りの実装になっているかgit diff差分で必ず確認する。

ドメイン層の実装が終わったら、そこからは並列で進める。

git worktree を使うことが多い。

よくやるのはフロントエンドの画面モック作成バックエンド実装の2並列で行う。

3並列以上はまだ自分脳みその性能が追いついていない。

フロントエンドも当然 spec 駆動前提。

実装プランを考えてもらうときは「◯◯画面を実装プラン考えて」くらいの単位で依頼する。

実装プランmd ファイルを作るときプロンプトには、基本設計の〇〇画面の項目一覧をベースに、◯◯のアイテムコンポーネントリストコンポーネント、◯◯のボタンコンポーネント、Information コンポーネント、外部通信用の ◯◯Gateway実装する、◯◯コンポーネントは既に ◯◯ 機能実装してあるからそれを使って、◯◯は処理が膨らみそうだからドメインサービス実装して、みたいな感じで頭の中のふんわりしたイメージを伝える。

詳細な名前とかは、AIにいい感じに考えてもらう。

バックエンドも同様で、◯◯のエンドポイントを作って、Gateway がこれこれ必要から実装して、これはインターフェース実装分けてね、Entityへの変換処理は関数分けて、◯◯の処理は Usecase 層で、◯◯の処理はドメイン層で、Usecase が膨らみそうだから ◯◯ の処理は独立したクラスにして、あ、似たようなのが ◯◯ 機能にあるからそれを参考にして、くらいの粒度で指示を出す。

フロントエンド実装を待っている間に、バックエンドプランを考えたり、タスク粒度を調整したり、リファクタリングプランを考えたりする、またバックエンドAI待ち時間フロントエンドのことをする。

フロントエンドオンリー実装とかで作業が競合するリスクあるときは並列作業しない。

チェックリスト更新が終わるごとに差分確認して、問題なければコミットメッセージ提案してもらってコミットする。

コミット粒度はあまり細かくしない。

細切れにするコストよりも、レビューする人間認知不可が許すレベルであればある程度まとまった単位レビューして実装速度を優先する派。

チーム開発ならもうちょっとちゃんとする。

テストは、ある程度実装が進んでリファクタリングが辛くなってきたタイミングで作ることが多い。

カバレッジミューテーションテストなど、定量的テスト評価できる仕組みは導入する。

バックエンド側のテスト実装は正直かなり楽で、行数や認知的複雑度を厳しく制限して単一責務の原則を守って実装しておけば、AI がかなり高精度なテストを出してくれる。

これもテストファイル実装プランを作ってもらって「ここからここまでのテスト20ファイル実装してね」をレビュー挟んで繰り返す感じ、例えばミューテーションテストのkill率100%ならそんなに詳しくは見ない。

フロントエンドテスト定量指標での評価が難しいので、そこはその分レビューを頑張るしかない。

自分はこんな感じでやっている。

感覚としては、優秀だけどシステムアーキテクチャ全体の責務を負ったことはない経験不足の2年目やSESの部下を扱うEMに近いのかなぁ。

周りの話を聞いていると、もっともっと AI自律的にいろいろやらせているようにも聞こえる。

これでも 1日1人で数万行レベルコードを書けてるので、AIない時代に比べると数ヶ月分の成果を1日とかで出してることになるが、もっと本気出せるのかなぁ。

それでも人間干渉しすぎなんだろうか。

「全機能プラン作ってね!そこから良い感じの粒度コミット自分でやってね!」みたいな指示を良い感じに出せたとしても、指示がでかすぎると、脆弱性盛々になったり、lint エラーループでパニクって linter オフにし始めたり、テスト通すためにエラー握りつぶして assertTrue(true) し始めたりする。

それは流石に許容できないレベルじゃない?が紛れ込むリスクが上がりすぎるんじゃないかなぁ。と思ってるんだがどうだろうか。。。

あとツールあんま入れてないねkiroとかspec-kitとか、ガチガチ細切れで仕様書作るメリットあんま感じなかった。

mcpserenaくらいしかいれてないや、トークン節約してレートリミット猶予伸ばした方が結局開発早くなるかなって。

いろいろ入れた方がいいんだろうか。

完全にオレオレでこんな感じでやっているんだけど、みんなspec駆動開発というものをどんな感じで、具体的にどうやっているのかが知りたい。

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん