Il numero medio di bug per località è lo stesso per diversi linguaggi di programmazione? [chiuso]


45

Mi è stato detto che il numero medio di bug / difetti per riga di codice è "costante" per diversi linguaggi di programmazione. 10 KLOC di Ruby avrebbero lo stesso numero di bug di 10 KLOC di c ++. L'argomento è di solito usato per promuovere l'uso di linguaggi espressivi (pensa a pitone / ruby ​​su c ++ / assembly) poiché il numero di righe per descrivere la stessa funzionalità sarebbe inferiore.

Qualcuno sa da dove viene questa affermazione? Le lingue di livello superiore portano a un minor numero di bug?


11
Sembra irragionevole considerando che alcune lingue incoraggiano uno stile che racchiude più istruzioni in una singola riga rispetto ad altre.
Caleb,

10
Bug / LOC è una metrica molto sbagliata per tutto. Dipende dalla lingua, ma dipende molto di più dal programmatore, scrivendolo. Quindi prendere la media per la lingua non ha senso, poiché le grandi fluttuazioni sono nell'altra variabile. Questo è solo IMO, spesso.
K.Steff,

3
Posso dirti che il numero di bug / linea che scrivo in Perl sarà molto maggiore del numero che scrivo in C. Un mio amico è un mago Perl, e per lui il bug / linea è molto maggiore in C che in Perl. Difficile vedere come questa metrica possa essere utile.
Caleb,


2
Ho appena incontrato questa domanda. Non ho il più nebuloso perché fosse chiuso; questa è una domanda perfetta per questo sito Per un grande progetto, i bug per KLOC non sono una misura di quanto siano bravi i programmatori. È una misura di quanto siano buoni l'organizzazione e il processo.
David Hammen,

Risposte:


43

Contrariamente all'intuizione, il numero di errori per 1000 righe sembra essere relativamente costante, senza controllo della lingua specifica in questione. Steve McConnell , autore di Code Complete e Software Stimation: Demystifying the Black Art analizza in dettaglio quest'area.

Non ho le mie copie prontamente a portata di mano - sono seduti sulla mia libreria al lavoro - ma un rapido Google ha trovato una citazione pertinente:

Media del settore: "circa 15-50 errori per 1000 righe di codice consegnato".
(Steve) afferma inoltre che questo è solitamente rappresentativo del codice che ha un certo livello di programmazione strutturata dietro di esso, ma probabilmente include un mix di tecniche di codifica.

Citato da Code Complete , trovato qui: http://mayerdan.com/ruby/2012/11/11/bugs-per-line-of-code-ratio/

Se la memoria funziona correttamente, Steve entra in una discussione approfondita di ciò, dimostrando che le cifre sono costanti tra le lingue (C, C ++, Java, Assembly e così via) e nonostante le difficoltà (come la definizione del significato di "linea di codice").

Soprattutto ha molte citazioni per le sue fonti - non offre opinioni prive di fondamento, ma ha i riferimenti per sostenerle.

Sembra ridursi a questo: il numero medio di difetti per kloc sembra essere più una proprietà del fatto che gli sviluppatori sono umani fallibili che dei vantaggi o svantaggi peculiari di un particolare linguaggio o piattaforma.

(A parte: se non hai già il codice completo, vai a comprarti una copia e leggilo attentamente - vale la pena l'investimento.)

Aggiornamento : c'è un altro fattore in gioco con alcune delle risposte qui: le statistiche su larga scala sono utili per fare previsioni generali ma non specifiche. Considera, le tabelle sulla mortalità della popolazione possono prevedere quante persone saranno uccise negli incidenti stradali quest'anno ma non possono dirti quali persone moriranno. Allo stesso modo, le statistiche del settore che mostrano un numero relativamente costante di difetti per kloc non possono essere utilizzate per prevedere quanto bene - o quanto male - un determinato sviluppatore eseguirà o cosa accadrà in un determinato progetto.


4
Non esiste una copia della stima del software, ma nel codice completo McConnel cita il rapporto 1977 "Qualità del programma e produttività del programmatore" di Capers Jones come fonte di una tabella di errori per LOC per dimensione del progetto. Il punto che McConnel cerca di evidenziare è che gli errori aumentano notevolmente all'aumentare delle dimensioni del progetto e osserva che i dati sono solo uno "scatto del settore" e che "i numeri possono avere poca somiglianza con quelli dei progetti su cui hai lavorato ". Non vedo davvero nulla che abbia qualcosa a che fare con questa domanda.
Roc Martí,

Quale edizione di Code Complete hai @ RocMartí? So che la seconda edizione è stata un importante aggiornamento. Dovrà scavarlo e vedere cosa dice quando arrivo a lavoro lunedì.
Bevan,

Penso che la tua modifica ( Aggiornamento:) sia il nocciolo del problema. Oppure, come diceva Mark Twain, ci sono tre tipi di bugie: Lies, Damn Lies e Statistics.
GalacticCowboy,

1
@ RocMartí "Gli errori aumentano notevolmente all'aumentare delle dimensioni del progetto" Ha anche sottolineato che l'acqua è bagnata? Naturalmente ci sono errori quando le cose si complicano. Perché ogni nuovo cambiamento deve tenere presente ogni possibile pezzo che potrebbe essere interessato. Che cresce man mano che il progetto cresce.
Colpo di Parthian del

3
La citazione è sbagliata o obsoleta. Nella seconda edizione, è a pagina 521: "L'esperienza media del settore è di circa 1 - 25 errori per 1000 righe di codice per il software consegnato. Il software è stato generalmente sviluppato utilizzando un miscuglio di tecniche."
Aryeh Leib Taurog,

18

L'affermazione è - nella migliore delle ipotesi - ingenua.

SLOC non è esattamente una metrica affidabile per qualcosa di utile, tranne forse confrontando la dimensione di due o più progetti. Inoltre ci sono due tipi distinti di SLOC, LOC fisico e LOC logico, e quelli potrebbero differire in modo significativo. Considera questo esempio, da Wikipedia :

for (i = 0; i < 100; i += 1) printf("hello"); 

Qui abbiamo un LOC fisico, ma due logici ( fore printfistruzioni). Ma potremmo ovviamente scrivere l'esempio come:

for (i = 0; i < 100; i += 1) 
  printf("hello"); 

Il che ci darebbe due LOC fisici e due LOC logici. Penso che sia chiaro che qualsiasi misura di "bug per loc" che dipenderebbe da LOC fisici sarebbe contaminata dallo stile di programmazione, quindi la nostra misurazione sarebbe in gran parte inutile.

Se, d'altra parte, andassimo con LOC logici, allora la nostra misurazione dipenderebbe fortemente dalle idiosincrasie sintattiche della lingua. Sebbene la metrica risultante possa essere un po 'utile quando si confrontano progetti scritti nella stessa lingua, sarebbe abbastanza inutile per progetti scritti in lingue diverse.

Una possibile fonte per l'affermazione sono i fallimenti, le follie e gli errori del software di Les Hatton :

Possiamo concludere che la scelta del linguaggio di programmazione è nella migliore delle ipotesi debolmente correlata all'affidabilità.

Successivamente, l'articolo menziona densità di difetto simili per C e C ++:

In uno studio recente che ha confrontato due sistemi simili di dimensioni simili (circa 50.000 linee ciascuno), uno in C e uno in C ++ progettato per oggetti, le densità di difetto risultanti sono state mostrate intorno allo stesso rispettivamente a 2,4 e 2,9 per 1000 linee.

Ciò, tuttavia, non significa che "bug per LOC" sia costante nei linguaggi di programmazione o che sarebbe significativo se lo fosse.


Se supponi che i bug / istruzione siano costanti, allora c'è una differenza per le lingue. L'esempio C ha comunemente dei bug negli argomenti for () e printf (). Se dovessi codificare completamente la funzionalità printf avresti proporzionalmente più bug e se avessi una lingua di livello superiore con una sola chiamata printRepeat () ci sarebbero meno opportunità di sbagliarla.
Martin Beckett,

2
Riepilogo: i bug per istruzione / punto funzione sono costanti, le lingue di basso livello hanno più codice scritto dal programmatore fallibile, le lingue di alto livello si digitano meno, quindi meno bug. Sebbene i bug del tipo di progettazione totalmente errati siano probabilmente gli stessi!
Martin Beckett,

2
Per non parlare del fatto che ciò che costituisce "un bug" è altamente soggettivo e che i bug differiscono selvaggiamente in gravità, impatto e importanza.
martedì

@tdammers E quell'importanza può essere negativa. Abbiamo una manciata di bug a cui il cliente è abituato / si aspetta / desidera, quindi non possiamo risolverli ...
Izkata,

@Izkata: dipende dalla tua definizione di bug ...
tdammers

12

Questa osservazione è molto antica e proviene da una fonte molto venerabile, vale a dire Fred Brooks nel suo libro "The Mythical Man Month". Era un top manager di IBM e gestiva numerosi progetti di programmazione tra cui il sistema operativo Milions-of-line OS / 360. In effetti ha riferito che il numero di bug in un programma non è proporzionale alla lunghezza del codice, ma quadratico ! Secondo le sue ricerche, il numero di bug era proporzionale alla lunghezza del programma rispetto alla potenza 1.5. In altre parole, un programma che è dieci volte più lungo ha 30 volte più bug. E ha riferito che questo valeva per tutti i linguaggi di programmazione e livelli di linguaggi di programmazione.


6

Non trovo che i bug per LOC siano costanti per una determinata lingua. I bug per LOC sembrano una metrica che alcuni manager usano per determinare la qualità degli sviluppatori quando si tratta di rivedere i tempi.

Ora al di fuori di questo, alcune lingue sono più inclini a errori o difetti di altre. Di solito, ma non sempre questo è un linguaggio di livello inferiore rispetto a un linguaggio di livello superiore. Ad esempio la codifica in C contro C # (o Java.) Dico di solito perché la realtà di esso e il punto cruciale della risposta che stai cercando si riduce alla qualità dello sviluppatore e alle pratiche di codifica in atto. Ho visto ottimi sviluppatori C con una qualità del codice molto più alta e un numero di difetti inferiore rispetto agli sviluppatori Java / C # medi. Questo è un elemento che separa uno sviluppatore senior da uno junior. Non quanti LOC scrivono in un determinato intervallo di tempo, ma la qualità del codice la scrive indipendentemente dalla lingua, LOC o intervallo di tempo.

L'unica cosa che posso dare che potrebbe essere correlata è che più LOC ci sono, più è probabile che ci sia un difetto e più difetti esistano.


La mia domanda riguarda il numero medio di difetti per riga di codice indipendentemente dalla lingua.
Kristian,

4
@Kristian non esiste un numero simile. Cambia per persona in relazione al lavoro e all'esperienza dello sviluppatore e alla lingua in cui codificano. Non credo che ci sia una media universale.
Akira71,

1
@ Akira71 "non esiste un numero simile" Beh, certo. Ma ci sono distribuzioni di probabilità, da cui è possibile estrarre numeri. Non c'è nemmeno un numero per quanti pollici di pioggia cadono ogni anno nella foresta pluviale amazzonica, ma puoi prendere una media.
Colpo di Parthian del

3

Bug per riga di codice

Bugs / LOC è relativo solo a un individuo. Per le aziende che implementano strumenti di tracciamento dei bug che si collegano al loro repository di codice sorgente. È possibile per un manager organizzare i problemi per sviluppatore, ordinati per problemi passati e modifiche al codice.

I bug sono relativi al tuo lavoro

Uno sviluppatore di software senior, di grande esperienza, altamente qualificato, molto intelligente e in grado di svolgere lavori indipendenti ha molte più probabilità di avere più bug registrati in un sistema di tracciamento, quindi uno sviluppatore junior con poca esperienza.

Come è possibile?

Gli sviluppatori senior sono spesso impegnati in attività di sviluppo a rischio più elevato. Refactoring del codice e costruzione di nuovi sistemi come esempio. Gli sviluppatori junior sono spesso assegnati a risolvere problemi noti che non valgono il tempo di uno sviluppatore senior.

Pertanto, per assegnazione di compiti un junior non introduce bug ma li corregge, e uno sviluppatore senior ha il rischio di introdurli, perché il vantaggio di ciò che stanno cercando di archiviare è più importante dei problemi minori che vengono sollevati completando quelli compiti.

La sintassi della lingua è importante

L'argomento secondo cui una lingua introduce meno bug, perché può ottenere di più in meno righe di codice è un mito completo. Linguaggi altamente strutturati come C ++ / C # / Java costringono lo sviluppatore a esprimere chiaramente per iscritto ciò che dovrebbe essere l'istruzione desiderata, laddove linguaggi come Python / PHP non sono molto strutturati. Tali lingue consentono espressioni scritte che non solo confondono uno sviluppatore, ma anche il parser di lingua.

Il compilatore riduce i bug

Quanti bug in Python / PHP sono arrivati ​​ai server di produzione, perché non c'era un compilatore per avvisare lo sviluppatore che qualcosa non era corretto. Quando si misurano i bug per LOC, prima o dopo che un compilatore ha elaborato il codice sorgente?

Aggiornamento 2019:

I compilatori non fanno alcuna differenza sulla natura o sul numero di bug. I bug sono puramente relativi alla persona che ha scritto il codice sorgente e i bug stessi possono essere di natura molto soggettiva.


3
Re compilatore che riduce i bug: sia Python che PHP hanno tecnicamente compilatori, semplicemente non fanno lo stesso controllo che fanno i linguaggi tipizzati staticamente. Inoltre, non concordo sul fatto che tale controllo abbia un effetto significativo sul conteggio dei bug finali poiché praticamente tutti gli errori che possono essere rilevati da un compilatore vengono colti con test minimi.
Winston Ewert,

3
Concordato che i bug che potrebbero essere catturati dal compilatore saranno generalmente colti da test ragionevoli automatizzati o manuali. La differenza è che i linguaggi tipizzati staticamente ti danno il primo passaggio di test (a) gratuitamente e (b) molto, molto rapidamente. Una buona suite di test di unità Ruby è migliore di un compilatore, ma di solito non è possibile eseguirli così velocemente, non li si ottiene gratuitamente e normalmente non puntano quasi altrettanto vicino alla riga di codice che è il problema.
Ken Smith,

I tipi statici @KenSmith non sono gratuiti. corsi.cs.washington.edu/courses/cse590n/10au/…
Hugo Wood

1

FWIW, nella mia esperienza

  1. Esistono due tipi di bug: a) in cui il programma non soddisfa le aspettative eb) in cui il programma non può soddisfare alcuna ragionevole aspettativa, poiché si blocca / si blocca / non viene compilato.

  2. Indipendentemente dalla lingua, i bug di tipo (b) sono causati dalla ridondanza nella struttura di dati / classe, in cui la modifica di qualcosa in una parte della struttura di dati pone la struttura in uno stato incoerente / rotto fino a quando una o più modifiche corrispondenti vengono apportate in altre parti . Contribuire a ciò è la ridondanza del codice sorgente, in cui una modifica a una riga di codice rende il codice errato fino a quando non vengono apportate una o più modifiche in altre parti. Questi due tipi di ridondanza sono strettamente correlati, ovviamente, e poiché i programmatori non sono super-persone si distraggono, dimenticano le cose e commettono errori, mettendo così in errore.

Queste cose (di nuovo, nella mia esperienza) non sono realmente una funzione della lingua, ma dell'abilità / maturità del programmatore. I programmi che sono molto meno soggetti a bug tendono anche ad essere molto più piccoli, in termini di LOC, per un determinato set di funzionalità.

Ho visto sistemi in cui alcune persone scrivono programmi, mentre altri scrivono directory e i primi tendono a "funzionare" rispetto al secondo.


1

Mi aspetto che un fattore chiave negli errori di codifica si riferisca a quello che chiamo "gap semantico" tra un particolare tipo di definizione della soluzione e il codice per risolverlo - dove questi sono errori di riformulazione ravvicinati sarebbe più evidente, dove il codice è molto diverso, ci si possono aspettare molti errori. Il paradigma di alcune lingue corrisponde strettamente a determinati domini problematici: i fogli di calcolo sono molto appropriati per i calcoli aziendali di tutti i giorni, con il risultato che sia il pochissimo "codice" che il "codice" sono molto vicini al dominio problematico. Il codice previsto è sia molto conciso (poco KLOC) sia pochi errori. Al contrario, l'utilizzo dell'assemblatore richiederebbe molti KLOC ed è probabile che produca un numero immenso di errori.


come è stato downvoted? SO sta diventando pieno di clown
codyc4321

0

Invece di parlare di righe di codice - che sono davvero una metrica inutile - vorrei affrontare questa parte della tua domanda:

Le lingue di livello superiore portano a un minor numero di bug?

Questo è diverso dai bug / LOC, perché le lingue di livello superiore fanno di più con meno codice. L'implementazione di alcuni requisiti di funzionalità potrebbe richiedere 500 righe di LISP contro 15000 righe di assembly x86.

Quindi, anche se i bug / LOC sono costanti tra tutte le lingue, la lingua di livello superiore produrrà ancora meno bug.


2
Righe di codice una "metrica inutile"? No, è una approssimazione approssimativa della complessità del programma. Può essere utile perché è facile da misurare ed è anche strettamente correlato ai tempi di sviluppo.
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.