Ho utilizzato una metodologia agile (SCRUM) da circa tre anni e vedo alcuni vantaggi ad esso, specialmente nel feedback a breve termine a molti livelli (dai clienti che hanno accesso anticipato alle funzionalità implementate, dai tester che possono funzioni di test non appena vengono implementate, da altri sviluppatori che possono fornire feedback molto precoci sul nuovo codice attraverso la revisione, ecc.)
D'altra parte, ho due problemi aperti, il primo dei quali proverò per spiegare in questa domanda.
Problema: difficoltà a ottenere un buon design
Cerco di eseguire il refactoring non appena il codice diventa complicato, scrivo quanto più possibile i test delle unità (che aiuta a prevenire i bug in generale e in caso di refactoring in particolare). D'altra parte, lo sviluppo di alcune funzionalità complesse in piccoli incrementi, con commit giornalieri e il ripensamento continuo del codice quando diventa non strutturato, non mi consente di produrre un design davvero valido.
L'unico modulo ben progettato che potrei produrre di recente ho ottenuto adottando un approccio diverso: ho analizzato il problema per alcuni giorni (in realtà avevo avuto il problema per un paio di mesi prima di iniziare a lavorare su di esso seriamente), abbozzò un progetto piuttosto dettagliato di tutte le classi coinvolte e le loro relazioni per un altro paio di giorni, e poi mi rinchiuse nel mio ufficio e scrissi l'intero codice lavorando senza interruzioni per circa tre settimane. Il risultato è stata la cosa migliore che ho prodotto da un po ', con pochissimi bug che erano piuttosto facili da individuare e da risolvere, e con un design molto chiaro, che da allora non ha richiesto modifiche rilevanti.
Quindi fino ad ora ho trovato molto più efficace ottenere un quadro generale di ciò che voglio fare prima di iniziare a scrivere codice in piccoli incrementi nella speranza che il quadro generale emerga magicamente nel processo. Con il mio massimo impegno, l'approccio allo sviluppo a piccoli incrementi mi ha sempre portato a un design peggiore.
Domanda : qualcuno ha avuto un'esperienza simile? Sto applicando SCRUM nel modo sbagliato o su cosa dovrei prestare attenzione se voglio sviluppare piccoli incrementi e finire con un software ben progettato? O dovrei pianificare una storia utente design prima di iniziare l'attuale codifica? È considerata una buona pratica, almeno per le funzionalità più complesse della media?
EDIT - NOTA
Sono consapevole del fatto che buon design non è qualcosa di assoluto e non ha un valore da solo ma dipende dal contesto, e quello dovrebbe mirare a un design che è abbastanza buono per il problema a portata di mano.
Ad esempio, non mi interessa (troppo) del buon design se devo implementare un componente semplice che (1) deve essere pronto al più presto possibile, (2) verrà usato una sola volta, (3 ) non è utilizzato da altre parti del sistema (YAGNI).
Mi interessa il buon design quando un componente (1) sarà usato più volte e in diverse versioni di un prodotto, (2) deve essere mantenuto ed esteso nel tempo, (3) ha molti altri componenti a seconda di ciò.