はじめに
今回は今夏に参加した2社目のインターンについての振り返り記事を書きます。
この度、株式会社サイバーエージェントの次世代トップエンジニア創出インターンシップ ACEに参加してきました。
このインターンシップでは、プロダクトを0から開発する時にこれまであまり考えてこなかった設計周りの話や、Goを使った初めての実務経験?の中で、たくさんの(自分にとって)新しい技術に触れるともに、エンジニアとしての未熟さを痛感することになりました….。
今回の記事では、インターン期間中に経験した内容を中心に、どこに苦戦したのか、何を学んだのか、今後の展望などについてまとめたいと思います。
なぜこの記事を書いたか
- 自分自身、去年のインターン参加者の方の記事を読んで大いに参考にさせていただいたので、私も後に続く方々の情報源になるような記事を書きたかったから
- 改めてインターンを振り返るためのメモ的な位置付けにしたかったから
- 「お前は技術者としてまだまだ未熟だぞ」を定期的に感じにくる場所にしたい
インターン概要
- 期間: 2週間(対面+リモート)
- 対象者: 2026年4月以降に入社可能な大学生・大学院生
- 使用技術: バックエンド(Go言語)、Webフロントエンド
- 特徴: チーム開発、エンジニアによるメンタリング、フィードバック
- 参加特典: 選考の一部免除、交通費・宿泊費支給(条件あり)
なぜ参加したのか
- 巷で「レベルの高い学生が参加する」という噂を耳にしており、インターンに参加することで、同世代の学生との交流を持ちたかった
- サイバーエージェントで働いているエンジニアの方々のお話を聞いて、プロのエンジニアとの実力の差分を把握したかった
- 会社として展開している事業に幅があるので、個々の事業の技術要素や開発環境、に興味があった
- Goを使った開発経験を積みたかった
- 保守性/拡張性の高い実装を学びたかった(設計とその思想とか)
(参加前の状態)
- インターンに参加する前、私は主にRuby on Railsを使用してWebアプリケーションの開発を行っており、フレームワークに頼った設計や実装を行ってきました。(いわばRailsとマブダチ状態。Rails特有のお作法、特に自動生成やシンプルなコーディングスタイルに慣れていた)
- Goに関しては、以前から興味はあったものの、実際に業務レベルで使用したことはなく、簡単なハンズオンで少し触れた程度でした。そのため、Goのエラーハンドリングの明確さや並行処理など、Railsとは異なる設計哲学や機能に不安を感じていました。
- これまでの経験の中でチーム開発やフロントエンドとの連携もある程度行ってきましたが、設計思想やアーキテクチャに関する深い理解は不足していたと感じています。特に、ドメイン駆動設計(DDD)やクリーンアーキテクチャなどの概念は、書籍で読んだ程度の知識にとどまっていました。
このような背景から、今回のインターンシップに参加することで、Goを使った実務経験を積み、特に設計やアーキテクチャに関する知識を深めることが一つの大きな目標となっていました。また、他の参加学生とのチーム開発を通じて、技術的なインプットだけでなく、協力しながらプロジェクトを成功に導くためのスキルも磨いていきたいと考えていました。
選考
- 書類選考
- 技術面接
- Pythonでごにょごにょした話をしました
- Railsの好きなところと嫌いなところを話しました
- 人事面接
- これまで直面した困難と課題の解消方法、思考について話しました
- 合格→参加
インターン内容
- 5~6人チームに分かれて1つのサービスを開発
- (我々のチームは)
- バックエンド3人
- フロントエンド2人
- 提示された仕様や要件について、PM(社員さん)と連携しながらすり合わせを行い、プロダクトの価値を高める
- ↑以外の設計や技術選定は全て学生によって策定される
- 各チーム(今年は2チームでした)でそれぞれ中間・最終発表を行い、優秀者や優秀チームには選考免除や企業グッズが贈呈される
社員さんが書いてくださった記事を置いておきます。
個人的に嬉しかったポイント
- 1人の学生に対して1人の社員さんがメンターとしてついてくださり、毎日1on1をしてもらえる
- 私のメンターさんになってくれた方は紛うことなくスーパーエンジニアであると同時に優お兄ちゃんでした
- 開発期間中も、Goの言語使用や設計について解説、品質向上のためのコードレビュー、毎日の1on1での壁打ち、言語化をしてくださりました(ありがとうございました!届けぇ)
- とにかく周りの学生のレベルが高い(→ めちゃめちゃ刺激になった)
- 見たことあるような著名な記事の作者や某メガベン企業でインターンやってます!という人、XXXハッカソンで優勝しましたとか、会社やってて受注開発してます….etc
- 幅広い技術スタックを持ち、深い知識理解を持っているからこそ開発のスピード感や議論の展開が至る所で行われており、くらいつきながら協働するのはとてもカロリーを消費しました
- このインターンに関わってくださる社員の方の多さと時間の長さ
- 1にも記載しましたが、1学生につき1社員がついてくださり、期間中は徹底的にサポートしてくださります。
- 加えて、運営の社員さんがいて、中間・最終発表のフィードバックやサービスの仕様に関する擦り合わせをしてくださりました。
このインターンで体験できる技術的な密度の高さは、他のインターンではなかなか得られないものであると思いました。また、現場社員の皆さんの(同じ20代とは思えない…)技術的な引き出しの多さや課題把握、アドバイスをいただくまでのスピード感を目の当たりにする毎日でサイバーエージェントという会社全体の技術力の高さを身をもって感じました。
設計
バックエンドチームでは、参加学生の中に設計に関してとても深い知見を持っている方がいらしゃったので、弟子入りして設計思想について学びながら、本インターンで重視したいポイント(中核の業務領域)の分析を行った後、責任領域を明確にしながらディレクトリ構成を検討しました。
また、今回のプロジェクトでは、フロントエンドとバックエンドの連携を効率的に行うために、BFF(Backend For Frontend)レイヤーをバックエンドサーバーに組み込むという方法を採用しました(graphQL経験者が少なかったため、キャッチアップによる工数の増大を避けたというのもあります)。個人的にこのような設計が初めてだったので、書き残したいと思います。
このレイヤーを導入することで、以下の課題を解決しつつ、保守性とパフォーマンスを両立させました。
- インターネットの遅延を最小化: フロントエンド側で必要なデータを取得するために複数回のバックエンドリクエストが発生すると、レイテンシが増加します。BFFレイヤーでは、複数のリクエストを1つにまとめることで、この問題に対処しました。
- フロントエンドとバックエンドの責任範囲の明確化: BFFレイヤーを通じて、フロントエンドで必要なデータ構造を作成し、バックエンドは汎用的な機能に集中できるようにしました。これにより、フロントエンド/バクエンドのエンジニアが自分の範囲に専念でき、開発効率が向上しました。
- サーバーが増えないため、保守コストが下がる: BFFを専用のサーバーとして用意せず、既存のバックエンドサーバー内で処理を行うことで、インフラのコストや運用負担が軽減されました。
技術スタック
下記に私たちのチームがサービスを構築する上で選定した技術スタックをメモ書きします。
- HTTPルーティング: ルーティングには軽量で高性能なフレームワークであるEchoを採用しました。
- データベース操作: クエリの作成にはsqlcを使用しました。sqlcは、SQLクエリをGoの型安全なコードとして自動生成するツールであり、負荷に応じて柔軟な対応が取れるという旨みがあります。
- APIスキーマ: APIスキーマの定義にはOpenAPIを採用しました。OpenAPIに基づいてスキーマを定義することで、フロントエンドとバックエンドのインターフェースを統一し、APIの仕様が明確化されました。また、oapi-codegenを使ってGoコードを自動生成することで、手作業によるエラーの発生を防ぎ、開発効率を高めました。
- タスクランナー: バックエンドの開発環境を効率化するために、Taskfileを使用しました。
- 依存関係の注入: google/wireを利用して依存関係注入(DI)を行いました。Wireを使用することで、依存関係を明確に管理し、テストのしやすさやコードの可読性を向上させました。
振り返り
以降は、インターンに参加して学んだことを備忘録として記述していこうと思います。
技術的な学び
- インターン期間中に得た技術的な学び(特に大きいもの)は下記です。
- 設計思想(と巷にある関連情報を盲信してはいけないという教訓、実際にいろんなプロダクトに触れてみながらいろんなケースを学ぶことの重要性)
- Goにおける文法や多様なライブラリの特徴・ありがたみ(少しは仲良くなれたかなと…)
- 開発におけるエラーハンドリングやログ設計、ドキュメント整備などの重要性:保守性や拡張性を高めること、長期的な運用を考える上で、これらの項目は避けてはいけないものであると実感しました。運用中の負荷分析や予期せぬトラブルへの対応、人員の入れ替わりなどを考慮して、環境を整えることが組織やプロダクトを含めた「サービス」をしての価値を高めることにつながるということを感じました。
- なお、インターン期間中に、学んだ知見の一部を記事として公開しました。(情報が整理できてとても効果的だと感じ、今後もサボることなく蓄積していきたいを改めて思いました。)
技術以外の学び
- チーム開発に関する項目
- 状況を整理して立ち返るような動きを意識すると円滑に議論が進む
- 議論の背景/目的(ゴールの状態)/期限/対象者を明確にすることで時間を有効に使える
- 衝突した場合は、相手の意見を受容してから意見を述べる
- 時には第3者に頼る
- 個人として
- とはいえ、エンジニアとして働く以上は、技術的なレベルがある一定以上ないとクリティカルな議論や意思決定ができない場面が多々あるので、引き続き技術研鑽に励みたい
インターンに参加した感想
- 今回参加させていただいたインターンでは、チーム開発の中での成功や失敗を経験し、エンジニアとしてのキャリアを歩んでいく上での強みと、まだまだ伸ばす必要のある課題を明確に把握できました。具体的なネクストアクション(後述)を見つけ、視座を高めることができた点において、非常に有意義なインターンだったと感じています。
- チームメンバーの皆がそれぞれの分野で深い知識を持ち、議論が進むスピードやアイデアの展開に感動する場面が多々ありました。そのような環境に身を置くことで、自分自身の成長の必要性を強く感じるとともに、もっと上を目指したいというモチベーションが高まりました。
- 特に印象深かったのは、チーム開発の難しさと面白さです。異なる背景や技術力を持つメンバーと協働することで、単なる技術スキルだけでなく、チームワークやコミュニケーションの重要性を改めて感じました。議論がスムーズに進まなかったり、意見が衝突する場面もありましたが、今後に活きる重要な知見(前述)を得ることができました。
- 繰り返しになりますが、メンターさんの献身的なサポートには感謝してもしきれません(届けぇ!)。周囲の学生との知識の差に苦しむ場面もありましたが、時間を割いてアドバイスをくださり、実務経験も踏まえた情報提供から私自身大きく成長できたと感じています。運営・人事の方々からいただいたフィードバックも心に響き、特に、ある社員さんから「一緒に働きたいと思えた」というコメントをいただいた際には、高いレベルで協働できるような人材になりたいという思いを一層強くしました。
今後の展望
できるだけ具体的にネクストアクションを考えてみました。
- 技術的な習熟度の低さの課題に対して、学生の間はインターン/ ハッカソンへの参加。長期的には日常業務に加えた技術記事の作成やカンファレンスの登壇を行っていきながら、クリアしていきたい。
- また、習得する知識についてもこれまでは具体性の高い(機能実装やライブラリのHow to)ものが大部分を占めていましたが、設計思想等の抽象度の高いものにもしっかりを目を向けたい。(直近では、単一責任原則、エラー設計、ログ設計あたりにタックルしたい)
- 社員さんからのフィードバックから自分の中での技術的な成長のマインドとチーム開発における動き方の点が強みであると認識することができたので、引き続き様々な開発組織に関する記事や実際にジョインする体験をしながら、思考と具体的な手段の選択肢を増やしていくような動きを通じて成長していきたい。
最後に
今回は、参加したインターンに関する概要とワークの振り返りについて(自分用の備忘録的な側面も含みながら)まとめました。今回のインターンで感じた悔しさを糧にさらに成長するために努力していきたいと思います。(研究も頑張るぞ!)