自分がやってる仕事って実は”Unityエンジニア“じゃないかもしれないという話。

クリーンアーキテクチャはゲーム開発に不向き説

以前から、界隈では「UnityでDIコンテナを使おう!クリーンアーキテクチャをやろう!」みたいな話がたびたび盛り上がっている。

私も、「そんなに素晴らしいなら使ってみたい」と思って勉強しようとするたびに、そもそものメリットがサッパリ理解できずに終わるのを繰り返してしまう。

本当にUnityでクリーンアーキテクチャをやるのは優れた方法なのだろうか?じゃあUnity公式のサンプルとかがベッタベタにUnityの普通の作り方になっててクリーンな設計が全然されてないのはなんでなん?

最近はこういう記事も見かけた。

ゲーム開発 に所謂なアプリケーション設計パターンをおいそれと適用するのは難しい

クリーンアーキテクチャというものはUIフレームワークとかWebのアーキテクチャから輸入されてきたもので、ゲーム開発の文脈とは本来無関係なものらしい。

こういう話を聞いてて思ったのは、どうやらクリーンアーキテクチャとか推してる人達自分のようなタイプのUnityエンジニアでは、想定している仕事の前提条件がまったく異なるんじゃないか?という事だ。

同じUnityエンジニアでも、彼らと私では、全然違う事をやってるのかもしれない。

クリーンアーキテクチャ勢は、おそらく、仕事はこういう風に進むものだと思っているはずだ。
・まず、誰かが事前に”完全”で”フィックス”された仕様書とか、要件定義を用意してくれている
・Unityエンジニアはその要件を見て、最初から完全な設計が行える
・クリーンな設計を考えて、あとはそれを実装すれば、仕事は終わり

シンプルでクリーンな世界観だ。よく知らないがWebとか業務アプリケーションの世界ではこういう感じなのかもしれない。

しかし、私が今までずっとUnityエンジニアとしてやってきた仕事ではまったく状況が異なる

そもそも、仕様書やら要件定義といったものは存在しない。クライアント(文字通りのクライアントや、あるいは会社の偉い人、上司)の願望(なんとなくこういう風にしたい的な雰囲気)だけが存在する。

別にクライアントに問題があるとか責めているわけでは無い。と言うのも、Unityを使って作るようなゲームやインタラクティブアプリは、事前に全ての要件を洗い出してください。なんて言ったところでそれは不可能である。実際にモックなりを作ってみて、アイデアに具体的な形を持たせて、クライアントにプレイさせてみて、そこで初めて「やっぱもっとこうして欲しい」という新しい要件が生まれ、次の日はそれを実装する。それの繰り返し。私が今までやって来たのはそういう仕事だった。

つまりそこにアプリの設計なんてものは存在しない。単にモックベースでのアイデアの実装を積み上げていくだけだ。

魔法のランプから出てくるランプの魔人のような存在だ。クライアントが願いを言えば、それを叶えてあげる。ひたすらそれの繰り返し。デザイナーの仕事にも似ているかもしれない。デザイナーは絵が描けないクライアントの代わりに要望をくみ取って手早く具体的な形に落とし込む仕事だ。(そして何度も繰り返される修正依頼と向き合う)

何となく良さげな話に聞こえるかもしれないが、実際は地獄に近い

昨日まではクライアントは”原神”みたいなゲーム(マルチプレイのアクションRPG)を作るって言ってたのに、今日になるとやっぱ”バトルロイヤル”にしたいとか言われてしまうのが私の仕事だ。

どこかの特定の会社とかを問題にしているわけでは無い。今までずっとあちこちでUnityエンジニアの仕事をしてきてどこでもそんな感じだった。だから、私はUnityエンジニアの仕事ってのはこういうもんだと思い込んでたわけだが、そうでもないという事なんだろうか。

もしかするとクリーン勢の方が一般的なエンジニア像なのかもしれない。

それなら、私は自分のようなタイプの仕事をクリーンなUnityエンジニアと区別して別の呼称で呼ぶことを提案したい。

Unityソルジャーというのはどうだろうか。地獄っぽさが出ていると思う。

ダーティな世界のUnityソルジャー

クリーン勢は「クリーンアーキテクチャを使うと機能追加仕様変更に強くなる」と言う。だったら、毎日クライアントの言う事がころころ変わるUnityソルジャーにとってもクリーンはありがたいのか?

とりすーぷさんのこちらのスライドを引用させてもらう。

こちらで例に出されているオニオンアーキテクチャで言うと、”変更に強い”と言っているのが何を指すかと言うと、”インフラストラクチャ層を差し替えるだけで機能を変更できる”という意味である。

スライドの実装例で言えば、ゲームデータのセーブ、ロードを行う時に、PlayerPrefsに保存してたのをJsonに保存するように差し替えができる。

これはあくまで例なので、そこにツッコんでもしょうがないけど、PlayerPrefsかJsonか、最終的にはどっちかに決まるだろうから、別に決め打ちでベタ書きでもいいんじゃね?とは思ってしまうけど。(だとしてもテストとかが書きやすいというメリットはまだある)

つまり、クリーンアーキテクチャが言う所の「変更に強い」というのは、とは言え”想定された範囲の想定された機能に限って”変更に強いという意味だと思う。設計自体が変更されない場合のみ。

しかし、昨日まで原神を作っていたのに今日からフォトナを作るみたいな、Unityソルジャーが日々落とされる地獄みたいな壮大なちゃぶ台返しの変更には耐えられるはずが無いのである。

オニオンアーキテクチャはドメイン層については”事前に十分設計されていて絶対に変更が無い”事が前提になっている。もしドメイン層までも変更するとなれば、アプリケーション層、ドメイン層、インフラストラクチャ層の全てをゴミ箱にぶん投げて全部書き直すハメになる。しかもインフラストラクチャ層で差し替えが効くように色々用意したバリエーションを全部書き直すハメになるだけ、ベタ書きで書くより悲惨な事になる。

よって、Unityソルジャーから見るとクリーンアーキテクチャの旨味はまったく理解できない。無駄に面倒なだけである。

そもそもクリーン勢がUnityにクリーンアーキテクチャを持ち込もうなんて言い出したのは、Unityが余りにもダーティな作りに寛容すぎる仕組みだからだろう。

(まあその気持ちは分かる。私も他人が作ったUnityプロジェクトのシーンを開いてなんちゃらマネージャがズラッと並んでるのを見たら吐き気がしてくるから。自分が作ったとしてもそんな感じだけど、他人のだとオブジェクトの依存関係がまったく分からない。全てのオブジェクトが全てのオブジェクトから参照されてる可能性(N:N関係問題)があり、どれを消しても大丈夫なのかサッパリ分からない。だからシーン上のオブジェクトが増えるほど吐き気が増す。)

しかし、そもそもどうしてUnityがこういうダーティな作りになってるのか考えてみて欲しい。ハッキリ言って毎日仕様がコロコロ変わる(それ自体はしゃーない)ような中でゲーム開発を進めていくには、Unityソルジャーにはクリーンの真逆、ダーティアーキテクチャが求められるのだ。ダーティの果てに進捗が生まれると言っていい。

UnityはUnityソルジャーに寄り添った作りになっているという事。何でそうなってるのかって、多分、ゲーム業界ではソルジャー的な作り方が一般的なんだろうと思う。ゲーム業界からクリーン的な発想が生まれなかったのはそこだろう。

クリーンに向いているアプリとソルジャーに向いているアプリ

一概にUnityでクリーンアーキテクチャは全部無意味!なんて言うつもりは全然ない。Unityでもクリーンが刺さる場合はあると思う。

Unityを使っていても、ゲーム寄りのアプリじゃなくて、もっと業務用ツールとか普通のスマホアプリに近いアプリを作る場合がある。

Unityで作られたツールっぽいアプリと言うと、例えばバーチャルキャストとかバーチャルモーションキャプチャとか、ああいう感じのものが思いつく。

ゲームじゃ無くてツールなら、事前に完全な要件定義を行えるかもしれない。

この場合、オニオンアーキテクチャ的な作りも刺さると思う。例えばバーチャルモーションキャプチャでoscで通信する部分をudp通信に置き換えられたりできたら便利そうだよね。

逆にゲームであらかじめ完全な要件定義ができるなんて思ってるとしたら、それは無い。ゲームはイテレーション回数が面白さに直結すると言われている。イテレーションと言うのはビルドして実際に動かしてまた変更して…と言うのを繰り返すことだ。ゲームは開発中に毎日調整されている。常に仕様が変わってるという事だ。

あらかじめ完全に要件定義されているとしたら、イテレーション回数がゼロのゲームと言う事であり、それは間違いなくクソゲーになる(オリジナルゲームじゃ無くて既存のトランプとか麻雀をゲーム化する場合には事前に完全な要件定義が可能かも)

採用のミスマッチ問題

就職市場では、クリーン勢もソルジャー勢も、みんなひっくるめて”Unityエンジニア”と呼ばれている。(というかソルジャーというのは私が今勝手に作った用語だが)

企業がUnityエンジニアの募集を出すとき、クリーン勢を求めているのか、ソルジャー勢を求めているのかはハッキリ意識しておく必要があると思う。

例えばソルジャーを雇ったつもりでクリーン勢を雇ったとしよう。
そしてクライアントが雇った彼にお願いする「なんかキャラが16人くらいマルチ?できて、フォールガイズみたいな感じで試合する感じで。でもVRでフルボディトラッキングできちゃうみたいな」

こんなふわっとした要望でもソルジャーならダーティに対応してくれるかもしれないが、クリーン勢は「じゃあ設計するので要件定義をください」と言うかもしれない。たしかに要件は大事だ。マルチプレイって言っても16人上限でいいのか?もしフォールガイズみたいに60人まで参加できる事が必要ならPhotonCloudは選定できなくなったりするし。

でもクライアントは困ってしまう「要件…って言われても、実際モックみたいなので動いてるのを作って見せてもらわないと分かんないんだよね…」クリーン勢は言う「”そんなふわっとしたお願いだけで設計できるわけないじゃないですか!設計できなきゃ実装もできませんよ!”何言ってんですか!」

採用のミスマッチが生んだ悲劇だ。

まあ逆にクリーン勢を雇ったつもりでソルジャーを雇ってしまってもそれはそれで困ると思う。

Unityソルジャーの受難

Unityソルジャーは毎日クライアントに進捗を見せて、「う~ん、せっかく作ってもらったけど、こうして実際見ると微妙だったからやっぱこうして欲しい」とか言われて作り直す日々を送ってる。穴を掘らされては埋めさせられる拷問に似ている

大抵の場合、スケジュールぎりぎりまで「ああでもない、こうでもない」みたいな段階から進まないで時間を費やす。そして残り時間が完全になくなってから、「じゃあもうこれでいいや」みたいな感じでようやく仕様がフィックスするのだ。

その時点でコードはグチャグチャの超ダーティ状態になっている。Unityソルジャーがいくらその時点でアプリを綺麗に作り直したいと言ったところで、そんな時間は与えられない。グチャグチャのプロトの叩き台がそのまま使われてリリースまで持っていくケースが多い(シーン名とかプロジェクト名が”test”とかだったりするけど結局そのまま使われる)Unityソルジャーは「こんな状態でリリースしちゃって後でどうなっても責任取れませんよ」と言うより他ない。

そしてリリース後は、アプリは運用チームに引き渡される。
そこで自分が作ったクソ過ぎるコードで悪評が立つ。Unityソルジャーは悲惨なコードの戦犯に仕立て上げられがちだ。何しろ開発中の地獄みたいな経緯を彼らは知らないから、書いたヤツだけがアホに見える。

歴史で例えると、義経が平家討伐ですごく活躍したけど、国を統治する段階になると英雄の存在が邪魔になって抹殺されてしまうような感じだろうか。

運用チームのクリーン勢が「俺ならもっとクリーンに作れるぜ!」とか言い出して作り直しを提案する。完成したアプリをクリーンアーキテクチャで作り直すのは容易な事だろう。なぜならリリースされたアプリ自体がそのまま完全な要件定義だからだ。

えてして、Unityエンジニアはエンジニアの枠の中で評価されがちだ。私が思うに、Unityソルジャーはエンジニアとは似てるようで全く異なる仕事であり、評価の軸も違ってしかるべきだと思うけど。

そういうわけで、アプリを焼き直しただけのクリーン勢が高い評価を獲得し、死ぬほど苦労してリリースまで持って行ったソルジャーの功績は貶められる。

まあこれは実話とかじゃなくて、そういう風になったらイヤだなという単なるストーリーだけど。

Unityエンジニアというのは実際には仕事内容が多彩過ぎて、正当に評価する事が結構難しいと思われる。

Unity開発でシェーダのスキルは必須だと思うが、会社で自分を評価する上司がゲーム畑じゃなかったりしてシェーダに理解が無ければ、「シェーダ?よく分からんがエンジニアっぽく無い事してて怪しいから評価下げとこ」くらいに思ってしまうかもしれない。

Unityは何でも簡単にビジュアライゼーションできるところが注目されて、ゲームと関係ない他業種でも採用が広がってるが、他業種の会社だとますますちゃんと評価されるか分からない。(逆に不当に高く評価されちゃったりして)

私が何となく思う事だが、ゲームの自主開発とかの経験があるほどUnityソルジャーの素養があるような気がする。根性で試行錯誤してゼロからイチを生み出す力と言ったところだろうか。

そして、どうも会社が大きくなって安定してくるとソルジャーの存在は疎まれがちになるような気がする。
ソルジャーは究極的には会社でエンジニアをやるより自分自身のプロダクトを自主開発してくのが一番向いてるのかもしれない。

最後に念押ししておくが、私自身はUnityソルジャーの仕事が好きだ。クライアントの要望を聞きながらゼロベースで対話的にアプリを作り上げていく作業は苦しくもあるがそれなりに楽しい。それに加えて、できれば自分のソルジャーの仕事の正当な評価が得られる事を願うばかりだ。

[追記 21/01/20] twitterの反応

昨日書いたこの記事ですが、twitterで色々反応がありました。

一通り見ましたが、おもしろいなあ…と思ったのと、ためになるなあ…と思ったのと、あとUnityソルジャー多すぎだろ…と思いました。

色んな人の反応ツイートをまとめてみます。

https://twitter.com/toRisouP/status/1351397247032856577