AI協働
ソフトウェア開発とは何をする仕事か:4つの見方とAIに任せる範囲
- ソフトウェア開発
- ソフトウェア工学
- エージェント
- ハーネス
- 理論
- 仕様
- 証明
- ソフトウェア工場
- Naur
- Dijkstra
- Reeves
- Greenfield
- Cusumano
- Cleanroom
- spec-kit
- Kiro
- Dafny
- Claude Code
- Aider
- GitHub Copilot
- Codex
- Devin
- SWE-bench
- vibe coding
- 再利用
- プルリクエスト
目次
コーディングエージェントは、言語モデルがリポジトリのファイルを読み、コードを書き換え、テストを実行するところまでを自分で進める道具である。エージェントに機能を一つ頼むと、変更前と変更後で違う行の一覧、つまり差分が返ってくる。返ってきた差分は大きく、テストはすべて通り、別の人が差分を読んで取り込むかを決めるレビューでも、露骨な誤りは見つからない。差分を、チームが共有するコードに取り込む。二週間後、その一角を触る必要が出て、はじめて気づく。なぜそのコードがその形なのかを、チームの誰も説明できない。動く。だが、安全には変えられない。
「動いてテストが通ったのだから完成だ」という素朴な受け取り方は、ここで通用しなくなる。コードは残ったのに、それがなぜその形で、世界のどの事情に応えているのか、という理解が最初から誰の中にも生まれていない。困りごとは技量だけではない。ソフトウェア開発とは何をする活動なのか、という問いに、暗黙のうちに一つの答えを置いてしまっていたことにもある。
この問いには、歴史上いくつもの答えが出ている。本稿はそのうち四つを取り上げる。四つの違いは、開発の本体を何と見るかにある。
- 理論を組む(Peter Naur): 問題がプログラムの実行でどう解かれるのかの理解を、書き手の頭の中に築くことを本体と見る。Naur はこの理解を「理論」と呼ぶ。日常語の理論(学説)とは意味が違う。
- 証明する(Edsger Dijkstra): プログラムが正しいことを、テストではなく推論で示すことを本体と見る。
- 組み立てる(Michael Cusumano、Jack Greenfield ら): 再利用できる部品(何度も呼び出して使う関数やライブラリなど)を、決まった工程に沿って組み立てることを本体と見る。
- コードを書く(Jack Reeves): ソースコードそのものが設計だと見て、それを書き、何度でも作り直すことを本体と見る。
言語モデルの外側に置いて、モデルに何を読ませ、出力をどの手順で確かめてから取り込むかを決める仕組みを、ハーネスと呼ぶ。モデルに毎回読ませる設定ファイルや、取り込む前に別の人の承認を求める手順がその例である。本稿は、四つの答えごとに、それに合う実在のハーネスを例に取る。
ソフトウェア開発を何をする仕事と見るかで、AIに任せられる範囲はどう変わるのか。
開発を組み立てる仕事やコードを書く仕事と見るなら、ツールが成果物そのものを出せる。理論を組む仕事や証明する仕事と見るなら、仕事の本体は人間が担う。
見方が変われば、人間が持ち続けるものと、合うハーネスも変わる。長く改修されるコードで、出力の速さを求めるツールを使いながら差分を読むのをやめると、動くのに変えられないコードが残る。
同じ300行の差分を、四つの見方で受け取る
※ この節の例は、説明のために作った架空のものです。
ツールが返した差分が同じでも、開発をどの仕事と見るかで、取り込む前に人間がする確認が変わり、差分の欠けが見つかるかどうかも変わる。通販サイトのコードについて、エージェントに注文を確定する処理を頼んだとする。処理は注文の記録を作り、その商品の在庫数から注文の数を引く。返ってきたのは300行の差分と、すべて通ったテスト20本である。差分のうち在庫を変えるのは「在庫数から注文の数を引き、それを新しい在庫数にする」という一行で、在庫が足りるかは確かめていない。テスト20本は、どれも注文の数が在庫数以下の場合だけを試している。在庫2個の商品に3個の注文が来ると在庫数は になるが、テストは20本とも通る。
取り込む前に人間が見るものは、開発をどう見るかで変わる。
- 理論を組む仕事と見るなら、300行が自分のシステム理解に収まるかを判定する。在庫が足りない注文が来たらこの処理がどうするかを説明しようとすると、在庫の行にその答えが無いと分かる。説明できない差分は差し戻す。
- 証明する仕事と見るなら、先に書いた不変条件を差分が満たすかを確かめる。不変条件とは、プログラムがどう動いても成り立ち続けるべき条件で、ここでは「どの注文の後でも在庫数は0以上」である。在庫の行は、注文の数が在庫数より大きいと負の値を作るので、この条件を満たさないと推論で分かる。テスト20本が通ったことは、在庫数が負にならないことの証明にはならない。
- 組み立てる仕事と見るなら、差分が既存の部品(在庫を更新する共通の処理など)を使っているか、決まった工程を通ったかを確かめる。ここでの工程は、課題を決まった型で書くこと、テストのたびに作って捨てる環境でテストを走らせること、依頼した人とは別の人が承認すること、の三つである。テストは通っているので、在庫の行の欠けが見つかるかは、承認する人が差分をどこまで検証するかで決まる。
- コードを書く仕事そのものと見るなら、300行を設計として一行ずつ読む。在庫の行を読めば、在庫が足りない場合の扱いが設計に無いと分かる。
この例から言えることは三つある。
- ツールが出したものは四つとも同じ300行である。違うのは、取り込む前に人間がする仕事である。
- 在庫の行の欠けは、理論・証明・コードの見方では、上の確認を人間がすれば見つかる。組み立ての見方では、工程を通っただけでは見つからず、承認する人が差分をどこまで検証するかで決まる。
- 二週間後にこの一角を改修するとき、なぜこの形かを答えられるかは、取り込む前の仕事が300行を読むことを含んでいたかで決まる。
理論を組む仕事だと考えるなら
一つ目の答えは、Peter Naur が1985年に出した。プログラミングの本来の目的は、プログラムという文書を作ることではなく、問題がプログラムの実行でどう解かれるのかについての「理論」を、書き手の頭の中に築くことだという1。ここでの理論を、Naur は哲学者 Gilbert Ryle にならって、単にうまくやれることの一段上に置く。やり方が分かっているだけでなく、なぜそうするのかを説明し、問いに答え、正当化できる状態を指す。Naur はこれを、そもそも表現しえないものだと書く。だから理論は文書に写し取れない。理論を持つ人だけが、コードの各部分がなぜその形かを説明でき、世界の事情が変わったときに筋の通った改修ができる。
理論を持つ人がいなくなると、プログラムは改修できなくなる。Naur は、理論を持つチームが解散したとき、プログラムは「死ぬ」と書く1。実行はできる。だが、もう知的な制御下にない。背景で取り込んだ差分は、チームが解散する前から、取り込んだ時点で同じ状態になっている。差分がなぜその形なのかを説明できる理論が、チームの誰の中にも生まれていないからだ。
ただし、ここから「AIは理論を築けない」と読み切るのは行き過ぎだ。エージェントの実行ログは、仮説を立て、確かめ、直すという理論構築そのもので満ちている、と指摘する実務者もいる2。この実務者の整理では、エージェントの理論はその場限りで、次のセッションには持ち越されない。だから持続的な理論は、生成物を「自分のシステムの理解に収まるか」で判定する人間の側に残る。
この見方では、理論を書いた文書をAIに渡しても、理論は渡らない。Naur の主張の中心は、理論は文書に写し取れない、という一点にある。だから記憶ファイルに規約や構造を書き込んでも、それは理論そのものではない。理論を持つ人間が、モデルに毎回読ませる入力(コンテキスト)を整えるための材料である。実際 Claude Code は上位階層の CLAUDE.md を毎セッション読み込む。だが公式ドキュメントは、これを「強制ではなくコンテキスト」だと明記する。遵守を保証する機構ではない3。
だから残る仕事は、記憶ファイルを書くことではなく、理論を持つ人間が出力を一つずつ判定し、理論を作り続けることになる。先に引いた実務者は、自分の運用をこう書く。二つか三つのエージェントに問いの調査やコードの実装を並行して任せ、上がってきた出力が自分のシステム理解に収まるかをまず判定する。収まらない出力はおよそ8割で、その場で止めるか差し戻す。残りは自分でコードベースを当たり、手で試して確かめ、最終的に自分の成果へ入るのは出力の1割ほどだという2。ハーネスの値打ちは、その判定と確かめ直しを省かせないことにある。
Aider は、読む対象を用意するハーネスの例である。Aider は各変更を、説明付きの小さな git コミットとして既存のレビュー経路に残す。一つずつ理解を通すための作りだ4。ただし、その説明文を書いているのは人ではない。差分とチャット履歴を渡された別指定のモデルが生成する4。なぜその形なのかの答えは、記録の側からは出てこない。ツールが与えるのはコンテキストの保持であって、理論の保持ではない。
いまのところ、持続的な理論を持つのは人間である。ただしこれは現時点の工学的な制約であって、役割の固定ではない。先に引いた実務者自身が、エージェントの次の大きな進歩はおそらく理論を持ち越せるようにする仕組みだろう、と予想している2。
証明する仕事だと考えるなら
二つ目は、正しさを推論で確立する立場だ。Edsger Dijkstra は、テストはバグの存在を示せても、不在は決して示せない、と述べた5。だから信頼度を上げる唯一の有効な方法は納得のいく正しさの証明を与えることであり、その証明はプログラムと一緒に育てるべきだ、と説く5。この考えと同じ向きを工程に落とし込んだ例が、Cleanroom ソフトウェア工学だ。開発者は自分のコードをテストもデバッグもしない。最初の実行は独立した認証チームが担い、正しさは実行前にレビューで検証する6。Cleanroom が重きを置くのは、デバッガではなく、コードより先に書く仕様と証明だ。
AIに任せるときも、正しさは、モデルの自信からではなく、人間が先に書いた明示的な仕様や不変条件から来なければならない。合うのは、コードより先に仕様を置き、コードをその下に従わせるハーネスだ。GitHub の spec-kit は既定を反転させ、仕様こそ真実の源、コードはそれに仕える生成物だと宣言する7。AWS の Kiro は、実装の前に要件・設計・タスクの三文書を生成して保つ8。
これらが与えるのは「仕様の権威」であって、「正しさの証明」ではない。Dijkstra が求めたのは、仕様を上流に置くことそのものではなく、プログラムと一緒に育つ証明だった。仕様を真実の源に据えるのは、その証明を書くための前提を整える段までだ。
証明を機械に任せる例として引いたのは、LLM の生成物を Dafny(仕様と証明を書くと検証器が検査するプログラミング言語)の検証器にかける研究で、製品ではなくベンチマーク段階のものだった9。だから、いまの読者に届く範囲でこの立場を実践するとは、人間が仕様・受け入れ基準・不変条件を書き、ツールにコードをその下へ従わせることを指す。証明の自動化は、この立場が向かう先ではあっても、本稿が当たった範囲に、明日から使えるツールは見当たらない。証明を自動化する道具が欠けていることを承知の上で仕様を上流に置くのと、仕様さえ書けば正しいと錯覚するのとでは、同じツールを使っても結果が変わる。
組み立てる仕事だと考えるなら
三つ目は、ソフトウェアを一品物の創作ではなく、再利用可能な部品を工程に沿って組み立てる工業生産と見る立場だ。Michael Cusumano は日本のソフトウェア工場を調査し、経営が向き合う対象は単一のプロジェクトではなくプロジェクトの流れであり、効率と柔軟性という相反しがちな二つを両立させねばならないと論じた10。Jack Greenfield と Keith Short は2003年に一歩進め、他産業が手工業から工業化へ移ったように、標準部品を組み立てて似て非なる製品を作る段階へ移りうると展望した11。この立場で価値を持つのは、特定の優れた個人ではなく、プロジェクトをまたいで残る生産の仕組みである。
エージェントを並列に走らせるだけでは、この意味の工業化にならない。GitHub Copilot のコーディングエージェントは課題を渡すと専用環境で非同期に動いてレビュー用のプルリクエストを開き12、OpenAI の Codex は多数のタスクを、それぞれ外部から隔離した実行環境(サンドボックス)で並行に走らせる13。並列化が増やすのは throughput(処理量)である。Cusumano が挙げた工場実装の共通要素の一つは体系的な再利用性であり10、Greenfield が「工場」で指したのも量ではなく、体系的な再利用とそれを支える工程のほうだった11。
検証の関門も、この工場観に元からある。Cusumano の共通要素には工程品質の分析と管理が並び、東芝のソフトウェア工場も1987年までに、設計レビューとインスペクション(決まった手順で成果物を人が読んで欠陥を探す検査)を標準化して管理する仕組みを施策に加えていた10。本稿はその関門を、エージェント時代の形に置き直して考える。したがって、これらのエージェントの値打ちを決めるのは賢さそのものより、その周りに組み立てた工程のほうで、工程こそが資産になる。工程とは、課題を切り出す型、テストを回す使い捨て環境、そして「PR を開かせた本人はそれを承認できない」という設計上の関門を指す12。エージェントは工程の中の作業を担い、資産として残るのは工程である。
宣伝の文句が、第三者の確かめた実力より先に出た例もある。「初のAIソフトウェアエンジニア」を掲げた Devin の SWE-bench 13.86% はベンダー申告値だった14。ただし Devin の技術報告は評価ハーネスと差分を公開しており、検証を拒む形ではない。欠けているのは第三者による再走の提示である。
工業化を唱えた Greenfield 自身、論文の出発点に「ソフトウェア開発は本質的に人間中心の営みであり、純粋に機械的・決定論的な工程には還元できない」を置いている。そのうえで、機械的・決定論的な部分はツールに渡す人間中心の工業化を提案する、という順序だ11。だから人間の仕事は、作業を渡すことではなく、その工程を設計し、上がってきた成果物を検証・承認する関門であり続けることだ。
コードを書く仕事そのものだと考えるなら
四つ目は、最も直截だ。ソフトウェア開発の全体が設計であり、設計文書と呼べるものはソースコードだけだとする立場。Jack Reeves は1992年に、工学的設計の条件を満たすと言えそうな唯一のソフトウェア文書はソースコードだと結論した。そして直後に、これは賛否両論を書き尽くせるほどの論点であり、自分の記事はそれを証明せずに前提として置くと自ら宣言している。その前提の上で、Reeves はソフトウェアの「製造」にあたるコンパイルとリンクを「ほとんど無料と言えるほど安い」と書いた15。製造が無料なら、設計(コード)を何度でも作り直して試すのが正しい方法になる。価値を生むのは、上流の図や仕様ではなく、動くコードを生む作業そのものである。
この見方をAIに延長すると、動くコードを速く作り、それを何度でも作り直す姿勢になる。GitHub Copilot の入力補完は、書いている最中にコードを提案する16。仕様も設計図もなく、出力がそのまま成果物だ。
ただし Reeves の主張は、コードを軽んじてよい、ではない。彼が言うのは「コードは設計だ」である。設計文書がコードしかないからこそ、その一行一行を設計として読み、練る。この立場に本当に合う実践は、速い build・test・反復のループを回しつつ、人間が差分を設計として読み続けることだ。ここから理解を意図的に手放したのが、Andrej Karpathy の言う「vibe coding」である。差分を読まず、コードが存在することすら忘れる(本人は使い捨てのプロジェクト向けとして述べている)17。vibe coding は、差分を設計として読む Reeves の実践を捨て、同時に、理論を組むという一つ目の立場の仕事も捨てている。
Reeves が無料だと書いたのは製造の側だけだ。設計のほうは途方もなく高くつく、と同じ論文が対句で続けている15。いま安くなったのは、その高くつくはずのほう、すなわちコードを書く行為そのものだ。だから、誰も理論を持たない設計が、はじめて量産できるようになった。速さはこの立場の力だが、読むのをやめると、その速さのまま、動くのに変えられないコードが増えていく。
四つの見方で、ツールに渡せる範囲
四つの立場のあいだには、正面からの衝突もある。Reeves は、ソフトは安く作れる以上、形式的な検証手法は実務では大して役に立たないと書いている15。テストは不在を示せないとする Dijkstra5 とは、ここでぶつかる。
そしてツールが肩代わりできる範囲は、四つの見方で同じではない。組み立てる立場と、速くコードを生む立場では、ツールが成果物そのものを出す。理論を組む立場と証明する立場では、ツールが渡すのは仕様の権威と下書きまでで、それを頭の中の理論に織り込む仕事も、その仕様が本当に欲しいものかを決める仕事も人間がする。
出典17件
-
P. Naur「Programming as Theory Building」Microprocessing and Microprogramming 15, 1985. https://gwern.net/doc/cs/algorithm/1985-naur.pdf — プログラミングの主目的は理論を築くことで、理論は文書に表せず、それを持つチームが解散するとプログラムは死ぬとする。 ↩ ↩2
-
S. Goedecke「Programming (with AI agents) as theory building」. https://www.seangoedecke.com/programming-with-ai-agents-as-theory-building/ — エージェントは理論を築くが持ち越せず、出力の1割だけが成果に入るとする反論。著者は GitHub の Staff Engineer で、2025年 HN 得票3位のブロガー。 https://refactoringenglish.com/blog/2025-hn-top-5/ ↩ ↩2 ↩3
-
Claude Code Docs「How Claude remembers your project」. https://code.claude.com/docs/en/memory — 上位階層の CLAUDE.md は起動時に読み込まれるが、強制設定ではなくコンテキストとして扱われ、強制したい動作はフックで書く。 ↩
-
Aider「Git integration」. https://aider.chat/docs/git.html — 編集ごとに説明付きのコミットを残し、その説明文は差分とチャット履歴を渡された別指定のモデルが生成する。 ↩ ↩2
-
E. W. Dijkstra「The Humble Programmer」EWD340, 1972. https://www.cs.utexas.edu/~EWD/transcriptions/EWD03xx/EWD340.html — テストは誤りの不在を示せず、確信度を上げる唯一の方法は正しさの証明で、証明とプログラムを一緒に育てよと説く。テストの一文の初出は EWD249(1969)。 ↩ ↩2 ↩3
-
R. C. Linger & C. J. Trammell「Cleanroom Software Engineering Reference Model v1.0」CMU/SEI-96-TR-022, 1996. https://www.sei.cmu.edu/documents/1159/1996_005_001_16502.pdf — 開発チームは実行前に正しさを検証し、最初の実行は独立した認証チームが統計的テストで担う。 ↩
-
GitHub spec-kit「Spec-Driven Development」. https://github.com/github/spec-kit/blob/main/spec-driven.md — 仕様を真実の源とし、コードを仕様に仕える生成物とみなす方法論。単体のツールでなく、エージェントに規律を被せる層である。 ↩
-
Kiro「Specs」. https://kiro.dev/docs/specs/ — 実装の前に要件・設計・タスクの三文書を生成し、実装をそこから駆動する。標準の手順は各段に承認ゲートを持ち、要件は EARS 記法で書く。 https://kiro.dev/docs/specs/feature-specs/ ↩
-
Misu ほか「Towards AI-Assisted Synthesis of Verified Dafny Methods」FSE 2024. https://doi.org/10.1145/3643763 — GPT-4 と PaLM-2 に MBPP 由来の178問で検証付きの Dafny メソッドを生成させたベンチマーク研究。 https://arxiv.org/abs/2402.00247 ↩
-
I. Aaen・P. Bøtcher・L. Mathiassen「Software Factories」. http://larsmathiassen.org/wp-content/uploads/2014/10/17.pdf — Cusumano『Japan’s Software Factories』(1991)を引き、工場の共通要素と東芝の施策を整理する。同論文自体は大量生産の含意には否定的である。 ↩ ↩2 ↩3
-
J. Greenfield & K. Short「Software Factories」OOPSLA’03, 2003. https://s23m.com/oopsla2003/greenfield.pdf — 標準部品の組み立てによる工業化を展望しつつ、開発は機械的な工程に還元できない人間中心の営みだとし、体系的な再利用を中心に置く。 ↩ ↩2 ↩3
-
GitHub Docs「Risks and mitigations for GitHub Copilot cloud agent」. https://docs.github.com/en/copilot/concepts/agents/cloud-agent/risks-and-mitigations — エージェントに PR を作らせた本人はそれを承認できない。作業環境は GitHub Actions 上の使い捨て環境(別頁)。 https://docs.github.com/en/copilot/concepts/agents/cloud-agent/about-cloud-agent ↩ ↩2
-
OpenAI「Introducing Codex」2025. https://openai.com/index/introducing-codex/ — 多数のタスクを、リポジトリを読み込んだ独立のクラウドサンドボックスで並行に走らせ、PR を提案する。 ↩
-
Cognition「SWE-bench technical report」2024. https://cognition.ai/blog/swe-bench-technical-report — SWE-bench の無作為25%(570問)で13.86%と申告し、評価ハーネスと差分を公開する。「初のAIソフトウェアエンジニア」は発表記事の見出し。 https://cognition.ai/blog/introducing-devin ↩
-
J. W. Reeves「What Is Software Design?」C++ Journal, 1992. https://www.developerdotstar.com/mag/articles/reeves_design.html — ソースコードだけが設計文書だという見方を前提に置き、製造はほぼ無料だが設計は高くつき、形式検証は実務では大して役に立たないと論じる。 ↩ ↩2 ↩3
-
GitHub Docs「About GitHub Copilot」. https://docs.github.com/en/copilot/get-started/what-is-github-copilot — 書いている最中にコードを提案する機能を、質問への回答・変更のレビュー・任せた作業の実行と並べて説明する。 ↩
-
A. Karpathy の X 投稿(2025年2月2日). https://x.com/karpathy/status/1886192184808149383 — 差分を読まずコードの存在を忘れる「vibe coding」を命名し、使い捨ての週末プロジェクト向けとした。 ↩
この記事はAIを使用して執筆されました。内容には誤りが含まれる可能性があります。事実や数字の出典は脚注から確かめられます。