株式会社Aimingのインターンシップに行ってきた

3/25 ~ 3/29までの1週間、株式会社Aimingのエンジニアインターンに参加させていただきました。

今回はそのことについて書きます。

 

Aimingとは

Aimingはオンラインゲームの企画からプロデュース・開発・運営までを行なっているゲーム会社です。

制作タイトルで有名どころだと剣と魔法のログレスなどがあります。剣と魔法のログレスは運営元は株式会社マーベラスとなっていますが、開発はAiminigが行なっています。

f:id:IKEP:20190331172111j:plain

 

 

インターンに参加したきっかけ

大きく分けて2つ理由があります。

プロの現場でコードを書いてみたい

私は前々からインターンに参加し、プロのエンジニアの現場を体験したいと思っていました。Aimingインターンに参加する1ヶ月ほど前に任天堂のインターンに行きましたが、プログラミングはしていません。なので、実際にコードを書くインターンに行きたいと思っていました。また、コードを書くのは個人でもできますが、自分の周りにCG関連のコーディングに強い友人がいないため、プロの現場なら学べるのではないかと思ったからです。

 

Webの知識を活かせるゲーム開発をしてみたい

私はアルバイトで開発の仕事をしていますが、そこでWeb系の知識をある程度身につけました。

一方、私の興味のある分野がVRやCG関連であるため、ゲーム会社のインターンをしてみたいと思っていました。今の時代、多くのゲーム会社がスマホゲームを作っています。そして、そのほとんどがオンラインゲームです。しかし、それらのゲーム会社のインターンの募集を見るとほぼすべて、クライアントとサーバ側でカリキュラムや日程が分けられています。しかし、Aimingインターン募集の時点でそういった区別がありませんでした。

実際に会社でオンラインゲームを開発するなら、私はお互いのことをある程度理解しておくべきだと思います。そうすれば、お互いのことを考えた開発ができます。Aimingはゲーム開発のみではなくWeb技術なども含む、技術的多様性のあるインターンを体験できると思ったからです。

 

 

インターンの内容

私が参加した回だけかもしれませんが、インターン生は私1人でした。しかし、チーム開発の手法を教わり、擬似的に実行していました。その中で社員さんからのアドバイスやフィードバックを受けつつ、ひたすら開発を行なっていました。

制作物としては、ドイツの2人対戦型のボードゲームガイスター」をオンラインゲームとして作りました。ユーザの作成&ログインからゲームルームの作成&参加、対戦相手とのマッチング、対戦準備処理、ゲーム操作、ゲーム状況の更新&提示、勝敗判定までオンラインゲームの基本となるものを一通り作成し、独自にオリジナル拡張機能の作成もさせていただきました。

最終日にはコードレビューを行なっていただき、これから自分が改善していくべき課題やプロのゲームエンジニア目線の考え方などを教わりました。

 

 

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

いかなる時もコーディング前の設計を大切に

今回のインターン生が私1人だったこと、開発速度を向上しインターンでもっと学びたいという思いから、私はコーディング前の設計を軽視してしまいました。結果、複雑な処理の実装時にどうやって作るべきかを悩んでしまいました。そして、無理くりな手法で実装したことで、コードが汚くなり、挙動も不安定なシステムになってしまい、後々修正する羽目になりました。

チーム開発の時は設計をしないと、チーム全体での実装方針が決まらないため、設計はきちんと行なっています。しかし、私は1人開発の時に開発速度を優先することにより、設計を軽視する側面があることに気づきました。今回のように開発速度を優先して設計を軽視しても、修正作業が入ってしまい、結果全体で見たときの開発速度は落ちてしまいます。

1人の開発でもチーム開発と同じです。1人開発はいわば、「過去の自分、今の自分、未来の自分とのチーム開発」なのです。

 

常に綺麗なコードを書こう。プロのコードは綺麗だよ。

  • 設計の話と絡む話ではありますが、設計がしっかりすれば綺麗なコードを書けるはずです。
  • 実装方法に悩んだ時は、すぐに無理くりな方法を実装しないようにすべき。周りに相談したり、より良い方法がないかを調べるようにする。
    結果、チームメンバーのコードのより深い理解につながるし、新たな技術の習得にもつながる。
  • 綺麗なコードを書くことは結果として、開発速度の向上や、機能拡張をする時にも役に立つ(長いスパンで考えた場合だけでなく、短いスパンの場合でも)
  • コピペをしない。コピペをすると、その機能に最適な処理でない可能性が高い
  • デフォルトで用意されている機能がないかを調べる。すでに用意されているものがある場合、自分で作るのは時間の無駄&他人は理解しづらい。一番理解しやすいのはコードを書かないこと!(この辺はリーダブルコードにも書いてあったような気が...)

 

オブジェクト指向型言語ならではのコーディング手法を身につける

  • MVCモデルを意識し、きっちりと処理を分ける。
    Viewは極力データを持つべきではない。
  • オブジェクトごとに細かくクラスを分け、機能拡張を容易に行えるコーディングを心がける
  • Unityの場合、何でもかんでもMonoBehaviourを継承するのをやめ、Unityの機能を本当に必要とするものにのみ継承すべき。こうすることで、Unityを使わないプロットフォームでの開発に利用できる。ロジック系のクラスは特に。
  • オブジェクト指向エクササイズのススメ」の9つのルールなどを参考に
  • ReactiveXとかは非常に便利

 

重たい処理を極力避ける 

  • ゲームはパフォーマンスが大事なので、CPUや, GPU, メモリのことを考えたコーディングを心がける
  • どれが重たい処理なのかを理解し、使うべき時を考える。初期化時に行なったり、本当に必要な時にのみ使用する。少なくとも、ループする関数では使わない。チリも積もれば山!
  • デフォルトで配置しておくオブジェクトを少なくする。多いと、データの読み込みに時間がかかってしまう。必要な時にコードから生成しよう
  • 定期的に、どこか重い処理がないかを確認しよう。

 

定期的に振り返ろう 

KPTというプロジェクト振り返り手法を学びました。

Keep: よかったこと、これからも続けていきたいこと

Problem: 悪かったこと、今後はやめること

Try: Problemをなくすために具体的にこれから行うこと

これらを書き出し、短いスパンで定期的に振り返りを行うことで、プロジェクトの改善を加速することができるそう。

参考:

【徹底解説】正しい「KPT」が仕事の成果を生み出す!進め方のコツ、現場の事例を紹介 | SELECK [セレック]

 

 

感想

 自分の周りにはCG関連に詳しい友人がいないので、なかなか他人にコードを見てもらう機会がありません。そんな中、今回のインターンで自分のコードを見てもらったことで、自分のコードの何がダメで何が良いのかが明確になりました。

個人開発では絶対に経験できないことを学べたので、非常に良い体験でした。