Parlando della mia esperienza, ho scoperto che è un equilibrio. Avviare un nuovo progetto e plasmare l'architettura mentre si va è più difficile che mantenere un progetto esistente. Con i nuovi progetti, hai una sorta di lavagna vuota e spetta a te definire come è strutturata. I progetti esistenti hanno già definito questo e ti offrono alcuni vincoli su cui lavorare, limitando le tue scelte e, a causa di ciò, potenzialmente ti danno un tempo più veloce per implementare.
Direi che è ingiusto confrontare i tuoi progetti personali con i tuoi progetti professionali. I progetti personali sono i tuoi progetti e dovresti usarli come un'opportunità per provare obiettivamente nuove metodologie e tecnologie. Cioè, a meno che tu non stia scrivendo il progetto esclusivamente per la funzionalità, nel qual caso - perché dovresti mettere più peso sul design rispetto alla funzionalità?
Per quanto riguarda i diagrammi UML, non ho avuto alcuna esperienza nel loro utilizzo per la progettazione del progetto. Io tendo a pensare che sono un po 'pesante quando la società ritiene che la cosa più importante sia spedire il codice. Per questo motivo, tendo ad iniziare la codifica ad alto livello dopo aver riflettuto sull'approccio di ciò che voglio che il prodotto finale assomigli. Ritengo che la manutenibilità e la leggibilità siano i fattori più importanti a questo punto. Un altro problema con la documentazione è che deve essere letto per essere utile. Puoi disegnare un diagramma UML per aiutarti a pensare attraverso il design, ma anche se impacchetterai tutta la tua documentazione più tardi, qualcuno lo leggerà davvero? La documentazione non letta non è utile.
Per quanto riguarda il ciclo "codice, refactoring, codice, refactoring", è sufficiente farlo quando è necessario migliorare il codice. Evitare il refactoring per motivi di refactoring. Prendi l'approccio che stai apportando miglioramenti necessari all'architettura. Solitamente eseguo piccoli refactoring (estrapolo al metodo, convenzioni di denominazione, ecc.) E lasciano i refactoring più importanti (architettura, struttura di classe) ai tempi in cui sto migliorando il sistema o correggendo un bug particolarmente sgradevole che sembra essere il sottoprodotto del design (o mancanza di esso). Ho visto molti posti che potrebbero trarre beneficio dal refactoring, ma se la funzione funziona, non mi pasticcio a meno che non sia necessario. A breve termine, eseguirò comunque le piccole correzioni di refactoring, così so che le cose stanno migliorando.
Al lavoro, cerco di tenere a mente di "lasciare le cose meglio di come le hai trovate". Questo non significa che io sto continuamente refactoring codice con ogni cambiamento, ma che se sto facendo un cambiamento che è abbastanza significativo per giustificare una valutazione di renderlo migliore, considero le opzioni (anche di peso nel tempo che sarebbe prendere per implementare insieme a rischio, manutenibilità, ecc) e scegliere la migliore opzione bang-for-the-buck.
Parte del vantaggio di lavorare su un team che produce applicazioni è che si viene esposti a metodi alternativi di progettazione. Inoltre, sei consapevole delle scorciatoie evidenti nel design o nella realizzazione per portarlo fuori dalla porta. L'esempio coerente che ho riscontrato è la mancanza di uso del polimorfismo rispetto all'uso di variabili per controllare il comportamento. Il primo richiede un po 'più di impegno per implementare e di solito è più manutenibile e meno incline a comportamenti strani. Lo sviluppatore potrebbe aver pensato che stava solo riutilizzando il codice che è già lì, ma il peso di mantenimento a lungo termine che porta non è sempre insignificante.
Per quanto riguarda le scadenze dei progetti commerciali, ci sono molte variabili. Non tutti i progetti sono su una marcia della morte, anche se sembra essere abbastanza comune valutare la distribuzione del codice rispetto alla sua qualità. Gli utenti finali non si preoccupano dei progetti di fantasia che potresti aver implementato, tanto meno della scelta del contenitore di iniezione delle dipendenze. Sono più interessati a un software ben funzionante, accurato e affidabile che possa portare a termine il lavoro.