Il semble une expérience peu fréquente mais courante que parfois vous travaillez sur un projet et que soudainement quelque chose se présente de manière inattendue, jette une clé massive dans les travaux et augmente la complexité beaucoup.
Par exemple, je travaillais sur une application qui parlait aux services SOAP sur diverses autres machines. J'ai préparé un prototype qui fonctionnait bien, puis j'ai développé un front-end régulier et généralement tout est opérationnel de manière agréable, assez simple et facile à suivre. Cela a très bien fonctionné jusqu'à ce que nous commencions à tester sur un réseau plus large et soudainement, les pages ont commencé à expirer car la latence des connexions et le temps requis pour effectuer des calculs sur des machines distantes ont entraîné des demandes de délai d'expiration aux services soap. Il s'est avéré que nous devions changer l'architecture pour faire tourner les demandes sur leurs propres threads et mettre en cache les données retournées afin qu'elles puissent être mises à jour progressivement en arrière-plan plutôt que d'effectuer des calculs demande par demande.
Les détails de ce scénario ne sont pas trop importants - en effet, ce n'est pas un bon exemple car il était assez prévisible et les gens qui ont écrit beaucoup d'applications de ce type pour ce type d'environnement auraient pu l'anticiper - sauf qu'il illustre une manière on peut commencer avec une prémisse et un modèle simples et avoir soudainement une escalade de complexité bien dans le développement du projet.
Quelles stratégies avez-vous pour faire face à ces types de changements fonctionnels dont le besoin se fait sentir - souvent en raison de facteurs environnementaux plutôt que de changements de spécifications - plus tard dans le processus de développement ou à la suite de tests? Comment équilibrez-vous entre éviter les risques d'optimisation / YAGNI / de suringénierie prématurés de la conception d'une solution qui atténue les problèmes possibles mais pas nécessairement probables , par opposition à l'élaboration d'une solution plus simple et plus facile qui sera probablement aussi efficace mais n'incorporera pas de préparation pour toutes les éventualités possibles?
Edit: La réponse de Crazy Eddie comprend "vous le sucer et trouver le moyen le moins cher de mettre en œuvre la nouvelle complexité." Cela m'a fait penser à quelque chose qui était implicite dans la question, mais je n'ai pas soulevé spécifiquement.
Une fois que vous avez touché cette bosse et que vous avez intégré les changements nécessaires. Faites-vous ce qui gardera le projet aussi proche que possible du calendrier mais qui peut affecter la maintenabilité ou revenez-vous à votre architecture et la retravaillez à un niveau plus détaillé qui peut être plus maintenable mais qui repoussera tout pendant le développement?