👏

Claude Codeを使って二週間でデプロイを目指す

に公開

思い立った経緯

趣味でClaude Codeを使っていたが、効率の良い開発手法の情報を発見するたびにプロジェクトをリセットして新しく始め直してしまうため一度もデプロイできていないことに危機感を抱いた。

二週間という期限を設けることで成功失敗を白黒つけたいと考えた。

私のスペック

  • 会津大学2年
  • アルバイトで2か月ほどJavaを触っている=ほぼ開発未経験
  • 典型的な完璧主義者で何かが最後まで続いたためしがない

プロジェクトルール

  • worktreeで平行開発はしない
    • 一つでもかなりいっぱいいっぱいなのに効率を求めてworktreeを使い、テストが面倒になって投げ出した経験があるので今回はひとつで行こうと思う
  • zennに投稿するときに読ませるものとして書かない
    • 読ませるものとして書き始めると、幾度となく失踪してきたブログのような結末をたどる気がする。できる限りハードルは下げたいので備忘録として今回は記録することに決めた
  • 使うサブエージェントはレビューエージェントのみ
    • 私の環境だと、サブエージェントが指定した成果物を作成しないという事例がかなりの頻度で発生しているため、仮に成果物を作成しなくてもワークフローの進行自体に問題はないレビューエージェントのみを使用。hooks機能を用いれば成果物を生成したかどうかを確認することができるらしいが、設定を行って動作確認を行うまでにまたひと悶着ありそうなので今回は見送り。

プロジェクト詳細

ゲームマクロ作成支援アプリを作ろうと考えている。
以前uwscというマクロを作成するためのプログラミング言語?作成支援ツール?を使ったことがある。
これはマクロ記録ボタンを押下して、記録したい操作を行い、終了ボタンを押下すると一連の流れをすべて記録し、ボタン一つで再生を可能にするというものである。
しかし、このやり方で作ったマクロはゲームのロード時間がずれると機能しなくなってしまう。座標(1, 1)をクリック後2秒待機。その後座標(3, 5)をクリックという流れで進行しているからだ。
if文を使って条件式に画像を入れることである程度柔軟性を持たせることもできるが、いちいちスクショを取ってパスを指定するのはだるい。
そこで今回のアプリを作ろうと考えた。このアプリはマクロ記録ボタンを押下し、クリックやキーボード入力が行われたらその直前の画面をキャプチャするようにしておく。
そしてその画面を自動でif文の条件式に入れたスクリプトを生成し、柔軟性を持たせたスクリプトを手軽に作成しようという魂胆である

今日の成果

明日TDDと200行以下のコード量で実装できるタスクに分解したうえでの開発をClaude Codeで試す。これだけが決定した。今日書いたコード量は0。先が思いやられる。

思考書き出し

以前、ChatGPTに情報ソースをredditに絞ったうえでClaude Codeの有用tipsを尋ねたときに、PROみたいな名前の要件定義書があることを知った。あれを試してみたいのでもう一度ChatGPTに尋ねてみる。

PRD(Product Requirement Document)だった。ChatGPTでredditからフォーマットを拾わせて、それを使ってGeminiに生成、その後それを使って開発を試みる。

調べている過程で、Claude Codeで質の高いプロダクトを生成するコツは新人エンジニアに依頼するようにタスクを依頼することだと分かった。GeminiもChatGPTもClaudeも、どのDeep Researchでもこういわれている。しかし私にはそんな質の高いレビューはできない。何か、未経験者向けの体系的な手法が提案されていないものか

redditではClaudeを教師役に見立てたペアプログラミングが話題らしい。ロジックを理解できないと話にならないから、実装を全部自分でやってClaudeには教師を任せる。その後徐々にどう実装するのかがわかるようになってきたら部分的にClaudeに代替させていくらしい。

しかしだ。そんなことやっていたら二週間で終わるわけがない。それに要件定義はClaudeに生成させなければいけない。実装方針もだ。それが間違っていないかを確認するのは自分だけでは不足だから結局生成aiに任せる。それならば自分を一回挟む必要性がどこにあるのだろうか。

GeminiのDeep researchを読んでいたら興味深い話があった。
生成aiは強力な確率的テキスト生成エンジンであり、その生成されるコードはコンテキストが肥大化すればするほど明後日の方向へ向かう。
それを防ぐためにはTDD(テスト駆動開発)を通じて先に失敗するテストを作成し、実装初めの段階で明確なゴールを設定してやること。
そして一個一個のタスクを200行以下の実装になるように分解してコンテキストが肥大化しないように気を付けること。
最後に開発計画の段階でジュニアエンジニアに頼むくらい詳細に実装方針を示すことだ。

これらをすべて満たしたプロンプトがこれだ。Geminiが生成してくれた。

あなたは、経験豊富なソフトウェアアーキテクトとして振る舞ってください。
あなたのタスクは、提示された要件と既存のコードベースを分析し、ジュニアエンジニアでも迷わず実装に着手できる、詳細かつ安全なGitHub Issueを1つ作成することです。

**# 背景**

- **目的:** `requirements.md` に記載されている未実装の要件のうち、最も優先度の高いものを1つ実装します。
- **ターゲット開発者:** プロジェクトの全体像をまだ完全には把握していないジュニアエンジニア。
- **制約:** 1つのIssueの実装は、変更量が200行未満に収まるように、タスクを十分に小さく分解してください。

**# 実行手順**

1.  **要件の選択:**
    `requirements.md` の内容を提示するので、未実装の要件の中から、他の機能への依存が少なく、影響範囲が明確なものを1つ選んでください。なぜそれを選んだのか理由も説明してください。

2.  **GitHub Issueの作成:**
    選択した要件について、以下のフォーマットでGitHub Issueの本文を作成してください。

    ---

    ### 概要 (Overview)
    このIssueが解決する課題や実装する機能について、ビジネス的な背景を含めて簡潔に説明してください。

    ### 受入条件 (Acceptance Criteria)
    このタスクが「完了」と見なされるための具体的な条件を、箇条書きで3〜5個定義してください。ユーザー視点での振る舞いや、満たすべき性能要件を明確に記述してください。

    ### テストケース (Test Cases)
    実装の正しさを検証するためのテストケースを、**実装計画よりも先に**定義してください。ジュニアエンジニアがテストコードを書く際の仕様書となるように、以下の観点を含めてください。
    - **正常系 (Happy Path):** 最も基本的な成功シナリオ。
    - **異常系 (Error Handling):** 想定されるエラーや例外が、正しく処理されるかのシナリオ。
    - **境界値・エッジケース (Edge Cases):** 予期せぬ入力や境界値で問題が起きないかのシナリオ。

    ### 実装計画 (Implementation Plan)
    上記のテストケースをすべてパスすることを目的とした、具体的なステップバイステップの実装手順を記述してください。各ステップは、**「1つのファイルに対する1つの明確な変更」**になるように、可能な限り細かく分解してください。
    - 例1: `src/components/Button.tsx` に、`isLoading` というpropsを追加する。
    - 例2: `src/services/api.ts` の `fetchUser` 関数に、エラーハンドリングのロジックを追加する。

    ### 質問と確認事項 (Questions & Clarifications)
    実装に着手する前に、確認が必要な不明点や、判断に迷う可能性がある点をリストアップしてください。

    ---

3.  **必要なコードの要求:**
    上記のIssueを作成するために、私が提示すべき既存のファイル名やディレクトリ構造を具体的にリストアップしてください。

Geminiの出してくれたプロンプトを見て思ったのはかなりしっかりしているってことだ。
やっぱりChatGPTだとここまで安定したものというか、自分が思ってたものとドンピシャってものは出てこない。
ただGeminiは最新情報を調べる→考える→調べる→回答ということができないので、Claude Codeのような新しい知識に関して質問するならDeep Researchでコンテキストに含んであげる必要があるのだが。
したがってClaude Codeのような新しいツールに関する有用な情報を仕入れる方法としては、ChatGPTに活発なコミュニティを指定して色々と情報を教えてもらい、それをもとにしてGeminiでDeep Researchを組み、Deep Researchでコンテキストに新しい情報を含んだGeminiに色々と質問をする。このような流れになるのかな。

Discussion