1) Quando la maggior parte delle persone parla di progettazione dettagliata, si riferisce a un processo noto come design top-down. In breve, quando pensi al problema che stai cercando di risolvere, inizi al livello più alto e poi lavori nei dettagli. Questo approccio funziona molto bene quando hai una struttura generale in cui desideri che la tua applicazione vada a vivere. A livello macro stai considerando quante macchine saranno necessarie per ospitare la tua applicazione, quali servizi esistenti dovrai utilizzare, ecc. Quando ti immergi più a fondo, stai considerando casi d'uso (o user story se preferisci quella terminologia) e gestione degli errori (i casi d'uso hanno sia percorsi normali che di errore da preoccupare). Man mano che prosegui nei dettagli, stai guardando il tuo algoritmo, le transizioni di stato, la sequenza logica e il modo in cui le parti interne del codice lavorano insieme.
2) Il classico approccio top-down alla progettazione dettagliata è ciò che viene insegnato con la metodologia "cascata", le guide ai processi IEEE, i venditori UML, le università e CMMI, tra gli altri. In molti di questi processi pesanti hanno a che fare con due documenti di progettazione. Uno è il diagramma architettonico generale (il progetto di livello superiore). L'altro è il disegno dettagliato dove vai più in basso nel buco della rabbia. In molti casi è l'unico modo di progettare che molte persone conoscono. È un approccio molto logico e metodico per abbattere un problema software.
3) Il vantaggio principale è che hai identificato quali saranno probabilmente le sezioni critiche. Se hai bisogno di iniziare a lavorare su come il tuo software utilizzerà un altro servizio esistente, hai compilato il tuo elenco di punti di integrazione. Sarai in grado di avviare colloqui con i proprietari di tali servizi per pianificare la tua integrazione e gestire gli eventi imprevisti.
Lo svantaggio principale è che molte volte le persone si spingono troppo oltre il buco della rabbia e il documento di progettazione prende una vita propria. Sebbene sia vantaggioso avere una visione e un'architettura generali su come funzionerà un'applicazione, si troveranno invariabilmente le prime considerazioni sui dettagli essenziali che sono state completamente sbagliate. Quando ciò accade, il documento di progettazione viene trascurato o si hanno gruppi intere che mantengono la carta e rallentano i progressi sul lavoro.
4) Ho già menzionato il design top-down, quindi è necessario che ci sia un approccio "dal basso verso l'alto", giusto? A quanto pare, c'è. Essenzialmente, l'approccio "dal basso verso l'alto" è il principale processo di pensiero dietro le metodologie di sviluppo guidato e di progettazione continua. In sostanza, i dettagli del codice di lavoro iniziano a guidare la progettazione di come pezzi più grandi di codice di lavoro cooperano e si interfacciano tra loro. Con TDD, hai dei test unitari per assicurarti che i dettagli si comportino correttamente e continuino a convalidare il tuo design. Il continuo design ci insegna che non conosceremo mai veramente i dettagli fino a quando il software non sarà finito. Pertanto, perché provare a combattere il fatto? Invece di una grande fase di progettazione iniziale, il progetto è costruito in incrementi su diverse iterazioni di design / codice e test. In realtà è un concetto molto liberatorio che ti consente di concentrarti sulla risoluzione dei problemi.
In conclusione, non c'è una risposta perfetta. Per quanto mi riguarda, trovo che un buon equilibrio tra design top-down e bottom-up funzioni bene. In sostanza, mi prendo ancora del tempo per pensare al quadro generale. Pianifico anche un piano per gli idiomi dell'interfaccia utente e le mie migliori idee per il suo design. Tuttavia, non entrerò nei dettagli perché so che i dettagli cambieranno. Fondamentalmente, è necessario interrompere il processo top-down quando si arriva a zone di cui non si è sicuri. Una volta arrivati in quelle aree, inizia con l'approccio dal basso verso l'alto. Ciò ti consente di provare cose diverse, verificare con il cliente se ha senso per loro e continuare a migliorare nel tempo.