Akatsuki Hackers Lab | 株式会社アカツキ(Akatsuki Inc.)

Akatsuki Hackers Labは株式会社アカツキが運営しています。

アカツキインターンで体験したこと・感じたこと

エンジニアインターンとして二週間アカツキで働いたnkzさんの体験記をお届けします。初めてのインターン、そして初めての実践的な開発に関わったということでしたが、どのような経験をされたのでしょうか。その様子をレポートいただきます。

ご挨拶

初めまして。nkzです。この度アカツキで、あるモバイルゲームのサーバサイドエンジニアとしてインターンをさせていただきました。趣味は競技プログラミングでそれ以外の開発経験はほとんどありませんでした。開発経験の無い競プロ勢がインターンに行ったらどうなるか?という一つのモデルケースにしてもらえれば幸いです。期間としては二週間ちょっと、開発環境はRuby on Railsでした。

インターンが始まるまで

アカツキのインターンに行くことを決めたのがインターン始まる二週間前とかで準備する期間はあまりありませんでした。一応メンターに「Rails Tutorialを最低7章までやっておいて」と言われたので、7章までやりました。
Webアプリケーションを作った経験はほぼ無くて、N予備校のプログラミングコースでNode.jsのExpressというフレームワークを使ってなんかやったくらいなんですが、なんかそれに比べるとかなり使いやすい印象を受けました。何となくRailsが流行っている理由が分かりました。

初日

インターンに伴うオリエンテーションや社内ツールなどの設定をやっていました。この日はメンターが不在だったので、フリースペースで人事の方とお話ししながらまったり過ごして早めに帰りました。

環境構築 〜 最初の課題(N+1問題)

二日目からメンターと顔合わせをして、まずは環境構築から始めました。ドキュメントを読みつつメンターに教えてもらいつつやりました。私が勝手にmysqlの新しいバージョンをインストールしたせいで、他の箇所でエラーが出たりして、環境構築は辛いと思いながら何とかできました。

そして最初の課題は「あるAPIでN+1問題が起こってそうだからそれを解決してみよう」というものでした。

「N+1問題」は有名な問題らしいのですが、私は「そもそもN+1問題とは……?」という状態でした(名前は何となく聞いたことがある)

幸いにも有名な問題なのでググるとたくさん解説ブログなどが出てきてくれて、以下のようなブログが参考になりました。
ruby-rails.hatenadiary.com

感覚としてはデータベースのサイズをN, クエリの数をQとするとN+1問題が起こっている状態ではO(NQ)くらいかかっている状態で、それをO(N)になるように修正したい、ということなんだろうと解釈しました(合ってるかな…?)

ともかくグーグルによってN+1問題とは何かは分かりましたが、次にそれがどこで起こっていてどう修正すればいいのか、ということを突き止めていかなければいけませんでした。

プロジェクトのソースコードは大規模でRails Tutorialで触ったようなサンプルアプリケーションとは比べ物にならないくらいファイルが多くて、まず「ソースコードを読む」ことすら困難でかなり苦労しました。

ようやく「ここかな?」と思うところを見つけてコードを書き直してみたものの、メンターに「そこじゃないよ」と言われてしまい……最終的にはお手上げ状態になってしまい、ソースコードやログの読み方を教えてもらいつつ「ここを直せばN+1問題が直るね」と教えてもらって「なるほどな〜」となってこの課題は終わりました。私は何も出来ませんでした…

とても勉強にはなりましたが、自力では何も出来なかったので落ち込みました。「まぁ何の知識も無い状態からスタートしてるしこういうもんだよね」という感じで切り替えて行くことにしました。ここまでで三日経ちました。

二つ目の課題(社内ツールのビューを作る)

二つ目の課題は「シナリオチームが使っている社内ツールがあって、変換部分は既に作ってあるから操作するためのビューを作ってください」というものでした。この辺りで私が想像していたサーバサイドエンジニアとは少し違った課題になりつつありますが、そういう仕事もやるんだという感じでやっていきました。

前回見たプロダクトのコードよりもかなり小規模で、Rails Tutorialをやったくらいの人間にはちょうどよかったです。また一から新しいものを作るというより、既存のコードを参考にしながら作れる部分がかなり多くてそれも良かったです。

またここで初めてRSpecというテストフレームワークを使ってテストを書きました。「ブラウザの操作をシミュレートして期待する動作をしているか?」みたいなこともヘッドレスブラウザを使って簡単に実装できるらしく、凄いと思いました。テストを書くのは大変だけど面白いと思いました。

この課題ではたまにメンターに助けてもらうこともありつつ(turbolinkのせいでCSSが当たらない、テストの文法が間違っていてブラウザの挙動がおかしいなど)、自分で調べたり考えたりしながら進められることも多く最終的にPRをレビューしてもらってOKを出してもらって、達成感がありましたし少し自信がついたので良かったです。自分のレベルに合った課題を割り振ってもらっているおかげですが。ここまでで五日経ちました。

三つ目の課題(社内ツールの機能修正)

次の課題は前回の社内ツールの機能に不具合があるのでそこを修正するというものでした。

この課題はそんなに難しい点は無かったので割とサクサク実装することが出来ました。先頭にBOMが付いている文字列と付いていない文字列を同値比較していてデバッグ出力してもぱっと見同じに見えるのになぜfalseが返ってくるんだ…?というところで若干ハマりそうになりましたが…

メンターには「ファイルを直接触るようなテストは環境に依存する可能性があるので、ファイルに書き出す文字列を返すような関数を作ってそれをテストする形にしたほうが良い」ということを教えてもらったりしました。

あとこの辺りからコミットメッセージを以下のgistを参考にしながら英語で書くように努めました。(あまり悩みすぎるところでは無いと思っていたので文法とか適当ですが…)
[転載] gitにおけるコミットログ/メッセージ例文集100 · GitHub

ここまでで七日経ちました。

四つ目の課題(社内ツールの入力フォームを作る)

四つ目の課題は手がけていた社内ツールの入力フォームを作って入力された値のバリデーションをしてごにょごにょやるというものでした。これがインターンの課題で一番大変でした。

とりあえず最初はモデルを作らずに入力フォームのビューを作ってバリデーションはそのままparamsに入っている値を直接見て有効な値で無かったらエラーメッセージを表示させて…みたいな方法でやろうとしていました。モデルを作らなくていいと思った理由は入力フォームの値をDBに保存したり読んだり、みたいな操作が必要無いのでモデルを作らないほうがいいのかな?と思ったからです。しかし実装している途中で「これいちいち空チェックのバリデーションを自分で実装するのは筋が悪い気がする…ActiveRecordを継承すればその辺楽になるのに…」と思って、DBにアクセスせずにモデルを作るってありなのかな?と思って調べてみると…ありました。

qiita.com

どうやら include ActiveModel::Model と書けばいい感じにバリデーションのメソッドを使えたりViewに紐付くように出来たりするようです。

というわけでモデルを作ってバリデーションはそれに任せる感じにしたらだいぶいい感じになりました。

次にやりたいのは「フォームの入力に失敗した時にフォームに入力した値を保持した状態でリダイレクトさせる」ことでした。これもなかなかいい実装が出来ず最初は失敗した時に入力フォームの値をセッションに一時的に保存してレンダーする時にその値を埋めてセッションに保持した値を消して…みたいなことをしていて「うーん」という感じでした。これもメンターに「いい書き方無いですかね…」と相談したところ、リダイレクト先にフォーム情報をクエリ文字列として渡すという方法でシンプルに解決することができました。

他にも色々メンターやWeb業界で働いていた人にもレビューをもらって様々な学びがありました(form objectの話とか)。また色々ハマったこともありました(form_withの挙動とか)。振り返ってみるとこの課題が一番苦労したなぁ…という感じです。その分達成感も一番あって自分でも頑張ったと思います。

ここまでで十一日経ちました。

五つ目の課題(社内ツールの機能追加)

インターンも終わりに近づいて残すところ後二日となりました。最後は手がけていたツールの機能追加…というか機能拡張ですかね。今まではViewを弄っていましたが今回はModelを作る感じでした。「後二日で終わるのかな…」という感じでしたが、ソースコードを読んでいると割と既存のコードを流用できる部分が多くてほとんどコピペして後は少し修正してテストを書くぐらいの作業で特にハマるポイントもあまり無く無事終わらせることができました。

開発以外にやったこと

以上がインターンでやった開発の内容です。インターンの仕事内容としては上記の開発がほとんどですが、それ以外にも色々なことを体験させてもらったのでずらっと書いていきます。

朝会(あさかい)

インターンは10:00出社なのですが、毎日10:05から朝会というものがありました。これはチーム全体で5分程度の時間を取って全体に共有したいことなどを伝える時間です。だいたいプランナーさんが売上状況とかゲームがどれくらい遊ばれているかとかイベントの状況などを共有することが多かったです。

昼会(ひるかい)

毎日14:30からは昼会というものがありました。朝会はチーム全体での共有でしたが、昼会は開発チームで集まって15分程度の時間を取って共有事項を伝えたり、「今まで自分が取り組んできたタスク・これから取り組んでいくタスク」を全員が一言二言で共有するという時間です。エンジニアは自分の開発にかかりきりになるとどうしても周りが見えづらくなってしまうことがあると思いますが、この時間があることでみんながどういうことをやっているのかを把握できるので良い取り組みだと思いました。

エンジニアミーティング

隔週火曜日17:00からはエンジニアミーティングがありました。これはチーム単位では無く社内全体でエンジニアが集まって外部から招いた人の話をしたり、インターン生の紹介をしたり、自分が作ったツールをみんなに紹介したり…という時間です。最初のエンジニアミーティングではセキュリティに強い人を招いたお話があってCTFの可視化の話があったり、バイナリかるたとかアセンブラ短歌という世界があるという話を聞いたりしてよく分からなかったですが「すげー」と思いました。

1on1

毎週火曜日は30分程度のメンターとの1on1がありました。業務中はなかなか落ち着いて話す時間も無いのでこういう時間を設けてゆっくり話をする、みたいな感じです。特に大層な話をしたわけでは無いですが、インターンのフィードバックを少しもらったりアカツキという会社について聞いたりその他は雑談をしていました。私は競プロをやっているのでその話をしていたら、この前マラソン系のコンテストで出た問題がメンターが10年くらい前の高専プロコンで取り組んだ問題と実はほぼ同じだった、という面白い話を聞けたのがよかったです。

インターンの成果報告

エンジニアのインターン生は私以外にも結構いました。インターン生は最終日に成果報告をすることになっているので、私も他のインターン生の発表を聞きに行っていたのですが、AWSの環境構築をガッツリやっている人やゲーム内のミニゲーム(正の得点を得ることすらめちゃくちゃ難しい)を作っている人の話を聞いて、みんな凄いレベル高い…と思って聞いていました。刺激を受けました。

ランチとか飲み会とか

たまにメンターが他の人を誘って一緒にランチに行ったり、インターン生が卒業するときに一回大々的に飲み会が行われたりしました。ランチでは他のプロジェクトチームの話を聞いたりすることができました。インターン卒業飲み会でアイマスにめっちゃ情熱を注いでいるインターン生がアイマスをめちゃくちゃ推してくれたのでちょっと見てみようと思いました。

インターンで感じたこと・学んだこと

ゲームはいろんな人が協力しあって出来ている

当たり前っちゃ当たり前ですが、実際みんなと同じフロアで働くことでより強くそれを感じることができました。エンジニアだけでは無く、プランナーさんが企画したりディレクションをしてくれたり、シナリオを作ってくれる人、絵を描いてくれる人、音を作ってくれる人、モーションを作ってくれる人、検証をしてくれる人……様々な人の協力で一つのゲームが作られていてそれって凄いことなんだ、と感じました。

アカツキの働く環境はめっちゃ良い

アカツキはオフィス環境作りにもかなりこだわりを持たれていて、そのおかげでみんながストレス無く働ける環境になっていると感じました。靴を脱いで素足で仕事ができるとか、各階におしゃれなカフェっぽい休憩スペースがあっていつでも自由に休めるとか、オフィスに緑があったりして心が安らぐとか(?)。オフィスにいるのが苦痛になってしまったら仕事も辛いものになってしまうと思いますが、オフィスがおしゃれで居心地が良いのでそういうことは全く無く非常に良かったです。ただトイレに行くときに靴を履かなきゃいけないのがちょっと面倒ですが…

またオフィスだけでは無く、一緒に働く人たちも皆それぞれ違った個性を持ちつつも良い人が多いんだろうという印象を受けました。今回のインターンでは他の人と一緒に仕事をするという感じでは無かったので、あくまで普段のオフィスの雰囲気を見て、という感じですが。話し合うことはたくさんあるだろうし、ときにはすれ違いなどもあると思いますが、ギスギスした感じでは無く笑いもありながら和やかな雰囲気で皆さん仕事に取り組んでいました。

終わりに

始めにインターンのお誘いをいただいたときは正直かなり悩んでいました。行った方が良いんだろうな…と思いつつ不安な部分も大きくて「行きます」と言った後も「やっぱり辞めとけば良かったかな…」と考えたりしていました。

それでも実際に来てみると、やっぱり大変なことやしんどいこともありましたが、それ以上に良い環境で働けて学ぶことや感じることも多くてトータルで見ると「来て良かった!」と思えるものでした。この度インターンでお世話になった人事の方やメンターの方、一緒に働いてくれた方々には本当に感謝しています。

それでは長くなりましたが、ここまで読んでくださってありがとうございました。