名古屋スタジオでサーバーエンジニアをしている水谷です。
私は2021年の4月に新卒入社して、現在入社から8ヶ月ほど経過しています。
入社前は、大学で研究実験のためのプログラムを一人で作ったり、趣味で個人開発のツールを作ったり、データ分析をしていました。
そのため、長期間に渡って多人数で開発されたプログラムに慣れていない状態でした。
今回はエンジニア初心者の私が、大規模なゲームのプログラムに触れて感じたことを元に、「良いプログラム」の作り方を知る手がかりを紹介したいと思います。
エンジニア初心者の方や新卒でゲーム業界に興味がある方の参考になれば幸いです。
ゲームのプログラム全体を見たときに思ったこと
スマホゲームのプログラムについて
スマホゲームはスピードの早い改善や新機能開発が求められるため、それに応じてプログラムも大きく複雑になっていきます。さらに長期タイトルでは、5年以上前に実装されたプログラムがたくさんあったりします。そのため、「良いプログラム」を意識して実装しないと、修正が難しくなるだけでなく、数年後のメンバーに頭を抱えさせることになってしまいます。
具体的な例を挙げると、ある機能の改善の修正をするために、部分的な修正をするよりも、その機能全てを修正したほうが良いという状況がありました。その場合、実装者は想定よりも多い時間が必要になるため、開発スピードや質に影響が及んでしまいます。
そのため、スマホゲーム開発を行うエンジニアのコーディングには、下記の内容が求められるのだと思いました。
- プログラムの質が高い
- 長期に渡って、多人数のエンジニアが、修正と再利用と拡張をしやすい
- 実装スピードが早い
- スマホゲーム開発に求められる、迅速な改善や新機能開発を短い時間で実装できる
でも、そこで私は悩みました。
「質が高くて実装スピードを早くできるプログラムは、どうやって作ればいいんだ?.....」
どうすれば「良いプログラム」を作れるのか
保守性や再利用性が高いプログラムは一般的に「良いプログラム」であると言えるでしょう。プログラムの修正や再利用がしやすいと、その後の機能追加や改修時の工数が削減でき、結果的に実装スピードが速くなることも期待できます。
具体的な例を挙げると、とても長いプログラムを作ってしまった場合、各オブジェクトや変数の状態が独立しておらずプログラム全体でわかりづらくなるため、プログラムの機能や状態の維持が難しくなってしまいます。また、関数化せずに同じ内容のプログラムを何度もゼロから作ってしまうと、全ての箇所で修正が必要になってしまい、機能が追加されるごとにとても複雑でわかりづらくなってしまいます。
この場合、必要なプログラムは関数化することで、プログラムを短くでき、わかりやすくなるので保守性が高まる場合があります。さらに関数ならば別の箇所からでも使用できるので再利用性が高まります。そのため「良いプログラム」により近づけることができます。
しかし、エンジニア初心者で経験の少ない私が「良いプログラム」を作るにはたくさん経験を積む必要があります。
そんな中、サーバーエンジニアの先輩にコードレビューをして頂いたときに、以下のような会話がありました。
先輩:「あぁ、ここはシングルトンとか使ったほうが良い感じになりそうだね」
私:「ん?...シングルトン??...なんですかそれ??」
先輩:「デザインパターンって知らない?」
私:「...。すいません...知りません......」
そこで私は「良いプログラム」を作るための手がかりとなる「デザインパターン」について、初めて知ることになりました。
デザインパターンって何?
デザインパターンは、オブジェクト指向のプログラミング言語の設計パターンのことで、先人のエンジニアの方々の知見を体系化したものです。そのため、このパターンを使うことで下記の恩恵を受けられる場合があります。
- 「保守性」が高く、維持しやすい
- 「再利用性」の高い設計
- 「可読性」が高く、分かりやすい
ですので、「デザインパターン」を理解して使えるようになれば、今のチームメンバーだけでなく、未来のチームメンバーに優しい「良いプログラム」を設計し実装することができます。
Singletonパターンについて
デザインパターンには、大きく分けて下記の3つのパターンがあります。
- オブジェクトの生成に関するパターン
- プログラムの構造に関するパターン
- オブジェクトの振る舞いに関するパターン
今回は、その中の1つとして「オブジェクトの生成に関するパターン」の「Singleton」について簡単に紹介します。
Singletonは、プログラム上でのオブジェクトの生成個数を1つだけに制限するパターンのことで、下記のメリットがあります。
- プログラム全体で一貫性のあるオブジェクトの状態を保つことができる
- 同じデータを何度も読み込んでしまわずに済む
- 不必要な容量を使わずに済む
ここで具体例として、桃太郎の題材を使ったプログラムを作ることを考えてみます。
登場人物は、桃太郎と仲間の犬、猿、キジ、敵の鬼です。
このデータを使ってSingletonを使わずにオブジェクトを生成した場合、以下の図のように複数回のオブジェクト生成を行うと、複数の別々のオブジェクトが生成されます。この場合、プログラムのある場所では敵を鬼として使い、一方では敵をゴリラに変更するという処理が可能となります。そのため同じデータから生成したのに、意図せずオブジェクトごとに異なる内容になってしまう可能性があります。
そこでSingletonを使えば、以下の図のようにオブジェクトの生成個数を1つだけに制限するので、プログラム全体で一貫性のあるオブジェクトの状態を保つことができ、分かりやすいプログラムを作ることができます。
まとめ
私は入社してからの8ヶ月の間で「良いプログラム」はなぜ必要なのかを具体的に知ることができました。そして「デザインパターン」の必要性を実感でき、実践することができました。
そのおかげでサーバーエンジニアの先輩に「良いプログラム書くね」と言ってもらえたり、
とあるAPIプログラムのパフォーマンス改善(約2倍の処理性能に!)の実現にも繋がり、とても嬉しかったです!
「デザインパターン」を知らなかった方はぜひ勉強して欲しいです!
この記事がエンジニア初心者の方の「良いプログラム」の作り方を知る手がかりになれば幸いです。
最後まで読んでいただきありがとうございました!