La mia regola generale è che quando devo fare qualcosa per la terza volta, è tempo di scrivere un piccolo script per automatizzarlo o di ripensare il mio approccio.
Non sto facendo uno "strumento" completo a questo punto, solo un piccolo script (di solito bash o python, anche perl funzionerebbe anche, o anche PHP) che automatizza quello che ho fatto manualmente prima. Fondamentalmente è un'applicazione del principio DRY (o del principio Single Source Of Truth, che è essenzialmente la stessa cosa) - se devi cambiare due file sorgente in tandem, ci deve essere qualche verità comune che condividono, e che la verità deve essere scomposta e archiviata in un unico punto centrale. È fantastico se riesci a risolverlo internamente tramite il refactoring, ma a volte non è fattibile, ed è qui che arrivano gli script personalizzati.
Successivamente, lo script potrebbe non evolversi in uno strumento completo, ma di solito inizio con uno script molto specifico con un sacco di cose codificate in esso.
Odio lavorare con passione, ma credo anche strongmente che sia un segno di design cattivo o errato. Essere pigri è una qualità importante in un programmatore, ed è meglio che tu vada di gran lunga per evitare il lavoro ripetitivo.
Certo, a volte il saldo è negativo - trascorri tre ore a refactoring del codice o scrivendo uno script per risparmiare un'ora di lavoro ripetitivo; ma di solito, il saldo è positivo, soprattutto se si considerano i costi non direttamente evidenti: errore umano (gli umani sono veramente cattivi nel lavoro ripetitivo), basebase più piccola, migliore manutenzione a causa della ridotta ridondanza, migliore autodocumentazione, futuro più veloce sviluppo, codice più pulito. Quindi, anche se il saldo appare negativo adesso , il codebase crescerà ulteriormente e quello strumento che hai scritto per generare moduli web per tre oggetti dati funzionerà ancora quando hai trenta oggetti dati. Nella mia esperienza, l'equilibrio è generalmente stimato a favore del lavoro dei grugniti, probabilmente perché i compiti ripetitivi sono più facili da stimare e quindi sottovalutare, mentre il refactoring, l'automazione e l'astrazione sono percepiti come meno prevedibili e più pericolosi e quindi sovrastimati. Di solito risulta che automatizzare non è poi così difficile.
E poi c'è il rischio di farlo troppo tardi: è facile da refactoring tre
nuove classi di oggetti dati in forma e scrivere uno script che genera moduli Web per loro, e una volta che hai fatto, è facile aggiungere altre 27 classi che funzionano anche con il tuo script. Ma è quasi impossibile scrivere quello script quando hai raggiunto un punto in cui ci sono 30 classi di oggetti di dati, ognuno con moduli Web scritti a mano e senza alcuna coerenza tra loro (a.k.a. "crescita organica"). Mantenere quelle 30 classi con le loro forme è un incubo di codice ripetitivo e ricerca-sostituzione semimanuale, cambiare gli aspetti comuni richiede trenta volte il tempo necessario, ma scrivere una sceneggiatura per risolvere il problema, che sarebbe stata una pausa pranzo no -brainer quando il progetto è iniziato è ora un terribile progetto di due settimane con la temuta prospettiva di un mese di conseguenze consistenti nel correggere bug, educare gli utenti e, eventualmente, anche abbandonare e ritornare alla vecchia base di codice. Ironia della sorte, scrivere il pasticcio di 30 classi ha richiesto molto più tempo di quello che avrebbe avuto la soluzione pulita, perché avresti potuto guidare il comodo script per tutto quel tempo. Nella mia esperienza, automatizzare il lavoro ripetitivo troppo tardi è uno dei maggiori problemi nei progetti software di lunga durata.