エキサイト就業型インターンBooost!!!を通して

こんにちは、齋藤 丈です。 この記事は、エキサイト株式会社(https://info.excite.co.jp/internship/booost2025/)の就業型インターン「Booost!!! 2025」に参加した体験記です。

はじめに(自己紹介)

改めまして、東北工業大学 工学部 情報通信工学科 3年の齋藤 丈です。(2027年卒見込み) 将来的にフルスタックなエンジニアになることを目標に、ハッカソン参加や自主制作、複数のインターンに挑戦しています。

これまでは、PKSHA Technologyでのインターン(Vue.jsやAWS Bedrockを使用)やハッカソン(Next.jsやFlutterを使用)などで、主にフロントエンド開発AI・LLMを活用した開発を担当する機会が多くありました。

フロントエンドの経験を積む中で、その先のバックエンド、特に「保守性・拡張性を考慮したアーキテクチャ「品質を担保するテスト」といった領域を実務で深く学びたいという思いが強くなり、今回はバックエンド(PHP/Laravel)に強みを持つエキサイトのBB事業部インターンに参加しました。

この記事では、インターンで学んだ以下の点について詳しくまとめていきます。

  • 参加理由: なぜエキサイトのインターンを選んだのか
  • タスク内容: LaravelInertia.js、オニオンアーキテクチャDIP
  • ぶつかった壁: PHPUnitMockery を使ったテスト設計
  • 社内の雰囲気: ビアバッシュでの交流やメンターさんからの「金言」
  • 得られた成長: 技術面と「なぜ?」を問う思考面での変化

1. エキサイトのインターンに参加したいと思った理由

「はじめに」で述べたバックエンドのアーキテクチャを学びたいという理由に加え、実務の「型」を学びたかったからです。

具体的には、 1. 実務でのタスク管理: 課金サービスを、現場でどのように活用しているのか。 2. 要件の細かさとルール: 個人開発では曖昧にしがちな要件定義や、企業ならではの開発ルール(ブランチ戦略、レビュー体制など)を体験したい。 3. コーディングのアンチパターン: 「動く」だけでなく「保守しやすい」コードとは何か、現場でNGとされる書き方を学びたい。

という3点を強く意識しており、エキサイトのインターンはこれらを学ぶ最適な環境だと感じました。

2. 参加までの準備にあたって

インターン参加にあたり、フレームワークLaravel を重点的に勉強しました。

フロントエンドの Vue.js に関しては、直前のPKSHAのインターンでも使用していたため、コンポーネント設計の知識は活かせると考えていました。

3. 具体的なタスク内容

私が担当したのは、BB事業部で使われている社内顧客検索ツールの機能開発です。

  • 概要: 既存の管理ツールに、新たな検索機能を追加し、そのテストを実装する。
  • 技術スタック:
    • バックエンド: PHP (Laravel)
    • フロントエンド: Vue.js ( Inertia.js 経由)
    • テスト: PHPUnit
    • インフラ: AWS (EC2), Docker

Inertia.js と オニオンアーキテクチャ

今回の開発で特徴的だったのが、Inertia.js の採用と、オニオンアーキテクチャ です。

1. Inertia.js による Laravel と Vue の連携

Laravel といえば Blade テンプレートが一般的ですが、このプロジェクトでは Inertia.js を使い、フロントエンドを Vue.js で構築していました。 Controller から Blade を返す代わりに、Inertia::render() を使って Vue コンポーネントを指定し、Props としてデータを渡す仕組みです。

// (例) AbcController.php
public function index(Request $request, AbcRepositoryInterface $repository)
{
    // ...ロジック...
    $results = $repository->search($searchParams);

    // Inertia::renderでVueコンポーネントを呼び出し、Propsを渡す
    return Inertia::render('Clb/Abc/Index', [
        'results' => $results,
        'searchParams' => $searchParams,
    ]);
}

Vue.js は他のインターンでも触れていましたが、Inertia.js を介して Laravel から Props を受け取るこの形は新鮮で、フロントとバックの責務分離が明確になるメリットを感じました。

2. オニオンアーキテクチャDIP(依存関係逆転の原則)

もう一つの特徴は、ディレクトリ構造です。 単なる MVC ではなく、責務を細かく分離したオニオンアーキテクチャ(またはレイヤードアーキテクチャ)に近い構成が取られていました。

特に、メンターさんに教えていただきながら分析した Controller の実装は、DIP (Dependency Inversion Principle: 依存関係逆転の原則) の良い学びになりました。

▼ 抽象(Interface)に依存する設計

// app/Http/Controllers/Clb/Applications/AbcController.php

// Controllerは「具象クラス」ではなく「Interface」に依存している
public function __construct(
    private AbcRepositoryInterface $repository
) {
}

public function search(Request $request)
{
    // Interfaceのメソッドを呼び出すだけ
    $data = $this->repository->search($request->all());
    // ...
}

▼ DIコンテナによる具象クラスの注入

// app/Providers/AppServiceProvider.php

// Interfaceが要求されたら、こちらの具象クラスを注入する
$this->app->bind(
    \App\Repository\Clb\AbcRepositoryInterface::class,
    \App\Repository\Clb\AbcRepository::class
);

このように AbcController が具体的な実装(AbcRepository)を知らなくても動作する設計になっており、テスト容易性保守性が格段に向上することを実感しました。

4. 困難だったことと、どう乗り越えたか

実務レベルのコードベースと設計思想に触れ、多くの壁にぶつかりました。

困難1:アーキテクチャの理解と「どこに書くか」

オニオンアーキテクチャの「作法」を理解するのが最初の壁でした。 「このロジックは Controller? それとも Repository?」 「ControllerRequestRepositoryInterface 以外受け取ってはいけない?」 など、ファイル構成図とにらめっこする日々でした。

[克服] メンターの伊藤さんに質問し、AbcController の実装を例にDIPの重要性を教えていただきました。 また、DataSearchRepository の実装を読み解き、「Controller はリクエストの検証とInertia::render での応答に専念し、複雑なDB操作(Eloquent のクエリビルダを使った whereInwhereRaw など)はすべて Repository 層に隠蔽する」という責務の分離をコードレベルで学びました。

困難2:実務レベルのテスト設計 (PHPUnit)

タスクには PHPUnit によるテスト実装も含まれていました。 これまでフロントエンド開発が中心で、バックエンドのテスト、特にDBが絡むテストは本格的に書いたことがありませんでした。 メンターさんから「テスト設計が大事。Xmindなどでパターンを洗い出すと良い」とアドバイスをいただき、設計から挑戦しました。

  • 正常系: 正しいパラメータが渡された場合に、期待通りのデータが返るか。
  • 異常系: 想定外のパラメータ(null, 空文字, 異なる型...)が来た場合に、適切にエラー処理されるか。

[克服] テストコードは「AAAパターン (Arrange, Act, Assert)」を意識して書くことを学びました。

  1. Arrange (準備): テストデータ(createTestDataのようなメソッド)を用意し、Mockery を使って Repository が依存する Eloquent Model などの動作をモック(偽装)します。
  2. Act (実行): テストしたい Repository のメソッド(例: search())を実行します。
  3. Assert (検証): 実行結果が期待値(「searchメソッドが1回呼ばれたか」「返り値の配列が正しいか」など)と一致するか検証します。

Mockery を使ってDBなどの外部依存を断ち切り、テストしたいロジックだけを正確に検証する手法は、非常に大きな学びとなりました。

5. メンターとの対話と社内の雰囲気

今回のインターンで最も印象的だったのは、メンターさんとの技術的な対話、BB事業部のリアルな雰囲気、そして社内イベントでの温かい交流でした。

社内イベント「ビアバッシュ」

インターン期間中、「ビアバッシュ」という社内イベントに参加する機会がありました。

ここでは事業部の垣根を越えて多くの社員さんと交流でき、特にメディア事業部からBB事業部に異動されてきた岡崎さんのお話が非常に興味深かったです。

岡崎さんからは、ご自身のキャリアパスや、Javaフレームのメリット・デメリットなどについて伺い、さらに本選考を控える私に対して、エンジニアとしてのキャリアに関する重要なアドバイスもいただきました。

イベント後日、岡崎さんからSlackのDMで応援の声や、これからもどんどん頼ってくださいといった温かいメッセージをいただき、技術面だけでなく人としての面倒見の良さにも感動しました。

メンターさんの紹介

  • 中村さん: 困った際にすぐにGoogle meetを立ち上げてハンズオンで課題を解決まで導いてくださりました。
  • 伊藤さん: 中途入社で中村さんと同じチーム。受託開発や楽天での経験をお持ちで、特に Laravelアーキテクチャに造詣が深い方でした。

「技術的負債」と向き合う現場

BB事業部では、エキサイト独自の旧フレームワーク「BEAR」で書かれたコードが残っており、それをPHPの古いスタイルで書かれたコードと呼び、モダンな Laravel に置き換えていく過渡期にありました。

メンターの伊藤さんからは、技術選定やコーディングに関する非常に示唆に富むアドバイスをいただきました。

▼ メンターさんからの金言(一部抜粋)

  • 「(古いコードの)実装方針は真似しないでほしい」
    • → 既存コードが必ずしもベストプラクティスとは限らない。なぜそう書かれているかを疑い、より良い書き方を常に模索する重要性を痛感しました。
  • 連想配列はダメ。Laravel Collection を使って」
    • foreach で配列を回すのは旧来の書き方であり、mapfilter が使える Collection を使うことで、可読性が高く、保守しやすいコードになることを学びました。
  • 「面接では本音(どう思っているか)が大事」
    • →技術選定の理由などを「流行っているから」ではなく、メリット・デメリットを比較し、自分の言葉で語れることが重要だと再認識しました。

単に「雰囲気が良い」だけでなく、技術的負債と向き合い、どうすれば保守性や開発生産性が上がるかを真剣に議論している、非常に健全な開発チームだと感じました。

6. インターンを通してどう成長できたか

今回のインターンを通して、技術面と思考面の両方で大きく成長できました。

1. 技術面:「動く」から「保守する」への意識改革

  • アーキテクチャの理解: DIPやレイヤードアーキテクチャのメリットを、コードレベルで理解できました。
  • テスト実装力: PHPUnitMockery を使ったバックエンドのテスト設計(正常系・異常系)の重要性と実装方法を学びました。
  • モダンなPHP: CollectionEnum など、Laravel の便利な機能を活用した「読みやすいコード」を意識できるようになりました。

今回エキサイトでバックエンドのアーキテクチャとテストを深く学べたことで、Web開発の全体像(フロント、バック、インフラ、チーム開発)をより立体的に理解できたと感じています。

2. 思考面:「なぜ?」を深く掘り下げてる姿勢

メンターさんとの対話や面接練習を通じて、**「なぜその技術を選ぶのか?」**を自分の言葉で説明できることの重要性を痛感しました。

例えば、メンターさんとの面談で「Go言語に興味がある」と話したところ(趣味でUdemyで勉強中のため)、「なぜGoなのか?」「PHP(Laravel)と比べて何が優れており、何が劣っていると思うか?」「BB事業部のようなWebアプリケーション開発において、Goを採用するメリット・デメリットは?」といった深掘りをされることを知り、かなり驚きました。

単に「流行っているから」「速そうだから」といった表面的な理解では通用しないこと、技術選定の背景にあるトレードオフを自分の言葉で説明できることの重要性を痛感しました。

この経験から、今後は「プリンシプルオブプログラミング」や「達人DB」といった基礎技術書もしっかり読み込み、技術の本質的な理解を深めていきたいと強く思いました。

7. おまけ:お世話になった方々へ

メンターの伊藤さん 技術的な壁にぶつかるたび、的確すぎるアドバイスをありがとうございました。特にアーキテクチャの話や「PHPのモダンな書き方」に関する話は、今後のエンジニア人生の指針になります。「実装、真似しないでくださいね」という言葉、忘れません!

メンターの中村さん Jiraの使い方からスクラムの進め方まで、チーム開発のイロハを丁寧に教えていただきありがとうございました。中村さんのサポートのおげで、安心してタスクに進めることができました。

岡崎さん ビアバッシュでの貴重なお話や、その後の温かいDM、本当にありがとうございました。

土屋さん 一緒に一ヶ月間の開発を共に乗り越えた仲間として本当にお世話になりました!!すごく勉強になりました!!!!

BB事業部の皆様 技術的負債というリアルな課題に立ち向かう現場で、インターン生として今回このような形で受け入れてくださり、本当にありがとうございました!

8. 最後に

エキサイトのインターンは、LaravelVue.js を使ったモダンな開発フローと、DIPに基づいた保守性の高い設計思想、そして「技術的負債」というリアルな課題、そのすべてを体験できる濃密な時間でした。

フロントエンドやAI開発の経験はあったものの、バックエンドの「守り」(アーキテクチャやテスト)の重要性をこれほど痛感した経験はありませんでした。

この記事が、エキサイトのインターンに興味がある方や、「フロントの次は何を学ぼうか」と悩んでいるエンジニア学生の参考になれば幸いです。