Findyの爆速開発を支えるセルフレビュー自動化の仕組み

こんにちは。ファインディ株式会社でテックリードマネージャーをやらせてもらってる戸田です。

現在のソフトウェア開発の世界は、生成AIの登場により大きな転換点を迎えています。

GitHub CopilotやClaude Codeなど生成AIを活用した開発支援ツールが次々と登場し、開発者の日常的なワークフローに組み込まれつつあります。

ファインディではClaude CodeのSkillやカスタムコマンドなどをPlugins経由で社内展開しています。Pluginsに関しては前回の記事を参照してください。

tech.findy.co.jp

AIに設計やタスク分解、コード生成を任せる分、Pull requestのコード品質やコードレビューがネックになることがあります。「型チェックが抜けてる」「命名がチームの規約と違う」といった指摘で手戻りが発生すると、AIで加速した開発のテンポが崩れてしまうからです。

本記事では、その課題に対処するために社内Pluginsに作ったセルフレビュースキルを紹介します。過去のレビューコメントから自動生成するチェックリスト、複数のAIエージェントによる並列レビュー、修正の段階的な適用を組み合わせて、Pull requestを出す前のセルフレビューを自動化しています。

Pull requestの質と、コードレビューをめぐる課題

AIが設計やコード生成を行うようになり、1日に作成できるPull requestの数は増えました。しかし一方で、Pull requestの質やコードレビューで問題が出てきました。

AIが出力したコードがチームのコーディング規約に沿っていなかったり、型チェックが抜けていたり、テストコードが不十分だったりすると、コードレビューで指摘されて手戻りが発生します。AIで加速した開発のテンポが崩れてしまうのです。

そしてこれら全てを人間のコードレビューで事前に防ぐのは、現実的に難しくなってきています。

AIが生成するコードの量とPull requestの数が増えており、これら全てを人間がチェックしようとすると、人間がボトルネックとなるのです。

そこでファインディでは、人間がチェックしないといけない領域と、AIにチェックを任せる領域を切り分けたうえで、AIにチェックを任せる領域を自動化することにしました。それが今回紹介するセルフレビューのスキルです。

セルフレビュースキルの概要

セルフレビュースキルは社内展開しているClaude Codeのスキルの一つで、Pull requestを出す前にコード変更をセルフレビューするためのものです。「セルフレビューして」と話しかけるだけで起動します。

# カレントブランチ全体をレビュー
セルフレビューして

# 特定ファイルに絞る
src/services/UserService.ts をセルフレビューして

# コミット範囲を指定
HEAD~3..HEAD の変更をレビューして

起動すると、リポジトリ全体の過去指摘パターン・バグ検出・セキュリティ・コード品質・実装漏れといった 異なる視点を持つ複数のエージェントが同時に動き出します。

それぞれが独立してdiffを解析し、全エージェントの完了後に結果をサマリとして統合します。

指摘事項は出典エージェント付きで一覧化され、「すべて反映」「個別に選択して反映」「反映しない」の3択でコードに適用できます。

エージェント並列レビューの設計

現在は最大6つのエージェントを並列起動します。各エージェントはレビュー対象のdiff(git diff DEFAULT_BRANCH...HEADの結果)を受け取り、それぞれ異なる観点で独立して動作します。

全エージェントの完了を待ってから結果を統合するため、直列実行と比べて待ち時間を大きく削減できます。

規約・スタックベースのチェック

プロジェクトの命名規則への準拠、テストコードの適切さ(テスト漏れ・カバレッジ・テスト規約への準拠)、ドキュメントとの整合性に注力して確認を行います。

CLAUDE.mdやrulesなど、プロジェクトの規約やスタックに関するドキュメントを学習したエージェントが、diffの内容と照らし合わせて規約違反やスタックの不適切な使用を指摘します。

チェックリスト照合

事前に用意しているセルフレビューのチェックリストの各項目とdiffを照合します。チェックリストの項目は該当リポジトリの過去のPull requestで指摘された内容から生成されているため、「やりがちなミス」にピンポイントで反応します。

チェックリストの自動生成の仕組みについては、次の記事で詳しく紹介しています。

tech.findy.co.jp

このチェックリストは定期的に自動で更新されるように仕組み化しており、常に最新の指摘パターンをカバーできるようになっています。

コード品質チェック

Claude Code公式プラグインのfeature-dev:code-reviewerエージェントが動きます。

github.com

バグ・セキュリティ・コード品質の3観点で検査し、信頼度80以上の指摘のみを報告する設計になっています。「これは問題かもしれない」程度の低確信度の指摘は出力されないため、レビュー結果がノイズで埋まりません。

具体的には次のような問題を検出します。

  • ロジックエラー(条件分岐の誤り、状態管理の不整合)
  • セキュリティ問題(SQLインジェクション、認証チェックの欠落、機密情報のハードコード)
  • コード品質(デッドコード、過剰な複雑度、テストの網羅性)

Codex AI

OpenAI Codex CLIのcodex reviewコマンドにdiffを渡してレビューを実行します。

developers.openai.com

プロンプトは次の優先順位で構成されており、スタイルやフォーマットの指摘は明示的に除外しています。

【最優先】バグ検出
- ロジックエラー、エッジケースの見落とし、例外処理の漏れ
- null/undefined処理の欠落、境界値チェックの不足

【第2優先】セキュリティ問題
- SQLインジェクション、XSS、CSRF
- 認証・認可の欠陥、機密情報の露出

【第3優先】パフォーマンス問題
- 非効率なアルゴリズム、メモリリーク、不要なループ

【除外】コードスタイルやフォーマットの指摘

Codex CLIが未インストールの場合は起動時に確認を求め、承諾されればnpm install -g @openai/codexを自動実行します。認証(ChatGPTアカウントへのログイン)も同様に案内します。

ファインディでは基本的にClaude Codeでコード生成を行っており、Codexはレビューの観点を増やすための補完的な役割で使っています。コード生成したモデルとは別のモデルの観点でのレビューを挟むのをオススメします。

コード簡潔化

Claude Codeのビルトインスキル/simplifyを呼び出します。/simplifyはコード変更を対象に「コード再利用」「コード品質」「効率性」の3観点でレビューエージェントを並列実行し、結果を統合して報告します。既存ユーティリティとの重複検出、冗長な状態管理、不要な処理・並列化漏れ・メモリリークなどが検出対象です。

code.claude.com

要件確認

現在のPull requestのタイトルとBody、紐づくIssueの内容から要件を抽出し、実装コードとテストコードの両方に反映されているかを2軸で分析します。

要件は「機能要件」「非機能要件」「エッジケース」の3種類に分類したうえで、実装ギャップ(要件があるのに実装がない)とテストギャップ(実装はあるのにテストがない)を区別して報告します。

## ギャップ分析レポート

### ✅ 実装・テスト両方あり
- ユーザー認証: 実装: UserService.ts:42 / テスト: user_service_spec.rb:15

### ⚠️ 実装済み・テストなし → テストが必要です
- パスワードリセット: 実装は PasswordService.ts にあるが、テストがない
  理由: 異常系(トークン期限切れ)の挙動が未検証

### 🚨 実装なし・テストなし → 実装漏れの可能性があります
- メール通知: Issueに「登録完了メールを送信する」とあるが、実装が見当たらない

レビュー結果の統合と出力

全エージェントの完了を待ち、結果を統合して表示します。

各レビュー用エージェントからの報告のサマリを出力して、コードの品質を全体的に把握できるようにします。

## セルフレビュー結果

### 📋 チェックリスト照合

#### ✅ 問題なし
- nullチェック: OK

#### ⚠️ 改善提案
- 関数名の命名規則: getUserById → fetchUserById に統一するとよい

#### ❌ 要修正
- エラーハンドリング: 外部API呼び出しにtry-catchがない

---

### 🔍 コード品質チェック

#### ❌ 要修正
- L42: 認証トークンのnullチェックが欠落
  修正案: `if (!token) throw new UnauthorizedError()`

---

### 🤖 Codex AI

#### ⚠️ 改善提案
- L78: N+1クエリの可能性。ループ内でDBアクセスが発生している

---

### 📊 レビューサマリー
- チェックリスト照合: ✅ 3個 / ⚠️ 1個 / ❌ 1個
- コード品質チェック: ✅ 0個 / ⚠️ 0個 / ❌ 1個
- Codex AI: ✅ 0個 / ⚠️ 1個 / ❌ 0個
- 要件確認: ✅ 2個 / ⚠️ 1個(テストギャップ)
- 合計指摘事項: 4個

修正の段階的な適用

レビュー結果が揃ったら、AskUserQuestionで3択を提示します。

? 修正を反映しますか?
> 個別に選択して反映する (Recommended)
  すべて反映する
  反映しない
  Other…

「個別に選択して反映する」では、指摘事項を一件ずつ確認しながら採否を判断できます。「この修正を適用しますか?(出典: コード品質チェック)」のように出典が表示されます。

## 未対応リスト(インラインコメント用)

### 1
- path: src/services/UserService.ts
- line: 42
- source: code-reviewer
- body: **[出典: コード品質チェック]** 認証トークンのnullチェックが欠落しています

  **修正案**: `if (!token) throw new UnauthorizedError()`

  <sub>*AIセルフレビュー*</sub>

「すべて反映する」を選ぶと、レビュー用エージェントそれぞれからの修正提案をEditツールで順次適用します。

「反映しない」を選ぶと、レビュー結果の確認だけで終了します。内容を把握してから自分で修正したい場合に使います。

まとめ

AIが開発ワークフローに入れば入るほど、生成されるコードやPull requestの数は増えていきますが、それら全てに人間が対応するのは現実的に難しくなってきています。

人間が対応する必要のある領域と、AIに任せる領域を切り分けたうえで、AIに任せる領域を自動化することが重要になります。

全ての変更内容を同じレベルでレビューしない ようにすることがAIレビューの設計のコツです。

軽微なリファクタリングと、データベースからの項目削除は、同じレベルでレビューする必要はありません。前者はコード品質の観点で簡単にAIに任せてしまい、後者は人間がしっかりレビューする、といった具合に、変更内容の性質に応じて適切なレビューのレベルを設計するのがポイントです。

ファインディでは一緒に会社を盛り上げてくれるメンバーを募集中です。興味を持っていただいた方はこちらのページからご応募お願いします。

herp.careers

【日本語訳全文】Gene Kim氏 基調講演:開発生産性向上の探求 ─ DevOpsの進化、普遍的な原則、そして生成AIがもたらす変革・後編

こんにちは。Findy Tech Blog編集長の高橋(@Taka_bow)です。

前編では、Gene Kim氏の26年にわたるDevOps研究の旅路、DORA研究によるハイパフォーマーの実態、DevOps Enterprise Summitの多彩な事例、そしてスティーブン・スピアー博士との共著『Wiring the Winning Organization』から導かれた"勝つ組織の魔法"のフレームワークとカウチのメタファーを紹介しました。

後編では、この魔法を解き放つ3つのテクニック ── 巧遅(前倒し)化(Slowification)単純化(Simplification)増幅(Amplification) ── を具体的な事例とともに紹介します。そして最後に、Gene Kim氏自身が体験した生成AIとバイブコーディングの世界をお届けします。

前編はこちら tech.findy.co.jp

講演動画

conference.findy-code.io

※ 視聴にはFindy Conferenceへのログイン、並びに視聴登録が必要です。ご登録頂ければ、他の講演アーカイブも視聴できます。

日本語訳全文(続き)

ソシオテクニカルの達人

このすばらしいシステムはどこから来たのでしょう?

昨年、フォースグレン博士も言及していたロン・ウェストラム博士です。

彼の詳しい話はあとにしますが、彼には"ソシオテクニカルの達人"という言葉を教わりました。

5つの特徴を持つ人たちです。

高エネルギーで高基準。

システム思考なので大規模作業で活躍しますが、小規模作業でも活躍し、質の高い質問ができます。

フロアを歩くのが好きで、自分の仕事が終わると積極的に現場を見て回ります。

このまま、ソシオテクニカルの達人がどんな行動をするかお話ししますね。

巧遅(前倒し)化(Slowification)

1つ目 ── ソシオテクニカルの達人は"巧遅(前倒し)化"します。最も危険度の高い作業は本番環境では行わず、前段階で問題を解決します。

『Wiring the Winning Organization』では24の事例を紹介しており、うち20%はテクノロジー関連です。

しかし驚くべきことに、最もケーススタディが多いのは医療業界でした。

救急部門は非常に危険な場所として知られています。

事故に遭って運び込まれた時、症状が増えて帰ることになる確率は、スカイダイビングやベースジャンプでケガする確率よりも高いのです。

ベースジャンプはビルや崖、ダムなどから飛び降りるスポーツです。病院はベースジャンプよりも危険です。

Ms.モリス 対 Ms.モリソンというケーススタディがあります。

間違った患者が処置を受けてしまった事例で、14もの強力なシグナルが出ていたにも関わらず手術は行われました。

患者自身も"違う"と訴えていたそうです。

明らかに制御不能な状態に陥っている兆候が見られるような時には、システムを停止させるのが正解だと示す事例です。

Netflix と Chaos Monkey ── 本番環境での巧遅化

私たちの業界における巧遅(前倒し)化の最も良い事例は、2011年4月に起こったAmazon EC2の大規模障害でしょう。

具体的にはAWSで最も規模が大きいUS-Eastの可用性ゾーンがダウンしました。顧客数も最大だったので大手顧客もすべてダウンしたのですが、非常に興味深いことにNetflixは例外でした。

NetflixはAmazonのクラウドサービスの利用を公言している大規模ユーザーですが、どうやって危機を乗り越えたのでしょう?

その答えは後日明らかになりました。

彼らは3つの驚くべき内容を明かしました。

"単一障害点は排除せねばならず、Amazonはその最たる存在だ"。

"障害を乗り越えるためには、常に障害を起さなければならない"。

そう言って"Chaos Monkey"の存在を明らかにしました。

ご存じの方も多いでしょうが、このChaos Monkeyはランダムに障害を起こします。クラウド上の仮想マシンに対して、日中にです。

Netflixの開発者でシステムを構築し実行する人間なら、いつでもシステムがダウンし得ると知っているので、障害時に回復力のあるシステムを作ります。

だからAmazonの障害も彼らにとっては日常にすぎなかったのです。

さらに驚くべきことに、Netflixはいくつもの障害を乗り越えてきました。

2014年にはAmazonの大規模リブートがありました。パッチを当てるために全体の5%のサーバーを再起動する必要があったのです。

ぜひスライドをご覧ください。NetflixのChristos Kalantzis氏が言っていたことです。"緊急リブートのニュースを聞いた時、影響を受けるノード数のリストを確認してぞっとしました。特にデータベース周りです"。ただ彼はこうも言いました。"でもChaos Monkeyのおかげで、かかってこい!です"。

結果はどうだったか。Bruce Wong氏が言ったように、2700以上ある本番データベースのノード中、218のノードがリブートされ、そのうち22は正常にリブートされませんでした。

でもNetflixの顧客にダウンタイムは発生しませんでした。

これこそが巧遅化の賜物です。本当に耐障害性と可用性を重視するなら、私たちは恐れずに本番環境で自分たちを試すべきなのです。

技術的な負債を解消することや、"何かが変"と誰かが言った時には耳を傾けることも含まれます。

巧遅(前倒し)化の事例紹介でした。

単純化(Simplification)

2つ目に移ります。次は"単純化"です。

単純化とはつまり、問題を分割することです。大きな問題を小さくし、安全に解決しやすい問題にするのです。方法はいくつもあります。一気に行うことも、段階的に行うこともできます。私のお気に入りの1つはモジュール方式です。

DevOps研究という観点から最も成果が期待できるのは、アーキテクチャでした。何によって測定できるでしょう?

どの程度まで、誰の許可もなしにシステムを大幅に変更できるのか。チーム外の人間と細かい調整を行うことなく、どの程度まで仕事を進められるか。どの程度まで、他のサービスとは関係なくデプロイとリリースができるか。不足しがちな統合テスト環境を使うことなく、必要なテストを任意のタイミングでどこまで実行できるか。

私たちは社内の多くの人間とカップリングされていますが、これらの条件を満たせれば、営業時間内のデプロイも可能で、ダウンタイムも最小限に抑えられます。

Amazon ── モノリスからサービス分割へ

実際に私が気に入っている事例の1つが、2000年代初頭のAmazonの話です。

米国では多くの人が昔のAmazonを覚えています。90年代後半はAmazonで本を注文しました。本と音楽を売っているシンプルなサイトでした。

しかし2002年になる頃には、製品カテゴリが35種類も増えていました。これによりチーム間のコミュニケーションと調整の量が増えました。

AmazonのCTOであるワーナー・ヴォゲルス博士が2004年にある発言をしています。

デジタルチームが直面していた不可解な仕様に関してです。

その仕様とは、音楽やビデオや電子書籍などデジタル製品を購入する際にも配送先住所の入力が必要というものでした。

配送する物など何もないにも関わらず必須だったのです。

デジタルチームは製品カテゴリーごとにあった80もの受注担当チームの元を訪れて変更のお願いをしました。でも彼らの答えはいつも"予算がない"でした。

そんなわけでデジタルチームはやるべきことを達成できぬまま、行き詰ってしまったのです。

理由は、当時のAmazonのソフトウェアアーキテクチャがモノリスで、3500人のエンジニアが全員、1つのカウチを一緒に運んでいるような状態だったからです。

補足 モノリス(monolith)とは、すべての機能が1つの大きなコードベースに統合されたソフトウェアアーキテクチャのことです。

デプロイ件数からも見てとれます。1999年には年間で多数のデプロイが行われていたのが、2001年にはほぼ停止状態となっていました。

年間にわずか数十件で、多くのデプロイが未完に終わりました。

スティーブ・イエギ氏が書いた有名なメモがあります。

Amazonの元CEOで創設者ジェフ・ベゾス氏の有名なお達しに言及した内容で、"チーム間のコミュニケーションはAPIのみで行い、例外は許されない"、"従わない者は解雇する"とまで書かれたものでした。

最後の"良い一日を"はイエギ氏の追加したジョークだそうです。

"ベゾスはスタッフの一日がどうでも気にしない"とね。

それ以外は実際の内容で、元陸軍レンジャーで当時CIOだったリック・ダルゼル氏が強行しました。

補足 リック・ダルゼル氏はこんな感じの方です。(動画)

www.youtube.com

10億ドル規模のプロジェクトでしたが効果も絶大でした。1つのサービスを10に分割し、10から100、さらには1000にまで分割しました。

すると年間数十件だったデプロイ数は、2011年には1日あたり1万5000件、2015年には1日あたり13万6000件にまで増えました。

さて、なぜでしょう?

彼らはカウチを細かく分割することで、行動に独立性を与えました。おかげでチーム外とのコミュニケーションや調整を行わずに、開発、テスト、デプロイができるようになったのです。

ケント・ベック氏はよく、疎結合を理解するのに30年かかったと話しています。

Gene Kim氏の講演を聞きながら熱心にメモをとるKent Beck氏

私もまったく同じです。疎結合がなぜそれほど重要なのか理解するのに30年かかりました。

補足 疎結合(decoupling)とは、コンポーネント間の依存度を低くし、それぞれが独立して変更・デプロイできるようにするソフトウェアアーキテクチャの設計原則です。前編で紹介した密結合(coupling)の対義語にあたります。

増幅(Amplification)

それでは最後のテクニックを簡単に紹介したいと思います。

最初に話した巧遅(前倒し)化は本番前の段階で問題を解決するという話でした。単純化は問題を分割して小さくする話でした。3つ目は弱いシグナルを増幅する話です。大きな問題になってしまう前に、大きな問題と同様に対処するためです。

ウェストラム博士の組織文化モデル

先程のロン・ウェストラム博士。

彼が研究していたのは、医療、航空宇宙、原子炉分野の安全性に関してです。

その中であることに気づきました。安全性は組織文化と相関性が高いということです。

安全性が最低レベルの組織に見られたのは、これらの特徴です。情報を隠ぺいし、悪いニュースのメッセンジャーを攻撃します。

チーム間の橋渡しは行わず、失敗も隠ぺい、新しいアイデアは潰します。良くありませんよね。

真ん中は彼が"官僚的"と呼ぶグループで、人を守るためにプロセスを作ります。わりと良さそうです。

でも最高の組織では、これらの特徴を見いだせます。情報を積極的に求め、メッセンジャーは悪いニュースを伝えるように訓練され、リーダーはそれを聞くように訓練されます。

大野耐一氏が言うように、"問題がないことが最大の問題"なのです。

補足 大野耐一氏はトヨタ自動車の元副社長で、トヨタ生産方式の生みの親とされる人物です。英語では "Having no problems is the biggest problem of all." として広く知られています。

トヨタ生産方式

トヨタ生産方式

Amazon

責任が共有されているのでチーム間の橋渡しも推奨されます。アップタイムと可用性はOpsだけの仕事ではありません。情報セキュリティがそうであるように、それは皆の仕事なのです。そして障害が起きてしまったら、とことん調べます。

情報理論で文化を診断する

ロン・ウェストラム博士は言いました ── "文化は時に問題となり得る"。なぜなら彼の言葉で言うと、文化は軽くて空気のようなもので、つまり目には見えにくく、実体がないものだからです。

スピアー博士と私が挑戦したことの1つは、ウェストラム博士が明確化しようとした内容と同じでしたが、私たちは情報理論を使いました。ウェストラム博士が言っていたことをすべて表現できると思います。

情報はまず生成されなければならず、それが送信され、確実に受信され、対応がなされてから問題が解決したか確認します。助けを求めてきた人に、問題は解決したかと尋ねるのです。

そして ── 私がこれを好きな理由はエンジニアとして診断できるからです。

つまり、文化の問題なのか?

情報生成に問題があったのか?

そもそも知ってたのか?

それとも送信段階の問題? 悪いニュースのメッセンジャーは攻撃されるので送りたくないですからね。

それとも受信側の問題?

リーダーに届いていない?

あるいは対応が見送られた?

つまり優先順位の問題?

それとも最後の確認漏れ?

問題が解決したか確かめていない?

トヨタ工場でのシグナル増幅

スティーブン・スピアー博士の本はすべて読みました。トヨタ生産方式の研究論文も含めてね。ただ『Wiring the Winning Organization』の"増幅"の章で、彼は非常にすばらしい事例の1つを挙げていました。

進行中のトヨタ生産方式に基づいた事例です。

彼がトヨタ自動車の製造工場を直接訪問した時の話でした。

テキサス州サンアントニオにある、トラックやSUVを製造している工場です。トヨタの社員とティア1サプライヤーの人間、合わせて数千人の従業員がいたそうです。

シグナル増幅のスピードの速さを示す事例です。

工場には3000〜4000ものアンドンのコードがあり、それを引くとリーダーの助けが必要な問題発生を意味します。

しかし最も注目すべきことの1つは、米国トヨタのSVPであるKevin Voelkel氏が毎日数時間は現場にいるということです。

補足 Kevin Voelkel氏は、トヨタ・モーター・マニュファクチャリング・テキサスのSVP(シニア・バイスプレジデント)です。

リーダーが現場を実際に見ることの大切さを示すエピソードです。

従業員の仕事ぶりを確かめることで、部下の目標達成のために自分に何ができるかが見えてきます。

私がこの話をした理由は皆さんがリーダーだからです。

現場で従業員の業務を妨げている障害に気づいてあげるために、どうすれば現場の実態を把握できるか考えてみてください。

生成AIから得た教訓

話を締めくくる前に、昨年生成AIを使ってみて私が学んだことをお話ししたいと思います。

正直、これまでのキャリアを通してこんなに楽しかったことはありません。

昨日、ケント・ベックも最高に楽しいと言っていましたね。とにかく目新しくて新鮮で、コーディングの喜びを私の日常にもたらしてくれました。

先程、スティーブ・イエギ氏が書いたこちらのメモをご紹介しました。

私は彼の仕事ぶりの大ファンで、長年彼の話を引用し続けています。AmazonとGoogleで20年過ごしてきた彼と、昨年やっと会えました。

"駆け出しエンジニアの死"と題した講演をカンファレンスで行い、AI登場の影響について話していました。

駆け出しエンジニアは消える運命か? 答えはノーです。これまで以上に開発者は増えるでしょう。

実際に開発作業にAIを使ってみて、新たな楽しい冒険が始まりました。スティーブとは一緒に本を書き始めました。『バイブコーディングブック』という今秋に出版予定の本です。

補足 原題 "Vibe Coding: Building Production-Grade Software With GenAI, Chat, Agents, and Beyond"

2025/10/21 に発売されました。

私はあることに驚嘆しました。なんとスティーブは、調子が良い日には、1日あたり7000〜1万2000行におよぶコードを35年間取り組んできたゲームのために書き続けていたのです。

彼は作業を進めるために何百ドルもClaudeに費やしていました。

ここで疑問が湧くと思います。

スティーブのような人だけがそうやって ── 多くタイピングすれば良いわけではないので、数字で比べたくはないのですが ── スティーブ・イエギのように100万行以上のコードを書いてきた実績がないとダメでしょうか?

それとも私のような平凡な開発者でもAIの恩恵を受けられるでしょうか?

驚いたことに答えはイエスでした。

本を書いていた頃、その最後の80時間で ── 気づけば私は4000行のコードを書いていました。原稿の締切直前で怒涛の編集作業を行っていたさなかにです。

スライドの上の部分は、その4日間の間に本の作業に費やした時間を示しています。

その下はコーディングをした時間です。

本の執筆にAIを役立てるためにバイブコーディングでツールを作っていました。

当時の私は、実は手と手首を痛めてしまっており、4つのGoogleドキュメント間でコピペするだけの作業さえ苦痛でした。

そこで思ったのです。本の原稿をSQLデータベースのようにして、クエリを送ることで目次や文章の一部を取り出したり、章や節ごとに取り出したりして、AIで書き換えられるようにしたいと。

スティーブ・イエギのレベルでなくても、平均的な開発者でも、平均以下の開発者でも、バイブコーディングの恩恵は受けることができます。

バイブコーディングの価値と注意点

そして本の中では ── バイブコーディングの価値を挙げ、英語の頭文字から"FAAFO"と呼んでいます。

より速く欲しいものを作ることができ、より高い目標に挑戦することができ、自分一人で構築できるようになります。他人に頼る必要も、他者と調整する必要もありません。普通ならなかなか難しいことですよね。だけど何より、作業がはるかに楽しくなります。ケント・ベックは数十年ぶりに午前3時にコーディングをしたそうですよ。

何かを作る作業というのは非常に楽しいものですが、それがより手軽で楽しいものになる上、私たちの選択肢も大幅に広がります。

ありがたいことに、つい最近あるAIラボの開発生産性ディレクターとお話しする機会を得ました。

彼は自分たちが抱える問題について教えてくれました。

"社内の開発者の多くは日々の業務にAIを使っていない"、"なぜか皆、手書きが好き"なのだとか。

つまり、AIの開発を行う企業の中でさえ、リーダーが部下に便利なツールの使用を促している状態なのです。

私たちの多くがこれから直面する課題だと思います。

AIという魔法の技術を活用して仕事をうまくこなすことを勧めていくことになるでしょう。

ただ、バイブコーディングは新たなリスクに満ちています。

本でも、自分たちが実際に経験した失敗について書きました。

単体テストを無効にして、コードが消えました。

理解できない謎のコードベースを作成してしまい、変更できなくなりました。

良いコードベースを台なしにしたこともあり、多くの注意と警戒が必要です。

しかし良いニュースもあり、AIによって私たちの強みと弱みは増幅されるでしょう。

だから単独作業を可能にするモジュラー型アーキテクチャの存在がこれまで以上に必要になるはずです。

フィードバックループはより速さが求められ、学ぶ文化も必要です。

この本の初期の草稿を読んだ人の多くはこんな反応でした。

"2人はものすごく賢いはずだ"、

"たくさん本を書いて優れた開発者の働き方を研究してきたのに、なぜこんなにも愚かな失敗を?"。

でも例えばですが、これまでずっと馬で移動する人生だったとします。

馬にしか乗ったことがなく、最高時速は約5マイル(約8キロ)程度。

その感覚では時速約50マイル(約80キロ)に耐えられません。訓練を重ね、自分をアップデートしなければ車は大破するでしょう。

そこで本ではバイブコーディングの流れを表すループや、内部、中間、外部の開発に役立つ実践項目も紹介しています。

AI活用のメリットが開発者の皆さんに伝われば幸いです。AIを使えばより楽しく、より大規模な開発を行えますし、開発スピードも上がり、所属する組織にもメリットがあります。

本の発売は今年の秋の予定です。(※発売されました)

まとめ

それでは話をまとめます。

成功する組織は"魔法"の力で並外れたパフォーマンスを実現します。個人の力ではどんな人でもおよびません。

組織内の問題解決能力や想像力が完全に解放された状態なのです。

逆に魔法がない組織では、創造力も問題解決能力も発揮できないまま全員が終わる運命でしょう。

この魔法を解き放つには3つの方法があります。

"巧遅化、単純化、増幅"の3つでした。

ソシオテクニカルの達人になればそれが実現できます。

高エネルギーで高基準、大規模でも小規模でも活躍し、現場歩きが大好きな人です。

補足 『Wiring the Winning Organization』邦訳では、Slowificationを「巧遅化」、Simplificationを「単純化」、Amplificationを「増幅化」(本記事では「増幅」と表記)と訳しています。

9月にはまた別のカンファレンスを開催します。テクノロジーリーダーが開発チームや企業のためにどうAIを活用しているかなどの話が聞けます。

ぜひそちらにもお越しください。各講演へのリンクや本の抜粋など、本日紹介した内容の詳細に興味がある方は、スライド送信用のアドレスにメールを送ってください。

件名に"Vibe"または"DevOps"とあれば、数分以内に自動返信が届きます。

本日はありがとうございました。

(会場拍手)


前編・後編を通して、Gene Kim氏の26年にわたるDevOps研究の集大成をお届けしました。DORA研究のデータに裏打ちされたハイパフォーマーの実態、製造業からソフトウェアまで共通する「勝つ組織の原則」、そして生成AIがもたらす新たな可能性 ── 皆さんの組織でも、この"魔法"を実践してみてはいかがでしょうか。

Ask the Speaker も盛り上がりました

ファインディブースにも来てくださいました

前編はこちら tech.findy.co.jp

今年も開催します!(名前変わります)

『継続的デリバリーのソフトウェア工学』著者 Dave Farley氏と和田卓人氏の登壇が決定!

スポンサー募集中です。(残り僅か!)

prtimes.jp

We're Hiring

ファインディでは一緒に会社を盛り上げてくれるメンバーを募集中です。 興味を持っていただいた方はこちらのページからご応募お願いします。

herp.careers

【日本語訳全文】Gene Kim氏 基調講演:開発生産性向上の探求 ─ DevOpsの進化、普遍的な原則、そして生成AIがもたらす変革・前編

こんにちは。Findy Tech Blog編集長の高橋(@Taka_bow)です。

本記事は、2025年7月にファインディが開催した「開発生産性Conference」のキーノートスピーカーとしてお招きした Gene Kim氏 の基調講演を、日本語の全文書き起こしとしてお届けするものです。

Gene Kim氏は、ベストセラー『The DevOps 逆転だ!(The Phoenix Project)』『The DevOps ハンドブック(The DevOps Handbook)』の著者であり、1999年から26年にわたり高い成果を上げるテクノロジー組織の研究を続けてきた人物です。

本講演では、DORA研究の成果、勝つ組織に共通する普遍的な原則、そして生成AIがもたらす変革について語られました。

前編では、DORA研究によるハイパフォーマーの実態、DevOps Enterprise Summitで出会った多様な事例、そしてスティーブン・スピアー博士との共著『Wiring the Winning Organization』から導かれた"勝つ組織の魔法"のフレームワークを紹介します。

後編では、その魔法を解き放つ3つのテクニック(巧遅化・単純化・増幅)と、生成AI・バイブコーディングの実践について紹介します。

後編はこちら tech.findy.co.jp

講演動画

conference.findy-code.io

※ 視聴にはFindy Conferenceへのログイン、並びに視聴登録が必要です。ご登録頂ければ、他の講演アーカイブも視聴できます。

日本語訳全文

オープニング ─ 26年間の研究とDevOpsへの道

Gene Kim氏:ありがとうございます。

(会場拍手)

私は高業績のテクノロジー組織について1999年から研究しています。創業者兼CTOとしてTripwireという情報セキュリティの会社に勤めていた頃からです。

私が研究対象としてきた高業績の組織は、開発プロジェクトの納期内でのパフォーマンスが申し分なく、運用の信頼性・安定性、セキュリティ・法令遵守体制も万全でした。知りたいのは、彼らがどうやって見事な変革を成し遂げたか、どうすれば他の組織が追随できるかということです。

ご想像の通り、この26年の間に多くの驚きがありました。最大の驚きは、私がDevOpsムーブメントのど真ん中に引き込まれたことで、これは極めて緊急かつ重要な動きだと考えています。

DevOpsは多くの産業に変革をもたらしましたが、それ以前で最後に目にした大変革は、恐らく1980年代にトヨタがアメリカ市場に進出した時だと思います。

彼らは見事に、ほぼすべての米自動車メーカーを完全に打ち負かしたわけですが、根底にはリーンの原則がありました。DevOpsの土台にもなっている原則です。

テクノロジーのバリューストリームに適用すると創発的なパターンが出現し、1日に数十件、数百件、さらには数十万件のデプロイが可能になり、世界水準の信頼性・セキュリティ・安定性も維持したままです。

10〜15年前には考えられなかったことです。少なくとも当時の私は、無理だと思っていました。しかし、今では多くの組織が実現しています。

今日は、私がこの26年で学んだ大事なことをいくつか紹介しようと思います。

私の著書をご覧になった方もいると思います。『The DevOps 逆転だ!』や『The DevOps ハンドブック』などですね。翻訳本を監修してくれた榊原彰さんに昨夜会えたんです。11年越しの願いがやっとかないました。

補足

『The DevOps 逆転だ!』(原題:The Phoenix Project)および『The DevOps ハンドブック』(原題:The DevOps Handbook)は、いずれも榊原彰氏(パナソニックコネクトCTO:写真右)が監修、長尾高弘氏が翻訳を担当しています。

11年越しの初顔合わせ

さて、昨年こちらのイベントでニコール・フォースグレン博士が登壇しました。

彼女とは6年以上、研究を共にしてきた仲です。内容は、ハイパフォーマンスとはどんな状態か ── それがDevOps研究の現状です。 今日は皆さんに4つのことをお話しします。

1つはニコール・フォースグレン博士と行った研究についてで、ハイパフォーマンスの実態とそれを予測する行動とは何かという話です。

次に、スティーブン・スピアー博士とこの4年で学んだことを紹介します。トヨタ生産方式を長年にわたり研究してきた人物です。

共著『Wiring the Winning Organization』の内容をベースに、DevOpsについて話します。既にご存じの内容もあるでしょう。ただ、何が驚きかというと、トヨタの現場管理者ならすぐに理解・共感できる内容です。

それから、昨日すばらしい講演をしたケント・ベック氏のように、私も生成AIを使ったバイブコーディングに取り組んでおり、非常に楽しく過ごしています。昨年学んだことを共有したいと思います。

DevOpsのビジネス価値は我々の想定よりさらに高い

先ほど、ニコール・フォースグレン博士とジェズ・ハンブルと進めた研究についてお話ししました。ジェズは『継続的デリバリー』の著者で、私達は『The DevOps ハンドブック』を共著しました。

私たちは2013年から2019年まで、6年間の間に3万6000人を対象に調査を行い、高業績な組織はどのような状態で存在するのか、ハイパフォーマンスの実態を調べました。結果は6回とも同様 ── ハイパフォーマンスな組織は存在し、そうでない他者をはるかにしのぐということでした。

その判断基準とは?

私たちが発見したのは、ハイパフォーマーは1日に複数回デプロイしているということです。他者と比べて、頻度が2桁多いのです。もっと重要なのは、デプロイにかかる時間の短さです。バージョン管理システムでコードをコミットしてから、統合してテストしてデプロイするまでの時間 ── つまり顧客に届くまでです。

1時間以内であることが分かりました。リードタイムの違いが2桁なのです。

しかも作業が速いだけでなく、結果も伴っています。彼らがデプロイを行う時に失敗する確率はどの程度なのでしょうか。業務に支障が出る重大度1(SEV1)のインシデントの発生率は? その可能性は7分の1なのです。

そしていざ何かが起きた時は ── 失敗は必ず起こるものだと言いますからね ── 1時間以内に解決できるのです。これは他者と比べて3桁も短い障害復旧時間になります。

スティーブン・スピアー博士がトヨタ方式を研究していた時、トヨタは生産性が4倍だと分かりました。床面積とサイクル時間は半分にも関わらず、生産物は2倍なのです。ここではそれが4倍どころか、100倍、1000倍なのです。ケント・ベック氏も言っていましたが、ソフトウェアのすばらしいところです。

品質についても多角的に見てきました。ハイパフォーマーは情報セキュリティの目標を日々の業務に取り入れているため、セキュリティ問題の修正に費やす時間は半分でした。

2014年に私たちは別のことに目を向け始めました。これらのハイパフォーマーは技術的に優れていただけでなく、あらゆる指標で数値が高かったのです。

収益性や市場シェア、生産性の目標を上回る可能性は2倍でした。組織が政府機関や軍などといった非営利団体であっても同じことが言えて、組織とミッションの目標を達成する可能性が2倍でした。顧客満足度や量と質の目標においても同様です。

これらはあることを示唆しています。価値の提供やミッションの達成にも、テクノロジーのバリューストリームと同じ作業が必要なら、DevOpsの原則やパターンはその目標達成に役立ちます。

もう1つの興味深い指標は、このような業績の高い組織では、従業員が勤務先をいい職場として同僚や友人に薦める確率が2倍でした。

"従業員ネットプロモータースコア(eNPS)"という ── 収益性や収益成長率と深い相関関係にある指標です。ですから、デプロイができない組織やしづらい組織だと、友人に自分の職場を薦めたいとは思わないということでしょう。

DevOps Enterprise Summit ─ あらゆる業界での実践事例

数字を超えて、これが示唆するのは、私たちはいかに安全かつ迅速に、高い信頼性を持って確実に、サービスの提供対象の目標、夢、願望を達成するかが大事なのです。

この11年間 ── "DevOps Enterprise Summit"というカンファレンスを運営してきました。カンファレンスの目的は、大規模で複雑な組織が、FacebookやAmazon、GoogleやMicrosoftと同じように勝利をつかむためのパターンを示すことでした。

補足 DevOps Enterprise Summitは現在、Enterprise Technology Leadership Summitに名称変更されています。

数多くのテクノロジーリーダーたちに、どうやってDevOpsを使って市場で勝ってきたかを共有してもらいました。私のお気に入りを一部紹介します。

こちらの男性はMike Carr氏で、ヴァンガード社のCTOです。

ヴァンガードは投資信託を普及させた会社で、9兆5000億ドルの資産を運用しています。1万人以上いる技術者の開発生産性を向上させることによって、先程私がお話しした指標をすべて達成しています。

それによって投資家に価値を ── 投資家というのはつまり、彼らの投資信託を買う人たちですね ── 彼らに価値を還元しています。

お次は世界有数の製薬企業ファイザーのJamie Hook氏です。

彼らの開発生産性の向上は、ある協力関係がきっかけでした。エンジニアリングのVPであるMike Lamb氏と、CISOだったBrian Cincera氏によるものです。

目的は生産性だけでなく、安全性も高めることでした。紹介してくれた開発者の支援方法が驚きで、研究開発、販売、マーケティング、流通など所属する組織に関わらず、重要な社会的目標を達成する支援を行っていました。

補足 Brian Cincera氏は2024年にファイザーを離れています。

皆さんはこう思っているでしょうか ── "よくある話だ"。

では、海軍大佐の例はどうでしょう?

現在は准将ですが、当時は大佐でした。彼はイージスミサイル防衛システムの責任者だったのですが、海上にいる船のソフトウェアをアップグレードする必要がありました。なのに8年も待つしかなく困っていました。

ソフトウェアをアップグレードするには、鋼鉄の穴や隔壁を切り開き、コンピューターを運び出す必要があったためです。

ですが今ではDevOpsパターンにより、海上にいる船を2隻同時にアップグレードできます。

紅海にいる船も含めてです。1970年代に造られた船でこれが実践できたのですから、ほぼどこでもできるはずです。

こちらは米国トヨタのKishore Jonnalagedda氏です。彼は工場の現場にDevOpsのパイプラインを構築し、工場の業務だけでなく、セールス、マーケティング、ポストセールスサービスなどの業務の何百ものアプリケーションを効率化しました。DevOpsの有効性を示しています。

彼いわく、トヨタウェイのおかげで改善の文化が築きやすかったそうです。もちろんトヨタでは"カイゼン"の概念が根づいており、ITの人たちも日々の業務を改善しやすい環境ではあります。

私が一番気に入った事例は、こちらかもしれません。シーメンスのThomas Jachmann氏のケースです。

彼はCTスキャナーのソフトウェアの責任者です。CTスキャナーは病院の画像診断部門に6000台も納入されています。

彼が解決したかった問題は、現場でソフトウェアをアップグレードする認証を得るには6ヵ月という長い期間を要することでした。

そこで彼はテスト自動化への投資を始めました。自動テストであれば、好きなタイミングで認証の段階へと進められます。

認証にはまだ数ヵ月かかりますが、認証が下りるかどうかは技術の問題ではありません。ただ、頻繁なアップグレードの土台はできます。

これが重要だと思う理由は、CTスキャナーで撮る際の出力電力というのはソフトウェアで制御されているからです。

安全性に関わり、重要です。

"うちではDevOpsは無理"と言う友人や同僚がいたら、"どこでもDevOpsは可能"と思い直してほしいのです。

困難でも成功した事例はたくさんありますからね。

過去4年間で得た教訓

スティーブン・スピアー博士と仕事でご一緒したことは先程お話ししました。彼との出会いは約10年前にさかのぼります。MITスローン経営大学院のワークショップに参加した時でした。

有名な方ですが、その理由の1つは1990年代の彼の研究で、彼はトヨタ生産方式を深く掘り下げた第二世代の研究者グループの一員でした。

彼らのような人たちのおかげで、アンドン、カイゼン、現場ウォークなどは海外でも通用する言葉となり、トヨタの手法を学ぶ際に役立っています。

補足 「アンドン」はトヨタ生産方式における異常の見える化のための仕組みです。トヨタ自動車公式サイトに詳細があります。

1999年に彼は、最も広くダウンロードされたハーバード・ビジネス・レビューの記事を執筆しました。

タイトルは「トヨタ生産方式の"遺伝子"を探る」です。

補足 原題 "Decoding the DNA of the Toyota Production System" の邦訳は https://dhbr.diamond.jp/articles/-/3743 に掲載されています。

私はこちらを2001年に読み、そのすばらしさに驚嘆しました。

彼はこう述べていました ── "3000〜5000人の人間がトヨタの工場で働いているとしたら、その全員が科学者集団の一員で、絶えず検証と改善に努めている"。

よく覚えている言葉です。10年後に彼と仕事をできる日が来るとは、当時は思いもしませんでした。

彼とどんなことに取り組んだかと言うと、『Wiring the Winning Organization』という本を書きました。

補足

邦訳『Wiring the Winning Organization 成功する組織を導く3つのメカニズム』(日本能率協会マネジメントセンター)

私たちの目的は ── まずは驚きますよね。なぜスティーブン・スピアー博士と私なのかと。

彼はハードウェアと製造業、私はソフトウェアの出身。

一見、話が合わなさそうです。ですが、私たちが読んできた本や論文を見ると、かなり重なっており、私たちは疑問を持ちました。

次のものの共通点は? ── アジャイル、DevOps、トヨタ生産方式、リーン生産方式、安全文化。

そして私たちが導き出した結論は、いずれもより大きな全体の不完全な表現であり、3つのメカニズムがそれらを結びつけているのです。

この点を明確にするために、勝つ組織が持つ"魔法"の3つの側面をシェアしたいと思います。

魔法の側面① ── 必要なものが手に入る

まず1つ目の側面というのは、誰もが常に重要な問題に取り組んでいます。

平行して行っているのが理想です。必要な時に、必要なものが手に入るからそれが可能なのです。適切な形式とタイミングで、適切な関係者から手に入るのです。例えばどんなものかと言うと、情報や承認、要件や決定権、テスト結果、生産ログなどがそうです。

その重要性を理解するには、魔法がない状態を想像します。つまり、誰もが行き詰っている状態です。必要なものが適切な形式とタイミングで手に入らないのが原因で、皆に尋ねて探し回るしかありません。だから小さな取り組みでも英雄的な努力を要するのです。

これがどれだけ重要なことかを提唱するために(ダメな例として)、「The Checkbox Project」という論考を友人たちと書きました。著書『The DevOps 逆転だ!』に近いものです。

補足 「The Checkbox Project」は、2023年にIT Revolutionが主催したDevOps Enterprise Forum(3日間のリトリート形式)での議論をもとに生まれたガイダンスペーパーです。

本稿のベースとなったのは、実際の出来事です。ある大企業で「サービスにシンプルなオプトイン用チェックボックスを追加する」という一見単純なタスクが、構想から完成まで12ヶ月かかり、コストが2,800万ドル超に膨れ上がりました。この実例をケーススタディとして、組織の「配線の仕方」がいかにパフォーマンスを左右するかを解説しています。

著者はApple・John Deere・Scaled Agileなど多様な組織のリーダー6名(Kamran Kazempour、Chris Hill、Steve Pereira、Dean Leffingwell、Amy Willard、Gene Kim)による共同執筆で、2023年9月26日にFall 2023 DevOps Enterprise Journalの一部として公開されました。

The Checkbox Project 入手先 https://itrevolution.com/product/the-checkbox-project/

この話のプロジェクトの目標は、1つのチェックボックスを表示することです。

何百万もの顧客に表示され、それにチェックを入れると、顧客は月額5ドルのサービス契約を結ぶことになります。

問題はそれが4つの顧客チャンネルにまたがり、20のチームによる作業が必要な点です。CEOレベルのサポートを必要とし、連日行われる作戦会議には12ヵ月で2800万ドルかかると見積もられています。さらなる問題は、プロジェクトが成功すると思っている人が20%しかいないという点です。

なぜなら過去2回は失敗したからです。

チェックボックスの表示は技術的に難しいことではありません。実際に大変なのは、調整やコミュニケーション、優先順位づけやスケジューリング、政治工作や説得、エスカレーションなどです。誰も必要なものが得られないとこうなります。これが魔法の1つ目の側面です。

魔法の側面② ── 弱いシグナルが検知される

次に2つ目を紹介します。

至る所で活発なフィードバックループが機能し、些細な失敗シグナルでも検知され、増幅されます。そうすれば迅速な対応でミスを防いだり、修正したりできます。このフィードバックを通して人々は学び、上達し続けられます。ただ、それはフィードバックが適切な人に、適切かつ実行可能な形式で届いた場合に限ります。

再び重要性の確認のため、魔法がない事態を想像します。フィードバックループが弱いか、遅いか、存在すらしない状態です。あるいは間違った人に届く状態です。

それだと失敗が検出されないので、時間の経過とともに拡大してしまいます。小さな問題が雪だるまのように膨らむのです。

シグナルは生成されるものの、システムで抑制されてしまうか、消されるケースもあり得ます。

悪いニュースを伝えると嫌な目に遭うような組織だと、それを恐れてこういうことが起こります。良くありませんよね。これが魔法の2つ目の側面です。

魔法の側面③ ── 計画と実践に十分な時間がある

そして最後の3つ目です。

計画、実践、実験、改善のための十分な時間が確保された状態です。

最も危険かつ重要な事態は、稼働してからではなく、リスクが低い計画と実践の段階で起こるのが理想的です。そうすればやり直しが容易なだけでなく、安全に失敗し、学び、改善することもできます。

そうやって教訓を得ていくことで、より良い仕事につながります。

ここで再びこの重要性を理解すべく、最も重要な作業をすべて本番稼働後に行うしかない事態を想像します。

元に戻すことも、やり直すこともできず、小さなミスが大きな失敗を引き起こします。学べるような状況でもありません。

スピードアップのために一度ペースダウンする時間も、『ノコギリの刃を研ぐ』ために手を止める時間もありません。

明らかにそれは良くない状態で、11年前に発売した『The DevOps 逆転だ!』でも語られている話です。

補足 「ノコギリの刃を研ぐ(Sharpen the Saw)」はスティーブン・R・コヴィーの『7つの習慣』における第7の習慣。生産性を高めるために、あえて手を止めて自分自身を磨く時間を取ることの重要性を説いています。

3つのレイヤー ── 作業の構造を理解する

さて、この3つの側面に名前をつけて説明しますが、先にもう1つお伝えしておきます。

これは最初にスピアー博士が類型化した内容で、私は重要だと思っていませんでした。ですが徐々に重要性が分かってきて、世界の見え方まで変わりました。

私たちが提唱するのは、作業には3つのレイヤーがあるということです。

レイヤー1 は目の前の作業対象です。たとえば患者だったり、取り組んでいるコードだったり、本番環境で動くバイナリだったりします。

レイヤー2 は私たちが使うツールや技術です。たとえばMRI装置、CTスキャナー、X線装置、IDEなどです。Kubernetesプラットフォームもですね。

しかし製造業やソフトウェアで鍵を握るのは レイヤー3 で、社員やチームを編成する役割がある管理システムです。ここで誰と誰が話すかが決まります。その頻度や内容、形式についてもここで決まるのです。

製造業の組織における非常に有名な事例をスピアー博士から教わりました。レイヤー1とレイヤー2は何も変えなかった事例です。

北カリフォルニアのフリーモントに非常に有名な製造工場があります。

ゼネラルモーターズの工場だった頃は、北米どころか世界トップクラスの業績の悪い自動車工場でした。

GMとトヨタの合弁会社の拠点となり、2年も経たないうちに日本の工場レベルの業績をたたき出しました。人も床面積も設備も、何一つ変えていません。

レイヤー1とレイヤー2は変化なしで、唯一変わったのがレイヤー3でした。

私たちの業界では、ソフトウェアアーキテクチャに当たります。リーダーが定める部分です。

一度にたくさんの仕事をするのか、小さく分けて仕事をするのか? フィードバックのスピードは?

レイヤー3は非常に重要だとお伝えしておきます。

補足 この工場はNUMMI(New United Motor Manufacturing, Inc.)として知られ、1984年にGMとトヨタの合弁事業として設立されました。同じ労働者、同じ設備でありながら、トヨタ生産方式の導入により劇的に業績が改善した事例として、経営学の教科書にも登場する有名な事例です。

カウチのメタファー ── DevOpsの本質

製造業でもソフトウェアでも、良いシステムを作るには3つの方法があります。

魔法の3つの側面が目指すのは、弱いシグナルを増幅できるかどうか、スピードアップのためにシステムをスローダウンできるか、そしてシステムを分割することで簡素化できるかです。

小難しく聞こえますよね。スティーブン・スピアー博士との研究で、最も鮮明に感じた話をここでご紹介します。

2人でカウチを動かす話です。スティーブとジーンです。

スティーブとジーンが行っているのは、ただの肉体労働で、頭は使わないと思うかもしれません。

しかし、2人で解決しなければならない問題が実はいくつも隠れています。

例えば、カウチの重心はどこか。狭い出入り口を通るにはどう回るべきか。狭いくねった階段を通るには誰が先に行くべきか。体は向き合うべきか、などです。

ただ、コンサルタントもフォーカスグループもここでは必要ありません。

試行錯誤と素早いフィードバック、そして何よりコミュニケーションと調整により、2人は確実に目標を達成するでしょう。

しかしリーダーの力で、彼らの仕事はもっと難しいものにできます。

1つは電気を消すことです。

作業にかかる時間が増え、危険度が増し、カウチや部屋、自分の体を傷つける可能性があります。

他にも様々な方法で変化を加えることができます。

大きなサイレンや大音量の音楽といった雑音を流してみたり、

スティーブとジーンが直接会話できないよう仲介人を送り込んだりもできます。

すると突然、スティーブとジーンがカウチの移動に失敗する姿が想像できます。

なぜなら、問題を解決するのに必要なはずの情報が手の届く範囲にないからです。

要するに、これこそがDevOpsの本質です。

2000年代にデプロイが非常に複雑になり、開発と運用がJiraチケットや要件定義書、プロジェクトマネージャーを介してしかコミュニケーションできなくなると、突然、目標達成に必要な帯域幅が不足してしまうのです。

開発と運用に限らず、技術とビジネスの間、研究開発とマーケと営業など、あらゆるチーム間でです。

スティーブとジーンのカウチ移動は、共同作業における問題解決のメタファーで、彼らのチームとしての成果に焦点を当てています。

リーダー次第で、彼らの仕事は簡単にも困難にもなります。

このカウチは2つのコンセプトを表していると思っています。

1つ目は コヒーレンス(Coherence) です。

スティーブンとジーンはどこまで一体として機能できるでしょうか?

直接話すことができない状況では、もはやチームではなく、ただのカウチを個々に支える2人です。

2つ目は 密結合(coupling) です。

2人でカウチを動かす作業は、2人が2つの椅子を別々に動かすのとは違います。

椅子が2つなら、コミュニケーションや調整は不要です。狭い出入り口を同時に通る時は別ですよ。

私たちが取り組むことの多くは、他のチームと連携して行います。例えば、大規模なカンファレンスの場で何かのプランニングに参加するとします。

何千人もの人が集まってコンテキストを共有し、方向性を決めるのはすてきなことですが、日常業務では行いたくありません。

何千人もの人間が連絡を取り続けて調整するなんて無理です。

代わりに必要なのが、カウチの分割です。

常に連絡と調整に追われることなく、独立して仕事ができるようにするためです。


後編に続きます

後編では、このすばらしいシステムを構築する3つのテクニック ── 巧遅(前倒し)化(Slowification)単純化(Simplification)増幅(Amplification) ── について、具体的な事例とともに紹介します。さらに、Gene Kim氏自身が体験した生成AIとバイブコーディングの世界についてもお話しします。

後編はこちら tech.findy.co.jp

今年も開催します!(名前変わります)

『継続的デリバリーのソフトウェア工学』著者 Dave Farley氏と和田 卓人氏の登壇が決定!

スポンサー募集中です。(残り僅か!)

prtimes.jp

We're Hiring

ファインディでは一緒に会社を盛り上げてくれるメンバーを募集中です。 興味を持っていただいた方はこちらのページからご応募お願いします。

herp.careers

Findyの爆速開発を支えるAIエージェントによる並列実装【Issue × Worktree × Agent Teams 】

こんにちは。ファインディ株式会社でテックリードマネージャーをやらせてもらっている戸田です。

ファインディでは要件定義から設計・タスク分解・Issue生成までをAIに任せるカスタムコマンドを開発しています。

tech.findy.co.jp

今回は、そのコマンドで生成したIssueをAIエージェントに渡したときに、どう並列実装まで自動化しているかを紹介します。Git worktreeとClaude CodeのAgent Teamsを組み合わせることで、依存関係を考慮しながら複数のIssueを並列にPR作成まで進められます。

Git worktreeとは

Git worktreeは、1つのGitリポジトリを複数のディレクトリで同時にチェックアウトできる機能です。

通常のブランチ切り替えと異なり、メインの作業ディレクトリはそのままに、別のディレクトリで別のブランチを並行して操作できます。

# worktreeの作成
git worktree add .worktrees/feature/add-auth -b feature/add-auth main

# worktreeの一覧表示
git worktree list

# worktreeの削除
git worktree remove .worktrees/feature/add-auth

エージェントごとに独立した作業ディレクトリを持てる点が、並列実装との相性が良い理由です。あるエージェントの変更が別のエージェントの作業ディレクトリに影響しません。

依存関係グラフで実行レイヤーを決定する

この仕組みを使うには、GitHubのIssueが次の構造になっている必要があります。

  • 親IssueにGitHubのSub-issue機能でSub-issueが紐づいていること
  • Sub-issue間の依存関係がGitHubのIssue依存関係機能(blocked_by)で設定されていること

docs.github.com

具体的には次のような構造です。

#200 ユーザー認証機能の実装(親Issue)
├── #201 テーブル作成
│   ├── #202 サービス実装
│   │   └── #204 APIエンドポイント
│   └── #203 テンプレート実装
└── #205 ドキュメント更新

並列実装で最初に解決しなければならない問題は「どのIssueを先に実装するか」です。Sub-issue間に依存関係がある場合、順序を間違えると後続の実装が破綻します。例えばテーブルが存在しない状態でサービス層を実装しようとしても、マイグレーションが走っていないためテストが通らず、PRを作るところまで辿り着けません。人間が実装するときも依存関係の順序は意識しますが、複数のエージェントが並列で動く場合は「誰がどの順番でどれを実装するか」を明示的に制御する仕組みが必要になります。

この依存関係をもとに、並列実行できるIssueのグループ(レイヤー)を計算します。

  • Layer 0: 依存なし → 全て並列実行可能
  • Layer N: Layer N-1 以前のIssueにのみ依存 → Layer N-1 完了後に並列実行

例えば5つのSub-issueがある場合、次のような実行計画になります。

依存関係グラフ:
#201 テーブル作成 ─┬→ #202 サービス実装 ─┬→ #204 APIエンドポイント
                   └→ #203 テンプレート ─┘
#205 ドキュメント更新(独立)

Layer 0(並列実行):  #201, #205
Layer 1(並列実行):  #202, #203  ← Layer 0 完了後
Layer 2:             #204        ← Layer 1 完了後

この実行計画をユーザーに提示し、確認を得てから実装を開始します。循環依存が検出された場合はエラーを報告して中止します。

Claude CodeのAgent Teams機能

この仕組みはClaude CodeのAgent Teams機能を基盤として構築しています。

code.claude.com

Agent Teamsは、複数のClaudeセッションがチームとして協調して動作するための機能です。Team Leadがタスクを作成して各Workerに割り当て、WorkerはSendMessageでTeam Leadに進捗を報告しながら並列で作業を進めます。なお、執筆時点では実験的な機能のため、利用するには設定での有効化が必要です。

Team LeadとWorkerの役割分担

実行はTeam LeadとWorkerというエージェントの役割分担で行います。

  • Team Lead: 依存関係グラフの構築、タスクの作成と事前割り当て、Workerの起動・停止、レイヤー間の同期(merge-gate)を担当する。コードは実装しない
  • Worker: 割り当てられたIssueのworktreeを作成し、実装・セルフレビュー・PR作成まで一貫して行う

Team Leadはオーケストレーターに徹し、Workerのworktreeに対してコマンドを実行したり、コードを直接編集したりしません。Workerからの報告を受動的に待つだけです。

IssueごとのWorktreeで並行実装を実現する

各WorkerはアサインされたIssueごとにworktreeを作成し、独立したディレクトリで実装を進めます。worktreeはリポジトリ内の.worktrees/exec-issues-{親Issue番号}/issue-{Issue番号}/以下に配置され、作業が完了したら削除されます。

git worktree add ".worktrees/exec-issues-200/issue-201" -b "issue-201/テーブル作成" main

複数のWorkerが同時に動いていても、それぞれが独立したworktreeを持つため互いの作業が干渉しません。あるWorkerがファイルを編集しても別のWorkerの作業ディレクトリには影響がなく、並行実装が安全に行えます。

tmuxやiTerm2を使っている場合、Workerの起動と同時にペインが追加されます。並行実装中のWorkerがそれぞれ別ペインで動いている様子をリアルタイムで確認できるため、全体の進行状況を把握しやすくなっています。

同一レイヤー内の並行IssueがどのファイルをPATCHするかは事前にわかりません。そのため、Workerのタスク情報に「同一レイヤーで並行実装中のIssue一覧」を含め、ファイル競合リスクをWorkerが意識できるようにしています。

merge-gateによるレイヤー間の同期

レイヤー間の依存関係を守るために、merge-gateという仕組みを新たに追加しました。

Layer 0のWorkerが全員PRを作成し終えたら、Team LeadはLayer 1のWorkerを起動する前にmerge-gateを処理します。merge-gateでは、Layer 0で作成された全PRのマージ状態をチェックし、未マージのPRをユーザーに通知して待機します。

全PRがマージされたことを確認してからdefaultブランチを最新に更新し、Layer 1のWorkerを起動します。この仕組みにより、後続レイヤーのWorkerは常に最新の状態をベースに実装を始められます。

タスクの依存関係で表現すると次のような構造です。

[impl] #201 ─┐
             ├→ [merge-gate] Layer 0 ─┐
[impl] #205 ─┘                        ├→ [impl] #202
                                      └→ [impl] #203

merge-gateタスクはTeam Lead専用で、Workerはclaimしません。

Workerの実装フロー

各Workerは割り当てられたタスクを順番に処理します。

  1. タスク詳細(Issue番号・タイトル・親Issueの文脈)を読み取る
  2. worktreeを作成して環境をセットアップする
  3. (PLAN_APPROVALが有効な場合)実装計画をTeam Leadに送信して承認を得る
  4. Issueの内容に従って実装する
  5. セルフレビューを実施し、修正提案をTeam Leadに送って承認後に適用する
  6. PRを作成してTeam Leadに結果を報告する
  7. worktreeを削除してクリーンアップする

全タスクを処理し終えたらTeam Leadに完了を報告して終了します。

Workerの実装フローを表すシーケンス図

まとめ

今回紹介した仕組みのポイントは次の3点です。

  • Sub-issue間の依存関係をもとにレイヤー分けし、同一レイヤーのIssueを並列実行する
  • merge-gateでレイヤー間のPRマージを確認してからdefaultブランチを更新し、後続レイヤーに進む
  • IssueごとにWorkerとworktreeを対応させることで、並行実装の干渉を防ぐ

Sub-issueに依存関係を設定した親Issueを用意して指示するだけで、実装の順序管理からPR作成まで自動で進みます。複数の施策を同時に走らせることへの心理的なハードルが下がり、並行して進められる開発の幅が広がりました。


ファインディでは一緒に会社を盛り上げてくれるメンバーを募集中です。興味を持っていただいた方はこちらのページからご応募お願いします。

herp.careers

ファインディのKPIダッシュボードを支えるLookerと段階的データモデリング戦略

こんにちは。ファインディでデータエンジニアをやっている開(hiracky16)です。

ファインディでは事業の成長に伴い、スプレッドシートで管理していたKPIダッシュボードの複雑さが限界を迎えつつありました。この記事ではLookerを導入し、derived_table→mart→dim/factと段階的にデータモデリングを進化させてきた過程を紹介します。ファインディが大切にしているバリューの一つであるスピードを損なわずにガバナンスを整えていくノウハウとして、参考になれば幸いです。

ファインディにおけるKPIダッシュボードの重要性と複雑性

ファインディは主に4つの事業と8つのサービスを展開しています。事業ごとに追うべきKPIが異なるため、事業部内のメンバーはもちろん、複数チームや事業を横断して見る部長や役員にとっても、各事業の健康状態を把握できるダッシュボードの必要性が以前と比べて増しています。事業によって売上が発生するまでの経路やリードタイムが異なり、ユーザーや企業を独自のセグメントで切り分けて分析する必要もあります。こうした複雑さは事業が成長するごとに増していきます。

たとえばファインディの祖業である転職事業では、職種・経験年数・アクセス頻度などといった属性値をもとに多軸で分析を行っています。さらに、転職に至るまでにはスカウト・応募・面談といった複数のファネルが並行して進むため、単純な線形のファネル分析では実態を捉えきれない難しさがあります。

Looker導入の背景

こうした重要性や複雑性を踏まえつつ、既存のスプレッドシートとBigQuery構成でKPIを管理する方法にはいくつかの課題が生じていました。

まず、事業やチームごとにスプレッドシートが増え続け、それぞれが独自フォーマットで作られているため、チームを横断した利用ができない状態でした。期が変わるたびに指標が追加されていくと、今期追うべき指標の整理も難しくなります。さらに、スプレッドシートごとにセグメントの切り方や集計ロジックが異なり、同じ指標のはずなのに数値が一致しないといった問題も起きていました。加えて、データ量の増加に伴いスプレッドシートの表示速度が低下し、売上管理の集計結果表示で障害が発生するなど、安定性の面でも限界が見え始めていました。

こうした課題を解決するために、LookMLで指標定義をコード管理しGitHubでレビューできるLookerを導入しました。BigQueryとネイティブに連携できるためデータ量が増えても表示速度が安定すること、チーム内にLookerの経験者がいて立ち上げコストを抑えられること、そしてGoogleの担当の方による丁寧なPoCで運用イメージが具体化できたことが導入の決め手になりました。

段階的なデータモデリングの最適化

導入後、まずは主要なKPIがLookerに集まっている状態を目指しました。ただし、利用者がBIツールに求めているのはいち早く事業数値を確認することであり、指標の定義を統一したいというデータチーム側の課題意識とは温度差があります。スプレッドシートからの移行でスピード感を落とさないことを重視しつつ、段階的にデータモデリングを進化させていきました。

全体の流れを図にすると次のようになります。

段階的なデータモデリングの全体像

derived_tableからの出発

最初のステップとして採用したのが、LookMLのderived_tableです。derived_tableはSQLベースでビューを定義できるため、BigQueryのSQLに慣れ親しんだメンバーにとってはダッシュボードやLook構築までのリードタイムが最も短い方法でした。ファインディではデータ変換にDataform(プロジェクトによってはdbt)を使っていますが、LookMLとは別リポジトリで管理する必要があり、両方を行き来すると開発速度が落ちてしまいます。その点derived_tableであればLookMLリポジトリだけで完結するため、スプレッドシートからの移行初期にはこの手軽さが大きな武器になりました。

一方で、derived_tableはExploreが実行されるたびにBigQueryへクエリが走るため、データ量が増えるにつれて表示速度が遅くなり、クエリコストもかさむという課題が見えてきました。

たとえばDAU(Daily Active User)を集計するビューは次のようなイメージです。

view: daily_active_user {
  derived_table: {
    sql:
        WITH calendar AS ( ... ),
        page_view AS ( ... ),
        users AS ( ... )
        SELECT calendar.report_date,
            users.user_job_segment,
            users.user_id
        FROM calendar
        LEFT OUTER JOIN page_view ON ...
        LEFT OUTER JOIN users ON ...
    ;;}

  dimension_group: report { ... }
  dimension: user_job_segment { ... }

  measure: dau { ... }
}

explore: daily_active_user {}

martレイヤーの導入

derived_tableの課題を解消するため、SQLのロジックをDataformへ移行し、事前に計算済みのmartテーブルとしてBigQuery上に実体化しました。LookML側はderived_tableのSQL定義を削除し、sql_table_nameでmartテーブルを参照する形に書き換えます。Exploreからは計算済みのテーブルを読むだけになるため、表示速度とクエリコストの両方が改善されます。

先ほどのDAUの例をmartに移行すると、LookML側は次のようにシンプルになります。

view: daily_active_user {
  sql_table_name: `project.mart.daily_active_user` ;;

  dimension_group: report { ... }
  dimension: user_job_segment { ... }

  measure: dau { ... }
}

explore: daily_active_user {}

derived_tableのSQL定義がなくなり、sql_table_nameでmartテーブルを参照するだけになっています。ただし、martテーブルはスケジュール実行で更新するため、データの鮮度には注意が必要です。先ほどのDAUの例であれば日次の集計で十分なので、Dataformのスケジュール実行で一日一回テーブルを更新しています。

dim/factモデルへの移行

martテーブルが複数できあがってきたタイミングで、ディメンショナルモデリングへ進みます。ここで重要なのは、すでに動いているレポートが複数ある状態でモデリングを行うことです。実際のレポートから共通する軸を抽出できるため、机上の設計よりも実態に即したモデルを組み立てられます。

たとえば、先ほどのDAUレポートに加えて、コンバージョンを日次で追うレポートも職種セグメント別に組み立てられているとします。この場合、user_job_segmentは複数のレポートで共通して使われる適合ディメンション(Conformed Dimension)になります。日付軸も同様です。

こうした共通軸を整理していくと、ユーザーディメンション・カレンダーディメンション・ページビューファクトという形に分解できます。ディメンションとファクトに分けたことで、新しいレポートを追加する際も既存のディメンションを再利用でき、定義のばらつきを防げるようになりました。

分解後のLookMLは次のようになります。

# カレンダーディメンション
view: dim_calendar {
  sql_table_name: `project.dim.calendar` ;;

  dimension_group: report { ... }
}

# ユーザーディメンション
view: dim_user {
  sql_table_name: `project.dim.users` ;;

  # サロゲートキーを作成
  dimension: user_key { ... }
  dimension: user_job_segment { ... }
}

# ページビューファクト
view: fct_page_view {
  sql_table_name: `project.fct.fct_page_views` ;;

  dimension: user_key { ... }
  dimension: user_id { ... }
  dimension: access_date { ... }
  measure: dau { ... }
}

# コンバージョンファクト
view: fct_conversion {
  sql_table_name: `project.fct.fct_conversions` ;;

  dimension: user_key { ... }
  dimension: conversion_date { ... }
  measure: conversions { ... }
}

# Explore でディメンションとファクトを結合
explore: fct_page_view {
  label: "ページビュー分析"
  join: dim_calendar { ... }
  join: dim_user { ... }
}

explore: fct_conversion {
  label: "コンバージョン分析"
  join: dim_calendar { ... }
  join: dim_user { ... }
}

fct_conversionのExploreでもdim_calendardim_userをそのまま再利用しています。ファクトテーブルが増えてもディメンションを使い回せるため、定義の重複が起きません。

移行時のガードレール整備

dim/factモデルへの移行ではBigQueryのテーブル構造とLookMLの両方に修正が入るため、意図せずダッシュボードが壊れるリスクがあります。ファインディではDataform上でのmartテーブルとdim/factテーブルの整合性テスト、LookerのCIによるLookMLバリデーション、そしてLooker APIを使ったExplore実行テストの3つをガードレールとして整備しました。

zenn.dev

特にDataformやLookMLはClaude Codeなどのコーディングエージェントを活用して開発する場面が増えており、こうしたガードレールがあることで開発速度を維持しながら安全に移行を進められています。

データアナリストの自律化と利用状況の変化

導入から1年弱が経った現在、全体のダッシュボードのうち68%がデータエンジニア以外のメンバーによって作成されたものになりました。データアナリストや事業部のメンバーがExploreを使って自らダッシュボードを組み立てられるようになり、「データを見たいときにデータチームへ依頼する」というボトルネックが解消されつつあります。

利用率も好調で、登録ユーザーの約7割が毎週ログインしてダッシュボードを確認しています。ただしLookerはライセンス費用がかかるため、現時点ではアカウントを発行できているのは一部のメンバーに限られています。今後はアカウント数を増やしつつ、SQLを触れないメンバーにもExploreを使って独自のコンテンツを作ってもらえるよう支援を広げていきたいと考えています。

こうした利用状況の把握にはLookerのSystem Activityを活用しています。System ActivityはLooker自体の利用データをそのままExploreとして扱えるため、誰がどのダッシュボードをどれくらい使っているかを日々モニタリングできます。Lookerは高機能な分コストもかかるからこそ、利用状況を定量的に可視化して成果をアピールし続けることが重要です。

まとめ

derived_table→mart→dim/factと段階を踏むことで、利用者のスピード感を損なわずにガバナンスを整えられました。ダッシュボードの68%がデータエンジニア以外のメンバーによる作成となり、データチームへの依頼ボトルネックの解消につながっています。

また整えた指標をチームや事業を越えて利用するシーンも増えてきた反面、モデリングの変更が広範囲に影響するようになりました。ガードレールの重要性は今後さらに増していくと感じています。LookMLで指標定義を整えてきた土台は、Lookerの会話分析のような生成AI機能の精度にも直結するため、モデリングの品質を高め続けることがデータ活用全体の鍵になると考えています。

ファインディでは絶賛データエンジニアを募集中です。 LookMLを使ったガバナンス強化やファインディの展開している事業領域におけるデータモデリングに興味を持っていただいた方はこちらのページからご応募お願いします。

herp.careers

設計の意思決定を「感覚から根拠へ」──3アーキテクチャ並列設計の仕組み

こんにちは。ファインディ株式会社でテックリードマネージャーをやらせてもらってる戸田です。

ファインディでは要件定義から設計・タスク分解・Issue生成までをAIに任せるカスタムコマンドを開発しています。前回の記事ではコマンドの全体フローを紹介しました。

tech.findy.co.jp

AIにタスク分解やIssueを作成してもらうには、先に実装方針を明確にする必要があります。方針が固まっていないと、生成されるタスクの粒度や設計の一貫性がブレてしまうからです。このコマンドの設計ステップでは、3つのアーキテクチャアプローチを並列で設計し、トレードオフを比較して最適な方針を選択します。

本記事では、その設計ステップに焦点を当て、3つのアーキテクチャ案を並列で設計してトレードオフ比較で選ぶ仕組みを紹介します。

コードベースの並列探索

コマンドを実行すると、まず3つのエージェントが並列でコードベースを分析します。

既存のコードベースを理解するため、Claude Codeの公式Pluginであるfeature-dev にある code-explorerエージェントを活用します。このエージェントはプロジェクトの構造やパターンを自動的に分析して実装に必要な情報を収集します。feature-devプラグインをインストールするだけでcode-explorerエージェントを利用できるようになります。

要件を分割して複数のcode-explorerエージェントを並列で起動します。各エージェントが特定の観点からコードベースを探索して必要な情報を収集します。

実際の実行ログは次のとおりです。

⏺ Phase 2: コードベースの探索

  既存のコードとパターンを理解するため、複数のcode-explorerエージェントを並列で起動します。

  Running 3 feature-dev:code-explorer agents… (ctrl+o to expand)
   ├─ Explore user registration architecture · 12 tool uses · 29.1k tokens
   │  ⎿  Search: **/models/admin*.py
   ├─ Explore admin API patterns · 12 tool uses · 27.6k tokens
   │  ⎿  Read: main.py
   └─ Explore CSV and file handling · 10 tool uses · 17.0k tokens
      ⎿  Search: **/api/routes/**/*.py

3つの探索結果は統合され、既存のユーザー登録処理のパターンやCSVファイル処理の実装有無、管理者APIの構造といった知見が次の設計フェーズに引き渡されます。コードベースを自分で読んで回るよりも短時間で、設計に必要な情報を網羅的に集められます。

3アーキテクチャ並列設計の仕組み

このコマンドの中核となるのが、1つの機能要件に対して3つのアーキテクチャ案を同時に設計する仕組みです。コードベース探索の結果を受け取った3つのエージェントが、それぞれ異なる方針で設計を並列に進めます。

Claude Codeの公式Pluginであるfeature-dev にある code-architectエージェントを活用します。このエージェントは設計方針を提案してくれます。開発者は提案された選択肢の中からプロジェクトに最適な実装方針を選ぶことができます。この選択により実装の方向性が確定します。

Running 3 code-architect agents...
├─ Design minimal change approach
├─ Design clean architecture approach
└─ Design pragmatic balance approach

最小変更アプローチ

既存コードを最大限活用して変更範囲を最小に抑える方針です。たとえばCSVインポート機能の追加であれば、処理ロジックをルートハンドラに直接実装することで新規ファイルを2個に抑えられます。

  • タスク数: 2個
  • メリット: 最速で実装できる。既存コードとの整合性が高く、レビューしやすい
  • デメリット: ハンドラが肥大化しやすい。処理ロジックの再利用が難しく、将来の拡張で追加実装が必要になる

緊急対応や短期のPoC、スコープを絞った小規模な機能追加に向いています。

クリーンアーキテクチャアプローチ

Parser・Validator・Serviceといった責務の分離を徹底し、将来の変更に強い構造を作る方針です。新規ファイルは7個ほどになりますが、各層を独立してテストでき、将来ExcelやJSONへの対応を追加する際も既存コードへの影響を最小化できます。

  • タスク数: 6個
  • メリット: 拡張性・テスタビリティが高い。ビジネスロジックの再利用が容易
  • デメリット: 初期実装に時間がかかる。抽象化レイヤーが増えるため、シンプルな変更でも影響範囲の把握が必要になる

長期的に保守・拡張する基盤機能や、複数のフォーマット・ユースケースに対応する予定がある場合に向いています。

実用的バランスアプローチ

サービス層を導入して責務をある程度分離しながら、Parser・Validatorの細かい分割は行わない方針です。新規ファイルは5個ほどになり、実装速度と保守性のバランスが取れています。

  • タスク数: 5個
  • メリット: 適度な抽象化で保守性を確保しつつ、最小変更よりも将来の拡張に対応しやすい
  • デメリット: クリーンアーキテクチャほどの柔軟性はなく、最小変更ほどのシンプルさもない

通常の機能開発にもっとも推奨されるアプローチです。即時の拡張予定はないが、一定の保守性は確保したいというケースに適しています。

トレードオフ比較と選択

3案が揃うと、次のような比較表が提示されます。

⏺ 3 feature-dev:code-architect agents finished (ctrl+o to expand)
   ├─ Design minimal change approach · 20 tool uses · 25.2k tokens
   │  ⎿  Done
   ├─ Design clean architecture approach · 26 tool uses · 41.0k tokens
   │  ⎿  Done
   └─ Design pragmatic balance approach · 0 tool uses
      ⎿  Done

⏺ 3つのアーキテクチャアプローチが完成しました。それぞれの特徴を整理してご提案します。

  3つのアプローチ比較

  1. 最小変更アプローチ (Minimal Change)

  特徴:
  - CSV処理をルートハンドラに直接実装(約150行の単一ファイル)
  - 既存パターンを最大限活用(teams.pyの部分成功パターン)
  - 新規作成ファイル: 2個(エンドポイント + テスト)

  メリット:
  - 最速で実装可能(2 PR、~650行)
  - シンプルで理解しやすい
  - 既存コードとの整合性が高い

  デメリット:
  - ルートハンドラが長くなる(~150行)
  - CSV処理ロジックの再利用が困難
  - 将来の拡張(Excel対応など)に追加実装が必要

  タスク数: 2個

  ---
  2. クリーンアーキテクチャアプローチ (Clean Architecture)

  特徴:
  - サービス層を導入して責務を分離
    - Parser(CSV解析)
    - Validator(バリデーション)
    - UserImportService(オーケストレーション)
  - 新規作成ファイル: 7個

  メリット:
  - 将来の拡張が容易(Excel, JSON対応)
  - テストが容易(各層を独立してテスト可能)
  - ビジネスロジックの再利用性が高い
  - 保守性が高い

  デメリット:
  - 初期実装に時間がかかる(6 PR、~730行)
  - 抽象化により複雑さが増す
  - シンプルなCSV処理に対してはオーバーエンジニアリングの可能性

  タスク数: 6個

  ---
  3. 実用的バランスアプローチ (Pragmatic Balance)

  特徴:
  - サービス層を導入するが、Parser/Validatorは分離しない
  - UserImportServiceで一元管理
  - 新規作成ファイル: 5個

  メリット:
  - 適度な抽象化で保守性を確保
  - 実装速度とコード品質のバランスが取れている
  - 将来の拡張もある程度対応可能

  デメリット:
  - クリーンアーキテクチャほどの柔軟性はない
  - 最小変更アプローチほどシンプルではない

  タスク数: 5個

数字だけでなく、各アプローチが「どんな状況に向いているか」も合わせて提示されます。チームの状況や緊急度、今後の拡張計画に照らし合わせてアプローチを選択します。

────────────────────────────────────────────────────────────
 ☐ Approach

どの実装アプローチを採用しますか?

  1. 実用的バランス (Recommended)
  2. 最小変更
❯ 3. クリーンアーキテクチャ
  4. Type something.

まとめ

3アーキテクチャを並列設計してトレードオフ比較で選ぶという手法は、設計の意思決定を「感覚から根拠へ」転換するひとつの形です。

この手法が特に効果を発揮するのはチームでの議論の場面です。3案と比較表が揃った状態でアーキテクチャの議論ができるため、「最小変更で進めるか、この機会にリファクタリングするか」という問いに対して、数字と具体的な設計イメージをもとに話せるようになりました。

大規模機能開発の設計に悩んでいるエンジニアやEMの方に、ぜひ試していただけると幸いです。


ファインディでは一緒に会社を盛り上げてくれるメンバーを募集中です。興味を持っていただいた方はこちらのページからご応募お願いします。

herp.careers

Findyの爆速開発を支えるAIによるタスク分解の粒度設計

こんにちは。ファインディ株式会社でテックリードマネージャーをやらせてもらってる戸田です。

ファインディでは要件定義から設計・タスク分解・Issue生成までをAIに任せるカスタムコマンドを開発しています。

tech.findy.co.jp

このコマンドの中にはAIがタスク分解を行うステップがありますが、分解の粒度が適切でなければ、実装がしやすいどころか混乱の元になります。大きすぎるタスクはレビューが困難になり、タスクを細かく分割しすぎると実装が中途半端でビルドが通らないPRが生まれます。

そこで、AIがタスクを分解する際の判断基準として、具体的なルールを定めました。この記事では、そのタスク分解ステップで使っているルールを紹介します。

AIのタスク分解の粒度が重要な理由

AIに実装タスクを分解してもらうとき、「タスクを小さくする」という方針だけを与えても、粒度の判断基準が曖昧では適切な出力は得られません。分割しすぎて中途半端なコードが生成されビルドが通らないPRが生まれたり、逆にまとめすぎて障害発生時にrevertの影響が広がりすぎたりします。

どちらも「revertの単位を意識していない」という同じ原因から来ているため、「revertできる単位か」という1つの軸を判断基準の中心に据えました。

タスク分解の基本原則

AIが設計するすべてのタスクは「独立してrevertできる最小の意味ある変更単位」であるべきです。具体的には次の4条件を満たします。

  • アプリケーションを壊さずにマージできること
  • 実装とテストが含まれていること
  • 他のタスクに影響を与えずにrevertできること
  • レビュアーが2〜3時間以内にレビューできること

この原則に沿うことで、障害が起きたときに「どのPRを戻せばいいか」の判断が明確になり、レビューの粒度も自然と揃います。

分割判断の3ステップフローチャート

AIは2つの変更(タスクAとタスクB)を同じタスクにまとめるか分けるかを、次の3ステップで判断します。どれか1つで「高凝集」と判断された時点で同じタスクにまとめ、3つすべてを通過してはじめて別タスクとして分離します。

ステップ1: 動作の独立性(Independence Check)

「タスクAがなくてもタスクBは正常に動作するか?」

「動作しない」なら高凝集と判断し、同じタスクにまとめます。APIエンドポイントとルーティング設定はその典型で、ルーティングなしではAPIを呼び出せません。一方、ユーザー検索機能と通知機能はそれぞれ独立して動作するため、別タスクに分離できます。「動作する」なら次のステップへ進みます。

ステップ2: 機能の完結性(Completeness Check)

「タスクAだけをマージしても、意味のある機能として完結するか?」

「完結しない」なら同じタスクにまとめます。メール送信ロジックだけをマージしても、それを呼び出すイベントトリガーがなければ誰にもメールが届きません。一方、ログ改善は単体でデプロイしても既存機能に価値を加えます。「完結する」なら次のステップへ進みます。

ステップ3: revertの影響範囲(Revert Impact Check)

「タスクAをrevertしたら、タスクBも壊れるか?」

「壊れる」なら同じタスクにまとめます。実装コードをrevertすればテストが壊れるため、実装とテストは常にセットです。一方、feature flagの追加とその有効化は独立しており、有効化だけをrevertしても追加コードは残ります。「壊れない」なら別タスクに分離できます。

3ステップフローチャート

タスクサイズの定量指標

3ステップの判断に加えて、サイズの上限も定義しています。AIが生成するタスクがこの範囲を超える場合は、さらに分割できないかを検討します。

指標 理想 最大
変更ファイル数 3〜10個 15個
変更行数(テスト含む) 200〜500行 1,000行
テストコード量 実装の0.5〜2倍

ただし、凝集度が高い変更であれば、サイズが目安を超えていても無理に分割しません。サイズはあくまで補助指標です。

凝集度パターン集

3ステップの判断を素早く行うために、「常にセットにすべきもの」と「常に分離すべきもの」をパターンとして定義しています。

常に同じタスクにまとめるべきもの

次の4パターンは絶対に分離しません。

  • 実装コード ⇔ テストコード(テストなしの実装はマージしない)
  • APIエンドポイント ⇔ ルーティング設定(両方ないと動作しない)
  • データモデル ⇔ マイグレーション(スキーマとコードの整合性を保つ)
  • サービスクラス ⇔ インターフェース定義(型の整合性を保つ)

常に別タスクに分けるべきもの

次のパターンは必ず分離します。

  • リファクタリング ⇔ 新機能追加(バグ発生時の原因特定を容易にする)
  • feature flag: 「実装(デフォルトOFF)→ 有効化(テストユーザー)→ 有効化(全ユーザー)→ 削除」の各段階
  • 依存ライブラリの更新 ⇔ 新機能追加(ライブラリ更新の影響を独立して検証する)
  • パフォーマンス改善 ⇔ 新機能追加(改善効果を独立して計測する)
  • データマイグレーション ⇔ 新機能追加(高リスクな操作を独立して実行する)
  • 互いに依存しない複数の機能(それぞれ独立してrevertできる)

具体例: ユーザー通知機能の分割

ユーザー通知機能を実装する場合、AIは次の3つのタスクに分けて設計します。

タスク 内容 ファイル数 行数
データ層 Notificationモデル・マイグレーション・モデルテスト 3個 約240行
ロジック層 通知送信サービス・ユニットテスト 2個 約450行
API層 エンドポイント・ルーティング・スキーマ・統合テスト 3個 約340行

「機能全体を1つのタスク」にすると変更ファイルが10個超・1,000行超になりレビューが困難です。加えて、API層に不具合が起きたときデータ層まで巻き込んでrevertする必要が生まれます。API層をrevertしてもデータ層には影響しないため、独立してrevertできる粒度に分解することが重要です。

タスクリストを評価する5つの観点

AIがタスクリストを生成した後、次の5つの観点で自己評価を行います。

  • 粒度チェック: 各タスクが適切なサイズか、大きすぎるものや小さすぎるものがないか
  • 凝集度チェック: 実装とテストが同じタスクにあるか、APIとルーティングがセットになっているか
  • 独立性チェック: 各タスクを単独でrevertできるか、マージ後にアプリケーションが正常動作するか
  • 依存関係マッピング: タスク間の依存関係が明確か、並列実装できるタスクが識別されているか
  • 改善提案: 問題があればどのタスクを分割・統合すべきかの具体的な推奨

この評価がPRを作る前の段階で完了するため、レビュー時の分割議論がなくなります。

実行例

今回紹介したスキルを実行したログです。

⏺ 承知しました。クリーンアーキテクチャアプローチで進めます。
  それではタスク分解フェーズに進んで、task-breakdownスキルを使って
  タスク分解を評価・調整します。

⏺ Skill(task-breakdown)
  ⎿  Successfully loaded skill

⏺ 評価対象タスク(code-architectが提案した5タスク):

  Task 1: [Data] ドメインモデルの追加
    変更ファイル: 3個, ~80行
    依存: なし

  Task 2: [Logic] CSVパーサーの実装
    変更ファイル: 3個, ~100行
    依存: Task 1

  Task 3: [Logic] バリデーターの実装
    変更ファイル: 3個, ~120行
    依存: Task 1

  Task 4: [Logic] ユーザーインポートサービスの実装
    変更ファイル: 3個, ~180行
    依存: Task 1, 2, 3

  Task 5: [API] 管理者用一括登録エンドポイント
    変更ファイル: 3個, ~100行
    依存: Task 1, 2, 3, 4

⏺ [粒度チェック]
  ✅ 全タスクのファイル数: 3個(基準: 3〜10個)
  ✅ 全タスクの行数: 80〜180行(基準: 200〜500行以内)
  ⚠ Task 4: メール連携部分を分離できる可能性あり(現状は許容範囲)

⏺ [凝集度チェック]
  ✅ 全タスクで実装コードとテストコードが同一タスクに含まれている
  ✅ APIエンドポイントとルーティング設定がTask 5に含まれている

⏺ [独立性チェック]
  ✅ Task 1マージ後: アプリケーションは正常動作する
  ✅ Task 2マージ後: アプリケーションは正常動作する
  ✅ Task 3マージ後: アプリケーションは正常動作する
  ✅ Task 4マージ後: アプリケーションは正常動作する
  ✅ Task 5マージ後: アプリケーションは正常動作する
  ✅ 全タスク: 独立してrevert可能

⏺ [依存関係マッピング]
  Task 1(モデル)
  ├── Task 2(CSVパーサー)─┐
  └── Task 3(バリデーター)┤
                             └── Task 4(サービス)── Task 5(API)
  並列実装可能: Task 2とTask 3

⏺ [改善提案]
  現在のタスク分解は非常に良好です。このまま進めることを推奨します。

  良い点:
  - 各タスクのサイズが適切(3ファイル, 80〜180行)
  - 各タスクマージ後もアプリケーションは正常動作する
  - Task 2とTask 3の並列実装で開発効率を高められる

⏺ 最終判断: 現在のタスク分解をそのまま採用

各タスクが3ファイル・80〜180行に収まっており、並列実装できるタスクまで特定されています。この評価があることで、実装に入る前にタスク分解の妥当性を確認でき、レビュー時に分割を再検討する手戻りが起きません。

まとめ

AIにタスクを分解してもらうとき、粒度の判断基準を明確に与えることが重要です。3ステップのフローチャートと凝集度パターン集を組み合わせることで、AIが一貫した粒度でタスクを設計できるようになります。

AIが作ったタスクリストを見るとき、「このタスクを単独でrevertできるか?」という問いで評価してみてください。その問いへの答えが、適切な粒度かどうかを教えてくれます。

ファインディでは一緒に会社を盛り上げてくれるメンバーを募集中です。興味を持っていただいた方はこちらのページからご応募お願いします。

herp.careers