Como fazê-lo vs Design de software sólido?

17

Com pouco tempo disponível para concluir os jogos que criamos, como você pode encontrar um bom equilíbrio entre uma arquitetura sólida de software e fazer um bom progresso para fazer tudo isso?

Meu desafio pessoal: que tal ser eficaz hoje e pensar a longo prazo ao mesmo tempo? Além disso, enquanto você está fazendo isso, pode querer aprender coisas novas a caminho, em vez de recorrer aos mesmos padrões repetitivos que você usa nesses últimos cinco anos?

jmp97
fonte

Respostas:

20

Quanto menos experiência você tiver, mais tempo perderá com o design inicial. Fazer bons projetos é algo que você aprenderá fazendo e depois vendo / avaliando como ficará. Algumas decisões têm implicações de longo alcance, mas obscuras. Após alguns jogos, você provavelmente conseguirá tornar o design inicial bastante sólido e valerá a pena investir mais tempo nesse estágio.

Meu lema: faça as coisas em primeiro lugar, mas use seu bom senso para detectar quais componentes são mais críticos que outros e os projeta muito bem, dentro do seu limite de tempo. Por exemplo, se a IA for essencial para o seu jogo, certifique-se de que você pode estender / alterar facilmente mais tarde. Ou, se você estiver escrevendo um componente que usará em todos os jogos, projete-o para reutilização. Acompanhe o seu tempo e não se preocupe em projetar. Defina um prazo de design e depois disso, comece a invadir tudo para obter seu prazo de liberação. Mas lembre-se de observar quais pontos precisam ser refatorados / reprojetados posteriormente e calcule em algum tempo antes de iniciar o próximo jogo para melhorar essas coisas, para que eles não o mordam de volta!

Um bom conselho: se você tiver que escolher entre duas opções, não demore muito nos detalhes. Na maioria das vezes, não há "bom" ou "ruim". Em algumas situações, A será melhor, em algumas, B será e, em geral, a diferença entre os dois nem sempre vale o tempo.

Há muita experiência a ganhar na criação de software ou jogos; portanto, dedique um pouco do seu tempo à pesquisa (por exemplo, lendo um livro sobre design, lendo sobre a experiência de outras pessoas, conversando com outros programadores sobre seus designs, etc.) )

Nef
fonte
7
+1, um bom conselho. Não se deixe surpreender pela infame Paralisia da Análise, pois isso não leva a lugar algum. Enquanto a refatoração é uma ferramenta poderosa para corrigir falhas do passado, não tenha medo de cometer erros.
Michael Klement
1
Ahh Paralisia de análise . Meu maior inimigo! Eu deveria construir um jogo em que o Analysis Paralysis seja servido como o Chefe Final. É melhor começar projetando a arquitetura do jogo primeiro ... Não ! Brincadeiras à parte: Ótima resposta e bom comentário!
precisa saber é o seguinte
12

As pessoas são terríveis em prever o futuro. Isto é especialmente verdade para jogos, onde os requisitos podem mudar diariamente.

Há um princípio chamado YAGNI , também conhecido como "Você não vai precisar", que basicamente diz que você não deve implementar algo até saber que vai precisar.

Eu já vi tantos sistemas atolados com a rigidez arquitetônica que na verdade não usava nada, já que os recursos que as pessoas pensavam que precisariam nunca chegaram a ser usados.

Minha filosofia pessoal é fazer a coisa mais simples possível . Dito isto, há uma diferença entre Getting It Done e Hacking Shit Together. Escrever código com um propósito não deve implicar em coisas que geram "cheiro de código", como tornar tudo público, ter classes de blob que fazem tudo, ou qualquer uma dessas dezenas de outras coisas que significam código "ruim".

Tetrad
fonte
8

Isso avalia como verdadeiro em minha mentalidade hoje:

  • Pragmatismo sobre ideologia
  • (1) Faça com que funcione (2) e faça com que seja correto - termine o jogo se você esquecer o passo 2
  • Solte-o!
  • Muito design inicial será uma perda de tempo
  • TDD e Clean Code levam a projetos de software mais simples e mais estáveis
jmp97
fonte
Você pode elaborar o desenvolvimento orientado a testes em um ambiente de jogo? Além de alguma lógica básica, nunca achei programas altamente interativos muito adequados para esse tipo de coisa. Além disso, você está ligando para a página de desambiguação;)
drxzcl
2
@Ranieri Se você desenhar uma linha entre as partes que fazem interface com o hardware gráfico e a entrada do usuário, o teste é direto.
Jonathan Fischoff
@Ranier Obrigado, corrigiu o link. Concordo que apresentar testes primeiro para simulações interativas ou jogos cliente-servidor pode ser complicado. Além dos testes de unidade, você pode querer ter alguns testes de funcionalidade de nível superior e, possivelmente, sessões de reprodução que são executadas em determinados intervalos. De qualquer forma, pensar nos testes primeiro provavelmente será recompensado em muitos cenários. Encontre algumas visualizações interessantes em gamedev.stackexchange.com/questions/1905/…
jmp97
5

Sou amigo da prototipagem rápida de software. Especialmente durante o desenvolvimento do jogo. É bom para aprendizado rápido, teste e uso de coisas. Para programação próxima a hardware ou algoritmos complicados, é o melhor método para mim.

Theory();
RapidPrototype();
bool bOk = false;
while(!bOk)
{
 Testing();
 LotOfFixing();
 PlayingWith(); 
 bOk= AnalysingResults();
}
FinalFastAndNiceDataStructuresAndCode();

Minha versão do Rapid Prototype deve ter uma crosta de protótipo adequada:

  • Interface de entrada amigável e máxima para configurar diretivas e variáveis ​​ou dados de configuração.
  • Tratamento estável de exceções e erros.
  • Online como função de depurador, mas no nível necessário.
  • Interface de saída amigável máxima para mostrar ou capturar resultados de todas as maneiras possíveis e necessárias.

Vantagens:

  • Você pode melhorar a crosta do RapidPrototype durante todo o desenvolvimento.
  • Você pode ver e configurar seu código de várias maneiras.
  • Você pode se concentrar apenas na teoria e no problema que precisa resolver.
  • Você pode desenvolver rapidamente novas partes do projeto e experimentá-lo com o restante das coisas finais.
  • Você pode fornecer coisas novas para usar no preenchimento de conteúdo mais rapidamente e finalizá-lo mais tarde. (Especialmente no caso de sandbox)
  • Você pode facilmente descrever e mostrar princípios ou soluções para qualquer outra pessoa. Conectados.
  • O protótipo funcional e transparente é a melhor fonte de informação para o código final (qualquer outra pessoa pode fazê-lo).

Se você fizer isso bem, poderá ter uma versão de depuração / aprendizado real do seu produto no final.
Estamos usando no nosso projeto e estamos felizes com isso.

samboush
fonte
1
Esse é um conselho bastante bom, embora eu recomende um tempo ou algum outro tipo de recurso vinculado ao loop, após o qual você acabou de sair (0) e tentar outro protótipo.
@ Joe Wreschnig - Os planos de tempo podem ser incluídos no AnalysingResults (), mas acho que você pode usar o RapidPrototype por um tempo e finalizá-lo mais tarde ou colocá-lo nos planos. Melhor do que ficar preso nele para sempre :). No RapidPrototype Você também pode simular a funcionalidade. É muito útil de várias maneiras.
Samboush
1

Veja o desenvolvimento ágil de software . Embora não seja uma bala de prata, o objetivo é fazer as duas coisas (fazê-lo e ter um design de software sólido).

lindon fox
fonte
2
Eu não acho que exista uma metodologia de desenvolvimento que não pretenda "fazê-lo e ter um sólido designer de software".
@ Joe Acho que muitas metodologias "pesadas" tendem a preferir o CYA em vez de software sólido. De fato, grande parte da minha experiência não-ágil tende a ser "não precisa estar certa, precisa estar no momento", enquanto "ágil" visa dizer "precisa estar no momento, mas faça tudo o que você quiser". pode fazer as coisas direito à medida que avança. "
Dash-tom-bang
Eu argumentaria que o desenvolvimento ágil tem muito pouca influência sobre se o código é sólido ou não. A essência do ágil é gastar todo o seu tempo de desenvolvimento apenas em coisas importantes. O código ainda pode ser uma bagunça na entrega, porque a qualidade do código (ou falta de dívida técnica) raramente é uma medida de sucesso em uma entrega.
Magnus Wolffelt