見出し画像

AIにコードを任せても壊れない人がやっていること

AIに任せたコードが、回すたびにじわじわ壊れていく。

そんな経験はないだろうか。

仕様書を書いて、AIにコード化させて、問題が出たら仕様を直してまた回す。コードは見ない。そんな進め方を試したら、かえってコードがどんどん悪くなったという話だ。

その違和感を真正面から扱った講演がある。AI Engineer というカンファレンスで Matt Pocock が話した「ソフトウェアの基礎は、いまこそかつてないほど重要だ」というLTだ。


「specs to code」を試したら、コードが壊れていった

Matt Pocock は「Claude Code for real engineers」という、Anthropic の AI コーディングツール Claude Code を本職のエンジニア向けに教えるオンラインコースを運営している講師だ。

そのカリキュラムを組むなかで、Matt は最近の流行をひとつ試してみた。

specs to code(スペックスツーコード)と呼ばれる手法だ。

仕組みはシンプルで、まずアプリの仕様書をしっかり書く。その仕様書を AI に渡してコードに変換させる。問題が見つかったら、コードではなく仕様書のほうを直す。そしてもう一度コンパイラ(AIによるコード生成)を回す。コードそのものは、できるだけ見ない。

「これは新しいパラダイムだから、古いルールはぜんぶ捨てよう」というノリの運動だった。

ただ、Matt が実際に試したらこうなった。

「コードを見ないようにしようと思っていたけれど、結局見てしまった」
「最初は普通のコードが出てきて、もう一度回したらちょっと悪くなって、また回したらもっと悪くなって」
「気づいたら、ただのゴミができあがっていた」

会場で「同じ経験をした人」と挙手を求めると、たくさんの手が挙がった。

Matt の結論はこうだ。

コードを無視して、AI に丸ごと管理させるという発想は、結局のところ vibe coding(AI にフィーリングで書かせるやり方)の言い換えにすぎない。

仕様書だけを直し続けても、コードはむしろ劣化していく。

ここから Matt は逆方向に向かう。

「AI を信じてコードから手を引く」のではなく、「AI が真価を出せるコードベースとは何か」を、古い設計の本に立ち返って考え直していく。

古い本に書かれていた、「変えられないコード」の話

Matt がまず引っ張り出してきたのは、『A Philosophy of Software Design(ソフトウェア設計の哲学)』だった。

著者はジョン・オースターハウト。スタンフォード大学でコンピューターサイエンスを教える教授で、Tcl/Tk というプログラミング言語の生みの親としても知られている。長年スタンフォードで「ソフトウェア設計」の授業を担当してきた人物だ。

そこには「複雑さ」の定義が書いてある。

「ソフトウェアシステムの構造に関連する、システムを理解しづらく、変更しづらくしているもののすべて」

つまり、悪いコードベースとは何か、と聞かれたら、答えは「変えにくいコードベース」だということになる。

バグを生まずに変更できないコードは、悪いコードだ。
変更が容易なコードは、良いコードだ。

シンプルだが強い基準だ。

次に Matt が手に取ったのは『達人プログラマー』だった。

そこには「ソフトウェアエントロピー」という章がある。エントロピーというのは、放っておくとシステムは秩序を失ってバラバラになっていく、という物理の概念だ。

ソフトウェアもまったく同じ性質を持っている。

ひとつ変更を加えるたびに、その目の前の変更だけを考えて、システム全体の設計を考えないでいると、コードベースは少しずつ確実に劣化していく。

そして Matt は気づく。

specs to code でコンパイラ(AI)を何度も回していたとき、自分が見ていたのはまさにこのエントロピーそのものだった。

設計を考えずに、変更だけを積み上げていく。

その結果が、ゴミの山だった。

「コードは安い」は嘘だった

specs to code を支えるスローガンに「code is cheap」という言葉がある。

「もうコードは安い、いくらでも生成できる、だから人間がコードに注意を払う必要はない」という空気だ。

Matt はここに正面から異議を唱える。

「コードは安くなんかない。むしろ、悪いコードはこれまで以上に高くついている」

理由はシンプルだ。

AI は、良いコードベースのなかではきわめて優秀に働く。だが、変更しづらいコードベースのなかに放り込まれると、AI も人間と同じように壊し始める。

つまり、コードベースの質が低いほど、AI から得られる恩恵は小さくなる。

良いコードベースこそが AI の燃料だ。
良いコードベースを保つには、ソフトウェアの基礎が要る。

ここから Matt は、自分が遭遇した5つの失敗モードを順に潰していく構成に入る。

失敗1 ── AIが意図したものを作らないとき

最初の失敗は、誰でも一度は経験している。

「自分の頭のなかにはちゃんとしたイメージがあったのに、AI が出してきたものは、まったく違うものだった」

そういう体験だ。

Matt がここで持ち出すのは、フレデリック・ブルックスの『The Design of Design』に出てくる「設計コンセプト」という概念だ。

二人以上で何かを設計するとき、両者の間にはふわっとした「つくろうとしているものの理念」が漂っている。マークダウンに書ける形にはなっていない、目に見えないけれど確かに存在する共通理解。それが設計コンセプトだ。

AI と仕事がうまくいかないとき、何が起きているのか。

人間と AI のあいだで、設計コンセプトが共有できていない。

Matt の解決策は、たった数行の指示を AI に渡すことだった。

スキルの名前は grill me「徹底的に問い詰めろ」という意味の名前だ。

中身はこんな短い指示だ。

「この計画のあらゆる側面について、共通理解に達するまで、容赦なく私にインタビューせよ」
「設計の枝分かれを一つひとつ歩き、決定どうしの依存関係を順に解いていけ」

これだけで、AI は40問、60問、ときには100問もの質問を投げ返してくる。

Matt が公開したスキルのリポジトリは、GitHub で 13,000 スターほど集めてバズった。それくらい刺さっている人が多いということだ。

このやり取りで生まれた会話は、そのまま PRD(プロダクト要件定義書)にも、Issue にも変換できる。

Matt はここで、Claude Code の標準機能である plan モードに小さな批判を加えている。

「plan モードはアセットを作りたがりすぎる」

つまり、すぐに「計画書」というドキュメントをアウトプットしようとしてしまう

それよりも、共有された設計コンセプトに先にたどり着くほうが大事だ、という主張だ。

失敗2 ── AIが冗長になるとき

二つ目の失敗は、もう少し地味だが厄介だ。

「AI が出してくる文章やコードがやたらに長くて、自分との会話が噛み合わない感じがする」

Matt はこの感覚を、ベテランの開発者ならよく知っているはずだ、と話す。

ドメインエキスパート(業務知識を持っている依頼主)と仕事をするときの、あの「言葉の壁」と同じだ。

たとえば半導体まわりのアプリを依頼されたとして、開発者は専門用語をうまく咀嚼できない。専門家のほうも、開発者が書いたコードはわからない。両者のあいだで、言葉そのものがズレている

ここで Matt が引っ張ってくるのが、DDD(ドメイン駆動設計)の「ユビキタス言語」という考え方だ。

ユビキタス言語とは、開発者の会話、コードのなかの表現、そして業務の専門家との会話、そのすべてが同じ用語で動く状態のことを指す。

それを AI とのやりとりに適用したらどうか。

Matt が作ったのは、コードベースを走査して、出てくる用語を集めてマークダウンの表にまとめてくれるスキルだった。

そうしてできた用語表を AI に渡し、自分でも開いておく。

AI の思考のログを読んでいると、こんな変化が見えた。

計画の質が上がる。
そして、AI 自身の思考が冗長でなくなり、計画と実装のズレも小さくなる。

人間と AI で、まず使う言葉を揃える。
そのうえで設計を話し合う。

これだけで、出力の精度はだいぶ変わる。

失敗3・4 ── 動かない、テストしづらい

三つ目の失敗は「ちゃんと作ったはずのものが、なぜか動かない」だ。

Matt の処方は王道だ。

TypeScript(型のある JavaScript)のような静的型を使う。
フロントエンドなら、AI にブラウザを触らせて挙動を確認できる環境を用意する。
自動テストを書く。

ただ、ここで Matt は LLM の悪い癖を指摘する。

AI はせっかくフィードバックループ(型エラーやテスト結果といった、即座に返ってくる確認の仕組み)があるのに、それをうまく使いきれない。

一気に大量のコードを書いてしまい、最後になって「あ、型チェックしていなかったな、テストも回しておくか」と思い出すような働き方をする。

『達人プログラマー』にぴったりの表現がある。

「ヘッドライトの先を走ってしまう」

夜道で、自分が照らせる範囲よりも速いスピードで走ってはいけない。フィードバックの速さが、そのままあなたの速度の上限なのだ。

四つ目の失敗は、その自然な続きだ。

「テストを書こうにも、テストすること自体が難しい」

テスト設計には、ユニットの大きさをどうするか、何をモックするか、どんな振る舞いを検証するか、たくさんの相互依存した判断がある。

Matt の経験則はシンプルだ。

良いコードベースは、テストしやすいコードベースだ。

ではテストしやすい構造とは何か。

ふたたびオースターハウトの本『A Philosophy of Software Design(ソフトウェア設計の哲学)』に戻る。「ディープモジュール」という考え方だ。

ディープモジュールとは、中身に多くの機能を抱えながら、外から見える窓口(インターフェイス)はとても小さい部品のことだ。逆に「シャローモジュール」は、中身がそれほどないわりに窓口だけがやたら複雑な部品を指す。

AI に任せると、放っておいてシャローモジュールだらけのコードが出来上がりやすい。小さな部品がたくさん散らばっていて、それぞれが互いに薄く絡みあっている。

そういうコードベースを AI に探索させると、目的のロジックにたどり着く前に迷子になる。依存関係を理解できず、勝手な変更を入れる。結果としてバグが増える。

ディープモジュールで構成されたコードベースは違う。

中身は太く、入り口は細い。

テストはその細い入り口に対して書けばいい。中身がどう変わっても、入り口が変わらないなら振る舞いは保証される。

Matt はここでも、シャローからディープにコードベースを整える専用のスキルを作っている。


失敗5 ── 脳が追いつかないとき

ここまでの失敗を片づけても、最後にもうひとつ、いちばん深い問題が残る。

人間の脳のほうが、追いつかなくなる。

「これまでで一番疲れている」と感じている人はいないだろうか、と Matt は会場に問いかける。

たくさんの手が挙がった。Matt 自身も同じだという。

書けるコードの量が増えれば、レビューしなければならない量も増える。AI と人間がいっしょに、コードベース全体を頭のなかに保持しようとしてしまう。

ディープモジュールが効くのは、ここでもだ。

中身が一定の太さでまとまっていると、人間はそれを「グレーボックス」として扱える。

グレーボックスとは、中身を完全に見るわけでもなく、完全に無視するわけでもなく、外側の振る舞いを確かめれば中身は AI に任せていい、という扱い方だ。

「私はインターフェイスを設計する。実装は AI に任せる」

これが Matt の五つ目の失敗への答えだ。

もちろん、金融処理のように壊せない領域はこの限りではない。だが、多くのモジュールではこの分業が成立する。

人間の脳を救うのは、設計の節度だ。

設計に毎日投資すること

最後のメッセージは、ケント・ベックの言葉だ。

ケント・ベックは TDD(テスト駆動開発)やエクストリームプログラミングを広めたことで知られるエンジニアで、現代のソフトウェア開発のスタイルに大きな影響を与えた人物だ。

「システムの設計に、毎日投資せよ」

Matt は specs to code の問題を、この言葉でひと言にまとめる。

specs to code は、設計から手を引いている。divest している。

それは投資の真逆だ。

Matt はこの講演を、ひとつの比喩で締めくくった。

AI を、現場で実際にコードを書いてくれる、戦術担当の有能な兵卒だと考えてほしい。

「兵卒の上には、戦略を考える人間が必要だ。そしてそれはあなただ」

戦略を担うために必要なのは、20年以上前から使われ続けてきたソフトウェアの基礎スキルだ。良いコードベースの定義、共通言語、TDD(テスト駆動開発)、ディープモジュール、毎日の設計投資。

どれも、新しい話ではない。

新しい話ではないからこそ、AI 時代でも揺るがない。

まとめ

ここまでの内容を振り返るとこうなる。

  • specs to code に違和感があるなら、その勘は正しい。コードを見ないという発想は、設計から手を引くことと同じだ

  • AI が壊さないコードベースをつくるための知恵は、すでに古典のなかにある。複雑さの定義、共通言語、ディープモジュール

  • 「設計はあなたが、実装は AI が」という分業を意識すると、人間の脳の負荷も下がる

  • Matt 自身が公開しているスキル群は GitHub の Mac PCO skills、ニュースレターは aihero.dev で見られる

ソフトウェアの基礎は、AI 時代になって陳腐化したわけではない。むしろ、こうしたスキルを持っている人ほど AI を強く使いこなせる、という話だ。

元の動画も短くて熱量があるので、ぜひ見てみてほしい。


元動画: "Software Fundamentals Matter More Than Ever" — Matt Pocock



いいなと思ったら応援しよう!