Eu tava vendo recentemente uma apresentação dobre o desenvolvimento de um jogo open source (Veloren) e aprendi muito com o relato do desenvolvedor.
Ele falou que fez várias versões do jogo, um verdadeiro desenvolvimento iterativo. A primeira versão não teria a estrutura necessária para o projeto crescer, então ele fez um novo projeto do zero já aplicando o que aprendeu na versão anterior, e assim por diante.
No fim das contas o estado em que o projeto se encontra hoje foi resultado de várias tentativas e erros, e não por que o desenvolvedor já sabia que aquela estrutura era a correta desde o início.
A gente faz o possível pra acertar desde o início, mas não podemos nos prender a isso. Errar faz parte, e consertar faz o todo.