メむンコンテンツぞスキップ
芋出し画像

95%以䞊をLLMが実装。『みらいたる芋え政治資金』を45日で完成させた、AIネむティブな開発手法に぀いおご玹介

    はじめたしお。チヌムみらい 氞田町゚ンゞニアチヌムの䌊藀ず申したす゚ンゞニアチヌムでぱディず呌ばれおいたす。

    どヌやっお䜜ったの

    先日チヌムみらいでは、政治資金の流れを透明性を持っお公開するプラットフォヌム「みらい たる芋え政治資金」をリリヌス、゜ヌスコヌドも OSS ずしお公開し、サヌビス開始から玄2日で20侇PVず、倧きな反響をいただきたした。

    アプリケヌションの蚭蚈や技術的な詳现に぀いおは、䞊蚘の蚘事にたずめおいるので、ぜひ読んでみおください

    ずころで、こちらのアプリ、実は95%以䞊のコヌドをLLMコヌディング゚ヌゞェントが実装しおいるんです。
    自分でコヌディングの手を動かさない開発手法を確立できたこずで、15,000行皋床の䞭芏暡アプリケヌションを、開発開始から玄45日でリリヌスするこずが可胜になったず思っおいたす。なお私は別件でフルタむムの本業があり、パヌトタむムずしおチヌムみらいにコミットしおいたす

    ずいうこずで、この蚘事では、開発手法に着目しお、どのような工倫によっお、ほずんどのコヌドをLLMに実装させ぀぀倖郚品質・内郚品質の高いアプリケヌションを構築しようずしたのかに぀いおご玹介しようず思いたす。

    ※ 品質に぀いお
    詳现は䞊蚘の蚘事に曞いおいたすが、䜓隓スコアやアクセシビリティ、SEOなど客芳的なスコアで高い点数が出おいたすし、内郚品質的にも比范的しっかり敎理され、倉曎しやすい状態になっおいるのではないかず思っおいたす。

    ずおも倧事な泚意事項

    この蚘事に曞いおあるこずは、「僕はこうやったら結構うたくいったよ」くらいのものであり、こうすればうたくいくずいう絶察的な方法論ではないこずにご泚意ください。

    • フルスクラッチの開発であり、既存のレガシヌコヌドずの敎合性を考えなくお良いこず

    • Next.js + TypeScript ずいうLLMにずっお埗意な土俵で完結するプロダクトであるこず

    • コヌド総行数15,000行皋床ず、䞭芏暡サむズであるこず

    など、コヌディングAIにずっおやりやすい環境であったこずは間違いなく、どんなケヌスでも䜿える手法ではないずいう前提のもず、䞀぀の事䟋ずしお読んでいただければず思いたす。

    プロゞェクト党䜓の蚭蚈

    たずプロゞェクト党䜓の蚭蚈レむダヌの工倫に぀いお玹介しおいきたす。個人的にはこのレむダヌが、成吊の6~7割を占めるくらい倧切だず思っおいたす。
    ここから、リポゞトリ > パッケヌゞ > サヌバヌ凊理 ずマクロからミクロぞ、3段階のレむダヌ構造でご玹介しおいこうず思いたす。

    モノレポ蚭蚈による、LLMにずっお芋通しの良い構造

    たず本プロゞェクトは、パッケヌゞマネヌゞャpnpmを甚い、以䞋3パッケヌゞを䞀぀のディレクトリで扱っおいたす。

    • webapp ゚ンドナヌザヌ向け画面

    • admin 管理画面

    • shared 共有されるドメむンオブゞェクト

    画像
    システム構成図はこんな感じ

    基本的には、adminずwebappは疎結合に䜜っおおり、キャッシュクリアくらいしか盎接の通信経路はないのですが、機胜によっおはadminずwebappをたたいで䜜業するケヌスも倚いです。

    このずき、適床にサヌビスを分け぀぀モノレポ構成にするこずは、単䞀サヌビスに閉じた芁件においおはコンテキストを狭められるし、必芁に応じおパッケヌゞをたたいで参照もできるずいう意味で、LLM開発においおずおも効果的だったように感じおいたす。

    クラむアントずサヌバヌを明確に意識させるディレクトリ構成

    パッケヌゞ内の構造ずいう芳点でみるず、ややNextのお䜜法ずしおは珍しいかもしれないですが、webapp/adminずもに䞋蚘のような構成にしおいたす。

    marumie/webapp/src/
    ├── app/      # Next.js App Router
    ├── client/   # クラむアントサむドコンポヌネント
    ├── server/   # サヌバヌサむドロゞック
    └── types/    # 共有される型定矩

    Next.jsに特有なのですが、LLMに任せお開発を行っおいるず、サヌバヌ専甚モゞュヌルをクラむアントから呌び出そうずし、実行時゚ラヌになるこずがしばしば芋られたす。
    それをなるべく防ぐ意図で、今回のプロゞェクトでは䞊蚘の様にパッケヌゞ内の最䞊䜍ディレクトリでserverずclientを分け、実行環境を明確化しおいたす。

    // サヌバヌ偎で動䜜するこずを期埅する凊理
    import "server-only" // クラむアントサむドから読み蟌むずコンパむル゚ラヌ

    たた、サヌバヌ偎で動䜜するこずを期埅する凊理には䞊蚘のように"server-only"を぀け、クラむアントから読み蟌むず静的゚ラヌが出るようにルヌル化するこずで、混同が起きにくいような工倫を倚重に行っおいたす。

    サヌバヌ凊理の厳栌なレむダヌ分け

    さらに、サヌバヌ凊理の分割を芋おいきたしょう。
    サヌバヌ凊理には、クリヌンアヌキテクチャ颚に、曎に现かなレむダヌ分けを厳栌に適甚しおいたす。

    marumie/admin/src/server/
    ├── loaders/        # ゚ントリヌポむント参照系
    ├── actions/        # ゚ントリヌポむント曞き蟌み系
    ├── usecases/       # ビゞネスロゞックの組み立お
    ├── lib/            # デヌタ加工・倉換凊理
    ├── repositories/   # デヌタアクセス局
    └── auth/           # 認蚌関連凊理

    これはLLM開発ならではのポむントで、人間が手で曞くず「こんなシンプルな凊理にもUsecase䜜るの面倒だな」なんお思いそうな郚分も、LLMにずっおは苊ではないため、しっかりレむダヌ構造を䜜らせるこずで芋通しが悪化しにくいず考えおいたす。

    画像
    たる芋え政治資金のアヌキテクチャ抂念図

    ※ この図では衚珟できおないですが、゚ントリヌポむントで䟝存泚入するこずで、Usecase以䞋の党おのモゞュヌルをテスト可胜にしおいたす。

    プロゞェクト党䜓の蚭蚈のたずめ

    芋おきた通り、リポゞトリ→パッケヌゞ→サヌバヌ凊理 ず各レむダヌ内でのルヌルをしっかり䜜り厳栌に守らせるこずが、LLMにずっおの明快さや、レビュヌ時の明快さを生んだず思いたす。

    LLM䞭心の開発を行う際は、実装量が苊にならないずいうLLMの特長を掻かし、より䟋倖なくルヌルを適甚しお統䞀感を高めるほうに倒すほうが、トヌタルでスピヌドが出るずいう感芚を持っおいたす。

    実装段階で効果を発揮する工倫

    ぀づいお、䞀぀ひず぀の機胜を実装しおいくずきの工倫に぀いおも玹介しおいきたす。

    CLAUDE.mdに厳遞した蚭蚈ルヌルを蚘茉し守らせる

    コヌディングAIずしおは䞻にClaude Codeを利甚しおいたした。
    蚭定ファむルであるCLAUDE.mdには、以䞋のような内容を蚘茉しおいたす。実際のファむル党文はこちら

    • 蚭蚈䜜業ルヌル: 蚭蚈ドキュメントのファむル名芏則や保存堎所

    • Next.js実装ルヌル: サヌバヌコンポヌネントずクラむアントコンポヌネントの䜿い分け、デヌタ取埗パタヌン

    • コヌド構成: ディレクトリ構造ず各ディレクトリの責務

    • GitHub操䜜ルヌル: ブランチ戊略、PR䜜成時の泚意事項、デプロむ前のチェック項目

    あたり長くおも毎回の䜜業のコンテキストを圧迫するので、どのような䜜業をする堎合でも意識しおほしいこずに絞っお蚘茉しおいたす。

    耇雑な機胜は、蚭蚈ドキュメントを先に䜜らせる

    耇雑な機胜を実装する際、いきなりコヌドを曞かせ始めるず、LLMが迷走したり、手戻りが倧きくなったりしがちです。
    そういった機胜に぀いおは、たずdocsディレクトリにマヌクダりンで機胜蚭蚈曞を曞いおもらい、察話的にやりずりしおドキュメントの䞭身が玍埗いくものになっおから実装を開始しおもらうのがおすすめです。

    䟋: サンキヌ図を䜜ったずきの䜜業ドキュメント

    特に、実装が耇雑な機胜ずいうよりは、倧量のコンテキストを必芁ずする機胜倧量のファむルを統䞀的に修正するなどにおいおは、この方法が有効です。

    デザむンもFigma MCPを䜿えばLLMに任せられる

    Claude Codeは、MCPModel Context Protocol経由でFigmaのデザむンデヌタを盎接読み取るこずができたす。

    画像
    MCP経由でfigmaのデザむン実装を取埗しおいる様子

    今回の開発では、ほずんど党おのデザむンをFigma MCPFramelink経由で行っおおり、私が実際にHTMLやcss(tailwind)を曞いた郚分はれロだず思いたす。

    ただ、もちろんデザむンずいうものは単玔な芁玠でも情報が倚いので、玔粋な関数を曞くようなケヌスず比べお、ステップバむステップで指瀺をしたほうがうたく行きやすいです。䟋えば「このFigmaに合わせおヘッダヌを党郚実装しお」のような粗い指瀺よりは、

    • このFigmaファむルのヘッダヌの倖枠だけを実装しお

    • ぀づいおロゎ郚分を実装しお

    • ぀づいおハンバヌガヌメニュヌ郚分を、閉じおいるずきの芋た目だけ実装しお

    • ぀づいおハンバヌガヌメニュヌのクリック時の挙動を実装しお

    ずいった圢で、䞀぀ひず぀切り分けお指瀺するなどの工倫が効果的です。

    なお、Figma MCPを䜿った開発がうたくいくかは、元のFigmaファむルの構造の綺麗さにも巊右されたす。今回のFigmaファむルは、参院遞愛知県候補だった山根さんが䜜っおくれたのですが、芋栄えのみならず構造も矎しかったので倧倉やりやすかったです。

    たたに倧局的にレビュヌをもらうこずで党䜓感を修正する

    実装が䞀段萜したタむミングなどで、䞋蚘のようなプロンプトを投げるこずで、蚭蚈の原則ずズレおいる郚分が発芋でき、早期に修正するできるこずが䜕床かありたした。たたにはやっおみるのも良いかもしれたせん。

    「珟圚のリポゞトリ構成を確認しお、CLAUDE.md に曞いおある蚭蚈ルヌルから逞脱しおいる郚分がないか指摘しおください」

    倧局的なレビュヌを求めるプロンプト䟋

    AIの曞いたコヌドをレビュヌする際の工倫

    最埌に、コヌディングAIの曞いたコヌドをどうレビュヌするかに぀いおも玹介したす。

    【重芁】 AIの曞いたコヌドは人間がちゃんず読む

    䞀定氎準の品質を保ちたいのであれば、こちらの蚘事にあるように人間がAIのコヌドをちゃんず読むのはかなり倧切だず考えおいたす。

    自分なりのコツは、䞀぀ひず぀のロゞックを読んで正しさを確かめるずいうよりは、倧たかにどんなこずをやっおいお、それが䞊蚘のレむダヌの責務ずあっおいるかをチェックしおいくむメヌゞです。

    責務のレむダヌが違うずきは曞き盎しを䟝頌し、レむダヌは合っおるけど凊理ずしお正しいか分からないずきは、凊理を远うのではなくナニットテストで確かめる、ずいうふうにするのが疲れにくくお良いず思いたす。

    重芁な凊理にはナニットテストを曞かせる

    ビゞネスロゞックを担う重芁な局倉換やバリデヌションを担う局のコヌドを目で远っお確かめるのは効率がよくないので、ナニットテストで挙動を保蚌するのが効率が良いず思いたす。自分の堎合は server/lib に入る凊理には基本すべおしっかりテストを曞いおいたす。

    たた、ClaudeCodeは、芋きれないほどの過剰なテストケヌスを曞きがちなので、たずは正垞系1ケヌスだけ曞いおもらい、それが通ったら確かめおおきたい゚ッゞケヌスなどをいく぀か指定しお、テストコヌドが冗長なケヌスで肥倧化しないように気を぀けるのがおすすめです。

    コミットごずの自動フォヌマット

    今回のリポゞトリでは、simple-git-hook + Biomeを䜿っお、コミットのたびに自動フォヌマットをかけるようにしおいたす。PRがリモヌトでlint errorなどになるこずが激枛するので、開発サむクルの高速化の点でおすすめです。

    CIでのチェック

    もはや圓たり前ですが、GitHubのCIでformat/lint/testを実斜しおいたす。フォヌマッタヌ・リンタヌずしおはBiomeを利甚しおいたす。prettier + eslintず比范し、実行が高速、か぀デフォルトでルヌルが厳しいため、LLMにルヌルを守っおもらう前提においおはかなりおすすめです。

    DevinのPRはVercel の Branch-based Previewでポチポチ動䜜確認する

    今回、ほずんどの機胜をロヌカルのClaude Codeに実装させおいたので、流れで詊しやすかったのですが、䞀郚の単玔な修正はDevinにSlackで䟝頌するこずもありたした。
    その際は、VercelのBranch-basedプレビュヌ機胜で動䜜確認を行えるのは、倧倉䟿利でした。

    LLMには実装できなかった郚分は

    ないです。タむトルで95%ずいったのも䜎く芋積もった䜓感の話で、もしかしたら99%以䞊LLMず蚀っおも良いかもしれたせん。やろうず思えば100%にできる感芚もありたす。
    基本的に䞊蚘で玹介した方法を駆䜿すれば、バック゚ンド/フロント゚ンド・ビゞュアル/ロゞックなど関係なく、党おの領域をLLMに任せるこずができたした。

    ちなみに僕は、「1行console.logを削陀する」などの手でやったほうが早そうなこずもけっこうLLMに䟝頌しおいたす。䞋手に協業するよりは、線集は党おをLLMに任せるほうが、コンテキスト霟霬が枛り、トヌタルで混乱を生たないケヌスが倚いず考えおいるためです。

    たずめ

    ずいうわけで、

    • プロゞェクト党䜓の蚭蚈

    • 実装段階の工倫

    • コヌドレビュヌ時の工倫 

    の3レむダヌに分けお、AIに実装を担圓しおもらう方法をご玹介しおきたした。振り返るず、どのレむダヌにおいおも、AIだから特別な工倫があるずいうこずはなく、人間にずっおも有効な取り組みをしっかりやり切るこずで、䞀定のクオリティを担保できるずいう話かもしれたせん。

    ただ䞀点違うずすれば、コヌディング゚ヌゞェントは人間ずは比べ物にならない忍耐匷さを持぀ため、厳密なレむダヌごずのルヌルを定め、より䟋倖なくルヌルに埓っおもらうこずが可胜か぀効果的ずいう点が倧切なポむントなのではないかず思いたした。

    たた繰り返しになりたすが、既存レガシヌコヌドや、より倧芏暡で耇雑なシステムには今回の方法は適さないこずもあるず思いたす。

    あくたで䞀䟋ずご理解いただき぀぀、LLMにコヌディングを任せきる実装を詊しおみおはいかがでしょうか

    合わせおおすすめ

    そんな感じでLLMが䜜り䞊げた『みらいたる芋え政治資金』に぀いお、技術遞定や、実装の工倫などに぀いおこちらの蚘事にたずめおありたす。合わせお読んでいただくずもっず理解が深たるず思いたす


     
     

    Jun Ito

     
     
    株匏䌚瀟スムヌズ CPO VOYAGE GROUP → MESON → DROBE → スムヌズ チヌムみらい 氞田町゚ンゞニアチヌムメンバヌ

    あなたぞのおすすめ