はじめに
こんにちは。GMOペパボ株式会社の2025年度サマーインターンシップに参加しました、まっちゃんです。 この記事では、9日間のインターンシップでの経験や学びを紹介します。
配属サービス・課題内容
インターンでは、4つの事業部の中から配属サービスが決定します。
私が配属されたのは、ECサイト構築サービス 「カラーミーショップ」 で、今回はこのサービスの機能追加に取り組みました。
具体的には、ショップオーナー様から要望のあった 受注管理画面へのメモ機能の実装 を担当しました。
課題の背景:なぜメモ機能が必要だったのか?
今回の機能追加は、実際にカラーミーショップを利用するショップオーナー様が抱える具体的な課題から生まれました。
ショップオーナー様は、注文が入ると受注を確認し、受注伝票を用いてピッキング(商品の準備)や発送準備を進めます。しかし、注文後にお客様から電話で「ラッピングを追加してほしい」といった個別のご要望が入ることがあります。
これまでの運用では、そうした急な変更内容を 受注伝票に付箋を貼ったり手書きで追記したり、コミュニケーションツールで担当者間に共有したりすることで対応されていました。 重要な情報がシステム外で管理されるため、伝達ミスが起きたり、確認の手間が増えたりする課題がありました。
そこで、受注情報に紐づけてメモを直接システムに保存し、それを受注伝票にも反映させることで、こうした一連の業務をサービス内で完結させ、より確実で効率的な店舗運営をサポートすることを目指しました。
担当した開発内容
今回の開発では、以下の要件を満たすショップ内メモを実装しました。
- 受注画面への設置: スタッフ間の連絡事項等を記入できる専用スペースを用意
- ショップ全体での共有: テキストエリアに保存した内容はショップ全体に共有され、どのスタッフが見ても確認可能

受注管理画面へのメモ機能の実装の開発タスクは以下の2つのフェーズに分かれています。
- フェーズ1: 受注管理画面において一つのメモを保存
- フェーズ2: 保存したメモを受注伝票に表示
今回のインターンシップでは、フェーズ2の途中までを実装しました。リリースした内容は、公式のお知らせでも紹介されています。
👉 ニュースリリースはこちら
1日目
初日は、オリエンテーションと開発環境の準備を行いました。 希望に応じてPC(MacBook Pro)のキーボード配列や画面サイズを選べる環境が整えられており、快適に開発に臨めました。
チームメンバーは4人で、それぞれ大学も学部・専攻も異なり、多様なバックグラウンドを持つ仲間と一緒に取り組むことになりました。
2~6日目
2日目以降はチーム内で役割を分担し、本格的な実装フェーズに移行しました。 私はメモ登録機能のバックエンド開発を一貫して担当し、OpenAPIを用いたAPI仕様策定からPHPによるロジック実装までを行いました。
API定義の重要性
本格的な大規模サービスのチーム開発は、私にとって初めての経験でした。その過程で特に痛感したのが、API定義の重要性です。
API定義を用意することで、開発メンバーが共通認識を持つためのドキュメントとして機能します。 これまでの個人開発であれば、途中で仕様を変更しても影響は自分自身に限られ、修正も容易でした。 しかし、チーム開発では仕様の変更が他メンバーの実装に直接影響し、手戻りを引き起こすため、プロジェクト全体の大きな遅延につながりかねません。 この経験から、開発初期の段階で仕様の認識を合わせておくことが重要であると学びました。
スキーマ駆動開発の徹底
こうした設計を確実に実装へ落とし込むため、私たちのチームではAPI定義を正とする「スキーマ駆動開発」を徹底しました。
-
フロントエンド:クライアントの自動生成
openapi-generator を使用し、OpenAPI定義からTypeScriptクライアントを自動生成することで、常に定義通りの型安全性を確保しました。
-
バックエンド:スキーマに基づいたテスト
「実装がAPI定義通りか」を検証するテストを導入しました。
class UpdateTest extends TestCase
{
public function testRequest()
{
// ... リクエストの準備 ...
$response = $this->request($request);
// レスポンスがOpenAPIスキーマと一致しているかを検証
$this->assertValidRequestAndResponse($request, $response, 201);
}
}
この assertValidRequestAndResponse メソッドは、リクエストURLに対応するOpenAPIスキーマを自動的にロードし、実際のレスポンス構造やステータスコード(例: 201)が定義と完全に一致しているかを検証してくれます。
このようにAPI定義を唯一の情報源として開発を進めたことで、フロントエンドとバックエンドの実装の不整合を防ぎ、結合時の手戻りを最小限に抑えることができました。
大規模コードベースと「AI前提の開発」
こうした開発を進める上で、私たちのチームには大きな壁がありました。初見のコードベースを理解するためにコードリーディングをする必要がありましたが、インターンシップ期間は限られています。
この壁を乗り越える強力な武器となったのが、GMOペパボが掲げるAI前提の開発という環境でした。
まず、コードベースの理解には、AIをコードリーディングの相棒として活用しました。 例えば、「受注IDを元にデータベースを更新する処理は、どのファイルに書かれていることが多いですか?参考になる既存のコードを教えてください」といった具体的な質問をすることで、巨大なコードの森の中から実装の参考にすべき構造を効率的に特定することができました。 さらに、開発初期には、「PHPで新しいAPIエンドポイントを追加するための、コントローラークラスの雛形を生成してください」といった形で具体的なコード案を生成させ、それを元に開発を進めるスタイルを確立しました。
一方で、AIが生成するコードの品質に悩まされる場面もありました。一見正しく見えるものの、エラーハンドリングが不適切だったり、コーディング規約から外れていたりすることがあったためです。
特に印象に残っているのが、以下のようなエラーハンドリングに関する提案です。ある時、AI は特定の例外を処理した後、最後の分岐ですべての例外をキャッチしてしまう実装を提示しました。
try {
// 処理実行
} catch (SpecificException $e) {
// 特定の例外ハンドリング
} catch (Exception $e) {
// ⚠️ ここですべての例外をキャッチしてしまう
}
一見、堅牢に見えるこのコードですが、コードレビューにて「すべての例外をキャッチすることで、予期せぬエラーまで握りつぶしている」という指摘を受けました。 Webアプリケーションでは、予期しない例外が発生した場合はその旨を利用者に返却するとともに、他の外部監視ツール等でエラーレポートを記録するべきです。 このような全てのエラーを最終的にキャッチしてしまう実装は、真に予期しない問題を隠蔽し、それらを調査・修正する機会を奪ってしまうことになります。
この問題は、AIへのプロンプトを以下のように改善することで解決しました。
# 実装の制約事項
- エラーハンドリングは /path/to/SomeModule.php を参考にしてください。
- 予期せぬ例外を握りつぶさず、監視ツールに通知される設計にしてください。
この経験から、AIはあくまで思考を加速させる副操縦士であり、生成されたコードの意図を理解し、最終的な品質に責任を持つのは自分自身であると痛感しました。AIの提案を鵜呑みにせず、検証し、修正するプロセスこそが、実践的な開発スキルに繋がると学びました。
7〜8日目:チーム開発とリリース戦略
残り期間が少なくなり焦りもありましたが、リリースに向けて最後の追い込みを行いました。
その中で特に効果的だったのが、メンターの方々と机を並べて行うペアプログラミングです。物理的な近さが大きな効果を生み、自分一人では気づけなかった視点を得られたり、バグの原因をリアルタイムで議論しながら特定できたりと、問題解決のスピードが格段に向上しました。
また、メンターの方々の思考プロセスを間近で観察することで、デバッグを効率的に進める方法など、実践的なスキルを深く学ぶことができました。
さらに、手が空いたメンバーは残っているタスクを積極的に引き受けるなど、チーム全体で開発を加速させられたのも良い経験でした。 バグが発生しないように網羅的なテストを書くのは大変でしたが、それによってより堅牢なコードが完成しました。 例えば、「空のメモ」や「最大文字数ぴったりのメモ」といったエッジケースをテストする中で、自分では気づけなかったバリデーションの不備を発見することができました。
さらにリリースプロセスでは、「フィーチャーフラグ」 を用いた開発手法を経験しました。 フィーチャーフラグとは、新機能の公開状態を外部から簡単に制御できる仕組みで、開発中のコードを本番環境にデプロイしたまま、機能のON/OFFを切り替えることができます。
以下のように、外部管理画面から True / False を変更できる変数を利用し、コード内で条件分岐を行います。
public function hoge()
{
// 外部管理画面で 'shop_memo_feature' がTrueの場合のみ実行される
if ($this->featureFlag->isEnabled('shop_memo_feature')) {
// メモ機能の呼び出し処理
}
}
これにより、「実装は本番環境にあるが、ユーザーにはまだ公開されていない」 という状態を実現できます。
私たちはこの仕組みを活用し、開発が完了した部分から随時本番環境へデプロイを行いました。機能を非公開のまま開発を進められるため、最終日に大量の変更をまとめてリリースする“ビッグバンリリース”のリスクを回避できます。 そして公開のタイミングになれば、外部管理画面から変数を True にするだけで、安全かつ即座にユーザーへ機能を提供することができました。
9日目:リリース、そして成果の共有
最終日、私たちはフィーチャーフラグの設定を切り替え、開発した新機能を無事にリリースしました。 リリース後、メモ機能の利用件数を共有していただき、開発した機能が実際にショップオーナー様へ届き、実際に使われていることを実感できて、とても感激しました。
午後には、これまでの開発成果や学びをまとめ、他のインターン生やパートナー(GMOペパボでは、いっしょに働いている仲間のことを「パートナー」と呼んでいます。)に向けて成果発表会を行いました。どの班もそれぞれ独自の課題に取り組んでおり、どのように解決したのかを聞くのは非常に興味深かったです。 多くの方がSlackの成果発表スレッドに感想やコメントを残してくださり、とても嬉しかったです。

その他の体験
インターン業務以外にも、さまざまな貴重な体験や発見がありました。
- パートナー向けに ビュッフェ形式のランチが無料 で利用可能でした
- さらに ドリンクや軽食も無料 で提供されていました
- GMOペパボのエンジニアが参加する フロントエンド・バックエンド勉強会 を聴講しました
- CTOあんちぽさんとの座談会 において最新のAI技術に関する知見を得ました
- etc…
最後に
このインターンシップでは、実際のサービス開発に携わり、リリースまで経験するという非常に貴重な9日間を過ごすことができました。 チームで協力して問題を解決する楽しさや、最新技術に触れる経験を通して、開発者としての視野を広げることができたと感じています。 少しでも興味を持った方は、来年以降のGMOペパボのインターンシップに申し込んでみてください。きっと、新しい発見や学びが得られるはずです。
