Quello che hai letto da qualche parte è molto vero. Quando si lavora su un software, si desidera ridurre al minimo tutti i loop di feedback (questo è il principio principale dietro lo sviluppo agile / snello). Prima scoprirai che è necessaria una correzione, più facile (sforzo, rischio ...) sarà quello di fare quella correzione.
Quindi, se dovessi scegliere tra i due approcci che hai elencato, vorrei andare con (1), sviluppare / testare il modulo alla volta perché l'altro approccio ha il più ampio ciclo di feedback che potresti avere. Scrivere un intero programma e solo dopo averlo testato sta chiedendo un disastro.
Tuttavia, voglio segnalarvi alcune altre cose:
Sembra che si assuma che "un bug" sia un errore di codifica. E sì, gli errori di codifica sono bug, ma quando si creano software è necessario essere a conoscenza di altri tipi di bug:
- bug di progettazione: il tuo codice funziona come previsto ma il tuo design non funziona. Forse è troppo complesso, forse non riesce ad affrontare correttamente i requisiti.
- bug di requisiti: il tuo codice funziona come previsto e come progettato, ma la tua comprensione di ciò di cui l'utente ha bisogno non è corretta. A volte quell'utente sei tu. Può capitare che ti immagini come vuoi che la tua app appaia e si comporti. Quindi crei un'interfaccia utente per esso e scopri che il tuo piano originale era completamente inadeguato perché non riesce a risolvere (o risolvere elegantemente) qualsiasi problema il tuo programma è destinato a fare.
Nessuno dei tuoi approcci è buono per trovare questi altri tipi di bug. E proprio come i bug di programmazione sono più economici da risolvere non appena li scrivi, i requisiti e i bug di progettazione sono anche più economici da sistemare non appena deciderai sulla strategia e prima di scrivere troppo codice. Dopo che il programma è stato fatto per lo più, i bug di progettazione diventano molto più costosi di quelli di programmazione. E i bug dei requisiti spesso implicano la necessità di riscrivere completamente un blocco del tuo programma.
In altre parole, immagina che il tuo programma sia composto da pochi moduli. Scrivi e collaudi il primo modulo e tutto sembra a posto. Quindi scrivi e testa il secondo e il terzo modulo e le cose sembrano ancora buone. Poi vai a metterli insieme solo per scoprire che il design del modulo A non è veramente adeguato per integrarsi in modo efficiente con il modulo B. Così ora sei tornato, ridisegnando, codificando e ripetendo il modulo A, cosa che comunque avevi già fatto. Il tempo sarà sprecato.
Un approccio migliore sarebbe quello di creare un'architettura di alto livello (layout generale dei moduli) per il tuo programma. Forse hai un'interfaccia utente, alcune logiche di business, alcuni moduli di comunicazione e archiviazione dei dati. Scrivi un minimo indispensabile (essenzialmente solo un codice skeleton) in TUTTI i moduli e poi prova l'intero programma. Anche se tutto ciò che fa è avviare e spegnere senza alcun lavoro utile. Assicurati che l'avvio funzioni. Quindi aggiungere una funzionalità al programma. Questa funzione interesserà probabilmente molti / tutti i tuoi moduli. Verificare che la funzionalità funzioni. Continua a farlo fino a quando il tuo programma è terminato.
In questo modo non passerai troppo tempo nel modulo A, prima di capire come tutto il programma si riunisce. Sarai anche in grado di vedere l'interfaccia utente dal vivo e sarai in grado di interagire con esso, quindi se qualcosa deve cambiare sarai in grado di apportare modifiche prima che venga scritto troppo altro codice.