夏期インターンシップ
初めに
こんにちは。
この度、アカツキでのフルリモート型の長期インターンシップに参加したので記事を認める。いつかインターンに参加される方の参考になれば幸いである。
私がアカツキでインターン生として解決した課題はn+1問題という、高速化において基礎中の基礎と呼ばれる部分である。基礎だからこそ大規模開発の複雑な仕様を理解することが必要不可欠だ。エンジニアとして非常に有意義な時間を過ごせたのではあるが、あまりにも広く膨大な量であるために、このような場では共有し切れない。そのため、私は日記形式で今回のアカツキにおける夏期インターンシップ内容を紹介する。
具体的な改善箇所はソシャゲをする上で、誰しもが行っている報酬受取の改善である。 現状10回分受け取ると、アイテムの種類によって複数回分のSQLが発行されるためn+1問題が発生してしまっている。 それを解決するのが私の課題である。
成果
公開できる範囲では、プレゼン用に作成したこの画像で完結する。 テストコードはいくらでも増やせるので、実質30行が本質。 ただ、n+1問題を解決するためだけに3週間のうち2週間を費やしたのには紆余曲折ある。要約すると、受け取る報酬の性質がそれぞれ異なり、かつ、厄介であったのだ。データ構造など深いところから考察して最適解を導き出すのに非常に苦労した。
さて、備忘録としての日記を基にインターン中の生活感を感じていただけたらと思う。 もし、技術的な面で記事を読みたい人はこれを見て欲しい。
日記帳
日記帳を開く
目次
初日
みんな大好き環境構築の時間。解決すべき課題もいただく。
報酬を受け取る機能の一つにガチャ機能というものがある。世間的には推しのキャラを引き当てるべく、様々な意見が跋扈しているが、コードを見る限りは完全に迷信の粋をでないと感じた。こういったユーザーからは見ることができない部分を見られるのはとても楽しい。
二日目
実際のゲーム運用の現場に入って仕事ができるので、ゲーム開発の舞台裏ではこんな風に作っているのかとワクワク感がある。わりとミーティングが多いのも印象的であった。
三日目
インフラチームとお昼食べながらミーティング。趣味の系統が似通っていて、居心地が良い。 個人的に雰囲気はとてもよかった。人事がこの辺りを見極めているのか、はたまたゲーム会社は似た気質の人が多いのか。 問題のN+1部分はbulk insertと呼ばれる一括更新によって解決すると思っていたが、課題は単純ではなかった。深淵を覗く旅路が始まった。
四日目
手元でシミュレーターを動かすことができたので、修正したコードが正しく動いているかを確認するのに大きく役に立った。通貨のパラメータを引き上げまくってガチャガチャしまくっている。直接通貨の数をいじることができるので、チーターの気分を味わった。ローカル環境なのでプレーヤーは私だけなんですが。 チーターといえば、ある会議を覗いた時にチート対策やリーク対策について話されていて、ゲーム会社の仕事を改めて感じた。
五日目
細かい文法の知識のなさが露呈する。浅い知識があるゆえに気づけない部分に気づくことができた、とも言える。それらを気付く機会を貰えたのは非常にありがたいし、それらは今後の開発においても大いに役に立つ知識であった。これは個人開発するだけでは決して身につくことのない感覚である。お手軽に結果を出すよりも、有意義だと感じた。
六日目
なにもしてないのにいんたーねっとがこわれました。
原因は、アプリ側のアップデートが行われたことによるローカルデータとの齟齬が発生したためである。メンターと環境ちゃんと三人でじっくり対話していたら一日が終わった。環境ちゃんとは仲直りできました。
七日目
既に修正自体の骨子は終わっているのだが、テストコードによって阻まれてしまい、中々改善し切れない。修正すべき箇所に関わるデータが多種多様な故に、共通のモジュールで処理するためにはそれらを全て理解しておかなければならないのだ。チームの方とモジュールの背景を聞きながら、修正を重ねていく。 雑談が始まって、そもそも何故アカツキがこのゲームを開発するに至ったか、という歴史まで聞いた。実際に会社に入ってみないとわからない部分を聞くととてもワクワクする。社外秘なので。
八日目
大規模開発であるが故に、テストコードに通過しただけでは十分とはいえない。どれだけ綺麗かつ、端的かつ、簡潔にできるか。人の入れ替わりがある現場において、可読性は何より重視される部分である。55行程度あったものが45行程度まで縮めることができた。なお、最終日までには30行まで縮められた模様。
九日目
修正箇所はある程度落ち着いたものの、共通モジュールに関数を追加したので、追加した関数に対してテストコードを作成した。テストコードの書き方についても既存のファイルを参考にした。
十日目
私より先に従事していた他のインターン生の発表を聞いた。長期にわたる成果を20分で聞く形なので、大体こんな感じなのだろうぐらいしかわからなかった。聞いたのは二人だけだけど、インターンとはいえ、大きな成果を残していた。
十一日目
デモ発表めちゃ面白い。デバッグメニューはTASとかで無理やり呼び出しているものしかみたことがなかったけど、正規の方法で利用されているのをみて一種の感動を覚えた。
コードレビューされていたので、色々と修正する。gitの操作で色々ミスをして修正を手伝ってもらった。ついでに色々な便利コマンドを教えてもらった。
十二日目
レビューされて修正してを繰り返して、1週間。テストコードなども終わっていないので、急ぎ足になる。自分が修正したコードでn+1問題が解決されたかを確認するため、負荷試験を行う。負荷試験は先に挙げたとおり、190msから120msと70msも高速化することに成功していた。
十三日目
資料作成開始。コードレビューも増えていたので、並行して進めていた。内容がかなり濃かったため、スライドにまとめる大変さを知る。整理することが苦手で、こうなることを見越して日記をつけていたがそれでもまとめることが難しい。
十四日目
資料作成終わらない、、。みやすくするために一枚20秒程度のスライドもあるけれど気がついたら40枚近くスライドを作っていた。ギリギリまで成果発表スライドをみてくれたので本当に感謝。一瞬で3週間が終わった。。。。
番外編
二週目の金曜日にスマブラ大会が勃発した。きっかけはなんだったか覚えてないけど、いろんなところで自己紹介をする機会があったので、ひたすらスマブラを擦り続けたので機会を頂けたんだと思う。(Zoom会議のバーチャル背景を"スマブラの挑戦者が現れました"にしていた) 21時ぐらいから、やっていたけど結構盛り上がって25時までやっていた。途中でガチ勢の人も出てきて、部署外の人とも交流することができた。
リモートの感想とかとか
先ほど一日あたりの所感を述べたが、今度は三週間を通してどう感じたかをまとめる。特に、今年が異例ともいえるリモートインターンという形式をとっているので、それらについて述べる。
リモートの利点
会議に参加しやすい
インターン生として折角その企業にお邪魔できるのであれば、会議に参加することを積極的に薦める。経営方針であったり、売上の推移などをリアルに知ることができる。聞きながら自分の作業もできるし、入退室もしやすい。これが現地であるならば、かなり遠慮される行為である。
質問しやすい
ふと思った疑問をすぐにslackに挙げられる。自己解決したら履歴として残せる。なにが悩んでいたかが自然とログに残る。
名前を覚えやすい
Zoomに表示されるので、初日から名前を間違えるということもなし。
通勤がない
帰宅後即布団が可能。昼休憩に布団で寝られる。
リモートの欠点
序盤打ち解けるのが難しい
単純接触効果を期待できないので慣れるのに少し時間がかかる。従来より気持ち多めに人と接する機会を増やしたほうがインターンの雰囲気を味わえると思う。人事の方に頼めばわりと簡単に別部署の人とも話を聞くことができる。
会社の雰囲気わからん
現場の人間の雰囲気が分かっても、現地の雰囲気はやはりわからない。フロントで写真撮りたいし、社員限定で利用できるサービスを利用したい。もちろん、実際の業務スタイルも経験したかった。
インターンの感想
いろんな方と話ができた
Zoomランチを何度か設けてくれたので、他部署の人とも話ができた。スマブラの話題をいくらか押していたら、スマブラをやる機会をもらえた。
多様な意見をいただいた
ほぼ毎日、自分のコーディング風景を見てもらっていた。いわゆるモブプログラミングというやつである。多い時は2,3人に見られながら作業できたので、質問などを通して多くの知見をもらえる時間だった。おかげで、一人同じところで悩み続けるということが殆どなかった。
やりたいことができた
わかりやすい成果を上げることができた。エンジニアから直々にフィードバックを受けることができた。
現場の雰囲気を味わえた
連絡が多すぎて自分のものしか追うことができなかった、、。 楽しかったの一言に尽きる。
最後に
リモートインターンシップの空気感が伝わっていたら幸いです。 ここまで読んでいただきありがとうございました!