Como você lida mentalmente com um trabalho muito longo [fechado]

8

Este é o meu primeiro trabalho na indústria de jogos e minha tarefa é remover um dos principais componentes do jogo e colocar outro.

Até o momento, já faz cinco semanas, e ainda estou encarando os erros. Eu acho que pode levar meses até que ele seja compilado. Está realmente me deixando para baixo. Estou apenas mudando as coisas, realmente não estou escrevendo nada. é apenas interminável. Eu conserto mil erros e nove mil tomam seu lugar.

Tenho certeza de que isso deve ser uma coisa comum, então eu estava pensando: como você lida com isso? Não parece que eu possa dividi-lo em pequenos pedaços.

SirYakalot
fonte
3
Eeek. Quem escreveria um código tão ruim que levaria meses apenas para compilar !? Você pode repensar como vai fazer isso ... Depois que compilar, estará cheio de erros lógicos.
MichaelHouse
7
Essa pergunta provavelmente é mais adequada em programmers.stackexchange.com (se houver).
9788 George Duckett
3
@GeorgeDuckett Poderia ser fornecida uma resposta específica da indústria de jogos a esta pergunta que lida com problemas que você só encontraria programação neste setor. Citado literalmente, a parte da FAQ que decide se as questões de código pertencem aqui ou no SO oferece sabedoria aqui também: Um desenvolvedor de jogos profissional me daria uma resposta melhor / diferente / mais específica a essa pergunta do que outros programadores? Se sim, não hesite em perguntar aqui.
Doppelgreener
5
Também voto a favor disso como uma questão geral de programação. Ele está refatorando uma grande bagunça de código, que por acaso é um jogo. Ele precisa de conselhos gerais sobre programação / refatoração, não conselhos sobre desenvolvimento de jogos.
Tim Holt
11
Não é possível migrar esta postagem e suas respostas em vez de apenas fechar?
precisa saber é o seguinte

Respostas:

21

Bem-vindo à indústria de jogos :)

Então você está fazendo uma refatoração massiva. Refatoração maciça é o mal, mas esse não é o assunto. Você provavelmente recebeu essa tarefa para testar seus nervos de qualquer maneira, então não desista.

Minha resposta é: você precisa dividi-lo em pequenos pedaços. Será sua rotina diária em alguns meses, então você precisa aprender a dividir e conquistar. É basicamente o seu trabalho. Algumas sugestões:

  • Certifique-se de entender o que esse componente deve fazer . Brinque com o que você precisa tirar e veja o que ele faz, pergunte aos seus colegas se suas suposições estão corretas.

  • Você está reescrevendo este módulo por um motivo. Pode não ser óbvio para você, mas se você recebeu essa tarefa, é mais provável porque algo era tão ruim que as pessoas acham melhor começar de novo. Pergunte: quais são esses defeitos ?

  • Tente encontrar o recurso principal do componente que você está reescrevendo, sua substância, o motivo pelo qual ele existe e comece a fazê-lo funcionar. Deve ser muito pequeno, tão pequeno quanto possível. Pergunte a seus colegas o que eles acham que esse recurso seria. Se for um sistema GFX, basta exibir um polígono. Se for um sistema de animação, basta colocar um osso corretamente. Se for um sistema de IA, basta fazer uma animação. Etc. etc. Apenas jogue fora tudo que atrapalhar e fornecerá todos esses erros assustadores. Não se preocupe com os detalhes, basta fazer com que esse recurso principal funcione o mais rápido possível. Sua implementação será feia, cheia de bugs, hacks e números mágicos e você não deixaria ninguém dar uma olhada no seu código, mas isso não é um problema.

  • Depois de obter esse recurso principal, você começará a se sentir melhor. É essencial ver o resultado do seu trabalho o mais cedo possível 1) para o seu moral 2) poder testá-lo. Então, teste, teste de estresse, torture . Se ele travar ou mostrar algum bug muito ruim, corrija isso. É o coração do seu módulo, então refaça um pouco e limpe até que você se sinta confortável.

  • Depois mostre aos seus colegas e pergunte se é disso que o jogo precisa. Peça uma revisão de código : provavelmente seus colegas lhe falarão sobre muitas coisas em que você não pensou. Você precisará refatorar novamente para garantir que sua implementação se encaixe com o que o restante da equipe deseja.

  • Depois, quando estiver pronto, escolha um dos outros recursos que você descartou anteriormente, enxágue e repita. Faça com que funcione o mais rápido possível, retrabalhe, peça uma revisão e retrabalhe.

Eu tenho que enfatizar uma última vez sobre isso: comunicar . Pergunte a seus colegas, não apenas a sua liderança, não apenas os programadores, todos que usarão, testarão ou avaliarão esse sistema. Não tenha medo de fazer perguntas estúpidas: em caso de dúvida, é sempre melhor obter as informações agora do que esperar semanas por uma reunião ou uma revisão.

A realidade da programação de jogos é que você não criará novos sistemas brilhantes todos os dias, é um trabalho de manter o foco e fazer as coisas com rapidez e eficiência. Junte-se, comece a trabalhar e boa sorte!

EDITAR

Há informações extras que considero úteis no comentário de Leo e na resposta de dhasenan. Estou envergonhando isso com eles para concluir esta resposta.

Não escrevi sobre como lidar com interdependências . O módulo que você está reescrevendo provavelmente está profundamente associado ao resto do jogo, é por isso que você recebe tantos erros ao mudar alguma coisa. Portanto, existem duas soluções:

  • Se houver apenas algumas dependências, você terá sorte. O módulo antigo e o novo podem ser mantidos em paralelo por um tempo; você pode até ter uma opção para seus usuários, para que eles decidam alternar entre o módulo antigo e o novo sempre que necessário. Basta colocar um switch em algum lugar, em um arquivo de configuração ou em um menu de depuração, e usá-lo onde quer que seu módulo esteja conectado ao resto do jogo. Quando o seu novo módulo estiver pronto para produção, ligue o interruptor por padrão. Posteriormente, quando o módulo antigo não for mais usado ou quando a produção precisar continuar, remova o módulo antigo e o comutador.

  • Se houver muitosdependências, você precisa desconectá-las e reconectá-las uma a uma. Tente manter os dois módulos em segundo plano e, sempre que um novo recurso funcionar, alterne para o novo módulo desse recurso. Ou seja, desconecte e reconecte o que está relacionado a esse recurso. Levará algum tempo, porque provavelmente é mais trabalhoso do que alterar apenas uma chamada de função: algumas estruturas de dados podem mudar, o fluxo do programa pode mudar etc. Mas ainda é melhor do que reescrever tudo uma vez e levar semanas para matar a besta de compilação. Se for realmente impossível manter os módulos antigo e o novo em paralelo, porque o módulo é tão vital para o jogo, você poderá reescrever. Mas lembre-se de que isso pode significar que, se os defeitos estiverem na interface do módulo antigo, você terá os mesmos defeitos. Enfim, se isso acontecer,

Se há algo específico no desenvolvimento de videogames, é o seguinte: não estamos fazendo ciência de foguetes ou um trabalho de pesquisa complicado, fazemos parte de um processo criativo. Ao fazer algo, você precisa criar uma primeira versão o mais rápido possível, para que possa ser testada, reproduzida, desaprovada e modificada. Você não pode passar semanas fazendo "um trabalho muito longo" sem entregar um pouco.

Laurent Couvidou
fonte
Boa resposta, claramente aplicável não apenas a jogos, mas a qualquer projeto.
Tim Holt
11
+1, importante para mim: não apenas teste , mas código de tortura :) Para mim, este é um excelente conselho.
Stefan Hanke
5
+1, é necessário dividir uma grande refatoração em pequenos pedaços. Concordo plenamente que é a única maneira de concluir uma refatoração maciça. Idealmente, altere o código pedaço por pedaço, certificando-se de que cada alteração deixe o sistema funcionando (isso reduzirá muito o número de bugs). Se isso for impossível para a funcionalidade completa, faça-o pelo menos para algumas funcionalidades principais. Mudar tudo de uma vez é uma maneira de criar toneladas de erros difíceis de encontrar.
5113 Leo
1

Você precisa dividir sua tarefa, mas ninguém oferece conselhos sobre como fazer isso.

  • Os módulos novos e antigos funcionam juntos? Ou seja, você pode compilar seu projeto com ambos? Isso permitirá que você compile pelo menos e provavelmente execute testes automatizados em alguns marcos.
  • Você está escrevendo o novo módulo? Ou é o código antigo que você possui? Reescreva no local (desde que a API externa permaneça a mesma). Se você corrigir uma função de cada vez, poderá continuar usando a API combinada do mongrel, até certo ponto.
  • Existem outros projetos na empresa que farão uma transição semelhante? Escreva wrappers nesses módulos para facilitar o processo da próxima vez. Nesse meio tempo, pode valer a pena.
  • Você pode comentar ou evitar a compilação de partes da sua cadeia de dependência? Se você tiver meio milhão de linhas de código no total, talvez seja possível dividi-lo em vinte blocos que são compilados independentemente, trabalhar um em algumas semanas e depois passar para o próximo. Talvez não sejam pedaços totalmente independentes o tempo todo, mas você pode fazer isso em ordem de dependências.

Além disso: peça conselhos ao seu gerente. Eu provavelmente começaria a descrever o problema: está demorando tanto para compilar as coisas corretamente que é difícil acompanhar as alterações, o que tornará mais difícil a depuração quando você tiver algo que possa testar. Então eu mencionaria uma solução em potencial e perguntaria: "Como você recomenda que eu implemente essa solução, ou existe uma maneira melhor de fazer isso totalmente?"

dhasenan
fonte