Yahoo! JAPAN 2023 Summer Internship に参加してきた話

Yahoo! JAPAN 2023 Summer Internship に参加してきました！

![PXL_20230815_071603601.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/0b76a05f-532b-95ea-24ac-b1cb1ffb7933.jpeg)

インターンの内容を振り返りつつ、学んだことや感想などを記事にします！

# インターン概要

2週間の実務型インターンで、Goを使ったバックエンド側の[広告配信システムの開発](https://about.yahoo.co.jp/hr/internship/1010/)を行いました。

フルリモートだったので真夏のこの時期には最高の勤務環境でした！

チームには10名のメンバーがおり、基本的にはメンターさんとインターンタスク案件に詳しいPMさんと実装に詳しい方の3名でサポートしていただけました。

その他に「オープンドア」というチームメンバー全員が集まる時間に他のメンバーからもアドバイスをいただけました。

インターンタスクとしては新規広告形式の開発を行い、追加タスクとしてチームに導入するか検討中の技術の調査を行いました。

本番リリースまで行え、追加タスクも貰えて、インターン中に日増しに成長が実感できたインターンでした！

# 配属チーム

インターンでは広告開発本部のSSPの開発をするバックエンドチームに所属していました。

SSP(Supply Side Platform)は聞き馴染みのない単語かと思いますが、広告媒体側のプラットフォームのことです。
ちなみにSSPとセットで出てくるDSP(Demand Side Platform)とは広告主側のプラットフォームのことです。

以下の**スマホアプリでの広告配信フロー**の3番と5番を主に開発しているチームでした。

![mermaid-diagram-2023-09-02-223928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/62c715cb-9173-be43-b302-45f3cebc1c60.png)

# 初日

初日は少し緊張していましたが、お昼に懇親会が開かれチームメンバーとざっくばらんに話せる機会をいただけたのでスムーズにチームに入ることができました。

↓懇親会用に送られてきたお昼ご飯のおかず (美味しかった！)
![PXL_20230821_030244605.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/fe4243e7-d66b-ee85-5e2c-694d60714da1.jpeg)

懇親会後は広告配信システムの説明があり、普段流れてくる広告の裏側を知ることができました。

配属チームの説明で上述したSSPやDSPなど知らない用語が多く最初は戸惑いもありましたが、説明会でわかりやすい言葉に言い換えて解説していただけたので自分でも全体像を理解することができました。

広告配信システム説明会の次にインターンの案件解説をメンターさんとPMの方からしていただきました。

既に要件定義から設計までしていただいている状態でインターン生の私は「内容理解→実装」に専念できるようになっていました。

広告の用語やヤフーの専門用語など知らないことが多くありましたが、理解が曖昧な部分をひたすら質問し、丁寧に教えていただくことができました。

# コードリーディング

2日目からSSPのソースコードを読み始めました。
広告SDKからリクエストを受け取り、レスポンスを広告SDKへ返すまでの下記②〜⑤の流れをどのコードで実装しているのかチームメンバーにサポートしていただきながら確認をしました。

![mermaid-diagram-2023-09-02-223928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/62c715cb-9173-be43-b302-45f3cebc1c60.png)

早めに流れを把握できたので2日目にして実装に入ることができました。

スタートダッシュが良好だったので、その流れでインターン全体もパフォーマンスを落とさず集中して取り組むことができました。

# 実装

実装した広告形式の正式な公表は1,2ヶ月後らしいので詳しい実装内容は書けません...
内容は薄くなってしまいますが実装中の感想的なものを書きます。

一番苦労したことは、タスク案件に関係するドキュメントが多く、どこにどの情報が書いてあるのか把握するのに時間がかかりました。
ずっと稼働してきた大手のシステムだけあって情報量は多かったですが、綺麗に整理されており、チームの方々にどの部分だけを確認すればいいのか教えていただけたので混乱せずにすみました。

またクラス関係に関しても複雑でしたが、クラス図が用意されており、どの部分を確認すればいいのかチームメンバーに教えていただけたのでとても助かりました。


他の感想としてはPMさんの仕事が早かったです！

実装中に、要件のところで疑問を持ったので質問すると、すぐに別チームに仕様確認して説明をいただけました。
またその際、追加要件が発生しても、わかりやすく伝えていただきました。

大きい会社だと縦割りで遅いのかなと偏見を持っていましたが、チーム間ではすぐに連携することができる体制になっているようでした。

# テスト

実装した関数のユニットテストを作成しました。

ここでVSCODEの素晴らしさを再実感しました。
ユニットテストの雛形自動生成やテストケースのカバレッジを見る方法を教えてもらいました。
特にカバーされている部分が可視化されることで、どんどんそれを埋めていく様子が確認でき楽しみながらテストを書くことができました。

またテストが非常に大事でありがたいことを実感しました。
既存の実装に手を加える場合やリファクタリングを行う際にテストがあることで心理的安全性が全然違いました。
またその代わりにテストケースで仕様を網羅しておく大切さも学びました。

テストを書くことはほとんどしてきませんでしたが、今後はテストの書き方なども積極的に勉強していこうと思いました。

# OpenAPIドキュメント

新規広告形式の実装をしたので、OpneAPIドキュメントに項目を追加しました。

OpenAPIという名前は聞いたことがあったのですが、使ったことがなかったので勉強になりました。

OpenAPIは仕様書だけでなく、フロントエンドやバックエンドのコードを自動で生成してくれる機能や、モックサーバーを立ててくれる超優れものだったので今後の開発でも取り入れていこう思いました。


# GitHub

実務観点でのGitHubの使い方も学びました。

便利機能としてドラフトプルリクエストを教えていただきました。

https://github.blog/jp/2019-02-19-introducing-draft-pull-requests/

マージするためではなく、他のメンバーにローカルで確認してフィードバックをもらいたい場合や、聞きたいことや議論したいことがある場合はドラフトプルリクエストを活用すると良さそうです。

またConversation機能も教えていただけました。
私が所属したチームではプルリクエストにConversationタブを積極的に使用してレビューしていました。
議論の内容がコードベースでわかりやすくチームの見える場所に残り、またそのConversationごとにcommitをすればレビュワーも見やすく、実装者もコメントを元に実装がしやすいので効率的に開発を進めることができました。

# 追加タスク

インターンタスクが早めに終わりそうだったので、追加タスクとしてチームに導入するか検討中だったPGOの技術調査を行いました。

PGO(Profile-Guided Optimization)とは実行時のプロファイリング結果を元にコンパイルを最適化する機能のことです。
Go言語では、2023年9月現在の最新バージョンであるGo1.21で正式にリリースされました。

https://tip.golang.org/doc/go1.21#compiler

追加タスクの要件としては

1. PGOの技術調査
2. 調査結果を元にドキュメント作成
3. 調査結果をチームに発表

という流れでした。

PGOに関しては社外秘では無いと承認をいただけたので技術記事を書きました。

https://zenn.dev/ynakashi/articles/19403d151a6b35

チーム発表では、質疑応答の時間に自分では気づけなかった観点からの質問をいただき非常に勉強になりました。
またチームで技術的議論が盛り上がり、Theエンジニアの会話ができて面白かったです！

# 1on1面談

ヤフーでは毎週、上長と部下がミーティングを行う1on1制度というものがありました。

インターンでは毎日メンターと1on1の時間が設けられており、そこで雑談や進捗確認、業務での疑問点解消などを行いました。

メンターの方が非常に話しやすく、些細な疑問でも答えていただけて、とっても優しい方でした！！

また、インターンではメンターの方以外に、多くの方とお話ししてみたいとも思っていました。

とは言え、最初は仕事がある人に時間を使わせては申し訳ないかなと遠慮していました...

ですが、相手の予定が空いていたら1on1の招待を送っちゃっていいよとGoサインが出たので、ありがたいことに気づけば10名の方と1on1をさせていただくことができました。

色んな人の考え方を学ぶことができ貴重な時間を過ごすことができました。

1on1面談のお時間作っていただきありがとうございました！

# インターン全体のGKT

チームでは毎週金曜に、その週のGood(良かった点)、Keep(続けたいこと)、Try(取り組みたいこと)を共有し合う定例会がありました。
それに倣い、インターン全体の自分に対するGKTを書いていこうと思います。

## Good

- 初日に案件内容把握、2日目にコードリーディングと実装、3日目にドラフトプルリクエストの作成、というようにドメイン知識と案件の要点、コードの全体像を早めにキャッチアップして実装に入り初速が良かった

- インターン中に本番リリースまで持っていけた
(チームメンバーのKさんにはリリースできるところまで手厚くサポートしていただき感謝です:bow:)

- 追加タスクにてチーム内発表の経験でき、インターン中に2回発表機会を得ることで、発表に対する苦手意識が和らいだ

## Keep

- フィードバックでもお褒めの言葉をいただけたが、その場で理解し、納得できるまで質問しきることを大切にしていたのでその点はインターンが終わった後も続けたい。

- 事前にキーパーソンとの方向性のすり合わせを行い、質問する前にある程度把握してから報連相を行うことでスムーズに実装を行うことができたので、今後も報連相を大切にしたい。

## Try

- 遅い技術を学んでいきたい。

↑今まで、エンジニアならほとんどの人が知っているような昔からある書籍で勉強せず、基本的にサイトを使い、手を動かして学んでいました。
ですがフィードバックで伸びる点として指摘いただいたので、今後は書籍も使い、概念的な勉強もしていきたいと思いました。

# 感想

ヤフーの実際のサービスに触ることができ、本番リリースまで行けたので自分の実装したものが誰かの役に立てているという貴重な経験を得ることができ達成感でいっぱいです！

フルリモート環境での業務に少し不安がありましたが、オープンドアの時間が設けられており、相談もしやすい環境だったので不安は消え、むしろリモートワークのならではの良さも知ることができました！

最終日の懇親会もリモート開催でしたがとても楽しかったです！！

![PXL_20230901_100929990.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/f6a880aa-8659-1a91-8d01-cf250624f9fa.jpeg)

# おわりに

広告配信システムという普段は関わる機会がなく、右も左もわからなかったのですがサポートしてくださった方々のおかげで楽しい2週間を過ごすことができました！
ありがとうございました！！