UNICORN株式会社様のインターンシップに参加しました!
こんにちは、タキガワです。
いろいろと忘れてしまう前にインターンシップ参加記を残そうと思います。
UNICORN株式会社とは?
広告配信システムの開発と運営をしています。自分で説明すると誤解を生むのが怖いので、上記の記事を見てほしいです。会社概要や、雰囲気が伝わると思います。
リモート環境
今回はコロナウイルスの影響もあって、フルリモートで参加することになりました。
労働時間はフレックスでしたが、インターン生は朝の10時からミーティングをしたので、10時から勤務して、19時に退勤ということがほとんどでした。
あと、正社員になると、業務で使用するMacが定期的に新しいものにリフレッシュされるらしいです。すごい
インターンの選考
スペック
(最終発表会で使用したスライドの1ページ。個人情報開示)
athletics様の逆求人イベント
これが運がよかった点の一つ目です。
UNICORN様は7/3にあったその逆求人に参加しました。
そもそもこの逆求人イベントに参加したのは、athletics様に誘っていただいたという経緯がありまして、当時は、競技プログラミングの調子も良くなくて、あまり乗り気ではなかったのですが、せっかくの機会だし、あとで後悔するかもと思って参加しました。athletics様には感謝をしております。
そして、そのイベントでは、企業さんと面談をするのですが、それがUNICORN様との出会いです。その時の僕は、twitterを含めて1ヶ月ほど他人とほぼコミュニケーションをとっていなかったので、かなり陰湿な感じになっていたと思います。それでもインターンシップに参加させてもらえたので、とても感謝しています。AtCoder青色というところが良く評価されたのだと思います。AtCoder様ありがとう...
インターンシップの待遇
報酬
時給2000円でした。ありがとうございます。
期間
8/11(水)〜8/31(火)
出勤時間
基本的に朝10時にミーティングがあったので、10〜19時の8時間勤務(休憩1時間)でした。
余談ですが、朝10時ならCodeforces(23:35〜1:50)に出ても大丈夫かなと思って一度試したのですが、おもったより体力がもってかれてキツかったです。
補助体制
メンターさんが二人ついてくれました。基本的に質問したらなんでも答えてくれるので、とてもやりやすかったです。
後で知ったのですが、インターン生が僕一人だけでした(え?)
課題内容
課題内容は、掲載可否を高速化すると言った内容でした。インターンの本質ではないので、誤解を恐れない程度に説明します。
掲載可否とは、広告枠にその広告を載せて良いのかを判定する機能のことです。
判定に使用する材料には、広告枠のホワイトリストとブラックリストがあって、それをもとにして判定するということです。
言語はGoでした。
インターンシップ
序盤
インターンシップ初日は、zoomでミーティングをした直後、リポジトリの閲覧権をわたされて、今後の説明をしてもらいました。ミーティングが終了した直後には、具体的に何をするのかがわかってなくて、リモートだったので部屋に静かに一人の状態で、かなり焦りました。事前の説明で、UNICORNは自分で仕事を見つけるような人が向いていると聞いていたので、とりあえず、課題内容のREADMEをよむことにしました。すると、特定のGoファイルの高速化をするらしいことがわかり、そのソースコードを読むのですが、さっそく非同期っぽい処理があって、流石に初日ではまったくわからなかったので、GoTourというサイトのGo言語入門をしていました。とりあえず、なにか報告しようとおもって、Slackに「Go tourを進めています」と送信したら、いろいろと課題のヒントをくれたりしました。初日はそんな感じでした。あと、開発環境はGoのバージョン以外は特に指定されなかったので、neovimでやってました。
それからは、Go言語の勉強をしつつ、掲載可否のテストケースの作成(簡単なもの)を作成しました。ほかにも、朝のミーティングで広告配信技術についての説明をしてもらっていたりしました。競技プログラミングをやっていたら意識しなかったのですが、メモリアロケーションがかなり遅い処理だということを実感しました。
あと、メンターさんと雑談して、コミュニケーションが取りやすくなってとても良かったです。
中盤
渡されたリポジトリを読み進めたり、その理解を深めるために、テストケースを作成して、掲載可否の判定をしてみたりということをしました。感覚としては、とてもややこしいマラソンコンテストの問題を理解するという感じです。ただ、事前にもらったサンプルケースも結構充実していたので、地道にやっていれば、なんとか理解できました。
具体的に、なにが複雑なのかというと、掲載可否に必要な情報の項目が20以上あって、それが文字列だったり、数列や、数値だったりして、それがブラックリストやホワイトリストの条件を満たすかどうかを確認する必要がありました。
そして、Go言語でとりあえず、紹介してもらったアルゴリズムを用いて掲載可否のプログラムの必要条件をみたすように、プログラムを書いていくわけなのですが、
えーー!タキガワの担当箇所がバグだらけ!?
ということにはなりませんでした。(ラッキー)
苦労した点は、メモリアロケーションが発生してプログラムが遅くなってしまうということに苦労しました。どこでメモリアロケーションが発生しているのかというのは、競技プログラミングで意識しなかったので、新鮮な体験でした。そしてなんとか、必要条件をみたすプログラムが出来たのですが、思ったより速くならなくて、ヒューリスティックな改善を導入したりして、プログラムが複雑になった割に、実行時間も75%程度にしかなりませんでした。
終盤
メンターさんにプログラムを見てもらって、Goの書き方を工夫したりしたのですが、お思ったよりも速くならなくて、まぁでも、定数倍が軽いO(N)から定数倍が重いO(1)にすることができたので、今後のブラックリストが増えていくならば、効果が出てくるだろうということで、プログラムを書くことは一旦終了しました。メンターさんからみると、インターンシップが思っていたよりも順調にすすんでいたようだったので、追加プログラムとして、他の社員さんに向けて成果発表をすることになりました。発表資料を作る時間はかなりもらえたので、ほとんどのスライドに図をいれたり、台本を用意したりして、準備をしました。また、ビジネスをする人にもインパクトがあるように作るという事が新鮮でした。
発表までに土日を挟んだのですが、その間に、プログラムの改善を思いついて、実装したところ、実行時間が50%になって、インフラコストの削減を計算したところ、月$5000の削減という事になりました。(ラッキー)
そして最終発表を迎えるわけなのですが、事前に十分な時間をもらっていたので、発表は成功しました。
発表後、社長さんと人事さんと面談をして、とても好評で、良い感想をいただきました。インターンも非常によく評価してもらっていて、まさか賞与(10万円)だけでなく内定も頂いてしまいました。UNICORNさんはエンジニアの力が出せるような環境を準備してくれているという雰囲気でした。とても嬉しかったです。
感想
プログラムが思ったより順調に進んだのは、後にバグらせたり、見落としがあって、崩壊するのが怖くて、保険として時間的に余裕を持たせたいという若干焦りのようなものもあったと思います。結果としては、うまく行って(ラッキー)、プログラムもmainにマージされて、良かったです。
信じて送り出したプログラムは多分今も動いています。
プログラムを書いた感覚としては、マラソンコンテストに近いと感じました。
そもそも広告配信技術には高速化や入札の最適化など、競技プログラミングが役に立つ場面が比較的多いと感じました。UNICORNさんも競プロerを高く評価しているみたいです。なので、興味があったら申し込んでみると良いかもしれません。
競プロerとして評価されたのは、論理的思考力と、その思考体力と、あとはアルゴリズムの理解力みたいな感じでした。これから就職活動する競プロerの方はそこをアピールしてもいいかもしれません。
今後
正直、このまま内定を承諾して就活を終わらせるのが最善だと思っているし、別の会社を探してもUNICORNさんより良い会社を見つけるのはかなり難しいと感じています。社会勉強として、他の会社の説明会に参加してみるなどはするかもしれませんが...。
最後に
というわけで、インターン参加記は以上になります。
僕がこんなに良い体験をできるとは思ってもいませんでした。
AtCoder様、UNICORN様、Athletics様には感謝しています。
ありがとうございました。