AI minne Vibe Coding

入社15営業日でVibe Codingを使って決済機能を改修した話

AI minne Vibe Coding

この記事の担当 @penpeen214224

こんにちは! 2025年6月1日にGMOペパボに入社した Ikechi です。
今回は Agentic AI/Vibe Coding を駆使して、入社15営業日で、minneのクーポン割引額上限機能をリリースした話をします。

入社早々、決済処理に変更を加えることに不安がありましたが、Vibe Codingを通じて、ドメイン知識を習得しながらリリースを実現することができました。

リリースまでの道のりとVibe Codingによる開発の中で得られた知見を共有しようと思います。

Vibe Codingとは?

Vibe Codingは、「完全に雰囲気に身を任せて、コードの詳細に気を払わず、自然言語だけで指示をしてコーディングする」コーディングスタイルです。このスタイルは、OpenAIの共同創設者であり、TeslaのAIディレクターとしての経験があるAndrej Karpathy氏が2025年2月に提唱したものです。

GMOペパボでは2025年新卒研修でも 「Vibe Coding」研修を実施しています。

minne について

minne は GMOペパボが運営している 「ハンドメイド作品の売買ができる国内最大のハンドメイドマーケットプレイス」 です。

2013年にローンチされ、私がこれまで経験したRailsプロジェクトよりもかなり大きい規模のプロダクトです。
以下の通りRails の Modelだけで 684 クラスもあります。

$ bin/rails stats
+----------------------+--------+--------+---------+---------+-----+-------+
| Name                 |  Lines |    LOC | Classes | Methods | M/C | LOC/M |
+----------------------+--------+--------+---------+---------+-----+-------+
| Controllers          |  20457 |  16543 |     388 |    1914 |   4 |     6 |
| Models               |  38382 |  26004 |     684 |    2690 |   3 |     7 |
| Views                |   6687 |   5627 |       0 |       0 |   0 |     0 |
+----------------------+--------+--------+---------+---------+-----+-------+
  Code LOC: 213589     Test LOC: 176550     Code to Test Ratio: 1:0.8

クーポン機能について

minneでは購入金額が割引されるクーポンを定期的に発行しています。
今回はクーポンの割引額に対して、上限額を適用する機能を実装しました。

クーポン画像

開発の流れ

ここからは実際の開発フローをご紹介します。
先述の通り、minneは大規模プロダクトであり、ドメイン知識の習得にかなり時間がかかることも考えられたため、AIを駆使しながらVibe Coding でタスクを進めることにしました。

1. 実現したい要件をまとめる

最初のステップとして、実現したい要件をまとめました。
事前に 要件を明文化 することで、AIとの認識のズレを防ぎ、効率的な開発を実現することができます。

以下は実際に作成したファイルから内容を抜粋したものです。

#役割
あなたはRails開発に精通したWebエンジニアです。

#タスク
minneのクーポン機能に「割引上限額」を追加実装してください。

#制約条件
- 既存のクーポン機能を壊さないこと
- パフォーマンスに影響を与えないこと
- 購入時に上限額を超える場合は上限額で割引を適用すること
- テストコードも併せて実装すること

#期待する成果物
- マイグレーション
- モデル
- 決済処理ロジックの修正
- テストコード

2. 現状把握

要件がまとまったところで、決済処理の現状把握を行うことにしました。
まずは各クラスの構成、既存の処理フローを理解するため、関連するモデルのER図、シーケンス図を出力してもらいました。

決済処理のシーケンス図(サンプル)

決済処理のシーケンス図

minne の決済機能は、多数のオブジェクトが相互に関連するアーキテクチャを持っています。
コードを一つ一つ読み解いていったとしたら、全体の処理フローを理解するまでに 数日から一週間は必要だった と感じます。

AIとの対話を通じてシーケンス図やER図を生成し、視覚的に構造を把握することで、約1日で現状の処理フローを理解 することができました。
テキストベースのコードから図表への変換により、複雑な関係性が一目で理解できるようになったのは、まさにVibe Codingの威力を実感した瞬間でした。

3. 設計

ここからAIと対話しながら仕様を固めていきます。
先程作成したシーケンス図とクラス図、要件定義書を活用しながら、設計書を作成していきます。

当時の反省点として、「クーポンに上限額を設けたいから設計して」というように抽象度の高いタスクを依頼すると、差分管理が大変でした。

AIが一度に大量のコードや設計を生成するため、その内容をレビューするのに相当な時間がかかってしまいます。
また、修正が必要な箇所を特定するのも困難で、結果的に効率が悪くなってしまいました。

AIの生成能力に対して、人間の理解・処理能力には限界があるため、 小刻みにタスクを依頼することが重要 だと学びました。
例えば「データベース設計」「クーポン作成機能」「割引計算ロジックの修正」のように、具体的で小さな単位に分割することで、各段階での品質確保と効率的な開発が可能になります。

**依頼事項**

1. データベース設計
   couponsテーブルに上限額を管理するカラムを追加したい。
   => 対応済み

2. クーポン作成機能
   管理者がクーポン作成時に上限額を設定できるようにしたい。
   => 本セッションで実装

3. 割引計算ロジックの修正
   クーポン適用時に上限額をチェックする処理を追加したい。
   => 次回実装予定

また、設計フェーズにおいては 既存の機能になるべく破壊的変更を加えず、拡張性が高い実装 をすることを特に意識しました。
指示をしないと既存機能を破壊するような変更が実施されることが多いので、要件定義書やタスク依頼時にも明記しておくのが良いかと思います。

4. 実装

設計書が完成したところで、AIと対話しながら実装を進めていきます。
実装フェーズにおいても、細かい単位で作業を依頼することで、予期しない変更を防ぐことができました。

また、実装フェーズで特に重要だと感じたことが、 AIの作業ごとにコミットを残すこと です。
問題が発生した際に即座にロールバックできる体制を整えることで、安心してAIとの協働開発を進めることができました。

使用するAIエージェントの設定ファイルに以下のようなルールを記載しておくことで、自動的にコミットを実行してくれます。
コミットメッセージにAIが作成したことを明記しておくことで、後から人間が行った作業とAIが行った作業を簡単に区別できます。

- 各作業完了後は必ずコミットを実行すること
- コミットメッセージにはAIによる作業であることを明記すること
- 例:[AI] Add discount_limit column to coupons table

5. デバッグ

ここまでで機能の実装が完了しました。
しかし動作検証の上で、一部のデータパターンで期待する動作と異なる挙動を確認しました。

バグの解消アプローチとして 検証したいメソッドでデバッグ情報を出力し、その結果をAIに入力してさらなる検証を進める 方法を実施しました。
このアプローチが非常に効果的で、効率的にバグの解消に取り組むことができました。

以下は、実際に発生したバグとその解決プロセスを簡略化したサンプルです。
実際の開発では、より複雑なロジックでしたが、Vibe Codingの効果を分かりやすく示すため、シンプルな例で説明します。

Step 1: デバッグログの仕込み

まずは問題が発生している箇所に、デバッグログを出力するようにコードを修正します。

def self.debug_log(binding_context, *var_names)
  var_names.each do |var_name|
    value = binding_context.local_variable_get(var_name)
    puts "#{var_name} = #{value.inspect}"
  end
end

def apply_coupon(price, coupon)
  debug_log(binding, :price)
  debug_log(binding, :coupon)

  discount = price * (coupon.discount_rate / 100.0)
  debug_log(binding, :discount)

  if coupon.discount_limit > 0
    discount = [discount, coupon.discount_limit].max
    debug_log(binding, :discount)
  end

  final_price = price - discount
  debug_log(binding, :final_price)

  final_price
end

Step 2: 実際の出力結果

20%割引クーポン(上限500円)をテストします。 以下が実際の出力結果です。

price = 5000
coupon = #<Coupon:0x... @discount_rate=20, @discount_limit=500>
discount = 1000.0
discount = 1000
final_price = 4000

明らかに問題があることがわかります:

  • 基本割引額は1000円(20%)で正しい
  • しかし上限500円が設定されているのに、1000円の割引が適用されている
  • 本来なら上限500円が適用されるべき

Step 3: AIへの問い合わせ

この出力結果をそのままAIに入力して、問題の特定を依頼します。

apply_coupon メソッドで、クーポンの上限チェックが正しく動作していません。
デバッグログを確認した上で、調査を実施してください。

price = 5000
coupon = #<Coupon:0x... @discount_rate=20, @discount_limit=500>
discount = 1000.0
discount = 1000
final_price = 4000

Step 4: AIからの回答と解決

AIがデバッグログの情報を解析し、ロジックの問題を指摘してくれました。

問題点: [discount, coupon.discount_limit].max で大きい方を選んでいる
改善提案: [discount, coupon.discount_limit].min で小さい方を選ぶべき

def apply_coupon(price, coupon)
  discount = price * (coupon.discount_rate / 100.0)

  if coupon.discount_limit.present?
    discount = [discount, coupon.discount_limit].min
  end

  price - discount
end

この提案で改善しない場合は、「ログ出力 → AI分析 → 修正」のサイクルを繰り返します

このように、デバッグログをAIに直接入力することで、複雑なバグも効率的に特定・解決できました。
標準出力に表示されたログをコピー&ペーストするだけで、AIが問題を分析してくれるため、デバッグ時間を大幅に短縮できます。

6. リリース

デバッグを経て、ついにクーポン割引額上限機能のリリースが完了しました!

以下の画像は、実際にクーポンの上限額機能が動作している様子です。
高額商品に対してクーポンを適用した際に、設定した上限額で割引が制限されていることが確認できます。 大規模プロダクトであるminneにおいて、既存の決済処理に影響を与えることなく新機能をリリースできたのは、Vibe Codingのアプローチが功を奏した結果だと感じています。

クーポン上限額機能の動作確認

チームメンバーからのコメント

daiki(専門職上長)

今回、Vibe Codingを積極的に活用するオンボーディングの骨子について計画した daikiです。 Vibe Codingは、すでにスキルやドメイン知識があるメンバーのみならず、これからそれらを習得していく場合においても、Agentic AIが良き伴走者となれる確信があったので、Onboarding支援する側からするとVibe Onboardingといえるような取り組みとしました。

これまでは、最新のドメイン知識の伝授や、細かい一般的なスキル面での支援について細かく計画を作り、すり合わせ、足りないところを補充しながら毎回のOnboardingを計画する必要がありました。

しかし、Onboardingの本質は、なるべくスムーズにチームに合流してもらうほか、価値提供を実現し、チームの一員として貢献を実現することです。その中で、人間同士のコミュニケーションで伝えなければならないことは何か改めて整理すると、プロダクトで大事にしているミッションであったり、直近の課題、プロダクト開発においてのスピリット、大枠の技術方針だったりします。こういったところを議論する時間としてFace to Faceの時間を確保することを重視しました。

逆に、日常的な技術系質問に関してであったり、社内手続きについては基本的にAgentic AIが担うものとして、対応し切れていない部分の補助をメンターに依頼しました。

結果として、ごく短期間でバリューを出せたほか、そのバリューの内容としてもお膳立てしたオンボーディングタスクというよりは、通常の開発業務で計画される規模のものを取り組むことができています。あらゆるOnboardingでAgentic AIに丸投げするというのは短絡的かもしれませんが、人から人へ伝えていくべき内容を改めて見直し、Agentic AIに代替できるところはしていくことで、人間のフィジカルな制約にとらわれてしまう部分のボトルネックを排除し、メンター・メンティー、トレーナー・トレーニーにおいて最適化されたOnboding Flowを実現することが重要なのだと今回の試みを通じて実感しました。

ikechi さん、大Value最高!!

kazu(@kazuhitonakayam) オンボーディングメンターより

2023年4月に私が中途入社した頃は、まだ今ほど生成AIが社内でも普及しておらず、地道にソースコードを読んで施策やドメインについて学習しておりました。そういった時から比べ、格段に学習が早くデリバリーが早くなったかと思います。おそらくあの頃同じ施策を私が任せられていたならばデリバリーまでに1ヶ月以上は要していたと感じます。

一方で、新しくjoinしてくださったパートナーからすれば、当然頭に入ってくる情報量も数倍になっているはずで、うまくキャッチアップできていないと感じることもあるかもしれません。なので、AIがあるからといってすぐに全てを把握しようとしすぎずに、うまくikechiさんのペースで歩んでいってほしいなと思います。 改めてご入社ありがとうございます!これからも一緒にminneを盛り上げていきましょう!

hikari(@_ave_h) オンボーディングメンターより

1stタスクからVibe Codingを活用して設計・実装を進めるという取り組みは、AIに頼る部分と自主的にキャッチアップする部分のバランスが難しいだろうと感じており、当初はメンターとしてもどうサポートすべきか手探りで進めていました。

minneではSlack Botに問い合わせれば多少のドメイン知識を補完できるような仕組みを日々整えていますが、ikechiさんがそういったAI活用しているツールを積極的に利用してキャッチアップに生かす動きもとてもよかったと思います。またある程度のことならAIに聞けば解決できるからこそ、上述の通り対面でプロダクト開発に対する考えやお困りごとをヒアリングする時間を毎日設けてそこで議論できたのはチームにとっても良い取り組みだったと思います。

Vibe Coding活用でのOnboardingで良い成功体験が得られたことで、今後より洗練されたチーム開発に繋がっていくと感じています。ikechiさん1stリリースお疲れさまでした!!

まとめ

入社わずか15営業日で、minneという大規模プロダクトの決済機能に新機能をリリースできたことは、私にとって大きな達成感と自信につながりました。
Vibe Codingを通じて、技術的な壁を乗り越えるだけでなく、ドメイン知識も効率的に習得することができました。
従来なら数ヶ月かかっていたであろうプロセスを、大幅に短縮できたと感じています。

また、今の時代はAIを適切に活用するスキルが不可欠であると実感しました。
AIとの効果的な対話やプロンプト設計、出力結果の適切な評価・活用といった能力は、現代のエンジニアにとって必須のスキルセットになっていると感じました。

今後はより複雑な機能開発や、他のプロダクトでの活用にもチャレンジしていきたいと思います!