はじめに
名古屋スタジオでアプリエンジニアをしています、佐々木と申します。
普段はアプリ側のことをやっていますが、サーバー側に触れる機会があったためそのときに感じたそれぞれの違いや、経験をまとめてみます。
今、プログラミングを勉強中でアプリとサーバーのどちらの道へ進もうか考えている方への参考になれば幸いです。
また、あくまでも今所属しているプロジェクトでのことですので、ご了承ください。
それぞれの違い
アプリの主業務
アプリエンジニアの業務は開発と運用に分類できます。これは開発バージョンや機能ごとに担当を入れ替わるものでそれぞれ専属するものではなく、両方の業務を行うことになります。
開発業務は新規機能の企画、設計、実装、テスト、リリースの一連の業務を指します。一方、運用業務はユーザーから送られてきた入信の対応や、本番に出てしまった不具合の修正対応、開発環境の改善をします。
また、開発業務の内容は、インゲーム・アウトゲームに分かれます。
インゲームは主にバトル中のスキルであったり、敵のギミックであったりとゲームのメインとなる部分のことを指します。
対してアウトゲームは素材を合成してキャラクターを強化する部分であったり、挑戦するステージを選ぶ画面であったりとバトル以外の多岐に渡る箇所を指します。
アプリエンジニアは上記の内容を開発プランナーが作成した仕様書を元に、デザイナーが作成した素材を使用して実装していきます。仕様書の作成段階では考慮されていなかった点や、実装を進める上でより良い仕様が思いついた場合などは、適宜エンジニアからプランナーへ相談して仕様を変更することもあります。もちろんこれはサーバーエンジニアから提案されることもあります。
ゲームエンジンはプロジェクトにもよりますが、メインはCocos2d-xとUnityです。
サーバーの主業務
サーバーエンジニアも同様に開発業務と運用業務に分類できます。サーバーエンジニアもアプリエンジニアと同様に専属になるのではなく、両方の業務を行うことになります。
こちらも開発業務は新規機能開発の一連の業務を指します。
運用業務も同様に入信の調査や、不具合の修正、開発環境の改善をしますが、サーバーエンジニアはさらにデータの更新をするツールや社内用の管理ツールの作成をします。
開発業務内容は主にAPI作成とデータベースの設計、構築です。
APIはゲームから送られてきた情報を元にサーバー上でデータのやり取りをし、そのデータをゲームに返すサーバープログラムを指します。ゲームでステージに挑戦する操作をしたときに、スタミナを減らす、ステージをクリアしたときに報酬を抽選するなどの部分です。
データベースはその名の通りデータを保存する部分です。イベントのスケジュールのようなゲームのデータを設定するもの、ユーザーの所持しているキャラのようなユーザーのデータを保存するものなどがあります。
今回、自分が担当したものは上記の開発業務に当たります。
他チームとの関わり方
他のチームとの関わり方にも違いがあります。
まず、アプリエンジニアはデザイナーと関わることが多いです。
運用業務時はアプリアイコンを受け取り、それを組み込みます。また、イベントごとにタイトル画面やホーム画面を切り替えることもしているので、それの実機確認をします。
ゲームを始めたばかりのユーザーにのみ表示されるバナーなど、条件によっては見せたいものが隠れてしまうことがあります。せっかくの素晴らしいデザインが、万全の状態で見えなくなってしまうのは非常にもったいないのでその点に注力して確認します。
共通して関わるチームはプランナーです。しかしその関わり方は違います。
運用業務時は、プランナーの運用メンバーと関わることになります。
アプリエンジニアの場合は、主にUI面でコミュニケーションを取っていきます。プランナーからやりたい施策に対して、問題なく表示されるか、問題がある場合は回避方法があるかなどを相談されます。
サーバーエンジニアの場合は、データの面でのコミュニケーションが主になります。やりたい施策へのデータ設定が可能か、可能な場合はそれの設定方法を相談されます。
またエンジニアからは、施策に対して問題があると分かった際に、問題点とその回避策を伝えます。それを、早い段階で発見するために、新しい施策の際は毎回説明会を設けています。
施策内容によっては、どうしても今ある機能では実現できないものが出てきてしまいます。そういったものに対しては、どうすれば元の案に近いものがユーザーに届けられるのか、最大限の楽しさを実現できるようプランナーと相談していくことになります。
アプリ、サーバーともに関わるメンバーがとても多いです。エンジニアに限った話ではありませんがゲーム開発にはコミュニケーションスキルが非常に大切になります。
それぞれの面白いところ、苦労したポイント
アプリ
アプリエンジニアの面白い部分はやはり、「ゲームを作っている感」が強い部分です。
初めて自分のプログラムによってスマホの画面が動くのは感動します。それが、実際にアプリストアでリリースされているゲームならばその感動もひとしおです。
アプリエンジニアはクリエイティブな面が強いと感じます。実際にユーザーが見て触れる画面を作ることになりますので、仕様についてしっかりプランナーやデザイナーと話し合いをしていくことになります。
新機能が出たときはTwitterなどでさわり心地の感想がないか探してしまいます。ポジティブな意見を見つけたときは、とてもやりがいを感じます。しかしネガティブな意見を見つけたときは、もっとやれることはなかったかと悔しい思いになります。
また、アプリで苦労するポイントはやはりパフォーマンスです。設計時点からサーバーとの通信回数や、SQLを使用してデータベースからデータを取得することは時間のかかる処理なので、できるだけ減らすように考慮しています。ゲーム側では所持しているキャラをすべて一覧で表示するなど、描画が重くなりそうな箇所は画面範囲内のみ生成し、画面外に出たタイミングで消去する方法を取り対応しています。苦労ポイントではありますが、これらの実装をして低スペック端末で確認したときにスムーズに動作したときは達成感があります。
サーバー
サーバーエンジニアの面白い部分は、実際にユーザーのデータを触れる部分です。
また、新しい機能を実装する際は運用のことも考え、見やすくデータの探しやすいデータベースの構造を考える必要があるなど、よりエンジニアとしての力が求められます。
サーバーの場合はユーザーのデータに影響のあるプログラムを書くことになります。ユーザーのデータに触れるというのは怖い部分でもありますが、そのぶんやりがいを感じる部分でもあります。
また、サービス直後や周年のイベント、CMを行なったときなどアクセスが集中した際は、ログインに障害が発生するなど、状況によって発生するトラブルがあります。しかし、自分はまだ経験したことが無いですが、そういった状況をきれいに捌き障害を発生させないように対応できたときはとてもやりがいを感じると上司のエンジニアに聞いたことがあります。
また、自分が今回サーバーをやってみて苦労したポイントは、PHPという新しい言語の学習です。しかし、慣れてしまえばC++と似ているため後半はすんなりと書くことができました。また、一通りの流れを実装しないと正確に実装できているか把握できないと勘違いしていたことも苦労したポイントでした。実際には、ブレークポイントでのデバッグができるとわかったのですが、これのためにでテストの際にいくつも不具合が出てしまい、なんども修正とテストを繰り返す羽目になりました。
さらに、サーバー側ももちろんパフォーマンスを考える必要があります。
通信時間が長くなってしまうとユーザーのストレスになってしまいます。APIの軽量化の知識は持っていませんでしたので、今回の実装へのレビューのコメントは、今までのレビューの中で最多になってしまいました。
最後に
以上が自分が、両方のエンジニアをやってみて感じたことです。どちらのエンジニアが自身のやりたいことかのヒントになったでしょうか?
今回、自分がサーバー側もやってみようとなったのは1on1で上司に話したことがきっかけでした。
ワンダープラネットには、2週間から1ヶ月に1度、1on1を行う文化があります。そういった場で、アプリエンジニアでも「やってみたい」という意思があればそれを尊重してくれる環境があります。
この記事が皆さんの就職活動のきっかけになれば幸いです。