In breve: dipende
Nei dettagli
Avrai bisogno delle cose pulite e lucide?
Ci sono cose da essere cauti qui, e devi identificare il limite tra ciò che è reale, il guadagno misurabile e qual è solo la tua preferenza personale e la potenziale cattiva abitudine di toccare il codice che non dovrebbe essere.
Più specificamente, sappi questo:
È un anti-pattern e presenta problemi integrati:
- esso può essere più estensibile , ma non può essere più facile da estendere,
- essa non può essere più semplice da capire ,
- ultimo, ma sicuramente non ultimo qui: potresti rallentare l'intero codice.
Alcuni potrebbero anche menzionare il principio KISS come riferimento, ma qui è controintuitivo: il modo ottimizzato è il modo semplice o il modo pulito e architettonico? La risposta non è necessariamente assoluta, come spiegato nel resto di seguito.
Il principio YAGNI non è completamente ortogonale all'altra questione, ma aiuta a porsi la domanda: ne avrai bisogno?
L'architettura più complessa rappresenta davvero un vantaggio per te, oltre a dare l'impressione di essere più mantenibile?
Scrivi questo su un grande poster e appendilo accanto al tuo schermo o nell'area della cucina al lavoro o nella sala riunioni degli sviluppatori. Ovviamente ci sono molti altri mantra che vale la pena ripetere, ma questo particolare è importante ogni volta che provi a fare "lavori di manutenzione" e senti l'impulso di "migliorarlo".
È naturale per noi voler "migliorare" il codice o anche semplicemente toccarlo, anche inconsciamente, mentre lo leggiamo per cercare di capirlo. È una buona cosa, poiché significa che siamo supponenti e cerchiamo di ottenere una comprensione più profonda degli interni, ma è anche legato al nostro livello di abilità, alla nostra conoscenza (come si decide cosa è meglio o no? Bene, vedere le sezioni seguenti ...) e tutte le ipotesi che facciamo su ciò che pensiamo di conoscere il software ...:
- lo fa davvero,
- in realtà deve fare,
- alla fine dovrà fare,
- e quanto bene lo fa.
Deve davvero essere ottimizzato?
Detto questo, perché è stato "ottimizzato" in primo luogo? Dicono che l'ottimizzazione prematura è la radice di tutto il male, e se vedi un codice non documentato e apparentemente ottimizzato, di solito potresti presumere che probabilmente non ha seguito le Regole di Ottimizzazione non ha avuto un grande bisogno dello sforzo di ottimizzazione e che era solo il la consueta arroganza dello sviluppatore sta entrando in gioco. Ancora una volta, forse è solo il tuo a parlare ora.
In tal caso, entro quali limiti diventa accettabile? Se ce n'è bisogno, questo limite esiste e ti dà spazio per migliorare le cose, o una linea dura per decidere di lasciarlo andare.
Inoltre, fai attenzione alle caratteristiche invisibili. È probabile che la tua versione "estensibile" di questo codice ti occuperà anche più memoria in fase di esecuzione e presenterà anche un footprint di memoria statica più grande per l'eseguibile. Le funzionalità OO brillanti comportano costi non intuitivi come questi e potrebbero essere importanti per il tuo programma e l'ambiente su cui dovrebbe funzionare.
Misura, misura, misura
Come la gente di Google ora, si tratta di dati! Se è possibile eseguirne il backup con i dati, è necessario.
C'è questa storia non così vecchia che per ogni $ 1 speso in sviluppo sarà seguito da almeno $ 1 in test e almeno $ 1 in supporto (ma in realtà, è molto di più).
Il cambiamento ha un impatto su molte cose:
- potresti aver bisogno di produrre una nuova build;
- dovresti scrivere nuovi test unitari (sicuramente se non ce ne fossero, e la tua architettura più estensibile probabilmente lascia spazio a più, dato che hai più superficie per i bug);
- dovresti scrivere nuovi test delle prestazioni (per assicurarti che questo rimanga stabile in futuro e per vedere dove si trovano i colli di bottiglia), e questi sono difficili da fare ;
- dovrai documentarlo (e più estensibile significa più spazio per i dettagli);
- tu (o qualcun altro) dovrai ripeterlo ampiamente nel QA;
- il codice non è (quasi) mai privo di bug e dovrai supportarlo.
Quindi non è solo il consumo di risorse hardware (velocità di esecuzione o footprint di memoria) che devi misurare qui, è anche il consumo di risorse del team . Entrambi devono essere previsti per definire un obiettivo target, da misurare, spiegare e adattare in base allo sviluppo.
E per il tuo manager, questo significa adattarlo al piano di sviluppo attuale, quindi comunicalo e non entrare in una furiosa codifica cow-boy / sottomarino / black-ops.
In generale...
Si ma...
Non fraintendetemi, in generale, sarei a favore di fare il motivo per cui mi suggerite, e spesso lo sostengo. Ma devi essere consapevole del costo a lungo termine.
In un mondo perfetto, è la soluzione giusta:
- l'hardware del computer migliora nel tempo,
- i compilatori e le piattaforme di runtime migliorano nel tempo,
- ottieni un codice quasi perfetto, pulito, gestibile e leggibile.
In pratica:
potresti peggiorare le cose
Hai bisogno di più occhi per guardarlo, e più lo complessi, più occhi hai bisogno.
non puoi predire il futuro
Non puoi sapere con assoluta certezza se ne avrai mai bisogno e nemmeno se le "estensioni" di cui avrai bisogno sarebbero state più facili e veloci da implementare nel vecchio modulo, e se loro stessi avrebbero bisogno di essere super-ottimizzati .
rappresenta, dal punto di vista della direzione, un costo enorme senza guadagno diretto.
Renderlo parte del processo
Indichi qui che si tratta di una modifica piuttosto piccola e che hai in mente alcuni problemi specifici. Direi che di solito va bene in questo caso, ma la maggior parte di noi ha anche storie personali di piccoli cambiamenti, modifiche quasi chirurgiche, che alla fine si sono trasformate in incubo di manutenzione e scadenze quasi mancate o esplose perché Joe Programmer non ne ha visto uno dei motivi alla base del codice e toccato qualcosa che non avrebbe dovuto essere.
Se si dispone di un processo per gestire tali decisioni, si toglie loro il vantaggio personale:
- Se testerai le cose correttamente, saprai più rapidamente se le cose sono rotte,
- Se li misuri, saprai se sono migliorati,
- Se lo rivedi, saprai se butta via le persone.
La copertura dei test, la profilazione e la raccolta dei dati sono difficili
Ma, naturalmente, il codice di test e le metriche potrebbero soffrire degli stessi problemi che stai cercando di evitare per il tuo codice reale: testi le cose giuste e sono le cose giuste per il futuro e misuri le misure giuste? cose?
Tuttavia, in generale, più si esegue il test (fino a un certo limite) e si misura, più dati si raccolgono e più si è sicuri. Cattivo tempo di analogia: pensalo come guidare (o la vita in generale): puoi essere il miglior pilota del mondo, se l'auto si rompe su di te o qualcuno ha deciso di suicidarsi guidando nella tua auto oggi stesso, il tuo le abilità potrebbero non essere sufficienti. Ci sono entrambe le cose ambientali che possono colpirti e anche gli errori umani contano.
Le revisioni del codice sono i test di corridoio del team di sviluppo
E penso che l'ultima parte sia la chiave qui: fare recensioni di codice. Non conoscerai il valore dei tuoi miglioramenti se li rendi soli. Le revisioni del codice sono i nostri "test di corridoio": segui la versione di Raymond della Legge di Linus sia per rilevare bug e rilevare sovrastampa e altri anti-schemi, sia per assicurarti che il codice sia in linea con le capacità del tuo team. Non ha senso avere il codice "migliore" se nessun altro, se non in grado di comprenderlo e mantenerlo, vale sia per le ottimizzazioni criptiche che per i progetti architettonici profondi a 6 strati.
Come parole di chiusura, ricorda:
Tutti sanno che il debug è due volte più difficile della scrittura di un programma in primo luogo. Quindi se sei intelligente quanto puoi esserlo quando lo scrivi, come eseguirai mai il debug? - Brian Kernighan