Per me, aiuta a scomporre un software più grande in blocchi più piccoli. E poi spezzare quei pezzi in parti ancora più piccole e così via. Ogni programma software è una raccolta di piccoli pezzi di logica.
Prendi in considerazione un blog, ad esempio. Vuoi essere in grado di creare e modificare post che altri possono leggere. Immediatamente puoi dividere il progetto in sezioni amministrative e pubbliche. Come minimo, l'amministratore richiederà agli utenti amministratori, una pagina di accesso e una sezione per la gestione del blog. La sezione per la gestione del blog può essere suddivisa in un'interfaccia CRUD (Crea, Leggi, Aggiorna, Elimina). La creazione di un nuovo post sul blog richiederà un controllo per assicurarsi che l'utente amministratore disponga dei privilegi giusti, un modulo, la convalida del modulo e la possibilità di salvare nel database. E così via.
Più si interrompe un problema o una funzionalità, più diventa gestibile. È dividere e conquistare. Una volta che sei stato in grado di mappare il tuo software in questo modo, puoi dare un'occhiata a come diversi pezzi di esso interagiscono tra loro. Dove potresti ripetere il codice? Cosa si può sottrarre? Questo dovrebbe essere un processo iterativo sia durante la pianificazione che durante la scrittura del codice stesso.
Consiglierei di capire qual è il tuo set minimo di funzionalità e di implementarlo prima di aggiungere altri pezzi. Ti consigliamo di programmare in modo difensivo in modo che i cambiamenti futuri non siano troppo difficili, ma allo stesso tempo, non vuoi implementare metà funzionalità che potrebbero non essere mai completate. È una linea difficile camminare tra la flessibilità e la volontà di uccidere spietatamente i tuoi cari, prendere in prestito un riferimento letterario. Essere bravi in quel particolare atto di bilanciamento proviene solo dall'esperienza.
E questo è ciò che si riduce, come hanno già detto le altre risposte: l'esperienza. L'unico modo per ottenerlo è solo iniziare. Non preoccuparti così tanto di renderlo perfetto fin dall'inizio. Prima fai in modo che il codice funzioni, quindi rendilo bello, quindi rendilo veloce.
Inoltre, a differenza di questo paragrafo, non considerare la sicurezza alla fine come ripensamento. Dovresti avere un'idea dei modi in cui il tuo software potrebbe essere compromesso, ma per iniziare, non fidarti mai degli input dell'utente.