新米エンジニアがアプリボットの開発現場で学んだ3つのこと

はじめに

こんにちは!2019年にサイバーエージェントにエンジニアとして新卒入社し、現在はアプリボットで新規プロジェクトにサーバーサイドエンジニアとして携わっている古矢です。本記事では私が1年間でどのように成長したかについてお話します。

アプリボット入社までの経緯

私は大学時代、宇宙について勉強できたら面白そうという単純な理由で機械航空系の学科に所属していて、主にシミュレーションによる研究をやっていました。なのでちょっとプログラミングには触れていましたが全然関係ないことをやっていました。しかし昔からやりたいと思っていたゲーム制作がどうしても諦めきれず1年間休学し、インターンや個人的なゲーム制作を通してゲームを作るための技術を学んできました。そこではUnityを用いたゲームクライアント制作や、ゲームサーバーの構築など広く浅く技術に触れていました。休学してゲーム制作に走った理由は純粋にゲームが昔から好きだったからなのですが、就職を考えなくてはならない時期に差し掛かり自分自身を振り返ってみたときに「自分はゲームに限らず人に楽しんでもらうためのものづくりがしたい」ことに気がつきました。その上で何を提供できるかを考えてみると、まずは自分の中では馴染み深かったゲーム制作の技術をマスターしてそこから価値を届けられたらと思い、ゲーム系エンジニアを目指すことにしました。このような目標を見据えた上で縁があった会社がサイバーエージェントでした。サイバーエージェントはゲームだけでなく多種多様なエンターテインメントを提供していて、先ほど述べたその観点から私の目標に合っていると感じました。また、技術書典やエンジニアブログなど社外へのアウトプットに意欲のある社員が多いことも特徴的かつ魅力的でした。サイバーエージェントには「弟子入り」と呼ばれる子会社理解を目的とした短期間の内定者アルバイト制度があり、内定後は「弟子入り」でアプリボットでお世話になったのですが、そこでの経験もあり馴染み深かったためアプリボットへの配属を決めました。

新規プロジェクトへのジョイン

アプリボットに入り、私は新規プロジェクトのサーバーサイドエンジニアとして携わることになりました。サーバーサイドエンジニアを志した理由は、サーバーサイドの技術は汎用的でありゲームに限らずエンタメを作るにあたって必要なものであると考えたからです。そして3年後の目標として「新規プロジェクトのサーバーサイドのすべての設計を一人でできるようになる」という目標を掲げることとしました。結果的に今のプロジェクトに1年間所属して得られたものはたくさんありました。

得られたことその1(ロジックの構成)

まず初めに任された仕事がゲームの1機能のDB設計、API作成、ロジック実装といった一連の実装でした。特にDB設計は考えることが多く大変でした。ゲームの仕様に落ちていない部分をいかに予測して最大の効率を出せるかを考える必要があったためです。このフェーズでは様々なメンバーと相談の上で決定をしました。また実装するにあたって、プロジェクトで用いられているKotlinサーバーサイドやgRPCといった新技術に慣れることがつまづきのポイントなのかと思っていましたが、実装の段階でそれが難関だったかと言われるとそうではなく、むしろロジック自体の作りを見直すことが多かったです。例えば、DBへの無駄なアクセスを含んだ実装をしてしまう、無駄なループなどにより余計に負荷をかけてしまうなどの処理は常に気にする必要があることを理解しました。入社後のオリエン時に「ゲームサーバーに過負荷を与えないようにロジックを作ることが大事」という話は聞いてはいましたが、話で聞くことと実際に実行することではやはり異なり、経験が理解を促進してくれました。先輩エンジニア方に多くのレビューをいただいたことが記憶に新しいです(この辺りはApplibot Gems Vol. 1に寄稿した記事に詳細を書かせていただきました)。これらのコードレビューや口頭による議論を通してより良い作りへの熟考を繰り返すことにより、この1年間で軽い機能から重い機能まで様々な機能実装を遂行できました。

得られたことその2(テストの大事さ)

これは点の話になりますが、ユニットテストをしっかり書くことの重要性が理解できてそれを実践できたことは良い体験ができたと感じています。アプリボットのサーバーアプリケーションにはテストを書く習慣があり、私が携わっているプロジェクトでもkotest(kotlintest), mockkといったユニットテスト用ライブラリを用いてアプリケーションを高品質な状態に維持しています。私個人の経験として以前はPostmanなどを使ってエンドユーザーからのレスポンスを見て正しさを判断していたことがありましたが、それが可能なのは小規模なアプリケーションだからであり、更に大きな規模になるとそれだけでは大変なため、ユニットテストを書いて堅牢な作りにすることが大事だということが分かりました。具体的に何が大変かというと、既に出来上がったコードに対してリファクタリングしたい、仕様変更などにより機能を改修したい、機能を追加したいといったケースが挙がります。ユニットテストがない場合これらの修正をした後に全ての機能をAPIを叩くなどしてチェックしなければなりません。しかしユニットテストがあることで既存のコードがある程度正しく動くことを保証してくれるので、先ほどのケースに対して柔軟かつ素早い対応が可能になることが期待できます。また、テストをCIに乗せることでサーバーサイド開発の効率アップに繋げられることも分かりました。もし再び新しくプロジェクトに携わることがあったらユニットテストは是非導入したいです。

得られたことその3(タスク管理術)

1年間で一番大きな仕事だと感じたのがログ周りの設計でした。アプリボットにはDIVE( https://blog.applibot.co.jp/2019/05/31/data-analysis-for-social-game/ )と呼ばれるデータ収集基盤が存在しますが、この汎用的なシステムに流し込むログの内容については各プロジェクトごとに決める必要があります。具体的には先の記事 ( https://blog.applibot.co.jp/2018/07/13/collecting-high-quality-log-in-social-game/ ) で述べているカスタマーサービス、マーケティングなどに使うデータ分析、バグ等の調査などといった多岐にわたる利用を考慮して作る必要があります。これらを鑑みてプロジェクトの方針を確認しつつ流し込むログの内容を決定しなければならないのですが、私にとって初めての内容だったため初めは具体的に何をすべきかがパッと分かりませんでした。そこで運用タイトルのメンバーに聞いて回ったり、先輩や当事者に直接確認したりすることで社内情報収集をしてから解決しようとしました。ですが今回、機能実装と並行してログ設計を進める必要があったため、自己管理やタスクスケジューリングの必要性が増しました。そこで私はtodoist, asana, 手書きノート, ハンディホワイトボードなど様々なツールを用いることでタスク消化効率アップを試みました。その結果、最終的にはキーパーソンにコンセンサスをしっかり取ってログ実装まで回すことができ、ゲームの機能実装も終えることができました。今のところは、

  • todoist: 自分がやるべきタスク管理をする場所
  • asana: セクションで共有したいタスクや懸念などをまとめる場所
  • 手書きノート: 文章では表現しづらいアイデアを記録する場所
  • ホワイトボード: 手書きノートに残すまでもないであろう内容を雑多に描く場所

などと使い分けています。アプリは会社の行き帰りなどでふと思いついたことをサッと記録できるので便利です。この経験を通して、プロジェクトを進める上で大事であるタスク管理の知見を学ぶことができました。一人でものを作るのであれば必要性は薄いかもしれませんが、複数人でものを作るときはこのようなタスク・スケジュール管理が大事です。

まとめ

これらの経験を通して私は「新規プロジェクトでサーバーサイドの設計を全てこなせるようになる」という目標に向かって進むことができました。とはいえ経験したことのない領域はまだまだあるので、引き続きいいモノを作れるようにスキルを磨いていきたいと思っています。

もし興味があれば・・・

ゲームは様々な人と協力して作られていくので大変なところもありますが、アプリボットには面白い人がいっぱいいます。組織づくりに熱量の高いまるでビジネス職のようなエンジニア、コードコミットもしてしまう、まるでエンジニアのようなプランナー、プログラミング言語自体が好きでそれ専用のチャンネルを開いているエンジニアなどなど。ぜひ遊びにきてみてください!
最後まで読んでいただきありがとうございました!


関連記事一覧

  1. この記事へのコメントはありません。