Stavo leggendo l'articolo di Wikipedia su Douglas McIlroy e ho trovato una citazione che menziona
"Il vero eroe della programmazione è colui che scrive codice negativo".
Cosa significa?
Stavo leggendo l'articolo di Wikipedia su Douglas McIlroy e ho trovato una citazione che menziona
"Il vero eroe della programmazione è colui che scrive codice negativo".
Cosa significa?
Risposte:
Significa ridurre le righe di codice, rimuovendo le ridondanze o usando costrutti più concisi.
Vedi ad esempio questo famoso aneddoto del team di sviluppatori originale di Apple Lisa:
Quando il team di Lisa stava spingendo per finalizzare il loro software nel 1982, i project manager hanno iniziato a richiedere ai programmatori di inviare moduli settimanali che riportavano il numero di righe di codice che avevano scritto. Bill Atkinson pensava che fosse sciocco. Per la settimana in cui aveva riscritto le routine di calcolo della regione di QuickDraw per essere sei volte più veloce e 2000 linee più brevi, ha inserito "-2000" nel modulo. Dopo alcune settimane i gestori hanno smesso di chiedergli di compilare il modulo e lui ha accettato volentieri.
C'è una citazione di Bill Gates sulla falsariga di misurare la produttività del programmatore per linee di codice è come misurare il progresso della costruzione di aeromobili in base al peso.
Vorrei aggiungere che la metrica LOC ha incoraggiato l'uso di linguaggi eccessivamente prolissi e ha deliberatamente reinventato la ruota per raggiungere la quota.
Quando ero al liceo - e sì, avevamo i computer negli anni '70, anche se dovevamo farli uscire dalle pelli degli animali usando i coltelli di pietra - uno degli insegnanti di matematica ha lanciato un contest di programmazione. Le regole erano che il programma vincente sarebbe stato quello che produceva l'output corretto e che aveva il più piccolo prodotto di righe di tempo di esecuzione del codice. Cioè, se il tuo programma ha preso, diciamo 100 righe di codice e ha funzionato per 5 secondi, il tuo punteggio era 500. Se qualcun altro ha scritto 90 righe di codice e ha funzionato per 6 secondi, il suo punteggio era 540. Il punteggio più basso vince, come il golf.
Mi è sembrato un sistema di punteggio brillante, che ha premiato sia la concisione che la prestazione.
Ma la voce che tecnicamente soddisfaceva i criteri vincenti è stata squalificata. Il problema era stampare un elenco di tutti i numeri primi inferiori a 100. La voce squalificata è andata in questo modo (la maggior parte degli studenti utilizzava BASIC allora):
100 print "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,"
110 print "67, 71, 73, 79, 83, 87, 89, 91, 97"
Lo studente che ha scritto quella voce ha sottolineato che non solo era breve e molto efficiente, ma l'algoritmo dovrebbe essere ovvio per chiunque abbia anche una minima conoscenza della programmazione, rendendo il programma altamente mantenibile.
È ironico. Se ti costa $ N per linea codificata media, allora la codifica di "linee negative" è sicuramente vincente.
Ciò significa che, come consiglio pratico, quel piccolo codice che compie il lavoro, è molto meglio del grande codice che fa la stessa cosa, a parità di altre condizioni.
X
righe. Quindi, su più iterazioni, riducendo il prodotto finale per Y
linee. Quindi, le (X-Y)
linee rimanenti sembrano essere molto costose perché la carneficina del refactoring ha interrotto tutta l'innesto.
Scrivere lo stesso programma con meno codice è un obiettivo per tutti.
Se un programma impiegava 200 LOC per codificare e lo scrivo in 150, scrivevo -50 LOC. Quindi ho scritto un codice negativo.
La risposta di Thilo è probabilmente storicamente più accurata, ma la metafora del "codice negativo" può anche includere prestazioni e uso della memoria - sforzi gratificanti per rinviare l'esecuzione o l'allocazione di qualcosa fino a quando non è effettivamente necessario.
Questa mentalità "procrastinazione paga" ha prodotto assiomi ironici come "Non fare nulla è sempre più veloce che fare qualcosa", "Il codice più veloce è il codice che non viene mai eseguito" e "Se riesci a rimandarlo abbastanza a lungo, potresti non doverlo mai fare "(riferendosi al differimento di operazioni costose fino a quando effettivamente richiesto)
Una tecnica per la realizzazione di codice negativo è quella di contestare ipotesi iniziali e definizioni del problema. Se riesci a ridefinire il dominio del problema / input in modo tale che "problema appiccicoso n. 3" sia categoricamente impossibile, non devi dedicare tempo o codice ad affrontare il problema appiccicoso n. 3. Hai eliminato il codice ottimizzando il design.