1つの非常に長い作品を精神的にどのように処理しますか[終了]


8

これは私のゲーム業界での最初の仕事であり、私の仕事は1つの主要なゲームコンポーネントを取り出して、新しいものに組み込むことです。

これまでのところ5週間が経過していますが、私はまだエラーを見つめています。コンパイルできるようになるまでに数か月かかると思います。本当に落ち込んでいる。私は物事を変えているだけで、自分で何かを書いているわけではありません。それは無限です。私は千のエラーを修正し、九千がそれらの代わりになります。

これは当たり前のことだと思いますので、どうすればこれに対処できるのでしょうか?私はそれを少しのチャンクに分解することはまったくできないようです。


3
ねえ。コンパイルするだけで何ヶ月もかかるような悪いコードを書いているのは誰ですか?あなたはどうやってそれをやろうとしているのかを再考したいかもしれません...コンパイルが完了すると、それは論理エラーでいっぱいになります。
MichaelHouse

7
この質問は、programmers.stackexchange.com(もしあれば)に適しています。
George Duckett

3
@GeorgeDuckettゲーム業界に固有の回答をこの質問に提供できます。この質問は、この業界でのプログラミングでのみ発生する問題に対処します。引用どおり、コードの質問がここにあるかSOにあるかを決定するFAQの一部は、ここでも知恵を提供します:プロのゲーム開発者は、この質問に対して他のプログラマよりも良い/異なる/より具体的な答えをくれますか?はいの場合は、こちらからお気軽にお問い合わせください。
doppelgreener

5
私はこれも一般的なプログラミングの質問として投票します。彼は大きなコードの混乱をリファクタリングしています。これはたまたまゲームです。彼には、ゲーム開発のアドバイスではなく、プログラミング/リファクタリングの一般的なアドバイスが必要です。
Tim Holt

1
この投稿とその回答を単に閉じるだけでなく移行することはできませんか?
SirYakalot

回答:


21

ゲーム業界へようこそ:)

つまり、大規模なリファクタリングを行っています。大規模なリファクタリングは悪ですが、それはトピックではありません。とにかくあなたはあなたの神経をテストするためにこの仕事を与えられたので、それをあきらめないでください。

私の答えは、あなたそれを小さな塊分解しなければならない。それは数ヶ月であなたの毎日のルーチンになるので、あなたは分割して征服する方法を学ぶ必要があります。基本的にはあなたの仕事です。いくつかの提案:

  • このコンポーネントが何をすべきかを理解していることを確認してください。何を取り出さなければならないかを試して、それが何をするかを確認し、仮定が正しいかどうか同僚に尋ねます。

  • 何らかの理由でこのモジュールを書き直しています。それはあなたには自明ではないかもしれませんが、このタスクを与えられた場合、それはおそらく何かがとてもひどいために人々がそれを最初からやり直したほうがよいと感じているためです。質問してください:それらの欠陥は何ですか?

  • 書き換えるコンポーネントのコア機能、その実質、その存在理由を見つけて、これを機能させることから始めてください。できる限り小さくしてください。この機能がどのようになるかを同僚に尋ねます。GFXシステムの場合は、1つのポリゴンを表示します。アニメーションシステムの場合は、1つのボーンを適切に配置します。AIシステムの場合は、アニメーションを再生するだけです。等など。邪魔になるすべてのものをゴミ箱に捨て、それらすべての困難なエラーを提供します。詳細に邪魔されることはありません。できるだけ早くこのコア機能を動作させてください。実装は醜く、バグやハッキング、マジックナンバーでいっぱいであり、コードを誰かに一瞥してもらえないでしょうが、それは問題ではありません。

  • このコア機能を手に入れたら、すでに気分が良くなります。1)あなたの士気2)それをテストできるようにするには、あなたの仕事の結果をできるだけ早く見ることが不可欠です。だから、それをテストし、ストレステストし、拷問しなさい。クラッシュしたり、本当に悪いバグが表示されたりした場合は、これを修正してください。これはモジュールの心臓部なので、少しやり直して、快適に感じるまでクリーンアップします。

  • 次に、それを同僚に見せて、それがゲームに必要なものかどうか尋ねます。 コードレビューを依頼する:あなたの同僚はおそらくあなたが考えていなかった多くのことについてあなたに言うでしょう。実装をチームの他のメンバーが望むものに適合させるには、再度リファクタリングする必要があります。

  • 次に、準備ができたら、先にゴミ箱に入れた他の機能を1つ選び、すすぎ、繰り返します。できる限り速く動作するようにして、やり直し、レビューを依頼し、やり直します。

最後にもう一度強調しなければならないのは、コミュニケーションです。このシステムを使用またはテストまたは評価するすべての人に、同僚だけでなく、リードだけでなく、プログラマーにも質問してください。愚かな質問をすることを恐れないでください。疑わしいときは、会議やレビューを数週間待つよりも、すぐに情報を入手する方が常に良いでしょう。

ゲームプログラミングの現実は、ブランドの光沢のある新しいシステムを毎日作成するのではなく、集中して作業を迅速かつ効率的に実行することです。一緒に自分を引っ張って、仕事に取り掛かり、そして幸運を!

編集

Leoのコメントとdhasenanの回答に役立つと思われる追加情報があります。この回答を完成させるために、私は恥ずかしくないことにそれらを精査しています。

相互依存関係に対処する方法については書きませんでした。書き換えているモジュールはおそらくゲームの残りの部分と深く結びついているため、何かを変更するときに多くのエラーが発生します。したがって、2つの解決策があります。

  • ただそこにある場合は、いくつかの依存関係、あなたは幸運。新旧のモジュールはしばらくの間並行して保持できます。ユーザーが必要に応じて新旧のモジュールを切り替えることを決定できるように、ユーザー用のスイッチを用意することもできます。設定ファイルまたはデバッグメニューのどこかにスイッチを配置し、モジュールがゲームの残りの部分に接続されている場所ならどこでもスイッチを使用します。新しいモジュールを生産する準備ができたら、スイッチをデフォルトでオンにします。後で、古いモジュールが使用されなくなったとき、または生産を継続する必要があるときに、古いモジュールとスイッチを取り外します。

  • たくさんあるなら依存関係は、1つずつ取り外してから再度差し込む必要があります。両方のモジュールをバックグラウンドで維持するようにしてください。新しい機能が動作するようになるたびに、その機能の新しいモジュールに切り替えてください。つまり、この機能に関連するものを取り外し、再度差し込みます。おそらく1つの関数呼び出しだけを変更するよりも手間がかかるため、少し時間がかかります。一部のデータ構造が変更されたり、プログラムフローが変更されたりする可能性があります。ゲームにとって非常に重要なモジュールであるため、古いモジュールと新しいモジュールの両方を並行して維持することが実際に不可能である場合は、適切な場所に書き直すことを検討してください。ただし、これは、欠陥が古いモジュールのインターフェースにある場合、同じ欠陥が発生することを意味する場合があることに注意してください。とにかく、これが起こった場合、

ビデオゲーム開発に固有のものがある場合、それはこれです。私たちはロケット科学や複雑な研究​​を行っていないので、私たちは創造的なプロセスの一部です。何かをするときは、最初のバージョンをできるだけ早く作成して、テスト、再生、難読化、および変更できるようにする必要があります。少し時間をかけずに「非常に長い1つの作業」に何週間も費やすことはできません。


良い答えです。ゲームだけでなくあらゆるプロジェクトに適用できます。
Tim Holt

1
+1、私にとって重要なポイント:テストだけでなく、コードを拷問しないでください:)私にとって、これは優れたアドバイスです。
Stefan Hanke、2012

5
+1、大きなリファクタリングを小さなチャンクに分割する必要があります。これが大規模なリファクタリングを完了する唯一の方法であることに私は完全に同意します。理想的には、コードをチャンクごとに変更し、変更するたびにシステムが機能するようにします(これにより、バグの数が大幅に減少します)。すべての機能でこれが不可能な場合は、少なくとも一部のコア機能でそれを実行してください。すべてを一度に変更することは、見つけにくいバグを大量に作成する確実な方法です。
レオ

1

あなたはあなたの仕事を分割する必要がありますが、それを行う方法についてのアドバイスを誰も提供していません。

  • 新しいモジュールと古いモジュールは一緒に機能しますか?つまり、両方でプロジェクトをコンパイルできますか?これにより、少なくともいくつかのマイルストーンで自動テストをコンパイルして実行できるようになります。
  • 新しいモジュールを書いていますか?それとも、あなたが所有している古いコードですか?所定の場所に書き直します(外部APIは同じままです)。一度に1つの関数を修正すれば、ある程度は複合mongrel APIを引き続き使用できるはずです。
  • 同様の移行を行う会社の他のプロジェクトはありますか?これらのモジュールの周りにラッパーを記述して、次回のプロセスを容易にします。それまでの間、これを行う価値はあります。
  • 依存関係チェーンのチャンクのコンパイルをコメントアウトまたは回避できますか?合計50万行のコードがある場合、独立してコンパイルできる20のチャンクに分割し、数週間で1つ動作させてから、次の手順に進むことができます。常に完全に独立したチャンクではないかもしれませんが、依存関係の順に行うことができます。

また、マネージャーに助言を求めてください。私はおそらく問題の説明から始めるでしょう:物事を適切にコンパイルするのに時間がかかりすぎて変更を追跡することが難しいため、テストできるものがあればデバッグが難しくなります。次に、潜在的なソリューションについて言及し、「このソリューションを実装することをどのようにすすめますか、またはこれを完全に行うより良い方法はありますか?」と質問します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.