Ogni volta che lavoro su un pezzo di codice abbastanza significativo, spesso scopro che passo attraverso una fase di progettazione di alto livello (a parte: mi piace usare la matita e la carta per questo), seguita da procedure mentali per evidenziare i difetti e fare raffinamenti.
Vedo la codifica come un altro livello (e la più fine) di walkthrough mentale: devi considerare e coprire ogni eventualità e questo spesso si traduce in un ulteriore perfezionamento del design. Di solito trovo alla fine del processo che è stato appreso abbastanza che se stavo progettando e scrivendo di nuovo il codice ci sono cose che potrei fare meglio. E alcune di queste cose sono forse troppo "covate" nella struttura del codice per giustificare il tempo necessario per apportare le modifiche.
Spesso mi sembra che in un mondo ideale avessi sempre in programma di passare attraverso il processo di cui sopra con l'intenzione di usarlo come un processo di apprendimento e di pianificare di riscrivere. Notando che molti dei dadi e dei bulloni del codice (ad esempio le subroutine di basso livello) saranno riutilizzabili, quindi non è una riscrittura bottom up completa .