Cos'è il codice negativo?


Risposte:


501

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.


257
La perfezione si ottiene, non quando non c'è altro da aggiungere, ma quando non c'è più niente da prendere - Antoine de Saint-Exupéry
systempuntoout,

7
#LOC è una buona misura della qualità del codice? Potrei "minimizzare" qualsiasi codice C o C ++ e ridurre significativamente il conteggio delle righe, ma sarebbe un incubo da mantenere.
JBR Wilkinson,

8
@systempuntout - e poi c'era Einsten "(Una teoria scientifica) dovrebbe essere il più semplice possibile, ma non più semplice"
Jonathan Day

32
Niente funziona più velocemente, è più affidabile o richiede meno manutenzione del codice che non c'è. "In caso di dubbio, scavalo!"
TMN,

4
@JBRWilkinson: direi che esiste un "punto debole" per quanto riguarda la brevità del codice. In generale, è più breve, ma arriva il momento in cui il codice può diventare troppo conciso e non essere facile da decifrare a un altro programmatore.
GordonM,

131

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.


30
Sì, questo è il problema con qualsiasi tipo di metrica. Non appena li usi per giudicare le prestazioni delle persone, inizieranno a giocare i numeri.

5
Qualcuno ha mai usato LOC come metrica delle prestazioni? L'ho visto usato solo per cose come "di quale bug di un progetto stiamo parlando qui?"
Michael Borgwardt,

5
@Michael: si. Sfortunatamente sì.
Michael Petrotta,

4
stiamo parlando dello stesso Bill G. che ha una compagnia che con quella metafora produce 10000 GTON? :)
Daniel Mošmondor,

37
Un programmatore che ha scritto il codice per i computer di bordo dello Space Shuttle mi ha detto che doveva rendere conto del peso del software! Il software era reale (i soldi venivano pagati); era sulla navetta; il peso di tutto ciò che è caricato sulla navetta deve essere registrato. Primo esempio di misurazione della produttività del programmatore in base al peso del codice. (Zero non era permesso, quindi ha specificato 0,00001 grammi e tutto è stato soddisfacente.)
Mark Lutton,

118

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.


10
Altre prove che contare le righe di codice è una metrica molto giocabile :-)

44
Quel programma BASIC è geniale! È piuttosto sconvolgente che l'insegnante abbia squalificato il programma. Dopotutto, le tabelle di ricerca (a cui il programma è in qualche modo simile) si trovano sicuramente nella programmazione del mondo reale.
Noctis Skytower,

6
Un insegnante saggio potrebbe aver accettato questo programma BASIC e averlo usato per evidenziare l'importanza di ottenere un SRS giusto. Mi ricorda un allenatore di baseball che era così frustrato con la sua squadra che per mostrare loro come giocare, ha preso la mazza, ha fatto tre colpi di fila e non essere da meno, ha gridato alla sua squadra "Vedi! È così che bas ***** stanno giocando. Ora prendi la mazza e gioca correttamente! ". Mi ricorda anche la persona che ha scritto "la creazione ha visto il creatore e arrossito" e ha vinto il concorso di saggi sul "vino".
Nav

3
@Nav: mi ricorda una storia simile che inizia allo stesso modo. Quindi l'allenatore lancia una palla in aria, oscilla e manca. Lo lancia di nuovo in aria, dondola e manca. Lo lancia in aria una terza volta, oscilla e manca. Quindi dice alla squadra: "Vedi, È così che dovresti lanciare!" (Non ho idea di cosa potrebbe avere a che fare questa storia con lo sviluppo del software.)
Jay,

13
Sarei piuttosto arrabbiato se fossi squalificato per questo. Un problema deterministico merita una soluzione deterministica, giusto? Quando scrivo un'app 'Hello World' non la scrivo per verificare se sto scrivendo correttamente 'Hello'.
Kirk Broadhurst,

34

È 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.


2
Vedo da dove vieni, ma il codice di ingombro ridotto e facile da capire è raramente realizzato in una volta sola. Solitamente lo scrive in modo che funzioni (molte righe), ottimizzi per la velocità (un po 'meno righe) e ottimizzi per manutenzione / leggibilità (meno righe ancora). Il costo reale con il lungo ritorno dell'investimento è il secondo e il terzo passo, quindi spesso vengono saltati del tutto. È come "c'è economico, veloce e buono - puoi sceglierne due".

2
In realtà, l'IME, l'ottimizzazione per la manutenzione / leggibilità può effettivamente aumentare LOC, poiché riscrivere il codice per renderlo più autocompensante tende anche a renderlo più dettagliato.

1
@Visage: "... a parità di tutte le altre cose".
Ira Baxter,

il punto è, penso, che tutte le altre cose non possono essere uguali tra codice conciso e codice dettagliato.
Tomas Narros,

Il motivo per cui la riga media del codice costa $ N è perché per prima cosa trascorri il tuo tempo a scrivere Xrighe. Quindi, su più iterazioni, riducendo il prodotto finale per Ylinee. Quindi, le (X-Y)linee rimanenti sembrano essere molto costose perché la carneficina del refactoring ha interrotto tutta l'innesto.

27

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.


3
Inoltre, scrivere meno LOC significa che puoi fare meno errori e individuarli facilmente-
LucaB

3
Non è vero per Haskell e altre lingue che possono essere compresse a rumore casuale. :)
Macke,

1
Certo, il mio punto non era "comprimere il codice", ma scrivere algoritmi efficienti che fanno la differenza in meno LOC :) +1 per il tuo commento.
Luca B

9

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.