エンジニアとして長生きするための考え方

柿崎貴也氏(以下、柿崎):ここからは、エンジニアが長生きするにはどうすればいいのかという話をしていきたいと思います。要点としては、「どういう技術を持つか・やっていくか?」というロードマップを持つことと、守りに強いエンジニアはけっこう長生きするんじゃないかなと思っています。

僕は今はゲーム業界ではなくてAIの会社にいて、バックエンドの仕事をしています。

今はDjangoを使ってWebサービスを開発して、認証のところをやったり、ライセンスをやったり、Docker運用といった仕事をしているのですが、それには前職の経験が活きています。

Webサービスでいうと、Railsを使っていたのがPythonになったりDjangoになったり、認証基盤もスマートフォンアプリで使われる認証基盤の知見を用いたり、ライセンス管理に関してはアプリ課金基盤だったり、Dockerに関してはゲームサーバのコンテナ運用だったり、スマートフォンゲームで培った技術は別の業種も移っても活きるなと思っています。

技術のロードマップの話をすると、ゲーム業界にいない方とかだとわからないかもしれませんが、ゲーム業界はスマートフォンをやるクライアントエンジニアとサーバ側を担当するサーバエンジニアに分かれています。

まず2つ、自分が今いる立場としてどこにいるのかという話と、将来働きたい業界を見据えてこれから身につける技術が結びついていくかどうか、そういう考え方でやるといいかなと思っています。

働きたい業界は、僕の独断でゲームとWeb業界とAIと書いてしまいましたが、例えばこんな感じでロードマップをひくと、これから何をやればいいのかがわかっていいのではないかと思います。

一例なので参考程度に聞いていただきたいのですが、クライアントをやっていて、例えばゲーム業界でずっと働きたい場合は、レンダリング技術をもっと極めたりして、3D開発をどれぐらい低コストでできるのかを提案する技術を身につけたり。あとはスマートフォンゲームではまだUnityのシェアがかなり高いので、Unityを極めるのもいいのではないかと思います。

Web業界だと、フロントエンドをやるのであればJavaScript系のフレームワーク。最近だとVue.jsとかNuxt.jsとか、あとReactとかありますが、そういったフレームワークを習得する。あるいは、ゲーム業界の中でもサーバサイドの経験を経て、サーバエンジニアに転向してからWeb業界に入るのも1つの手かなと思っています。

自分の話ですが、AI業界に行くのであれば、AIの技術を身につけて、AIはまだサーバサイドで動くほうが多いので、サーバサイドの経験があったほうがいいかなと思いました。

あとは、組み込みの検査の現場ではネイティブでC#やC++で動いている場合があるので、そちらのプログラミング力をつけてエッジ側に入るのも1つの手かなと思います。

サーバサイドのほうなんですが、サーバサイドは汎用性が高くて、そのままサーバサイドの経験を活かして生きるのはけっこういけてる感じなので、ゲーム業界に行くにしても、Web業界に行くにしてもAI業界に行くにしても、今のところの自分の技術を伸ばしていくと、それなりにどこの業界でもわりと生きていけると感じています。

ソーシャルゲームのエンジニアリングにおける攻めと守り

「守りに強くなるといい」という話をしましたが、なんで守りなのか? 「エンジニアという観点じゃなくて、プロフェッショナルとして生きていく業界ってエンジニアだけじゃなくてほかにもあるよね」と思ったので、「ほかのプロってどんなポジションの人が長生きしているんだろう?」ということで調べてみました。

プロ野球とサッカーの引退年齢や平均年齢がどんなものなのか調べてみたところ、プロ野球だと、キャッチャーが一番長生き。やはりキャッチャーは守りの要ですよね。捕手が一番で、2番目が内野手、3番目が外野手。投手はやっぱりすごく肩を使うので、投手は若くして引退する人が多い。

サッカーはより露骨に出ていて。ゴールキーパーが一番長生きで、その次がディフェンス、ミッドフィルダー、フォワード。前に行けば行くほど引退年齢が若くなるということが顕著に出ています。結論からいうと、やっぱり守りが強い人ほど長生きできるんじゃないかなと思っています。

「ソーシャルゲームの攻めと守りの定義」という話をさせていただくと、攻めというのは、売上が上がる開発が攻めなのではないかと定義しています。例えばガチャの機能を実装したり、まさにゲームが触られるところの機能だったり、ソーシャルの機能だったり、売上につながるところを攻めとして定義しています。

一方、守りというのは、これができると売上が上がるというわけではないけれども、これができていないとそもそも運用が成り立たないところを「守り」と表現しています。例えば課金システムだったり、OSのバージョンアップだったり。ゲームだとbotやチートもけっこうきついので、それだの対策なんかが守りだと考えています。

ソーシャルゲームの守りを支える技術

ソーシャルゲーム業界で、自分が考えた守らなきゃいけないところはこんなところかなと思います。

まずIDの管理システムです。端末のIDに関しては先ほど言ったとおりで、その端末IDをベースにユーザーIDと紐付けて払い出すシステムをクラウド上に構築する必要があります。

WebアプリではOpenIDConnectなどといった規格があり、対応するサービスもいくらか存在するため、なるべくその規格に乗ったほうが開発コストが少なくて済みます。しかし、現状は歴史的経緯もあって全く同じにはできず、独自に実装する部分が出てきます。ここは規格の動向も見ながら基盤を育てていく感覚がエンジニアに求められていると思います。

課金システムも地味なんですが重要です。

決済そのものはAndroid・iOSともにアプリ内課金システムがあるのでそれを使う前提で、アプリ内仮想通貨を払い出すシステムを運用する必要があります。

例えばスマートフォンアプリでは資金決済法という法律を守らないといけなくて、その規制があるので有料で買った石と無料で配った石を必ず分けて管理しないと、いざアプリが運用終了したときにすごく困ったことになります。そういうところも守らなければいけないので、この部分のシステムを開発するときはそういう知見があるエンジニアが求められます。

アセットの管理システムも、UnityのAssetBundleの初期バージョンでは機能が足りず、管理システムを独自に実装する事例が多く見られました。最近は新しいAssetBundleのシステムが出てきてまともになってきたらしいですが、まだまだ各社独自のチューニングを施しながら運用しているので、そこでノウハウを貯めていくとけっこう飯を食っていけるかなと思っています。

ログ管理やセキュリティスキルについて

次はログ管理に関する話をします。主として文字列データをファイルに保存するという言葉だけでは簡単なお仕事なんですが、ゲーム業界は大量のアクセスがあるので、一定量を超えると、保存するのに対応しきれずデータが溢れて、ログが欠損してしまう事案というのが、ひと月やふた月に1回ぐらい起きたりすることもあります。ログをいかに安全にロストしないように保存するかということだけでも、かなりいろいろな知見が必要になります。

例えば、リレーショナルデータベースにログを保存する方法は検索は楽なんですが、一定規模を超えたら溢れて書き込めなくなってしまうので、なるべく分散して書き込みを行えるようなS3のような分散型のストレージに保存しないと、大量のログを保存することができなくなります。

しかし、ただ保存すればいいかというとそうではなくて、そもそも何のためにログを保存するかというとを検索したりKPIを出したり、障害が起こったときにどうしてエラーが起きたのかを取り出すために使うので、そこはなるべく取り出しやすいかたちで保存しないといけないですよね。最近ではBigQueryを利用する事例が多いのですが、安定してデータをロードできる仕組みを提供する必要がありますし、クエリ単位で課金がされるため、開発者のミスによって不必要なクエリが実行されてクラウド破産しない仕組みを構築する必要があります。

さらに情報セキュリティができるとかなり強いかなと思っています。可用性や信頼性、保守性というのはどこでも言われていて、そのあたりができることは前提として、ゲーム業界ならではで言うと、チート対策であったりbot対策、ハッキング対策がかなり求められます。

これもなかなか「こうすればいい」という絶対的な解がなくて、botってかなり向こうの業者も本気でやってくるのでけっこう半端ないイタチごっこになるので、けっこうこのへんは知見がある人は、いくらでも、いつまでも生きていられる業界かなと思っています。

後半戦のまとめですけど、ロードマップをひくという話では、今自分がどういうふうなポジションにいるかというのと将来働きたい業界はなにかというのを決めて、そこに紐づく技術要素を学んでいったらいいんじゃないですかねという話と、長生き、エンジニアとしてずっと生きていこうと思ったときには、なるべく守りの、守る力を蓄えておくと長生きしやすいですよねという話でした。

現職について

現在私は、アダコテックというAIの会社にいます。このあたりについてはWantedlyの記事に出ているので、興味があったら見ていただきたいなと思います。

ゲームに関して興味があるところというと、レンダリングだったり、アセンブラのプログラミングが好きなので、そのあたりの話を聞きたい方はぜひ話しかけてください。あと、ゲームAIに関して麻雀AIを公開しているので、麻雀AIに興味があったらぜひお話しましょう。

最後に会社の話をさせていただくと、「モノづくりの進化と革新を支える」というミッションで、AIを作る会社にいます。

アダコテックという会社がやっているのは、製造業の画像検査ってDeep Learningが最近流行ってるんですけど、Deep Learningとは違ったアプローチで画像検査をやっています。

Deep Learningとの違いとしては、「Deep Learningだとどうしても見逃し0が実現できないよね」とか、「学習ではGPUが必要ですごく重いよね」とか、「ブラックボックスになって何が起きてるかわからない」みたいな話があるのですが、アダコテックの検査アプリでは見逃し0にできます。学習に関しても、Deep Learningとは違って、汎用PC・正常データのみで学習ができます。説明性に関しても、Deep Learningのようなブラックボックスにはならないので、理由がわかるということで優位性を持ってやっております。

アダコテックも絶賛エンジニアを募集しております。

1つは画像検査のデータアナリストと、あとエッジアプリを書いていただけるC#のエンジニアと、SaaSのフロントエンド、Vue.jsやNuxt.jsとか書いていただける方がいたら、ぜひ私にご一報ください。

そんな感じでした。どうもありがとうございました。

(会場拍手)

レンダリングに関してどのように勉強すべきか?

司会者:ありがとうございます。今のご登壇でなにかご質問等あればお受けしたいと思います。

質問者1:クライアントのほうでレンダリングの話があったと思うんですけど、勉強するとしたらどのあたりを勉強すればよいでしょうか?

柿崎:そうですね、そこも攻めと守りとあると思っていて。攻めの文脈でいうと、やっぱりきれいなレンダリングというか。例えば揺れものだったら「こういう揺れがかっこいいよね」みたいな、そういう開発をするというのが1つあります。

もう1つは守りなんですが、なるべく低コストでできるアセットの作り方であったり組み込み方のノウハウを積み重ねるという、キャリアの積み重ね方としては2通りあるかなと思います。

質問者1:そうすると、例えば先ほどUnityの話が出てたと思うんですけど、Unityに特化した作り方やテクニックを磨いて、状況によってローポリにうまく落とせたり、それで独自のパッケージを作ったりプラグインを作るぐらいのことをしなくてはだめということでしょうか?

柿崎:そうですね。そこができればすごくいいとは思います。ただ、そこまでいかなくても、今ゲームを作っている会社にいらっしゃるのであれば、今のゲームのアセットを作る仕組みを少しでも改善できるやり方を提案できるところまででも徐々に積み重ねていくと良いのではないかと思います。

質問者1:そうしたら、仮にプロファイラーとかああいうものを使って、負荷を読みながらどこがかかってるかを全部つぶすようなことをやるという守りでいいのでしょうか?

柿崎:そこも1つあるかなとは思いますが、もちろんレンダリングって、速さもありますがそれを作るコストをどれだけ下げられるかというところもありますよね。もちろんレンダリングのFPSを上げるということも当たり前のこととしてあるので、もちろんそれはやるんですけど、それだけじゃなくて、作るのにかけるコストをどれぐらい下げられるかという視点もありますよね。

質問者1:そうすると、Unityのエンジンとはまた別の、3Dの知識をある程度自分で高めなく手はいけないのでしょうか?

柿崎:今のところスマートフォンゲーム業界ではUnityのシェアが高いのでUnityだけでもなんとか生きていけますが、もちろんUnityだけじゃなくてUnrealでも転用できるほうが望ましいと思います。

質問者1:なるほど。ありがとうございます。

攻めの技術が長生きできないのはなぜ?

質問者2:今回のお話で、守りの技術を考えることがエンジニアとしての長寿の秘訣ということでしたが、逆に攻めの技術だとあんまり長生きできないみたいな理由はありますか?

柿崎:そうですね。なぜかというところは僕の仮説でしかないですが、攻めの技術のトレンドは移り変わりが激しいからではないかと思っています。

これは攻めの技術が用がなくなるという意味ではなく、相対的にビジネスなどの影響を受けやすいということです。たとえば、ガチャの演出を考えたときに、今こういう動きを加えると売れるという手法が見つかったとして、10年後に同じスキームが使えるかというと難しいと思います。従って、攻めで生きていくには流行や業界そのもののトレンドをかなり早いスパンでキャッチアップして行かなければならないので、長生きという観点でいうと難しいのではないかと考えています。

一方で、守りに関していうと、コストを下げる考え方や管理モジュール、セキュリティに関する技術は、積み重ねていくことに長い年月が必要な代わりに、ある意味汎用性というか普遍性があると思うので、守りに関する技術を身につけると、長生きというか、長い間使える。そういうニュアンスですね。

質問者2:ありがとうございます。

司会者:ありがとうございます。それでは今回のお話は以上になります。ありがとうございました。

(会場拍手)