Sembra un'esperienza rara ma comune che a volte stai lavorando a un progetto e all'improvviso qualcosa si presenta inaspettatamente, getta una chiave enorme nelle opere e accelera molto la complessità.
Ad esempio, stavo lavorando su un'applicazione che parlava con i servizi SOAP su varie altre macchine. Ho montato un prototipo che ha funzionato bene, poi ho continuato a sviluppare un front-end regolare e in genere ho fatto funzionare tutto in modo carino, abbastanza semplice e facile da seguire. Ha funzionato alla grande fino a quando non abbiamo iniziato i test su una rete più ampia e improvvisamente le pagine hanno iniziato a scadere poiché la latenza delle connessioni e il tempo necessario per eseguire i calcoli su macchine remote hanno portato a richieste scadute ai servizi soap. Si è scoperto che dovevamo modificare l'architettura per estendere le richieste ai propri thread e memorizzare nella cache i dati restituiti in modo da poterli aggiornare progressivamente in background anziché eseguire calcoli su richiesta per richiesta.
I dettagli di quello scenario non sono troppo importanti - anzi non è un grande esempio in quanto era abbastanza prevedibile e le persone che hanno scritto molte app di questo tipo per questo tipo di ambiente potrebbero averlo anticipato - tranne che illustra un modo in cui si può iniziare con una premessa e un modello semplici e improvvisamente avere una escalation di complessità ben nello sviluppo del progetto.
Quali strategie avete per affrontare questi tipi di cambiamenti funzionali di cui si presenta la necessità - spesso a causa di fattori ambientali anziché di modifica delle specifiche - più avanti nel processo di sviluppo o come risultato di test? Come si fa a bilanciare l'evitamento dell'ottimizzazione precoce / YAGNI / i rischi di ingegnerizzazione eccessiva della progettazione di una soluzione che mitiga i possibili problemi ma non necessariamente probabili rispetto allo sviluppo di una soluzione più semplice e facile che sia probabilmente efficace ma che non incorpora la preparazione per ogni possibile eventualità?
Modifica: la risposta di Crazy Eddie include "lo fai schifo e trovi il modo meno costoso per implementare la nuova complessità". Ciò mi ha fatto pensare a qualcosa di implicito nella domanda ma non ho sollevato in modo specifico.
Una volta che hai colpito quel dosso, e hai incorporato le modifiche necessarie. Fai ciò che manterrà il progetto il più vicino possibile al programma ma che può influire sulla manutenibilità o torni alla tua architettura e lo ripeti su un livello più dettagliato che può essere più mantenibile ma respingerà tutto durante lo sviluppo?