GreenSnap TECH BLOG

GreenSnapのエンジニアチームの取り組みや使っている技術を紹介します

Claude Codeとペアプログラミングで効率的な開発体験できた

はじめに

久しぶりに記事を書きます。GreenSnapの高畑です。 AIエージェントを使ってプログラムを書くのが当たり前になってる昨今、自分もこれまでいろいろなAIツールと開発してきましたが、今の段階でClaude Codeが気に入りました。 というのも先日、GoでのAPI開発にClaude Codeを活用してみました。およそ半日の作業で30ファイル近くの追加・変更を行いました。以下の機能を実装することができました

  • パスワードリセットAPI
  • パスワード更新API
  • 月次クレジット残数リセット用のcronジョブ

内容としてはそこまで難しくないのですが、自分で手で書くよりも圧倒的に早く仕上がります。 いわゆるRepositoryクラスでCRUDを実装する部分やDAOのオブジェクトなど、ほぼテンプレート化されてるような実装は完全にお任せして量産できます。 ControllerやServiceもほぼ真似できる型があるとそれに沿って開発してくれるので 自分ひとりで開発する場合と比較して、2〜3倍のスピードで実装できたと実感しています。開発体験は非常にスムーズで、指示からコード生成までの応答速度も速く、非常に気に入りました。 他のAIエージェントのツールと比較してどこが気に入ったのか紹介します。

DevinとClaude Codeの比較

同様のAIコーディングアシスタントであるDevinも試しましたが、個人的にはClaude Codeの方が合っていると感じました。その理由としては

  • 料金体系がAPIの使用料のみで、短時間の利用でも気軽に始められる(今回は1日で約10ドル程度の利用)
  • ローカルファイルをリアルタイムで変更してくれるため、IDE上で修正を即座に確認できる
  • 必要に応じて起動ディレクトリを変更し、読み込み対象のソースコードを限定できる

これらの特徴によって、非常に使いやすく効率的な開発環境を実現できました。 特にIDE上でdiffを確認できるので、AIに指示を伝えるのが難しい部分や、わざわざAIに任せるほどでもない部分はささっと自分で編集して続きをまたAIに任せるという作業ループができました。Devin単体だと望み通りの実装に持っていくのが難しく、ストレスになりがちでしたが、Claude Codeではそういった問題が解消されて気持ちよくコーディングできました。

CursorやClineとClaude Codeの比較

自分はIDEにJetBrains製のものを普段から使っているので、VSCode系のUIには慣れなくて開発がしにくかっただけなのでCursorやClineが問題なく使える人にはClaude Codeだから新たにできることはないと思います。

JetBrainsのJunieとClaude Codeの比較

JunieはJetBrains公式のプラグインで提供されていますが、指示出しから結果まで遅すぎて合わなかったです。 仕上がるクオリティもClaude Codeのほうが質が高く感じました。

AIとのコラボレーションで求められるスキル

AIとのペアプログラミングでは、従来のペアプロとは異なり、1行ずつ確認しながら進めるのではなく、AIが一気にコードを生成します。そのため、以下のスキルが重要になります

  • 生成されたコードの品質と正確性を迅速に判断する能力(プルリクエストのレビュースキルに近い)
  • 自分の設計思想と異なる実装に対して、適切な修正指示を出す能力
  • 最終的な完成形をしっかりイメージできること

AIの提案をそのまま採用してしまうと、ディレクトリ構成などの小さな違いが積み重なり、最終的に管理しづらいコードベースになる可能性があります。そのため、自分がイメージする完成形に向けてAIを上手く誘導する必要があります。

より効率的なAI活用のためのヒント

  1. 基本的なテンプレートや必要なファイル構造をあらかじめ用意し、それをAIに修正してもらう
  2. Claude Codeを起動する際は、必要な情報が揃っている特定のディレクトリに限定する
  3. 広範囲にわたるコード生成を一度に依頼するのではなく、ステップバイステップで進める

まとめ

  • Claude Codeは使いやすく、VSCodeのUIを使えない人にとっては開発効率を大幅に向上させるツール
  • 最も効果を発揮するのは、自分が完成形をしっかりとイメージできているプロジェクトにおいて
  • 適切な範囲設定と誘導によって、高品質なコードを効率的に生成できる

しばらくは開発のお供にはClaude Codeを活用していきたいと思います。 2,3ヶ月後には別のツールに移ってそうですが…

以下AIに出した指示たち

一部編集してますが、ほぼ原文ママです 結構雑にお願いしたり、仕様書を投げつけたり試してましたがどれもそこそこ満足のいく仕上がりを出してくれたので満足です。 依頼の合間に自分でソースを追加したり修正しています。

repositoriesディレクトリにdomainディレクトリに対応するモデルのRepositoryクラスを作ってください。すでにdomainモデルに対応するrepositoryが作られている場合は作らないでください。
プログラムの書き方はすでにある既存の書き方に沿って作ってください
passwordResetのAPIを作ってください
main.goに「/password_reset」というルーティング追加して
controllerとServiceクラスを作ってください
controllerとserviceはすでに参考となるクラスがcontrollersとservicesのディレクトリにあるのでそれを参考にしてください
repositoryはpassword_reset_repositoryがあるのでそれを使ってください

処理の流れは
メールアドレスをRequestで受け取って、対象のメールアドレスが存在する場合は
password_resetsテーブルにデータを挿入
存在しない場合はなにもせずにmessage-"success"のJSONを返して
以下の仕様に沿ってindoorgreenのパスワード更新APIを作ってください

#パスワード更新API仕様書

##概要

リクエストを受けてusersテーブルのpasswordをUPDATEします

##エンドポイント

POST <https://example.com/password>

##リクエストボディ

JSONフォーマットで以下のパラメータを送信してください。

|パラメータ名|型|必須|説明|
|---|---|---|---|
|token|String|必須|パスワードリセットのトークン|
|password|String|必須|新しいパスワード|

###リクエスト例

{
"token":"user_authentication_token",
"password":"new_secure_password"
}

##認証

このAPIエンドポイントには認証は不要です

##レスポンス

###成功時のレスポンス(200OK)

{
"message":"success"
}

##バリデーションルール

-パスワードは必須です
-パスワードは6文字以上である必要があります

###エラー時のレスポンス

###バリデーションエラー(400BadRequest)

{
"message":"パスワードは6文字以上である必要があります"
}

##その他の仕様

-トークンが無効または存在しない場合は適切なエラーレスポンスを返す必要があります(例:404NotFound)
PasswordResetServiceのパスワードをDBへいれるときに、セキュリティ的にbcryptしてDBにいれるようにして
1日に1回起動するscheduler.goを作ってください
処理の内容はuser_creditsのnext_reset_dateの情報を見て
現在時刻より過ぎていればcreditを5にし、next_reset_dateを来月にして更新します
credit_reset_service.goのnext_reset_dateはDBから取得した日時からプラス1ヶ月にするように修正して
scheduler.goが利用しているサービスのなかでpanicを起こすとWebアプリケーションそのものが終了してしまいます
なんとかcatchしてエラーログを出すようにしたい