Sembra un'esperienza rara ma comune che a volte stai lavorando a un progetto e all'improvviso qualcosa si presenta inaspettatamente, getta una grossa chiave nelle opere e aumenta enormemente la complessità.
Ad esempio, stavo lavorando a un'applicazione che comunicava con i servizi SOAP su varie altre macchine. Ho montato un prototipo che funzionava bene, poi ho continuato a sviluppare un front end regolare e in generale ho messo tutto in funzione in un modo piacevole, abbastanza semplice e facile da seguire. Ha funzionato benissimo fino a quando non abbiamo iniziato a testare su una rete più ampia e improvvisamente le pagine hanno iniziato a scadere in quanto la latenza delle connessioni e il tempo necessario per eseguire calcoli su macchine remote hanno portato a richieste scadute per i servizi di sapone. È emerso che avevamo bisogno di cambiare l'architettura per far girare le richieste sui propri thread e memorizzare nella cache i dati restituiti in modo che potessero essere aggiornati progressivamente in background invece di eseguire calcoli su una richiesta per richiesta.
I dettagli di questo scenario non sono troppo importanti - anzi non è un grande esempio in quanto era piuttosto prevedibile e le persone che hanno scritto molte app di questo tipo per questo tipo di ambiente potrebbero averlo previsto - tranne che illustra un modo per iniziare con una premessa e un modello semplici e avere improvvisamente un'escalation di complessità nello sviluppo del progetto.
Quali strategie hai per affrontare questi tipi di cambiamenti funzionali di cui c'è bisogno - spesso come risultato di fattori ambientali piuttosto che di cambiamenti delle specifiche - più avanti nel processo di sviluppo o come risultato di test? Come bilanciare tra l'evitare l'ottimizzazione prematura / YAGNI / i rischi di overengineering della progettazione di una soluzione che mitiga i problemi possibili ma non necessariamente probabili anziché sviluppare una soluzione più semplice e facile che rischia di essere altrettanto efficace ma non include la preparazione per ogni eventualità possibile?
Modifica: la risposta di Crazy Eddie include "fai schifo e trova il modo meno costoso per implementare la nuova complessità". Questo mi ha fatto pensare a qualcosa che era implicito nella domanda, ma non ho sollevato specificamente.
Una volta colpito l'urto, incorporerai le modifiche necessarie. Fai la cosa che manterrà il progetto il più vicino possibile, ma potrebbe influire sulla manutenibilità o tornerai alla tua architettura e la rielaborerai a un livello più dettagliato che potrebbe essere più gestibile ma spingerà tutto indietro durante lo sviluppo?