問題解決はスモールステップで。大きな問題は切り分ける【ゲーム開発】
ゲーム開発をしていたらバグとこんにちはするのは日常茶飯事。
バグに出会うこと自体は悪いことではなくて、「今はうまくいっていない(けど直せばうまくいく)」と教えてくれる重要な情報です。これはゲームをさらに良くするための、そしてあなた自身が成長するためのとても良いきっかけになります。
(そうは言ってもリリース後はなるべく出て欲しくないですが)
ゲーム開発では問題や課題に行き合うことはとても良くあることで、それがバグという形で現れたり、動くけれどなんとなくイメージと違っていたりと日々こうしたものに出会います。
ひとつの問題に出会ったとき、一気に解決しようとすると手が止まっちゃうことってありませんか?
このページではこうしたときに有効な方法について紹介します。……といってもタイトルでネタバレしているのですが、スモールステップ、小さく分けてちょっとずつ解決していく方法です。
問題解決はスモールステップで
人間の脳って複雑なことを一気に考えようとするとフリーズしてしまうんですよね。問題解決に挑んでいるにもかかわらず、逆に手が止まっちゃったりします。
このページを読むあなたはコンピュータの知識もあると思うのでCPUで例えると、複雑な問題を考えるときは複数のプロセスを同時に実行するようなもので、CPUの使用率が100%になっちゃって処理が止まってしまうような感じです。
こうした時には、PCでひとつひとつ処理を実行していくように問題を細分化してみましょう。一度で解決するのではなく、登りやすい階段のようにスモールステップで解決することを考えてみてください。
これは大学に通っていた頃、某個別指導の塾で生徒に言っていたことなのですが、「分からないことがあったら、前に戻ってちょっとずつ難しくしていこう」と伝えていました。(その塾の研修の時にこの進め方を教わったような記憶)
例えば中学生で正負の計算がうまくできていないなら、そもそも普通の足し算や引き算がうまくできているか? といったことから確認していきます。
そうすると引っかかっている原因を突き止めやすいんです。
問題の切り分け
ITの世界だと「問題の切り分け」という方が馴染みがあるかもしれません。
ネットワークがつながらない場合は、
- LANケーブルが繋がっているか
- ルータの電源は入っているか
- IPアドレスは適切か
- ファイアウォールが塞いでいないか
などの順番にチェックしていきます。「ネットワークがつながらない」という問題の単位だと漠然としてしまい解決策を見つけるのはなかなか難しいのですが、このように問題の捉え方を細分化していくことで原因が特定しやすくなり、解決もしやすくなります。
これは前の会社の研修であったことなのですが、研修の中でトラブルシューティングを行うものがありました。ネットワークの研修でインターネットにつながらない状態を解決するものがあり、みんなでPCの設定を見直しながらあーでもない、こーでもないと頭をひねっていました。
IPアドレスの割り振りもみんなで重複してたりしないし,LANケーブルも刺さっているし……と諦めムードでため息をついていたら、目の前のコンセントになにやら違和感が。「あれ? 今使ってない機械あったっけ?」とそのコードを追っていくとその先には研修で使っているはずのスイッチングハブが。恐る恐る講師の先輩の顔を見上げてみれば「ニヤリ」と笑みを浮かべていました。
そう、インターネットにつながらない原因は機械のコンセントが抜けていたことでした。そりゃつながらないよ。ちなみに目の前でコンセントを抜かれていたことに全く気づかなかったのは私でした。同期にクッソ笑われたのもいい思い出です。
問題を捉えるときにはどこまでが大丈夫で、どこから問題があるのか、という点を確かめる必要があります。これが問題の切り分けです。
「ここは大丈夫だろう」とか、「まさかそんなことはないだろう」と思っているところほど問題が隠れていたりします。なので、問題を一気に解決しようとせず、うまくいっている部分、うまくいかない部分を分析して、細かい単位で解決するようにすると良いでしょう。
ゲーム開発での例
例えばUnityでゲームを作っているなら、
- コンパイルエラーはないか
- スクリプトはアタッチされているか
- インスペクターウィンドウで参照をセットしているか
といったようにどこで問題が発生しているのかスモールステップで確認していくと解決しやすくなります。
Unityの場合はC#のスタックトレースの機能によって、問題が発生した行がどこで、このメソッドはどこから呼び出されていて、と処理の経緯を追跡することができます。これにより、「ゲームを実行したらエラーが発生した」という問題を「ホニャララのメソッドで問題が発生した」と細分化することができるんですね。
ゲーム全体のどこかで問題が起きている、という状態だと解決は難しいですが、ホニャララのメソッドで問題が起きている、という状態なら解決しやすくなります。さらに深掘りしていけば、例えばint型で値を渡すべきところをstring型で渡していたりするかもしれません。そしたらその周囲をチェックしていけばいいので解決の糸口が見つかります。
人間は大きな問題を考えたくない
大きな問題ほど「一気に解決したい!」という欲が出てきます。問題を詳細に見ていくのって、こんがらがった糸を一本の糸に戻すように大変な作業です。脳のエネルギーを使う作業でもありますから、人間の脳の立場からするとなるべく考えたくないんですよね。なんとか一発で解決しようとこんがらがった糸を強引に引っ張って、結び目がより強くなるなんてのはよくある話です。
大きな問題を分解して考えていく作業は脳内のメモリを大きく使う作業でもあるので、頭の中が問題でいっぱいになっちゃって、今はこっちの部分を考えていたけどさっきの部分は……なんて思考がループして前に進まないこともあります。
問題を細分化するときには紙に書き出すことも大切です。紙に書き出してあれば脳の短期メモリに情報を残しておく必要がないので、問題の別の部分を考える余裕も生まれます。その瞬間に考えるべき問題の大きさをなるべく細かくすることで、脳のリソースをその問題に注ぎ込むことができるんです。
もし他の問題と連鎖的に繋がっている部分があるなら、その部分をなんとか断ち切れないか考えてみることも大切です。問題が関連していると考えてしまうとひとつの大きな問題になってしまい解決が難しくなりますが、関連している要素を切り分けられないか、細分化できないかと考えるのも解決のために必要です。
まとめ
複雑な問題はなるべくシンプルに細分化して各個撃破していきましょう。ITの世界ではトラブルシューティングの手法として「問題の切り分け」が使われるので、この方法をマスターすると問題解決が早くなります。
大きい問題を大きいまま考えるのは大変なので、細分化して楽して解決していきましょう。
ゲーム開発の攻略チャートを作りました!
-
前の記事
全力でやるから学びが生まれるので今のMAXをぶつけるんだ!【ゲーム開発】 2020.11.08
-
次の記事
「ちょっとだけやる」に副次的効果があるんです【ゲーム開発】 2020.11.10
コメントを書く