Parece uma experiência pouco frequente, mas comum, que às vezes você está trabalhando em um projeto e de repente algo aparece inesperadamente, lança uma chave de boca maciça nas obras e aumenta muito a complexidade.
Por exemplo, eu estava trabalhando em um aplicativo que falava com serviços SOAP em várias outras máquinas. Eu criei um protótipo que funcionou bem, depois desenvolvi um front end regular e, geralmente, colocava tudo em funcionamento de uma maneira agradável, bastante simples e fácil de seguir. Funcionou muito bem até que começamos a testar em uma rede mais ampla e, de repente, as páginas começaram a atingir o tempo limite, pois a latência das conexões e o tempo necessário para realizar cálculos em máquinas remotas resultaram em solicitações de tempo limite aos serviços de sabão. Aconteceu que precisávamos alterar a arquitetura para gerar solicitações em seus próprios encadeamentos e armazenar em cache os dados retornados, para que pudessem ser atualizados progressivamente em segundo plano, em vez de realizar cálculos em uma solicitação por solicitação.
Os detalhes desse cenário não são muito importantes - na verdade, não é um ótimo exemplo, pois era bastante previsível e as pessoas que escreveram muitos aplicativos desse tipo para esse tipo de ambiente podem tê-lo antecipado - exceto que ilustra uma maneira de pode-se começar com uma premissa e modelo simples e de repente ter uma escalada de complexidade até o desenvolvimento do projeto.
Quais estratégias você tem para lidar com esses tipos de mudanças funcionais cuja necessidade surge - geralmente como resultado de fatores ambientais e não de alterações nas especificações - posteriormente no processo de desenvolvimento ou como resultado de testes? Como você equilibra entre evitar os riscos prematuros de otimização / YAGNI / superengenharia de projetar uma solução que atenue problemas possíveis, mas não necessariamente prováveis , em vez de desenvolver uma solução mais simples e fácil, que provavelmente seja tão eficaz, mas não incorpore a preparação para toda eventualidade possível?
Editar: a resposta de Crazy Eddie inclui "você absorve e encontra a maneira mais barata de implementar a nova complexidade". Isso me fez pensar em algo implícito na pergunta, mas não levantei especificamente.
Depois de acertar o solavanco e incorporar as alterações necessárias. Você faz o que manterá o projeto o mais próximo possível do cronograma, mas pode afetar a capacidade de manutenção ou você volta à sua arquitetura e a refaz em um nível mais detalhado, que pode ser mais sustentável, mas atrasa tudo durante o desenvolvimento?