Esistono noti usi validi di SLOC per misurare la produttività?


54

Ho avuto una conversazione insolita e breve con un architetto molto anziano su linguaggi dinamici e statici. Ha detto che i dati dell'azienda mostrano che ci sono prove per una maggiore produttività quando vengono utilizzati linguaggi statici. Nota, è una grande azienda con una lunga storia. Con mia (e altre) sorpresa, la metrica che ha usato sono state le righe di codice aggiunte.

Ha rapidamente respinto le obiezioni relative alla metrica affermando che all'interno di una stessa azienda, con cultura, linea di business e dati simili, le differenze (rispetto a situazioni e capacità uniche degli individui) si fondono abbastanza in modo che la metrica SLOC sia utile per confrontare la produttività di strumenti e lingue.

Anche se non credo che questa affermazione sia supportata da una rigorosa analisi statistica, ci sono alcune prove nel settore che potrebbero supportare questa linea di pensiero?


25
Produttività è il termine sbagliato. Tale termine è definito come la quantità di lavoro svolto in un periodo di tempo, che non è correlato al codice prodotto.
Frank Hileman,

25
Una persona saggia ha detto che dovremmo considerare le righe di codice non come "costruite" ma come "spese"; nell'ingegneria fisica se consideriamo il conteggio delle parti e la lunghezza della DBA, minore è meglio.
pjc50,

23
Il confronto tra lingue diverse (non importa se statiche o dinamiche) sconfigge il presupposto di "all'interno di una stessa azienda, con cultura, linea di business simili": le differenze nelle lingue rendono insensati i confronti di SLOC.
rapina il

4
Questo metodo è tragicamente imperfetto. Anche due sviluppatori diversi nella stessa azienda che utilizzano lo stesso ambiente di sviluppo producono spesso SLOC drasticamente diversi per implementare lo stesso set di funzionalità.
17 del 26

8
L'uso di SLOC per misurare la produttività ha lo stesso senso dell'utilizzo dell'inquinamento emesso per misurare la distanza percorsa quando ciò di cui si dovrebbe preoccupare è l'efficienza del carburante. I modi in cui questo è giusto sono ancora sbagliati. Utilizzare questo .
candied_orange,

Risposte:


65

L'argomento dell'architetto senior potrebbe significare due cose.

  1. Può significare che uno sviluppatore medio dell'azienda produce più righe di codice quando utilizza linguaggi statici rispetto a quelli dinamici. Ad esempio, se quindici sviluppatori lavorano con Java per sei mesi, scriveranno 100 KLOC e se gli stessi quindici sviluppatori lavorano con Python per sei mesi, scriveranno solo 50 KLOC.

    Non vi è alcuna correlazione tra LOC e produttività qui. Cosa succede se ci vogliono quattro volte più righe di codice in Java per produrre la stessa funzionalità rispetto a Python? Se ciò è vero, l'uso di Python comporterebbe un doppio della produttività, in base alle metriche KLOC sopra.

  2. Può anche significare che uno sviluppatore medio nell'azienda produce meno righe di codice quando usa linguaggi statici rispetto a quando ne usano uno dinamico: quindici sviluppatori scriveranno in sei mesi 100 KLOC in Java o 200 KLOC in Python.

    Mentre di solito è meglio meno righe di codice (meno codice da scrivere, leggere e mantenere), non è ancora chiaro quante funzioni abbiano prodotto gli sviluppatori Java rispetto a quelle di Python. Forse hanno scritto mezze righe di codice rispetto agli sviluppatori Python, ma hanno anche prodotto la metà del numero di funzionalità?

In entrambi i casi, LOC non è una metrica preziosa, poiché la stessa funzionalità non si tradurrebbe nella stessa quantità di righe di codice in lingue diverse . Alcune lingue tendono ad essere più dettagliate; altri: più compatti. Mentre in alcuni casi la compattezza è preziosa, non esiste una regola generale per questo. Un esempio estremo sarebbe il linguaggio Brainfuck che ha un'estrema compattezza, ma che non è popolare per la sua leggibilità. Confrontare anche lingue simili potrebbe essere complicato: ad esempio, quando si tratta di parentesi graffe, Java segue lo stile K&R, mentre in C #, la parentesi graffa di apertura è sulla propria linea nella maggior parte dei casi quando si segue lo stile ufficiale, che porta a un artificiale aumento dei LOC per C #. E cosa succede quando si confronta un linguaggio procedurale con un linguaggio orientato agli oggetti o con un linguaggio funzionale?

Invece di utilizzare una metrica soggetta a errori, l'architetto senior potrebbe fare affidamento su un gruppo di metriche che misurano la produttività se utilizzate insieme: il numero di funzionalità sviluppate al mese, il numero di bug introdotti nella base di codice e il tempo impiegato per risolverli , l'evoluzione del debito tecnico, ecc. Questo confronto potrebbe essere complicato all'inizio, dal momento che si deve tener conto della non familiarità della squadra con la nuova lingua. Una volta che il team ne avrà abbastanza familiarità, la scelta dovrebbe basarsi su metriche stabili, nonché nella maggior parte delle preferenze dei membri del team stesso.

LOC ha un valore in alcune situazioni ristrette. Ad esempio, potrebbe fornire un suggerimento sulla dimensione del progetto e su parti del progetto (e in media si correla con i punti funzione, pur essendo spesso più facile da misurare), oppure potrebbe indicare i metodi e le classi che potrebbero richiedere ulteriore attenzione perché delle loro grandi dimensioni. Tuttavia, LOC dovrebbe essere usato con cura, poiché è usato troppo spesso da persone che immaginano una correlazione tra cose non correlate. L'uso più umanamente disastroso dei LOC è stato in passato il tentativo di misurare la produttività di un singolo sviluppatore in base ai LOC scritti al mese.


8
Sì. L'unica metrica di cui mi fido è il numero di ticket (funzionalità, bug, ricerca ecc.) Completati per unità di tempo. Varia a seconda della squadra (i diversi team suddividono i biglietti con una granularità diversa) ma all'interno della stessa squadra o gruppo di squadre emergerà una cultura per rendere le dimensioni dei biglietti abbastanza accurate (purché non le si paragonino al di fuori di quella cultura)
slebetman,

10
La cosa che mi piace di più: "Non fare affidamento su una sola metrica"
Chococroc,

30
@slebetman Sono geloso della precisione / coerenza della persona che crea i tuoi biglietti, ma devo risolvere i problemi che vanno da "Correggi la scrittura di 2 parole" a "Aggiungi funzione X". La metrica dei biglietti mi è persino meno utile di LOC. Il codice di classe ridotto di 20 LOC mi dà almeno un'idea del lavoro svolto. Risolvere 5 biglietti può essere un'ora di lavoro, ma potrebbe anche essere una settimana.
R. Schmitz,

3
@ R.Schmitz Questo è lo stesso per la mia compagnia, ma ogni biglietto ha anche una dimensione associata, quindi la somma delle dimensioni dei biglietti funzionerebbe.
Nico Burns,

1
Anche provare a usare queste metriche ha problemi. Cosa succede se le funzionalità aggiunte sono complesse e difficili da implementare? Oppure potrebbe anche essere una situazione in cui funzionalità specifiche sono particolarmente facili o difficili da implementare per una lingua, ma in generale la lingua è più facile / difficile da usare. La mancanza di produttività potrebbe anche essere dovuta al fatto che i dipendenti attuali non hanno familiarità con una lingua all'inizio. Uno non dovrebbe fare affidamento principalmente sulle metriche per determinare quale lingua usare.
John Smith,

26

A proposito di produttività e SLOC

Il problema con SLOC

Il problema con la metrica SLOC è che misura un'approssimazione della quantità di codice scritto, senza tener conto di:

  • la qualità del codice (ovvero se per ogni 100 SLOC dovessi aggiungere altri 90 SLOC a causa di bug, ma che non conosci al momento della consegna del tuo codice?)
  • gli obiettivi raggiunti con il codice (ovvero lo SLOC 10K gestisce tutti i casi d'uso previsti o le storie degli utenti? o solo un piccolo sottoinsieme?)
  • la manutenibilità del codice (ovvero dovrete aggiungere l'1% o il 50% in più di codice per adeguare il codice a prevedibili requisiti in evoluzione?).

In caso contrario, la produzione di un codice spaghetti non mantenibile soggetto a errori con molte parti incollate sarà considerata più produttiva del codice riutilizzabile attentamente progettato.

Quindi SLOC non è sicuramente il modo migliore per misurare la produttività.

Quale produttività stiamo considerando?

La produttività è misurata per un processo. Quindi SLOC potrebbe essere un indicatore perfettamente valido per il solo processo di codifica.

Se, ad esempio, fraintendete i requisiti scadenti, spendete cinque mesi per produrre il software, mostratelo all'utente, scoprite che è assolutamente sbagliato e impiegate altri 5 mesi per riscriverlo da zero, avreste la stessa produttività in SLOC / mese, che una squadra che scrive il codice alla prima volta, ad esempio perché ha utilizzato un processo agile che riduce i malintesi attraverso frequenti feed-back. Questa apparente uguale produttività nasconde enormi problemi.

Pertanto, la misurazione della produttività dello sviluppo software deve tenere conto dell'intero processo, compresa l'analisi dei requisiti, la progettazione di cosa codificare, la codifica, i test, il debug e la verifica del rispetto delle aspettative degli utenti. Poiché tutte queste attività sono molto diverse, la cosa migliore è misurare l'unica cosa che conta: software funzionante, ovvero cosa significa il software prodotto per l'utente .

Come misurare i prodotti software?

Esistono diversi approcci:

  • L'approccio tipico nell'ingegneria del software classico è Function Points (FP). I punti funzione vengono misurati in base ai requisiti da soddisfare (ad es. Numero di moduli, numero di campi in ciascun modulo, ecc ...). La produttività viene quindi misurata in FP per unità di tempo e per persona. Alcune aziende hanno persino dati che indicano quanti punti funzione uno sviluppatore può produrre per unità di tempo in una determinata lingua per un determinato dominio. Il problema con FP è che richiede requisiti molto dettagliati e richiede tempo.
  • Un approccio più moderno e pragmatico è lo story points (SP). Questi vengono utilizzati per valutare la complessità del codice da produrre e vengono abitualmente utilizzati per valutare la velocità dei team di sviluppo. Tuttavia, SP è una misura di stima per il lavoro svolto prima che tutti i dettagli siano noti. Non è una misura finale di ciò che è realmente accaduto. Pertanto, è necessario prestare attenzione quando lo si utilizza come misura di produttività perché potrebbe ritorcersi contro il processo di stima .

Informazioni sulla produttività della digitazione statica o dinamica

Devo confessare che sono personalmente un fan dei linguaggi tipicamente statici, perché nel mio io interiore so che è più affidabile (anni di programmazione mi hanno dimostrato che).

Quindi una cosa che prendo per certo è che il linguaggio tipizzato staticamente è in grado di prevenire molti più errori / bug in fase di compilazione (ad esempio errori di battitura, mancata corrispondenza nei tipi previsti, ecc ...) rispetto ai linguaggi non tipizzati staticamente. Ma in tutta l'obiettività, non oserei generalizzare abusivamente questo come una maggiore produttività.

Il tuo architetto ha ragione?

Forse sì forse no.

Ma i suoi argomenti non sembrano validi: l'aumento di produttività del linguaggio tipizzato staticamente deriva da un numero significativo di errori che vengono colti in anticipo dal compilatore.

Di conseguenza, non è possibile scoprire questo "maggiore" aumento di produttività osservando SLOC da solo senza esaminare la rilavorazione richiesta per i linguaggi tipizzati dinamicamente. Quindi il suo confronto non può essere giusto.

Nemmeno l'argomento di circostanze comparabili. Alcune lingue tipizzate dinamicamente consentono alcuni costrutti di livello superiore che richiedono meno codice rispetto a fare lo stesso in una delle classiche lingue tipizzate staticamente. Quindi potresti aver bisogno di meno tempo, scrivere meno codice, ma aggiungere lo stesso overhead di analisi, test e verifica. Quindi misurare la produttività da parte della SLOC diluirebbe i potenziali guadagni di produttività, creando così un pregiudizio contro il linguaggio tipizzato in modo dinamico.

Qualche studio a supporto di tale affermazione?

Esistono numerosi studi accademici recenti sull'argomento. Sebbene alcuni di essi vedano un vantaggio della digitazione statica, è generalmente limitato a uno scopo specifico (documentazione, riutilizzo di codice o API scarsamente documentati, ecc.). La formulazione prudente viene anche utilizzata perché i moderni IDE hanno ridotto significativamente i rischi legati alla tipizzazione dinamica:


3
I tuoi punti critici erano già stati affrontati nella domanda: " all'interno di una stessa azienda, con cultura, linea di business e dati simili, differenze (quanto a situazioni e capacità uniche degli individui) si fondono in modo tale da rendere utile la metrica SLOC ". Cioè l'argomento era che su questa scala, tutte le basi di codice sarebbero di qualità comparabile. Sebbene personalmente, dubito fortemente che sia vero.
amon,

Usiamo gitprime ( gitprime.com ) per misure concrete e una delle cose che fa è tenere traccia di quante volte uno sviluppatore riscrive le stesse righe di codice. Quindi, se scrivi del codice, ricevi una segnalazione di bug e riscrivi il codice, in realtà misura la tua efficienza e segnala la tua produttività netta. In breve, non penso che i tuoi commenti siano problemi inerenti all'uso di SLoC come misura della produttività. Piuttosto, penso che le tue lamentele riguardino sistemi che non misurano SLoC "correttamente".
Conor Mancone,

8
@ConorMancone Nessuno viene pagato per scrivere il codice. Vengono pagati per creare soluzioni. Un'analogia sarebbe misurare un falegname in base al numero di chiodi e assi che usa. Un clown che taglia le tavole in corto e piega più chiodi che porta a casa sarà più produttivo di un maestro falegname con questa metrica.
JimmyJames,

1
@Christophe Ho sperimentato la misurazione dei risultati finali per la produzione come principale parametro di produttività. L'unica parte difficile è che alcune cose potrebbero essere più impegnative di altre, ma da quello che posso dire, nel tempo, le cose tendono a un rendimento abbastanza (statisticamente) coerente in base alle dimensioni e alla composizione del team. Certo, molte cose vanno in questo, quindi l'attribuzione può essere una sfida, ma è l'ancora per qualsiasi altra misurazione della produttività dello sviluppo.
JimmyJames,

2
Anni fa, in almeno un negozio di programmazione alcune persone scrivevano diagrammi logici e altre persone convertivano quei diagrammi logici in codice compilabile. In sostanza, il compilatore di quel negozio aveva pre-processori umani. Sarebbe giusto usare SLoC / mese per misurare la produttività di uno di quei preprocessori umani; è analogo a quante viti un lavoratore in una catena di montaggio può installare nei fori in cui gli ingegneri hanno detto che dovrebbero andare. L'ingegnere che specifica 100 viti quando 15 sono ciò che il lavoro richiede sta riducendo la produttività dell'azienda. (Allo stesso modo se specificano 5 viti!)
David K,

7

Ecco un controesempio per il tuo architetto senior: Supponiamo che io voglia scrivere una gerarchia di tre classi, due delle quali derivano dalla terza, implementando alcune funzioni virtuali definite dalla classe base.

Se scrivo queste tre classi in C ++, è piuttosto semplice. Dichiaro le lezioni, uso virtuale nei posti corretti e finisco.

Se scrivo queste tre classi in C, dovrò aggiungere un po 'di codice: ho bisogno di definire structs per le v-table, ho bisogno di aggiungere un puntatore v-table alla classe base, devo aggiungere codice ai costruttori per impostare effettivamente i puntatori v-table, ho bisogno di aggiungere codice ai costruttori per chiamare effettivamente il costruttore della classe base, ho bisogno di aggiungere il codice per eseguire l'allocazione della memoria esplicitamente prima di chiamare un costruttore (cosa che C ++ newfa in un solo passaggio ), allo stesso modo, devo separare la distruzione dalla free()chiamata successiva , e così via, e così via.

Il punto è che tutte queste cose aggiuntive sono piuttosto insensate. Posso farli molto rapidamente. Quindi, non ci vorrà molto più tempo per scrivere la versione C di quanto sia necessario per scrivere la versione C ++. Tuttavia, ho prodotto molte più righe di codice C rispetto al codice C ++. Tanto che sembrerò essere stato più produttivo in C in termini di SLOC.

Qualsiasi lingua che richieda una certa quantità di codice del bollettino apparirà più produttiva in termini di SLOC di una lingua che non richiede la stessa quantità di codice del bollettino.

Vedete, l'argomento SLOC è così fondamentalmente imperfetto, che in realtà lo vedrei al contrario: prenderei l'affermazione "i programmatori tendono a produrre più SLOC in linguaggi statici" per dire: "i linguaggi statici sembrano richiedere di più codice del boilerplate e quindi ridurre la produttività ".


1
Mi piace la tua ultima frase.
Peter - Ripristina Monica il

1
"I linguaggi statici sembrano richiedere più codice sulla caldaia e quindi ridurre la produttività": questo dimostra ancora una volta che la metrica SLOC è difettosa. Il numero finale di righe non considera (1) quante volte è necessario riscrivere il codice prima di ottenere la soluzione finale (2) quante righe di codice aggiuntive sotto forma di unit test sono richieste (le lingue tipizzate dinamicamente richiedono in media più test unitari per avere una fiducia comparabile nella correttezza del codice di produzione). La metrica SLOC è decisamente imperfetta.
Giorgio,

6

Sarò il contrarian.

Tracciamo SLoC nel nostro lavoro (anche se non lo usiamo direttamente nelle decisioni del personale) e ho avuto persone che discutono di ciò che la maggior parte delle persone dice nelle loro risposte. In effetti, "LoC non ha importanza perché la tecnologia X ci consente di fare di più con meno codice" o "Gli sviluppatori migliori scrivono meglio, codice più breve e quindi non scrivono più di chiunque altro". Nella mia esperienza (anche se non ho numeri concreti per sostenere queste cose), queste obiezioni semplicemente non sono corrette. Ai miei tempi ho visto una chiara correlazione sia nella velocità che nella qualità della produzione di codice per i nostri sviluppatori, se confrontata con tutte le altre misurazioni significative della loro "competenza" complessiva come ingegnere. Per fornire alcuni contro-esempi al tipo di argomenti fatti sopra:

  1. Sì, alcune lingue possono fare di più con meno codice. In effetti, abbiamo creato un intero framework che "automatizza" gran parte dello sviluppo per i nostri particolari problemi aziendali (solo back-end). Il risultato di tutto ciò non è che le persone scrivono meno codice, ma semplicemente che abbiamo più tempo per scrivere codice. Di conseguenza, nella nostra azienda, il tasso complessivo di scrittura del codice è abbastanza costante tra le tecnologie e dipende principalmente dal livello di competenza dell'ingegnere.
  2. L'idea che uno sviluppatore migliore produrrà meno codice perché sta scrivendo in modo più intelligente non è assolutamente vera. Sì, un programma meglio progettato potrebbe occupare meno righe di codice. Tuttavia, ho scoperto personalmente che gli sviluppatori "migliori" che scrivono codice più efficiente non impiegano più tempo a pianificarlo di quanto uno sviluppatore più giovane scriva cose a lungo. Di conseguenza, lo sviluppatore più senior eseguirà le attività di codifica più rapidamente e passerà a scrivere codice diverso allo stesso ritmo elevato.

Quella parte lat è il mio riassunto generale, BTW. Quello che ho scoperto è che, indipendentemente dallo stack tecnologico o dal tipo di progetto, la maggior parte degli sviluppatori ha il proprio ritmo, che è il ritmo a cui operano. Se una lingua ha molte funzionalità che rendono più efficace il codice degli sviluppatori, questo è un grande vantaggio per l'azienda, ma ciò non significa che scriveranno meno codice di conseguenza. Al contrario, ottengono le funzionalità più rapidamente e passano rapidamente al nuovo codice. Ancora una volta, il risultato finale è che valutano il modo in cui codificano dipende principalmente dalla loro abilità e meno dal loro stack tecnologico. In effetti, per questo motivo, mi aspetto generalmente che lo stack tecnologico faccia più differenza sulla velocità con cui i biglietti e le funzionalità vengono sviluppati rispetto alla velocità con cui le persone codificano.

Detto questo, né il tasso di scrittura del codice né il tasso di chiusura dei biglietti sono una misura perfetta della produttività, motivo per cui non prendiamo direttamente decisioni sul personale sulla base di SLoC. Invece fa parte del processo e le valutazioni dei dipendenti vengono eseguite utilizzando il maggior numero possibile di punti dati. Direi però che il tuo architetto non è certamente pazzo.

Un'eccezione

L'unica eccezione con cui sono d'accordo è la possibilità del codice targa caldaia. Se c'è un sacco di copia e incolla in corso da una classe (o qualsiasi altra) a un'altra per metterlo in funzione, allora questo ovviamente distorcerà le metriche. Ciò vale anche se si dispone di strumenti in grado di generare automaticamente grandi quantità di codice. Tuttavia, penso che queste saranno spesso l'eccezione piuttosto che la regola. Se i tuoi sviluppatori impiegano un po 'di tempo a copiare il codice della piastra della caldaia per iniziare, stai utilizzando il set tecnologico errato. Se in realtà stanno scrivendo il codice, anche se è abbastanza ripetitivo, allora mi aspetto che questo distorca qualsiasi misura solo una piccola quantità: quando scriviamo il codice, il più delle volte siamo limitati da quanto velocemente possiamo pensare attraverso il problema piuttosto di quanto velocemente possiamo digitare. Anche quando si scrive codice relativamente ripetitivo,

Ovviamente, tutto quanto sopra si basa sulla mia esperienza personale. Il tuo chilometraggio può variare e ovviamente sono in minoranza. Sentiti libero di non essere d'accordo. In sintesi però:

Trovo che il tasso di codifica dipenda più da quanto velocemente puoi pensare attraverso i tuoi problemi che da qualsiasi altra cosa. Di conseguenza, ho scoperto che la velocità di codifica è una misura decente della produttività, anche tra i set tecnologici, con solo alcune possibili eccezioni.


4
C'è anche un'altra eccezione: la caccia ai bug. La ricerca di bug per bug particolarmente cattivi può richiedere molto tempo, ma di solito comporta una singola riga di modifica del codice.
Nathan Merrill,

@NathanMerrill Questo è un buon punto, anche se meno rilevante per l'OP: il debug è il debug in tutte le lingue e (al di sopra della mia testa), non vedo alcun motivo per cui sarebbe sostanzialmente più facile o più difficile da un tecstack all'altro. Detto questo, questo è un motivo per cui, nel complesso, non si può giudicare la produttività esclusivamente in base al codice scritto, più di quanto si possa fare con qualsiasi altra metrica.
Conor Mancone,

Usiamo gitprime ( gitprime.com ) nella nostra azienda, e sia come manager che come ingegnere, penso che sia la cosa migliore del mondo. Ancora una volta, è solo una parte del quadro per noi, ma è stato estremamente utile per identificare potenziali problemi con gli ingegneri molto prima che ci fosse un vero problema. La trasparenza è eccezionale e tutto ciò che fanno alla fine si riduce a SLoC. Data la quantità di valore e intuizione che aggiunge, sono sempre molto dubbioso sulla tendenza di alcuni ingegneri a scartare di mano SLoC. Chiunque è il benvenuto alla loro opinione, ma sicuramente funziona
Conor Mancone,

La domanda è se LoC può essere utilizzato per confrontare strumenti e lingue, nel contesto dello sviluppatore senior che afferma che mostra una maggiore produttività nei linguaggi "statici". Sembra che tu stia rispondendo a una domanda diversa: LoC può essere utilizzato per confrontare gli sviluppatori, ma sei ancora d'accordo sul fatto che non può essere utilizzato per confrontare le lingue perché un determinato sviluppatore scrive lo stesso numero di LoC indipendentemente dallo strumento / lingua? Dici di essere contrario alle altre risposte qui, ma sembra che tu sia d'accordo?
TessellatingHeckler,

Come sviluppatore mi viene in mente molte volte ho preso un sacco di codice non DRY e lo ho sostituito con un piccolo set di funzionalità riutilizzabili. Ho quindi aggiunto una quantità significativa di nuove funzionalità. Ridurre la quantità di codice mentre si aggiunge un multiplo di valore reale è una buona cosa nel mio libro. Nella mia esperienza, i migliori ingegneri scrivono il minor numero di righe di codice e il peggio scrive di più.
JimmyJames,

6

Anche se sto saltando sul carrozzone. Penso che l'impatto sul comportamento dei programmatori debba essere evidenziato.

L'uso di SLOC come misura di produttività ha un effetto tossico sul morale del programmatore. Nel momento in cui un ingegnere del tuo team / azienda si rende conto che sono misurati su SLOC accadono diverse cose:

  1. Iniziano a scrivere codice molto più lungo per fare la stessa funzione
  2. si preoccuperanno meno della qualità del loro codice
  3. smetteranno di fare altre cose che aiutano la tua squadra (reclutamento, debug, aiuto ai giovani)
  4. odieranno il loro lavoro e probabilmente se ne andranno

Non posso sottolineare abbastanza quanto sia corrosivo ingegnerizzare il morale poiché l'ho visto accadere due volte in 2 diverse aziende. Qualunque sia il caso d'uso apparentemente valido che hai per esso, sostengo che è improbabile che valga la pena l'impatto sul tuo team / azienda anche se c'è solo una piccola possibilità che il suo utilizzo venga scoperto. Anche se in alcuni casi esiste forse una correlazione tra il numero di righe scritte e la quantità di funzioni utili, incoraggia tutti i comportamenti sbagliati nei programmatori e invia il messaggio la qualità non è importante.


In effetti ... qualsiasi metrica che disincentiva qualcuno dalla rimozione del codice ridondante ("hai avuto una metrica SLoC negativa questa settimana!" È sbagliata, assolutamente sbagliata!
Andrew

1

Non è generalmente considerato un modo valido per misurare la produttività. Un codice più piccolo di solito è meglio di un codice più grande, quindi uno sviluppatore più produttivo di solito produce meno codice. La produttività ha il suo maggior successo nel debug; gli sviluppatori efficienti impiegano poco tempo per il debug.

I linguaggi tipizzati staticamente sono più produttivi (se si controllano tutte le altre differenze tra le lingue), perché se usati con saggezza, riducono i tempi di debug, rilevando errori nella fase di compilazione, dove sono più veloci da correggere.


1
Questo potrebbe essere un punto valido se si confrontasse la produttività dei singoli sviluppatori. La domanda riguarda tuttavia il confronto tra le lingue, quindi il contesto è molto diverso. Ciò significa, ad esempio, che un codice più piccolo non è migliore o peggiore di un codice più grande; confronta LOC del codice scritto in Brainfuck con il codice scritto, diciamo, in Ruby.
Arseni Mourzenko,

1
@ArseniMourzenko A parte le battute come Brainfuck, i linguaggi ben progettati vengono effettivamente confrontati sulla base della quantità di codice necessaria per risolvere un'attività. Di solito un simile confronto si chiama espressività. È vero però, stavo parlando di LOC all'interno di una sola lingua, non attraverso le lingue. La produttività è generalmente definita come il tempo necessario per eseguire un'attività; questo non è specifico per la programmazione.
Frank Hileman,

0

L'unica metrica che è possibile utilizzare per confrontare la produttività degli sviluppatori tra le lingue è una metrica che non confronta il codice tra le lingue. Alcune lingue sono notoriamente dettagliate (COBOL per la vittoria legacy), e altri richiedono diversi passaggi per fare qualcosa che puoi fare in una riga di codice (assembly vs. praticamente tutto il resto). Anche se si confrontano solo le righe di codice attive (ovvero non si contano le dichiarazioni e si contano solo i codici che comportano qualche azione) è comunque possibile distorcere i risultati.

Potresti essere in grado di argomentare in merito ai tassi di variazione. Vale a dire righe di codice aggiunte, confrontando l'inclinazione della produttività nello stesso periodo di tempo. Tuttavia, ciò non tiene conto delle modifiche negative nelle righe di codice. Ad esempio, erediti un progetto che ha il codice copia e incolla ovunque. Esegui alcuni refactoring facili e veloci per ridurre il numero di blocchi di codice ripetuti - per definizione hai una pendenza negativa.

In tutta serietà, confrontare la produttività di squadre / lingue non ha senso perché ci sono così tanti fattori aggiuntivi che influenzano la produttività di una squadra che non è possibile trarne conclusioni significative.

Ho lavorato a un progetto in cui l'infrastruttura era molto fragile e gli strumenti erano obsoleti. Il progetto è stato creato su Java con un'app a pagina singola inserita su di esso, ma ospitato in un contenitore portlet senza alcun vantaggio apparente. Il tempo impiegato per fare anche semplici cambiamenti è stato ridicolmente lungo. Se dovessi basare tutte le tue conclusioni su quel particolare progetto, potresti concludere che Java era cattivo o che le app a pagina singola erano cattive. Né sono vere. Il sistema che il brutto progetto avrebbe dovuto sostituire era costruito su C # e WebForms. Quando abbiamo sviluppato il caso aziendale per estendere l'applicazione esistente per gestire le esigenze dei clienti, la nostra produttività è salita alle stelle. Ciò significa che un'app WebForms strettamente accoppiata è superiore? Puoi solo trarre una conclusione per questo caso particolaree non si estende al mondo in generale. E ha senso solo perché esisteva un'applicazione esistente con maturità sufficiente da estendere.

Anche il confronto delle percentuali di risoluzione degli elementi nel sistema di tracciamento dei problemi è errato nel senso che si stanno confrontando infrastrutture di progetto complete tra loro. Le librerie e i framework utilizzati possono accelerare o rallentare i progressi. Potresti essere nella fase di avvio con un'inerzia molto piccola da superare, in cui il progetto in cui sei "migliore" si trova in una fase di manutenzione in cui il numero di nuovi biglietti è relativamente basso. Non si tratta mai di confrontare cose simili.

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.