così alcuni sviluppatori / gestori vedono il valore nello scrivere meno codice per fare le cose in modo da avere meno codice da mantenere
Si tratta di perdere di vista l'obiettivo reale.
Ciò che conta è ridurre le ore dedicate allo sviluppo . Ciò è misurato nel tempo (o sforzo equivalente), non in righe di codice.
Questo è come dire che i produttori di automobili dovrebbero costruire le loro auto con meno viti, perché ci vuole un tempo diverso da zero per inserire ogni vite. Mentre questo è pedanticamente corretto, il valore di mercato di un'auto non è definito da quante viti fa o non ha. Soprattutto, un'auto deve essere performante, sicura e di facile manutenzione.
Il resto della risposta sono esempi di come il codice pulito può portare a guadagni di tempo.
Registrazione
Prendi un'applicazione (A) che non ha registrazione. Ora crea l'applicazione B, che è la stessa applicazione A ma con la registrazione. B avrà sempre più righe di codice, quindi è necessario scrivere più codice.
Ma molto tempo sprofonderà nell'indagare su problemi e bug e nel capire cosa è andato storto.
Per l'applicazione A, gli sviluppatori rimarranno bloccati nella lettura del codice e dovranno continuamente riprodurre il problema e scorrere il codice per trovare l'origine del problema. Ciò significa che lo sviluppatore deve testare dall'inizio dell'esecuzione fino alla fine, in ogni livello utilizzato, e deve osservare ogni logica utilizzata.
Forse è fortunato a trovarlo immediatamente, ma forse la risposta sarà nell'ultimo posto in cui pensa di guardare.
Per l'applicazione B, presupponendo una registrazione perfetta, uno sviluppatore osserva i registri, può identificare immediatamente il componente difettoso e ora sa dove cercare.
Questo può essere una questione di minuti, ore o giorni risparmiati; a seconda delle dimensioni e della complessità della base di codice.
regressioni
Prendi l'applicazione A, che non è affatto DRY-friendly.
Prendi l'applicazione B, che è ASCIUTTA, ma ha finito per aver bisogno di più righe a causa delle astrazioni aggiuntive.
Viene archiviata una richiesta di modifica, che richiede una modifica alla logica.
Per l'applicazione B, lo sviluppatore modifica la logica (unica, condivisa) in base alla richiesta di modifica.
Per l'applicazione A, lo sviluppatore deve modificare tutte le istanze di questa logica in cui si ricorda che viene utilizzata.
- Se riesce a ricordare tutte le istanze, dovrà comunque implementare la stessa modifica più volte.
- Se non riesce a ricordare tutti i casi, ora hai a che fare con una base di codice incoerente che si contraddice. Se lo sviluppatore ha dimenticato un pezzo di codice usato raramente, questo errore potrebbe non essere evidente agli utenti finali fino a molto tempo fa. A quel tempo, gli utenti finali identificheranno qual è l'origine del problema? Anche in questo caso, lo sviluppatore potrebbe non ricordare ciò che il cambiamento ha comportato e dovrà capire come cambiare questo pezzo di logica dimenticato. Forse lo sviluppatore non ha nemmeno lavorato in azienda per allora, e quindi qualcun altro ora deve capire tutto da zero.
Questo può portare a enormi perdite di tempo. Non solo nello sviluppo, ma nella caccia e nella ricerca del bug. L'applicazione può iniziare a comportarsi in modo irregolare in un modo che gli sviluppatori non possono comprendere facilmente. E questo porterà a lunghe sessioni di debug.
Intercambiabilità degli sviluppatori
Sviluppatore Un'applicazione creata A. Il codice non è pulito né leggibile, ma funziona come un fascino ed è stato eseguito in produzione. Non sorprende che non ci sia nemmeno documentazione.
Lo sviluppatore A è assente per un mese a causa di festività. Viene presentata una richiesta di modifica di emergenza. Non possono aspettare altre tre settimane per far tornare Dev A.
Lo sviluppatore B deve eseguire questa modifica. Ora ha bisogno di leggere l'intera base di codice, capire come funziona tutto, perché funziona e cosa cerca di ottenere. Questo richiede secoli, ma diciamo che può farlo tra tre settimane.
Allo stesso tempo, l'applicazione B (creata dallo sviluppatore B) presenta un'emergenza. Dev B è occupato, ma Dev C è disponibile, anche se non conosce la base di codice. Cosa facciamo?
- Se continuiamo a lavorare con B su A e mettiamo C su B, allora abbiamo due sviluppatori che non sanno cosa stanno facendo e il lavoro di bering viene eseguito in modo non ottimale.
- Se allontaniamo B da A e gli facciamo fare B, e ora mettiamo C su A, allora tutto il lavoro dello sviluppatore B (o una parte significativa di esso) potrebbe finire per essere scartato. Questo è potenzialmente giorni / settimane di sforzo sprecato.
Lo sviluppatore A ritorna dalle sue vacanze e vede che B non ha capito il codice e quindi lo ha implementato male. Non è colpa di B, poiché ha usato tutte le risorse disponibili, il codice sorgente non era adeguatamente leggibile. A deve ora dedicare tempo a correggere la leggibilità del codice?
Tutti questi problemi, e molti altri, finiscono per perdere tempo . Sì, a breve termine, il codice pulito richiede ora maggiori sforzi , ma finirà per pagare dividendi in futuro quando dovranno essere affrontati inevitabili bug / modifiche.
Il management deve capire che una breve attività ora ti farà risparmiare diverse attività lunghe in futuro. Non riuscire a pianificare sta pianificando di fallire.
In tal caso, quali sono alcuni argomenti che posso usare per giustificare il fatto che sono stati scritti più LOC?
La mia spiegazione goto è chiedere al management cosa preferirebbero: un'applicazione con una base di codice 100KLOC che può essere sviluppata in tre mesi o una base di codice 50KLOC che può essere sviluppata in sei mesi.
Ovviamente sceglieranno i tempi di sviluppo più brevi, perché alla direzione non interessa KLOC . I manager che si concentrano su KLOC sono microgestione mentre non sono informati su ciò che stanno cercando di gestire.