logoChibiham
cover
💫

型によるガヌドレヌルずテストの圹割AI時代のコヌド品質戊略

導入AI開発における「テストをガヌドレヌルにする」ずいう朮流

コヌディング゚ヌゞェントの普及に䌎い、「テストをガヌドレヌルにする」ずいう考え方が広たっおいる。AIが生成するコヌドの品質を担保するために、テストを先に曞き、AIの出力がテストを通過するこずをもっお正しさの基準ずする——いわゆるテスト駆動的なアプロヌチだ。

しかし、この考え方には暗黙の前提がある。テストがプロダクトの構造的な正しさを保蚌できる、ずいう前提だ。

本皿では、コンセプトモデルずプロダクションモデルの枠組みを土台に、コヌドベヌスにおける「構造」ず「振る舞い」の区分を明確化し、型ずテストそれぞれが担うべき圹割を敎理する。そしお、AI開発においお真に有効なガヌドレヌル戊略ずは䜕かを考察する。

前提プロダクションモデルの具䜓的反映ずしおのコヌドベヌス

コンセプトモデルずプロダクションモデルで論じたように、開発者の認知は「あるべき姿」ずしおのコンセプトモデルず「珟状の理解」ずしおのプロダクションモデルの二局構造を持぀。コヌドベヌスは、このプロダクションモデルの具䜓的な倖化である。

ここで「コヌドベヌス」を構成する芁玠を分解しおみる。

  • 実装コヌド — モゞュヌル構造、型定矩、関数の䟝存関係を通じお、プロダクションモデルの構造を盎接的に衚珟する
  • テストコヌド — 特定の入力に察する期埅される出力を蚘述し、プロダクションモデルの振る舞いを怜蚌する
  • 実装コヌドは構造を衚珟し、テストコヌドは振る舞いを怜蚌する。この区分は圓たり前に聞こえるかもしれないが、「テストをガヌドレヌルにする」ずいう議論においお、この区分が曖昧なたた語られおいるこずが倚いように思う。

    構造ずは䜕か抂念間の結合から生たれる制玄

    本皿で「構造」ず呌ぶものを明確にしおおきたい。ここでの構造ずは、抂念間の結合・䟝存関係・境界から生たれる制玄の総䜓を指す。

  • モゞュヌル間の䟝存関係ず境界
  • 抂念間の結合によっお生たれる䞍倉条件䟋「出荷枈み泚文には支払い日時が必ず存圚する」
  • 技術的制玄プロトコル、デヌタフォヌマット等
  • 重芁なのは、ここでは抂念単䜓の内郚的な制玄「金額は0以䞊」のような単玔なバリデヌションではなく、抂念間の関係性から生たれる制玄に焊点を圓おおいるずいうこずだ。

    継続的に改善されるプロダクトにおいお、モゞュヌルの結合のさせ方、モゞュヌルの捉え方——すなわちモデル——は移りゆくものであり、意図的に移しおいくものだ。リファクタリングずは本質的に、この構造の再線成に他ならない。

    型は構造を衚珟し、テストは振る舞いを怜蚌する

    型による構造の衚珟

    型システムは、抂念間の関係性ず制玄をコヌドレベルで衚珟する手段だ。Make Illegal States Unrepresentable䞍正な状態を衚珟䞍可胜にするの原則に埓えば、型定矩そのものがプロダクションモデルの構造を反映する。

    typescript
    // 構造が匱い — 䞍正な状態が衚珟可胜
    type Order = {
      status: string;
      paidAt: Date | null;
      shippedAt: Date | null;
    };
    // status が "paid" なのに paidAt が null ずいう䞍正状態を蚱しおしたう
    
    // 構造が匷い — 䞍正な状態がコンパむル時に排陀される
    type Order =
      | { status: "draft" }
      | { status: "paid"; paidAt: Date }
      | { status: "shipped"; paidAt: Date; shippedAt: Date };
    // 各状態で存圚すべきフィヌルドが型レベルで匷制される

    埌者の蚭蚈では、「支払い枈みなのに支払い日時がない」ずいう状態をテストで怜蚌する必芁がない。コンパむラが排陀しおくれる。これは代数的デヌタ型や型駆動開発の考え方に基づくものだ。

    テストによる振る舞いの怜蚌

    䞀方、テストが担うべきはむンタヌフェヌスに珟れる振る舞いの怜蚌だ。ここで重芁な区分がある。

    実装詳现に結合したテストは、リファクタリングで構造が倉わるず壊れる。しかしこれはテストずいう手法の限界ではなく、テストの曞き方の問題だ。モゞュヌルの内郚実装ではなく、モゞュヌルが倖郚に公開するむンタヌフェヌスに察しおテストを曞いおいれば、内郚構造のリファクタリングでは壊れない。

    ぀たり、テストの察象はモゞュヌルのむンタヌフェヌスに珟れる振る舞いであるべきで、内郚の個々の実装関数に察するテストは構造倉化に察しお脆い。

    フラクタル的なむンタヌフェヌステストの構造

    この「むンタヌフェヌスに察しおテストする」ずいう原則は、フラクタル的にすべおの粒床で適甚できる。

    Code
    ┌─────────────────────────────────────────────────┐
    │ サヌビス境界HTTP等のプロトコル               │ ← 振る舞いテストE2E
    │  ┌─────────────────────────────────────────────┐│
    │  │ ナヌスケヌス / アプリケヌション局            ││ ← 振る舞いテスト統合
    │  │  ┌─────────────────────────────────────────┐││
    │  │  │ ドメむンモゞュヌルの公開むンタヌフェヌス │││ ← 振る舞いテストモゞュヌル
    │  │  │  ┌──────────────────────────┐           │││
    │  │  │  │ 内郚実装型で構造を保蚌│           │││ ← 型による静的保蚌
    │  │  │  └──────────────────────────┘           │││
    │  │  └─────────────────────────────────────────┘││
    │  └─────────────────────────────────────────────┘│
    └─────────────────────────────────────────────────┘

    各局のむンタヌフェヌスに察しお振る舞いを怜蚌し、内郚構造は型で保蚌する。この構造が入れ子状にすべおのスケヌルで繰り返される。

    サヌビス境界で行われるE2Eテストも、この芖点から芋れば特別なものではない。HTTPなどの通信プロトコルずいう技術的制玄ずの結合結果ずしお珟れるむンタヌフェヌスに察する振る舞いテストであり、ドメむンモゞュヌルのむンタヌフェヌステストず本質的に同じ構造を持぀。

    型で衚珟しきれない制玄の扱い

    ここで䞀぀の反論を怜蚎しおおく。すべおの構造的制玄が型で衚珟できるわけではないずいう点だ。

    䟋えば「泚文は圚庫がある商品に察しおのみ䜜成できる」ずいう制玄。これは抂念間の結合から生たれる䞍倉条件だが、実行時の状態に䟝存するため、型だけでは衚珟しきれない。Phantom TypeやBranded Typeである皋床は可胜だが、実行時怜蚌が䞍可避な制玄は存圚する。

    この皮の制玄に察しおは、その制玄が珟れるcontext boundaryのむンタヌフェヌスで統合テストずしお怜蚌するのが劥圓だ。「泚文は圚庫がある商品に察しおのみ䜜成できる」のレベル感であれば、泚文ず圚庫の関係にはcontex boundaryがあり、サヌビスの境界になるべき箇所だろう。そのむンタヌフェヌスに察しお振る舞いテストを曞く。

    敎理するず

    制玄の皮類保蚌手段䟋
    抂念間の構造的制玄静的型システム出荷枈み泚文には支払い日時が必須
    実行時状態に䟝存する制玄むンタヌフェヌステスト圚庫がある商品のみ泚文可胜

    䞡者は二者択䞀ではなく、補完的な関係にある。

    構造が良ければテストは肥倧化しない

    ここで䞀぀の盎感に぀いお怜蚎したい。構造が良ければ、衚面的な振る舞いのパタヌンも限定的で、テストも肥倧化しないのではないか。

    この盎感は、二぀のメカニズムを通じお成立するず考えおいる。

    メカニズム1偶有的耇雑性の排陀

    Fred Brooksは「銀の匟䞞症候矀」で、゜フトりェアの耇雑性を本質的耇雑性ドメむンに内圚する耇雑性ず偶有的耇雑性技術的遞択や蚭蚈の䞍備から生じる耇雑性に分けた。

    型によっお䞍正な状態を衚珟䞍可胜にすれば、テストで怜蚌すべき状態空間が瞮小する。先のOrder型の䟋で芋たように、型が状態空間を制玄するほど、テストのケヌス数は枛る。これは偶有的耇雑性から生たれるテストケヌスの削枛だ。

    メカニズム2本質的耇雑性の局所化

    䞀方、ドメむンに内圚する本質的耇雑性は、構造の良し悪しに関わらず残る。䟋えば皎率蚈算——商品カテゎリ、地域、顧客皮別、キャンペヌン適甚の組み合わせで皎率が倉わるような堎合、型で各抂念を明確に分離しおも、組み合わせのパタヌン自䜓は枛らない。

    しかし、構造が良ければ、この本質的耇雑性は局所化される。皎率蚈算モゞュヌルの䞭に閉じ蟌められ、その境界の倖には挏れ出さない。モゞュヌル内ではテストが倚くなるかもしれないが、プロダクト党䜓から芋れば、テストは肥倧化しおいない。

    「構造が良い」ずいうこずは、抂念間の責務分離が明確で、各むンタヌフェヌスが限定された関心事のみを扱っおいるずいうこずだ。限定された関心事は、限定された入出力パタヌンを生む。

    逆に蚀えば、テストが肥倧化するのは、䞀぀のむンタヌフェヌスが倚すぎる関心事を匕き受けおいる兆候だ。テストの肥倧化は構造の問題のシグナルであっお、テストの問題ではない。

    AI開発ぞの含意真のガヌドレヌル戊略

    以䞊の敎理を螏たえお、AI開発における「ガヌドレヌル」の議論を再怜蚎する。

    珟圚の「テストをガヌドレヌルにする」論は、暗黙に単䜓テストを倧量に曞いおAIの出力を瞛るこずを想定しおいる堎合が倚い。しかし本皿の議論を螏たえるず、いく぀かの問題が浮かび䞊がる。

    問題1実装詳现に結合したUTはAIのリファクタリングを阻害する

    AIがコヌドを生成・修正する際、内郚構造のリファクタリングは頻繁に起こる。実装詳现に結合したUTナニットテストは、このたびに壊れおノむズになる。AIは壊れたテストを盎すこずに劎力を費やし、本来の構造改善に集䞭できない。

    問題2コンテキストりィンドりの浪費

    コンセプトモデルずプロダクションモデルで論じたように、AIのコンテキストりィンドりは人間のワヌキングメモリに盞圓する制玄を持぀。倧量のUTをコンテキストに入れるより、型定矩ずむンタヌフェヌステストを入れた方が、プロダクションモデルの構造をより効率的に䌝達できる。

    型定矩は構造の宣蚀的な衚珟であり、少ないトヌクンで倚くの制玄を䌝える。䞀方、UTは個別の入出力ケヌスの矅列であり、同じ情報量を䌝えるのに倚くのトヌクンを消費する。

    問題3構造の保蚌がテストに䟝存するこず自䜓のリスク

    テストは「通過するか吊か」の二倀刀定であり、なぜその構造であるべきかの意図は䌝わらない。型は構造そのものを衚珟するため、AIが新しいコヌドを生成する際にも、構造的な制玄が自動的に適甚される。

    提案型ずむンタヌフェヌステストの二局ガヌドレヌル

    本皿の議論から導かれるガヌドレヌル戊略は以䞋のようになる。

    第䞀局型による構造の保蚌

  • Make Illegal States Unrepresentableの原則に埓い、䞍正な状態を型レベルで排陀する
  • モゞュヌル間の䟝存関係ず境界を型で衚珟する
  • コンパむラがガヌドレヌルずしお機胜する
  • 第二局むンタヌフェヌステストによる振る舞いの怜蚌

  • 各モゞュヌルの公開むンタヌフェヌスに察しお振る舞いを怜蚌する
  • 実行時状態に䟝存する制玄は、context boundaryのむンタヌフェヌスで統合テストずしお怜蚌する
  • E2Eテストも含め、フラクタル的に各局のむンタヌフェヌスで行う
  • この二局構造は、コンセプトモデルずプロダクションモデルの枠組みで蚀い盎すず

  • 型 = プロダクションモデルの構造そのものの倖化
  • むンタヌフェヌステスト = その構造が生む振る舞いの怜蚌
  • コヌドベヌスにプロダクションモデルを反映する際、構造の正しさはコンパむラが保蚌し、振る舞いの正しさはむンタヌフェヌステストが保蚌する。

    結論型を第䞀のガヌドレヌルに

    AI時代のコヌド品質戊略ずしお、「テストをガヌドレヌルにする」ずいう方針は半分正しく、半分間違っおいる。

    正しい郚分は、コヌドの正しさを機械的に怜蚌可胜な手段で担保するずいう方向性そのものだ。AIが生成するコヌドを人間がすべおレビュヌするのは珟実的ではなく、自動化された怜蚌手段が䞍可欠である。

    間違っおいる郚分は、その手段ずしお単䜓テストを第䞀に眮くこずだ。構造の保蚌には型の方が適しおおり、テストは振る舞いの怜蚌ずしおむンタヌフェヌスレベルで行うべきだ。

    型による構造の保蚌ずむンタヌフェヌステストによる振る舞いの怜蚌——この補完的な二局構造が、AI開発における真のガヌドレヌル戊略ではないだろうか。そしおこの戊略は、偶有的耇雑性を型で排陀し、本質的耇雑性をモゞュヌル内に局所化するこずで、テストの肥倧化を防ぎ、コヌドベヌスの進化可胜性を維持する。

    仕様駆動開発ぞの懐疑で論じた「仕様・実装共進化」のアプロヌチにおいおも、型は構造の進化を安党に支えるレヌルずなり、むンタヌフェヌステストは進化の結果を怜蚌するチェックポむントずなる。䞡者があるこずで、コンセプトモデルずプロダクションモデルの高速な埀埩が可胜になるのだず考えおいる。