Parece una experiencia infrecuente pero común que a veces estás trabajando en un proyecto y de repente algo aparece inesperadamente, arroja una llave masiva en las obras y aumenta mucho la complejidad.
Por ejemplo, estaba trabajando en una aplicación que hablaba con los servicios SOAP en varias otras máquinas. Creé un prototipo que funcionó bien, luego desarrollé un front end regular y, en general, puse todo en funcionamiento de una manera agradable, bastante simple y fácil de seguir. Funcionó muy bien hasta que comenzamos a probar en una red más amplia y de repente las páginas comenzaron a agotar el tiempo, ya que la latencia de las conexiones y el tiempo requerido para realizar cálculos en máquinas remotas dieron como resultado solicitudes de tiempo de espera agotadas para los servicios de jabón. Resultó que necesitábamos cambiar la arquitectura para distribuir las solicitudes en sus propios subprocesos y almacenar en caché los datos devueltos para que pudieran actualizarse progresivamente en segundo plano en lugar de realizar cálculos solicitud por solicitud.
Los detalles de ese escenario no son demasiado importantes; de hecho, no es un gran ejemplo, ya que era bastante previsible y las personas que han escrito muchas aplicaciones de este tipo para este tipo de entorno podrían haberlo anticipado, excepto que ilustra una forma en que uno puede comenzar con una premisa y un modelo simples y de repente tener una escalada de complejidad en el desarrollo del proyecto.
¿Qué estrategias tiene para lidiar con este tipo de cambios funcionales cuya necesidad surge, a menudo como resultado de factores ambientales en lugar de cambios en las especificaciones, más adelante en el proceso de desarrollo o como resultado de las pruebas? ¿Cómo se equilibra entre evitar los riesgos de optimización prematura / YAGNI / ingeniería excesiva de diseñar una solución que mitigue los problemas posibles pero no necesariamente probables en lugar de desarrollar una solución más simple y fácil que sea tan efectiva pero no incorpore preparación para cada eventualidad posible?
Editar: La respuesta de Crazy Eddie incluye "lo succionas y encuentras la forma menos costosa de implementar la nueva complejidad". Eso me hizo pensar en algo que estaba implícito en la pregunta pero que no planteé específicamente.
Una vez que golpeas ese golpe, e incorporas los cambios necesarios. ¿Hace lo que mantendrá el proyecto lo más cerca posible del cronograma posible pero puede afectar la capacidad de mantenimiento o vuelve a su arquitectura y la reelabora en un nivel más detallado que puede ser más sostenible pero retrasará todo durante el desarrollo?