Whenever I write a piece of functionality from scratch, it's a good and robust code.
Pensiamo tutti che a questo punto. Raramente abbiamo ragione.
But often times my assumptions about how the code should work evolve over time. After I reflect those changes in the code, the whole system suddenly loses its quality.
Bene, no. Non ha mai avuto qualità. Se fosse successo, saresti stato in grado di cambiare facilmente le tue ipotesi. La qualità è più che soddisfacente per le esigenze di oggi.
It seems to me that the best approach is to drop the old code and write a new one from scratch with new assumptions in mind. But from obvious constraints in time I wanna learn how to keep the code quality high while heavily changing it.
Se semplicemente non riesci a scrivere un codice flessibile, allora una riscrittura è la migliore. Certamente migliore del codice mezzo mutato che sta ancora cercando di soddisfare i requisiti che non esistono più.
Question: Are there any techniques or books that could help me develop this skill?
Dal punto di vista dello sviluppo questo è agile. La cascata non reagisce bene a molti cambiamenti non pianificati ed emergenti. In questo momento agile è il meglio che abbiamo per questo.
Da un punto di vista della codifica il principio migliore per questo è la singola responsabilità. Ogni modulo dovrebbe avere solo una, preferibilmente unica, ragione per cambiare. Prendi le tue decisioni in un unico posto. Non diffondeteli. Seguitelo dall'inizio e il cambiamento non sarà così traumatico.
I see how code review is a good tool to uncover issues in code and I agree. But I'm interested in preventing those issues from happening in the first place and developing the skill to do that on my own without involving other team members.
La revisione del codice serve principalmente a verificare che il tuo codice sia leggibile. Sicuramente vale la pena, ma non garantirà tutto. Altri potrebbero verificare la tua progettazione e implementazione, ma non appoggiarti a ciò.
PS: Please don't confuse this with refactoring, which is meant to change the code, while keeping the behavior the same. In my case when the requirements to the code change, it's obviously not refactoring and involves changing the behavior.
È vero. Modifiche al refactoring. Hai bisogno di trasformazioni per soddisfare nuove esigenze. Indovina un po? Refactoring consente di modificare i vecchi progetti che non prevedevano la necessità di adeguare i cambiamenti a quelli che lo fanno. Una volta che sei pronto per scrivere nuovi test unitari che riflettono le tue nuove esigenze e possono farle passare.
Non consigliamo libri qui, ma questa risposta contiene abbastanza parole che dovresti riuscire a trovare ora.