Supership初のテックインターンシップを開催した話（アドテクセンター）

# 背景
Supershipで働く面白さと、学生の皆さんの視野を広げる機会を創出したいという考えから、インターン実施を決定しました。
今回のインターンシップの目的は、(1) スキルアップ、技術へのモチベーションアップ、(2) 参加者のエンジニアスキル証明、(3) プロ水準の当たり前化、(4) 強いエンジニアのリアルを知る、の4つとなります。

インターンシップはアドテクノロジーセンター（広告チーム）とデータソリューションスタジオ（検索チーム）の2部署で行いました。本記事では、広告チームで実施したインターンシップについて記します。
検索チームの記事は[こちら](https://qiita.com/westtail/items/ba153936a058994f10eb)です

詳細はSupershipグループ社内報で掲載しておりますので、そちらをご覧ください。
https://super-stories.com/n/n1ddb6b624ea6#a062655e-cb92-4d6b-98ab-6fc557809004

なお、今回のインターンシップは新型コロナウイルスの影響により、フルリモートで行いました。

# コンテンツ設計
広告チームでは、国内最大規模のDSPプロダクトである[ScaleOut](https://supership.jp/business/scaleout/)の開発チームに10日間実際に入り、3人1組のチームでRailsを用いたプロダクト開発を体験していただく内容としました。

開発は、実務と同様にGitHubのIssueを消化する形で行います。開発期限のないIssueをインターン用に確保したり、ScaleOutの開発者やユーザーに欲しい機能や動作が遅い画面をヒアリングしたりした後、各タスクの難易度を初級、中級、上級に分類しました。難易度と内容の関係は以下の通りです。

## 初級タスク
開発の手順、Pull Requestの出し方、Specを書くことの重要性などを学んでいただくために、新たに配属された人が最初に取り組むレベルのタスクを用意しました。例えば、`good first issue`ラベルの付いたIssueなどです。1日で1人1～3タスクの消化を想定しました。主な内容は以下となります。
* メソッド名のtypoの修正
* DB側のバリデーションとRailsのモデル側のバリデーションの不一致の修正
* 不要となった機能の画面からの削除

## 中級タスク
Bid Requestの仕組みやOpenRTBの仕様など、広告配信の裏側を理解していただくために、任意のBid RequestをScaleOutに送信できるツールを制作するタスクを用意しました。

タスクを用意した背景として、ScaleOutの営業担当から、ある案件について期待するBid Responseが返されないという問い合わせが来る場合があります。その調査を行う際に、様々なSSPの仕様に基づいたBid Requestを組み立てて送ることがあるものの、エンジニアが各SSPの仕様を調査してBid Requestを組み立てるのには工数が掛かります。
中級タスクでは、その工数を削減するためのツールをScaleOutに組み込みます。

タスクを細分化するために以下のIssueを用意し、必要に応じてIssueを切ってもらいました。
* 特定のSSPの仕様に基づき、バナー広告のBid RequestのJSONを組み立て、ScaleOutに送信できるようにする
* VASTなど、バナー広告以外の広告タイプに対応させる
* OpenRTB 2系に準拠した仕様のSSPのBid Requestを送信できるようにする

期間は4日間を想定し、初級タスクとは異なりチームで1画面を作ることになるので、VS CodeのLive Shareを用いたモブプログラミング形式で取り組んでいただきました。

## 上級タスク
目標が与えられた課題に対して、原因の特定から実装までを行うタスクとして、ScaleOut内のあるレポート画面において、動作が遅い画面の高速化を行うタスクを用意しました。
こちらはScaleOutのユーザーに動作が遅い画面をヒアリングしたところ浮上した課題です。

運営側で事前に検討を付けていた原因は以下の通りです。
* 1画面に数千件のレコードが出力されることがあるため、view側の描画が遅い
* データを取得する際に内部的にAPIを呼び出しているが、その呼び出し回数が多い
* バックエンド側で処理しているSQLのクエリにおいて、不要な絞り込みが行われている

上級タスクでは細分化したIssueは用意せず、進め方や役割分担は全てインターン生に一任しました。想定した期間は3日間です。

# スケジュール
10日間のスケジュールの概要は以下の通りです。
```
1日目：説明、環境構築
(土日を挟む)
2日目：初級タスクに取り組む
3～5日目：中級タスクに取り組む
6日目：中級タスク仕上げ、中間発表
(土日を挟む)
7日目～9日目：上級タスク
10日目：上級タスク仕上げ、最終報告会、懇親会
```

# インターンシップのアピールポイント
ScaleOutは10年以上動いており、データベースには数百のテーブルがあり、全てを理解することは不可能と言われるほど規模の大きいプロダクトです。
このような大規模なプロダクトの開発を実務レベルで体験できる点や、現役のエンジニアから質の高いコードレビューを受けられる点がインターンシップの特徴です。
レビューを乗り越えると、自然と高品質なコードが書けるようになります。

また、インターンシップの期間中には、アドテクの技術的知識講座や、広告配信サーバーを支えるインフラチーム、広告配信基盤の構成管理を行うSREチーム、エンジニアと営業担当との橋渡しを行うアドソリューション室など、広告配信に関わる部署の説明を聞ける機会を用意しました。

# インターンシップの結果
インターンシップの参加者は、全員アルバイトやハッカソンでWebアプリケーションの開発経験がありました。
10日間で、インターン生は初級タスクのIssueは1人1件以上消化でき、中級タスクは全て完了でき、上級タスクはレビューには至らなかったものの高速化の実装まで行うことができました。


# インターンシップ参加者の声
参加者のQiita記事
* https://qiita.com/Arumakan1727/items/500b89d22685cf4ba3f7

# 運営側の感想
インターンシップを開催した感想として、参加者の皆さんからアドテクについて理解できたという声や、社員からのコードレビューが参考になったという声を頂けて、視野を広げて頂けたと感じました。

参加者の技術力は予想より高く、Dockerコマンドを使いこなせていたり、こちらから具体的な指示を出さなくてもチームで開発できていたり、上級タスクにおいてはこちらが想定していた原因を難なく突き止められていたりと、入社後即戦力になってくれそうなレベル感でした。

また、実際のタスクを使って開発体験をして頂く内容を用意するためには予想以上に時間的コストが掛かりました。期限がなく、かつ前提知識が最小限で済むタスクを探し、模範解答も用意していたので、運営側の他のタスクが疎かになったこともありました。そのため、本来の実務を体験していただく内容とするためには、やはり数ヶ月の期間は必要であると実感しました。

他には、新型コロナウイルスの影響により、オフィスに来る機会を用意できなかったことが残念です。

# おわりに
最後に宣伝です。
[Supership](https://supership.jp/)ではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership株式会社 採用サイト](https://supership.jp/recruit/)
是非ともよろしくお願いいたします。