新卒1年目を振り返って

この投稿は[グレンジ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/grenge)の25日目の記事です。
今日はクリスマスです！

# 概要
[株式会社グレンジ](https://www.grenge.co.jp/)でクライアントエンジニアをしているGamu([@AblerBiri](https://twitter.com/ablerbiri))です。

私は今年の4月に株式会社サイバーエージェントへ新卒入社しました。
2ヶ月弱の研修のあと、株式会社グレンジに配属となり、現在はスマホゲームのクライアントアプリの開発などを行なっています。

配属後半年程度しか経っていませんが、様々な仕事を任せて頂き、沢山の学びがありました。
この記事では、ゲーム会社に新卒エンジニアとして入社してからこれまでにやったこと、学んだことを振り返りたいと思います。

# サイバーエージェントとグレンジを志望した理由
まずは私が今の会社を志望した理由から振り返っていきたいと思います。

サイバーエージェントを志望した理由ですが、若手でも挑戦したいことがあれば任せてもらえるベンチャーマインドがあり、一方でベテランから助力を得られる安心感がある環境で、 **最も仕事の充足感が得られそうな会社だと思った** からです。
また、各々が何かしらの強みを持ったゲーム会社が複数集まったゲーム事業部(以降、SGEと呼びます)があり、色々なジャンルのゲームの開発に携われる可能性があるのも魅力の1つでした。

そんなSGEの中でグレンジを志望した理由は、面白いゲームを世界中の人に遊んでもらいたいという考えが、自分のゲーム開発の考えと合っていたからです。
例えば、同じSGEに属するアプリボットは長編のRPG × 3Dを得意ジャンルとしていて、クオリアーツは3D美少女を得意ジャンルとしています。
特定のユーザ層を狙ってジャンルを固めるのは正しいのですが、 **その時々で本気で面白いと思った企画で勝負している** のが自分にはピッタリでした。

# 1年間の目標
グレンジが所属しているSGEでは、エンジニア個人の中長期目標を設定します。
この目標は、自分がエンジニアとしてどう成長したいか、どんなことをしていきたいかを考えるためのものです。

私は、ゲームの第一印象を決め、ユーザがワクワクするかどうかに大きく影響するグラフィックス(絵作り)に強いエンジニア(グラフィックスエンジニア)になりたいと思い、 **グレンジのグラフィックスのリードエンジニアになる** という目標を設定しました。

この目標を掲げた以上、グレンジで一番ゲームグラフィックスに詳しくならないとダメです。
しかし、この時点でのゲームグラフィックスの知識は、レンダーパイプライン(ゲーム画面の処理全体のコード)というものがあり、頂点シェーダやピクセルシェーダがゲーム内の物体の見た目を決めているというのを知っている程度でした。



# 12月までにしてきたこと
4月から12月までの次のようなことをしてきました。
6月からは**グレンジのグラフィックスのリードエンジニアになる**という目標の達成に向けた動きが多くなっています。

| | |
|:--|:--|
|4月|入社<br>サイバーエージェント全体研修|
|5月|SGE配属<br>SGE研修<br>グレンジ配属|
|6月|インゲームのUI修正・実装<br>3DCG勉強<br>エンジニアLT会開始|
|7月|インゲームの最適化<br>輪読会の開始<br>エンジニアLT会<br>3DCG研究組織への参加|
|8月|インゲームの最適化<br>輪読会<br>エンジニアLT会<br>CEDEC視聴|
|9月|インゲームの通信・サウンド周りの実装<br>ツール開発<br>輪読会<br>エンジニアLT会<br>社内技術カンファレンス登壇|
|10月|インゲームの最適化<br>ツール開発<br>輪読会<br>エンジニアLT会<br>半期総会での出し物の企画・実行|
|11月|インゲームの最適化<br>ツール開発<br>輪読会<br>エンジニアLT会|
|12月|インゲームのUI機能実装<br>社内活性化施策の運営<br>アドベントカレンダーの運営|

### インゲームのUI修正・実装
インゲームとは、そのゲームの遊びの核となる部分です。
アクションゲームならステージ内を動き回る部分だったり、パズルゲームならパズルを操作・表示する部分だったりです。

配属初期は1日も掛からないようなインゲームのUIの不具合修正のタスクを任せて頂きました。
それから2週間程度経ってプロジェクトのコードに慣れてきたあたりでUIの機能実装のタスクを頂きました。

この時点では、私がまだ仕事でグラフィックスを扱えるほどの技術力を持っていませんでした。
タスクをこなしつつ、3DCGの自主勉強を進めていました。

###  3DCGの自主勉強
まずはタスクと並行しながら、3DCGの基本を詰め込みました。
6月末までは先輩エンジニアから教わった入門サイトを見ながらレンダーパイプラインやシェーダを学び、サンプルで提示されているシェーダコードをじっくり読み解きました。
ある程度シェーダに慣れてきたら、UnityのShaderLabでサンプルを書き直すということもやりました。

勉強に使用した入門サイト

https://wgld.org/

### エンジニアLT会の運営
社内エンジニアの交流活性化を目的として始動しました。
同期の島田（[@konnyaku256](https://twitter.com/konnyaku256)）と協力して、LT会を月に1回の頻度で開催しています。
1回ごとに2~3人に技術や趣味のLTを行なってもらっています。

### インゲームの最適化(7~8月)
7月頃は3DCGの知識が身について、シェーダで書かれていることがある程度理解できるようになっていました。
7月からは、インゲームのフレームレート(1秒あたりの描画回数)が低いことの原因の調査と解決、いわゆる最適化を任せて頂きました。

フレームレートが下がる原因はCPU処理とGPU処理に大別されるのですが、それぞれで一番処理に時間が掛かっていそうな部分を調べました。
CPU処理側は、大量のオブジェクトを毎フレーム処理することによる負荷が高かったことが原因で、地道なメモリ効率化や計算の高速化を施していきました。
GPU処理側は、 **レンダーパイプラインで描画する画面の解像度が端末スペックに見合わないほど高いことが原因** で、品質設定で解像度を調節できるようにしました。
文面だと簡単ですが、私が所属するプロジェクトのレンダーパイプラインはSRPで独自実装されたもので、どこに原因が潜んでいるか調査するのに膨大な時間を費やしました。

2ヶ月間、調査・最適化・計測を繰り返すのは大変でしたが、このタスクのおかげでレンダーパイプラインやシェーダのコードを更に理解できるようになりました。

### 輪読会
配属された頃は『HLSLシェーダーの魔導書』が出版された頃で、6月に会社に購入して頂きました。
そして、この本を使って7月から私とトレーナーさんが交互に毎週輪読会で読みました。

輪読会で読む担当になった時は、その前に内容を読み込んでおく必要があります。
最初の頃は内容を読み込むだけで終わらせていましたが、インゲームの最適化タスクのおかげでレンダーパイプラインやシェーダの理解が進んでからは、記載されているサンプルを **Unityで再現実装したものを用意して、輪読会の後半でそれを見てもらうということを行うようにしました。** 
再現実装した時の方が読み込むだけの時よりも理解度は高くなりました。

Deffered Renderingという描画手法の勉強では、Unityで自由度高くレンダーパイプラインを実装できるScriptable RenderPipeline(SRP)を使って再現実装しました。

<table>
<tr>
<th>Combine</th>
<th>Base Color</th>
<th>World Normal</th>
<th>World Position</th>
<th>Metallic Smoothness</th>
<th>Receive Shadow Flag</th>
<th>View Depth</th>
<th>Shadow Map</th>
</tr>
<tr>
<th><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225590/48744e87-83de-0128-c397-773600d709cb.png"></th>
<th><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225590/e151fa15-f998-4f10-4f1c-3c05ef5d503e.png"></th>
<th><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225590/b620a066-1961-5c1c-60fd-3b9553f39fa6.png"></th>
<th><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225590/bf934c84-361f-85df-0872-b070216b8053.png"></th>
<th><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225590/8478d818-4e4a-9d7f-700f-666723093ba7.png"></th>
<th><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225590/c954354d-aad5-b42b-fff1-016f4b7e7734.png"></th>
<th><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225590/6a37865b-7909-abb8-2dae-dbfec25bab7b.png"></th>
<th><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225590/67a33ead-7a8c-9aa2-b07b-680abad04952.png"></th>
</tr>
</table>
再現実装したものを置いてあるリポジトリ

https://github.com/Gamu2059/hlsl_grimoire_reimpl

### 3DCG研究の組織への参加
SGEには会社の垣根を超えて社員同士が何かをする組織がいくつもあります。
その中にSGEの3DCG技術を強化するため、色々な3DCG技術を調査したり再現実装したりする組織がありました。
私は7月からそこに所属して、3ヶ月おきに変わるテーマに沿って勉強したりシェーダを書いたりしました。
9月にはCA BASE CAMPという社内技術カンファレンスに他メンバーと共に登壇し、実装した内容を紹介したりもしました。

https://www.cyberagent.co.jp/way/features/list/detail/id=26701

次の記事では、この社内技術カンファレンスで紹介した内容の技術部分を一部紹介しています。

https://qiita.com/gamu/items/449ab562a7aa34da0f73

### ツール開発(9~11月)
プロジェクトにはユーザが遊ぶためのゲームクライアント用の開発環境とは別に、アセットを作成したり配信作業をしたりするための環境がありました。
レンダーパイプラインを拡張して演出チーム向けの描画負荷可視化ツールを開発したり、サウンドチーム向けにLaunchPadというMIDIコントローラを使ったツールを開発したりしました。

LaunchPadの扱いはアドカレで記事に書いてみました。

https://qiita.com/gamu/items/0524f37f59b16c4392f9

### アドベントカレンダーの運営
こちらも同期の島田と協力して運営しており、自分たちで投稿したり、社内のエンジニアの皆さんに執筆を依頼したりしています。
今年は今までのグレンジのアドベントカレンダーで一番盛り上げるという気持ちで2人で運営しています。

### 記事の執筆(アウトプット)
学んだことを発信することでより深い理解に繋がります。
今まであまり学んだことを記事として発信することはありませんでしたが、今回3DCGの勉強をし始めてから書く習慣を身につけるようにしました。
 **また、自分の目標がグラフィックスに強くなることだとアピールしたり、目標のために今こんなことをしているとアピールしたりする側面もあります。** 
現在は、備忘録などの軽い内容でも良いので月に2つ記事を投稿するようにしています。
記事は、社外に出せないものは社内のQiita Teamへ、出せるものは普通のQiitaへ投稿しています。

直近ではアドカレの記事が多いですが、過去にはシャドウマップを自作するための記事を執筆しました。

https://qiita.com/gamu/items/214637ac068f65f5862d

https://qiita.com/gamu/items/7558fbc0be41913bbba5

### 目標の現段階の達成度
様々なタスクをこなしつつ目標に向けて勉強などを行なってきました。
**グレンジのグラフィックスのリードエンジニアになる**という目標に対しては12月時点で65%くらい達成できているかなと思います。

半年前はシェーダがちょっとだけ書ける程度でしたが、現在はレンダーパイプラインを自前で実装したり、既存のものに拡張機能を付けたりできるくらいになりました。
グラフィックスエンジニアを名乗れるくらいの最低限の技術力は身に付きましたが、 **思い通りのグラフィックスを表現できるかと言われるとまだまだです。** 
現在は既存ゲームのグラフィックス関連の工夫点を調査したり、自分が好きなゲームのグラフィックスをマネしてみたりして、表現力を鍛えるための勉強をしています。

# 反省と学び 報告・連絡・相談・確認
就活の時点から、目にたこができるほど耳にこぶができるほど大事だと教わった報連相。確認もプラスで。
大事なのは分かっているつもりでしたが、いざ仕事をしてみるとちゃんとできていなかった場面が多々ありました。

### タスク状況が遅れそうなことを報告しない
 **「任せられたタスクなのに遅れるなんてあり得ない！何とかして期日までに間に合わせなきゃ！」** と頑張るけど、何も報告もせずに結局期日直前に間に合わなさそうなことを報告してしまうということをやらかしました。
見積もった工数が甘くて遅れそうだなと判断した時点で、スケジュール管理者に報告して工数を再見積もりしないといけませんでした。
 **自分だけで何とかしようとせず、自分やタスクの状況をチームやプロジェクトに共有し続けることが大事だと学びました。** 

### タスクが完了したことを報告しない
私がツールを作り、そのツールを使って他の人がアセットを作り、期日までにアセットを組み込むという状況がありました。
私はツールの開発が完了した時点で次のタスクをやることで頭がいっぱいになっていました。
ツールを使ってアセットを作る人はツールができていることを知らず、期日直前までアセットを作れずにいたというやらかしをしました。
 **遅れそうな時だけでなく、何かが完了した時も関係者に自分から伝えることが大事だと学びました。** 

### 自分の仕様把握が合っていると信じて作業する
自分自身の認識を信じて実装したけど必要な仕様を満たしていなくてやり直しということがありました。
仕様書が無いなら認識ズレが発生してもおかしくないですが、 **仕様書があったとしてもその解釈がズレていることはあります。** 
確認をプラスしたのは、 **対応すべき仕様の認識が合っているか分からない時は、素直に詳しい人に確認を取るべき** という、この反省からです。
それからは自分の認識が本当に合っているのか確認を取るようにしています。

# これまでに成長したところ
技術力も上がりましたが、それ以上に仕事の仕方が成長したと思います。

ゲーム会社では数十人規模で1つのゲームを開発したり運営したりしています。
自分はその人達と関わり合いながら仕事をしているということを認識して、自分の状況を適切に伝える、他職種の人が分からないような言葉で共有しない、など他の人の気持ちや立場を考えて仕事ができるようになりました。

また、一度作ったツールも作り切ったら終わりではなく、使用者から使用感のフィードバックを頂いたり、使っているところを様子見したりして改善していくことができるようになりました。

 **自分だけがゲームを作っているのではなく、チームとしてユーザを楽しませるためにやっているんだということ** を忘れないようにしたいです。

# さいごに
半年間でやってきたこと、反省と学びを振り返ってみました。
新卒のゲームクライアントエンジニアの事例に興味がある方のお役に立てれば幸いです。

これでグレンジ Advent Calendar 2021は終了です！
皆さん良いお年を！