Existe uma abordagem muito simples e prática para isso, que funciona para uma ampla gama de projetos de pequeno a médio porte. Mesmo que provavelmente não funcione bem para a Mars Explorers.
Primeiro, decida o que você quer que o sistema faça e anote cada um dos recursos individuais. Isso pode ser tão sofisticado quanto um storyboard de usuário inteiro ou tão simples quanto alguns pontos marcados em um pedaço de papel à sua frente. Mas é importante que você saiba o que deseja fazer.
Com base nisso, elaborar a estrutura geral do sistema. Novamente, esse é apenas um desenho rápido das diferentes classes / módulos e de como elas se relacionam, mas pode ser tão complexo quanto um documento inteiro. O importante é que você tenha algum tipo de idéia de como implementará o sistema. Mas isso provavelmente será aprimorado à medida que você trabalha, portanto, não tente ir para o complexo e detalhado.
De todos esses recursos, descubra quais são as principais coisas que o programa precisa fazer - os principais recursos.
Em seguida, implemente-os um por um. Agora, o principal aqui é que, para garantir que uma vez implementado um recurso, isso esteja pronto e funcionando totalmente - idealmente, isso é acompanhado por um teste de unidade que garante que ele continue funcionando. Normalmente, suponho que estarei tão ocupado que nunca terei tempo para voltar ao recurso e corrigi-lo.
Depois que os principais recursos são implementados, geralmente tento colocar o sistema em uso o mais próximo possível do ambiente de produção. Isso fornece a) quaisquer bugs que você possa ter perdido anteriormente eb) você terá uma boa idéia da prioridade dos próximos recursos.
Em seguida, você pode continuar implementando os recursos restantes, conforme necessário.
Qualidade do código vs. recursos
Com o exposto acima, costumo sacrificar os recursos pela qualidade do código, se for preciso cumprir um prazo. Simplesmente porque, pelo menos na minha linha de trabalho, quando eu termino algo, minha gerência assume que está feito. E que eles podem me dar a próxima tarefa. Não tenho muito tempo aprimorando o código após o fato.
Agora, e o tratamento de exceções?
Se você não quiser implementar isso de imediato, basta listá-lo como outro recurso da lista. E quando você chegar lá, você pode implementar isso. Mas provavelmente no seu caso, provavelmente existem muitas outras coisas que são mais importantes primeiro.
No entanto, há um requisito mínimo para exceções: verifique se o usuário é notificado se algo der errado - não importa quão feia a saída possa ser. Não engula exceções em algum lugar.