サイバーエージェントの「アドテク」に参加してきました[インターン]

こんにちは、かわそんです!

先日、このようなツイートをしました。

サイバーエージェントのインターン修了👌 一言で表すと「挫折と成長」でして、周りのつよつよエンジニアに揉まれつつ、圧倒的に視野を広げました。これについて、明日の夜まで渋谷のカフェにこもって記事執筆します。ルーティンは大切にしなきゃですね、おやすみなさい💤

このツイートの通り、サイバーエージェントのインターンについて、共有します。

「アドテクコンペ」という、
ハッカソン形式のインターンですね。

✔️本記事の内容

  • インターンの内容
  • 学んだこと・反省点
  • これからの自分

圧倒的に挫折して、成長した人間の記録です。

読み物として、
時間あるときにどうぞ。

サイバーエージェントの「アドテク」に参加してきました[インターン]


インターンは3日間でして、順番に紹介します。

初日:お題の発表・アーキテクチャの設計


まずは、初日。

インターンの間で作るプロダクトと、チームメンバーが発表されました。

お題は一言でいうと、
「DSP」を作成せよ。
ですね。

、、、DSPとは何ぞやっていう話ですが、

広告主の利益を最大にする、
広告落札オークションシステム

って考えてもらえれば、OKです。

詳しく知りたい方は、こちらの記事をどうぞ。

✔️何をどう作ったのか

詳しいことは書けないのですが、
ざっくりこんな感じ。

一秒間に2000リクエストを送ります。
全部さばいて、機械学習でクリック率を予測してください。
その結果で、広告枠を争ってオークションをしてください。
競り勝ったら、あなたに売りますよ。

上記の通り。

で、僕はサーバーをGo言語で書いたという感じですね。

✔️技術選定の話

結論からいうと、
サーバー側はこんな感じ。

Golang、GCP、Redis、Kubernetes、flask

これを、組み合わせました。

GCPが使い放題ということで、
贅沢に設計に盛り込んでみましたw

(たぶん、8万以上の請求になってるはずです。
すみません。。)

チームビルディングをしつつ、
設計を終わらせる。

これが、初日でした。

2日目:ひたすら開発あるのみ


2日目は、ひたすら開発です。

初日はAbemaTowerだったのですが、渋谷マークシティに移動です。

ML(機械学習)側とエンドポイントや、レスポンスの形をすり合わせつつ、サーバーの構築をし始めました。

この辺りで、
ヤバめな予感が漂ってきました。

✔️何がやばかったのか

何がやばかったのか。

3つでして、下記の通り。

・ML側とつなぎ込みがうまくいかない
・Goが思った以上に書けない
・処理が重すぎる

上記の通り。

僕たちサーバー側2人が、かなりチャレンジをしていました。

Goに慣れていなかったのですが、
「スピードも早いし、せっかくなので」
という理由で、選定してたんですよね。

✔️ハッカソンあるあるが起きた

ハッカソンで一番あること

「寝れない」
問題です。

仮眠を繰り返しつつ、朝まで作業です。

ゴッティさん(@masagotty)のモンスタータワーで乗り切りましたw

最終日:最後の追い込み、だが、、


いよいよ最終日。

午前中の開発2時間を使って、開発を追い込みました。

具体的には、
「とにかく動くものをデプロイする」
ことにフォーカス。

Kubernetesをサーバー側で使うことを諦め、GAEを使うことに決めました。

✔️エンドポイントの動きがおかしい

さてさて、、
デプロイが終わって、毎秒2000リクエストが流れてきました。

しかし事件が。

なんと204を返すはずが、ずっと500(サーバーエラー)を吐き続けていたんですよね。

焦りました。
メンターさんを呼んでも、なかなか解決せず。

結局、Goのソースコードを読むと、「ステータスコードを返すタイミング」にハマってたことがわかりました。

参考までに。
w.WriteHeaderだけで、statusコードは反映されません。
その後に、w.Writeも呼ばないとダメみたいです。

✔️最後の30分で正常な動きができた

原因はシンプルでしたが、
調べるのに時間がかかりました。

4時間のオークション中、最後の30分だけ、正常に動いたという状況でしたね。

残りは、
サーバー2人とメンターさんで、ひたすら調査でした。

調査の方法を盗んだり、
Goの内部を知るいい経験にはなりましたが、、、完全にやらかしです。

アドテクコンペの反省・成長


ここからは、
反省と成長について書きます。

大きく3つ。

  • 「チャレンジ」には優先順位をつけること
  • インフラのスキルもつけること
  • 「コア機能の選定」には時間をかけるべき

ぶっちゃけ、かなり悔しかったので、忘れないように入魂します。

「チャレンジ」には優先順位をつけること

これは、審査員の方から頂いたフィードバックです。

「実務でチャレンジを入れる時は、優先順位をつけるよ」

新しい技術を入れる時は、
レガシーの技術も盛り込むようです。

つまり、
「新しい技術ばかりにならないようにする」
っていうことかなと。

✔️僕たちの場合

今回の僕のチャレンジは、下記です。

  • がっつりGo言語を書く
  • GCPを使う
  • MLと連携する

「初めまして」ばかりのスキルでした。

ぶっちゃけMLとの連携以外は、1人の時の努力次第で、できますよね。

意識が分散して、
安定したシステムの構築が難しくなってました。

インフラのスキルも身につけること

今回使ったのは、GCPっていうインフラです。

Google Cloud Platformってやつですね。

※大量のデータを保存したり、処理したり、負荷を分散させることができるクラウドです。

ぶっちゃけ、かなり「慣れ」が必要な分野でして、限られた中で調べながら使うのは、なかなか骨が折れます。

✔️普段から触っておくことで解決

チュートリアルくらいは触っておいていいはずです。

というのはやっぱり
「触ったことがある」っていうだけで、
かなり出足が早くなるんですよね。

トラフィックが多い実務ではどうせ使うので、身につけておいて損はないです。

コア機能の選定には時間をかけるべき

「コア機能から作るべき」

よく聞く言葉ですよね。
特にITの世界では。

でも、特に複数の技術を混ぜる時は、意識し直したほうがいいです。

時間をかけて、
ここ以外は作らないくらいの気持ちで。

本当に大切ですよ。

予想外のところで詰まって、時間をロスすることとかありますので。

✔️僕たちの失敗

一番大きい失敗は、下記です。

最後までリクエストを導通させることができなかった

致命的ですよね。
広告主が永遠に広告を出せません。

原因ははっきりしてまして、
「導通の優先度を低く見積もりすぎた」
ことです。

導通しないと話にならないのに、インフラやサーバーに意識を奪われすぎました。

最後に:サイバーインターン後の展望

ぶっちゃけ、かなり悔しい結果でした。

自分のGo技術不足、
インフラ知識不足、
実装手順の不備、、

ですが、もう繰り返しません。

こうやって文字に起こして、整理したので。

実は、ちょっと余談なのですが、僕はTwitter(@KKohey4)で「#今日の積み上げ」っていうタグを使って、毎日のタスクを宣言しています。

外さないのは、
ブログの毎日更新ですね。

ここに「Go言語の勉強」を加えます。

次にみんなにお会いする時は、Goスキルで引っ張れる立場になるために。

あとインフラは、サイバーからもらった、4000円くらいのクレジットで勉強。

「つよつよエンジニア」になるために、
毎日頑張っていきます。

力をつけていく様子や学びは、Twitterにて発信しますので、よかったら「かわそん」って調べてみてください。

ではでは、以上です。

今回みたいに、「自分のカラを破る」きっかけを下さった、サイバーエージェントの皆様に、改めて感謝いたします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です