Come dedicare meno tempo al debug? [chiuso]


15

Seguendo la regola di Pareto, un programmatore trascorre solo il 20% del suo tempo in cose davvero utili.

Dedico l'80% del mio tempo al debug, riparando piccole cose per far funzionare tutto.

C'è un modo per dedicare meno tempo al debug?


9
Non sono sicuro che sia così che interpreterei il principio di Pareto.
c_maker,

6
<meme>
Dai

1
Che cosa in realtà fa durante il debug?

3
devi dedicare più tempo alla tua attenzione ai dettagli

1
C'è molto da guadagnare semplicemente guardando il tuo codice di tanto in tanto. Meglio ancora, scrivi i commenti quando senti l'impulso, quindi sarà più facile notare errori in seguito.
Joey Adams,

Risposte:


5

Codice in Agda o Coq . Una volta compilato il codice, funzionerà. Se è troppo hardcore, scegli una lingua con un sistema di tipo più debole, ad esempio Haskell o F #.

Tuttavia, nella maggior parte dei casi sarai molto più produttivo spendendo il 20% del tuo tempo in programmazione e l'80% in test e debug. Il 100% di una settimana è molto più del 20% di un'ora. Se il debug è ciò di cui hai bisogno per fare le cose, il debug non è una perdita di tempo e non dovresti preoccuparti di "migliorare" questa proporzione.


1
Solo perché qualcosa funziona non significa che non abbia bug. I bug sono spesso il risultato del codice che fa la cosa sbagliata.
HLGEM,

3
@HLGEM, prima di effettuare il downvoting dovresti leggere di più su Agda e Coq. Se il tuo codice viene compilato, è garantito e dimostrato di fare esattamente ciò che dice la sua specifica. Ovviamente può esserci anche un bug nelle specifiche, ma non definirei un "debug" la correzione di questo tipo di problemi.
SK-logic

2
@HLGEM, allora la tua idea di "debug" è abbastanza creativa e lontana dal mainstream. E comunque, con questo approccio una proporzione tra codifica e "debug" sarebbe lontana dal 20/80. Quindi, per favore, mente spiegando il tuo voto negativo.
SK-logic

1
@HLGEM, non era in un elenco di requisiti OP. Non si sa nulla su quanti sviluppatori ci siano, chi è il responsabile, ecc. L'unica domanda era "come misurare il rapporto 20/80" e l'uso di un linguaggio verificato staticamente è chiaramente la risposta più ovvia ad esso. Ma, come ho già detto, questa risposta è applicabile solo in casi molto rari e, in generale, attenersi alla regola 20/80 è un'opzione molto migliore.
SK-logic

1
@ uhbif19 Knuth voleva dire essere umoristico quando lo diceva. Sai cosa intendeva davvero?
Phil,

44

Test unitari.

Dopo aver iniziato ad applicare i test unitari ho scoperto che il codice che ho scritto è diventato meglio strutturato. È stato quindi più facile evitare e individuare i bug. Ho impiegato meno tempo per il debug, ma più tempo con la scrittura di unit test.

Penso anche che il tempo investito nei test unitari abbia un ritorno dell'investimento migliore rispetto al debug. Dopo una sessione di debug ho appena corretto il codice. Lo stesso bug può comparire settimane dopo e devo eseguire nuovamente il debug. Se scrivo un test unitario, il bug viene documentato come test unitario e successivamente funge da test di regressione. Se il bug appare di nuovo, i test unitari me lo rivelano.


Uso i test unitari e sono completamente d'accordo con te. Ma non posso provare tutto.
uhbif19

5
Certo che puoi. Beh, non tutto , ma tutto ciò che conta. Usando interfacce, iniezione di dipendenza, classi / metodi fingendo e beffardo sarai in grado di scrivere test per praticamente tutto il tuo codice.
Fredrik,

8
@Fredrik, non puoi correttamente testare l'unità anche il a + bpezzo di codice (a meno che il tuo test non copra l'intera gamma del tuo tipo di dati aritmetici).
SK-logic

"Dopo una sessione di debug ho appena corretto il codice." -- Veramente? Penso che dopo una sessione di debug ho appena introdotto più bug - semplicemente non so dove siano.
B Sette,

35
  • Test unitari, in modo da sapere se il codice funziona in primo luogo.
  • Almeno un po 'di design iniziale, in modo da sapere cosa stai codificando.
  • Revisioni del codice, perché due teste sono meglio di una e quattro occhi sono meglio di due. Per non parlare del fatto che anche provare a spiegare il tuo codice a qualcun altro rivela molti problemi.
  • Controllo della versione, in modo da poter isolare rapidamente quali modifiche potrebbero aver causato il bug.
  • Rifattorizzare, in modo che il codice non si trasformi in un orribile pasticcio incomprensibile.
  • Leggi "Clean Code" di Robert C. Martin e fai quello che ti dice. Rimarrai stupito dai risultati.

5
Esatto: nessuna singola pratica (ad esempio test unitari) darà un ordine di miglioramento della grandezza, ma una combinazione di pratiche può. In altre parole ... non esiste un proiettile d'argento.
Michael,

Vorrei aggiungere TDD (ove possibile).
Tom,

1
Ordinerei prima il codice pulito e il refactoring. I test unitari sono utili per trovare e correggere i bug in anticipo, ma non ne ridurranno il numero (ridurranno un po 'il tempo, perché correggerai i bug quando avrai tutto nuovo in memoria, ma comunque). Scrivere codice pulito d'altra parte riduce il numero effettivo di bug.
Jan Hudec,

1
@JanHudec Refactoring + codice pulito + test = TDD
Tom

1
@ Tom: Sì, ma le diverse parti di esso hanno effetti diversi. Imparare a scrivere codice pulito ti aiuterà a ridurre i tempi di debug senza alcun test. I test sono lì in modo da poter testare i moduli prima che venga implementato il loro uso e in modo da poter verificare di non aver modificato il comportamento durante il refactoring, necessario per ripulire il vecchio codice disordinato.
Jan Hudec,

8

I test unitari saranno utili se si introducono dei bug che si romperanno prima del codice di produzione - test unitari ben scritti ti diranno anche esattamente cosa si è rotto.

Questo ti porterà per la maggior parte del tempo, ma per il 99,999% dei progetti dovrai ancora eseguire il debug delle cose di volta in volta. La cosa migliore da fare qui che trovo è fare 4 cose:

  1. usa i tipi immutabili ove possibile - se qualcosa ha un valore sbagliato saprai esattamente dove cercare immediatamente (dove viene costruito).
  2. applicare gli invarianti nel codice: se si sa che un valore non è assolutamente consentito, verificarlo e lanciare un'eccezione nei punti di ingresso a metodi e costruttori. Se lo combini con tipi immutabili, puoi anche iniziare a fare alcune ipotesi su ciò che è valido o meno.
  3. assicurati di avere una registrazione adeguata: procedi in anticipo e ti fornirà molte informazioni importanti su quando le cose vanno male. AOP funziona davvero bene qui. La registrazione come ripensamento di solito è un po 'spazzatura: procuratela all'inizio della configurazione del progetto.
  4. se la tua base di codice è abbastanza grande / complessa, evita di usare le primitive, ad esempio usa un tipo chiamato "Age" piuttosto che usare semplicemente un int. All'inizio sembrerà un po 'inutile, ma essere in grado di rintracciare tutti gli usi di qualcosa in un istante è un'enorme vittoria di debug.

6

Il mio 80% è debug. Sto risolvendo semplici bug e sto cercando di far funzionare tutto.

Inizia scrivendo unit test e cerca di avere la massima copertura possibile. Qualcuno ha menzionato TDD, ma andrei con BDD .

Alla fine, molto probabilmente spenderai l'80% per il debug di bug complessi.


6

Come dedicare meno tempo al debug? Scrivi meno codice.

Seriamente, finché scrivi il codice, dovrai eseguirne il debug. I test unitari ecc. Aiutano immensamente, ma non pensare che rimuoverai mai del tutto.


4

Comprendi cosa e perché prima di iniziare a scrivere codice. Quindi utilizzare una metodologia in modo coerente. Quale metodologia scelta non è così importante quanto l'uso ripetuto coerente della metodologia. Se vuoi risultati costantemente buoni, devi fare sempre un buon lavoro e avere un "metodo per la tua follia" è il primo passo per ottenere questi risultati. Man mano che identifichi i problemi, puoi adattare la tua metodologia secondo necessità e nel tempo migliorerai il tuo processo di sviluppo e, auspicabilmente, meno bug e uno sviluppo più nuovo e significativo.


3

Dai una lettura attenta al tuo codice prima ancora di compilarlo. Una lettura molto attenta per sintassi e funzionalità. Può essere sorprendentemente informativo, ed è anche un buon indicatore se una sezione di codice è troppo complicata.


Sono totalmente d'accordo. Leggere il codice immediatamente dopo averlo scritto può rivelare molto rapidamente alcuni bug evidenti, come errori di battitura copia e incolla (che a volte può essere difficile da trovare in seguito).
jirkamat,

3

La maggior parte delle risposte sembra focalizzata su come ridurre il numero di problemi che è necessario eseguire il debug e questo è prezioso. Tuttavia, il debug sarà sempre necessario, quindi è utile cercare modi per accelerare il debug.

  • Sapere come utilizzare il software di controllo della versione.

    • L'uso delle filiali ti aiuterà a separare le aree di sviluppo e sarai in grado di vedere quale area di sviluppo ha il bug e quali no.
    • Scopri come usare la bisection nel tuo VCS, Git ha questo integrato. Se usi un VCS diverso che non ha bisection incorporato, cerca uno strumento che funzioni come git bisect ma per il tuo VCS (so che esiste per SVN e non dovrebbe essere troppo difficile da creare per altri VCS). Questo ti aiuterà a restringere la modifica del codice che ha introdotto il bug, che ti aiuterà a sapere dove puntare il tuo debugger. Questo processo di bisection sarà più veloce se si hanno test per il bug e sapere quale commit contiene la modifica offensiva sarà più utile se si praticano commit atomici.
  • Migliora la tua comprensione del linguaggio di programmazione che usi.

    • Leggi libri, blog e codici sul linguaggio di programmazione.
    • Ogni volta che correggi un bug, assicurati di comprendere a fondo perché il codice non ha funzionato e perché la correzione funziona. Nel tempo imparerai molti gotcha nella tua lingua che ti aiuteranno ad evitare i loro problemi e individuare i loro sintomi nel caso in cui dovessero ripresentarsi.
  • Sii logico

    • Non cambiare più di una cosa alla volta, altrimenti se il comportamento cambia non saprai quale cambiamento ha causato il cambiamento nel comportamento.
    • Verifica i tuoi presupposti.

2

Aggiungendo ai commenti per Unit Testing, ma è davvero buono solo se il codice è stato separato per supportarlo (ad esempio MVC). Se non è possibile implementare MVC (o simile) (progetto legacy), i test unitari non funzionano affatto per l'interfaccia utente. Vorrei quindi aggiungere il test automatico dell'interfaccia utente (Test codificati dell'interfaccia utente Microsoft, WaitN) in quanto ciò ridurrà gli errori in quella parte del codice.

Consiglio vivamente anche l'esecuzione di strumenti di analisi statica (ad esempio FxCop / Microsoft Code Analysis, Resharper, JustCode per il mondo MS). Questi possono trovare tutti i tipi di problemi di codifica comuni che possono ridurre le sciocche attività di debug e concentrarsi maggiormente sul debug della logica aziendale.


2

Fallo funzionare, quindi fallo velocemente, poi rendilo carino. La maggior parte dei bug proviene da ottimizzazioni anticipate o re-factoring su righe di codice che andavano benissimo. Se segui l'orientamento agli oggetti, non ripeterti, mantieniti semplice e fai sempre controlli di integrità degli intervalli di valori, specialmente se i tuoi metodi continueranno a funzionare con vincoli. Non ti aiuterà a fare meno errori, ma probabilmente ti aiuterà a individuare i bug più velocemente e quindi il debug richiede meno tempo.


1
La tua affermazione "La maggior parte dei bug proviene da ..." suona bene, ma hai prove a sostegno di ciò? Penso che sembrerebbe altrettanto convincente se dicessi "la maggior parte dei bug proviene da requisiti poco specificati o dalla mancanza di un design chiaro". È necessario aggiungere un collegamento o una citazione alla ricerca a supporto della propria dichiarazione.
Caleb,

2

Di recente ho riflettuto molto su questo problema: la semplice risposta è leggere The Design of Everyday Things di Don Norman; Scrivi il codice come se dovessi progettare un prodotto.

Per parafrasare, un buon design riduce al minimo l'errore. Ciò significa che alcune cose, la maggior parte delle quali già fai (anche se potresti non sapere esattamente perché ).

-Il nome funziona in modo intuitivo. Questo è formalmente noto come convenienza. Cioè, un pulsante consente di essere premuto, una leva consente di cambiare, una maniglia da tirare, ecc.

-Fai fatica a scrivere codice errato. Controlla l'input errato e genera errori prima o poi, usa le app ungherese quando appropriato, ecc. Queste sono chiamate funzioni di blocco.

-Utilizzare l'astrazione ove appropriato. La memoria a breve termine è debole.

-La documentazione è ovviamente importante, ma è la meno efficace per assicurarsi che il codice sia usato correttamente. In breve, i prodotti ben progettati non richiedono alcuna documentazione. (Il modo più ovvio per vederlo è guardare a cattivi esempi: vale a dire, porte con maniglie che dovresti spingere.)

-Unità test. Questi non impediscono davvero gli errori, tanto quanto rendono ovvio dove si trovano i bug e forniscono buonsenso.

Sono sicuro che mi mancano molti più principi, ma il punto è, leggere sulla progettazione per errori.


1

Il modo migliore per ridurre il debug, IMO, è concentrarsi e rallentare durante la codifica. Questo ti costringe a vedere gli errori che potresti aver fatto!


1

Mentre supporto totalmente i test unitari suggeriti sopra, TDD o BDD saranno di grande valore in quanto è necessario innanzitutto pensare al problema e alla soluzione.

Ma personalmente per me, impiegando qualche minuto solo per sedermi tranquillamente e pensare al problema e come affrontarlo e qualsiasi pro e contro con ogni approccio, fa miracoli per la mia qualità del codice e aiuta a liberare la mia mente dal disordine.

A volte uno scarabocchio veloce su un pezzo di carta ti aiuta a vedere i pezzi collegati più grandi del puzzle.

Scrivo il codice peggiore quando mi tuffo per primo nella testa e premo la tastiera. Un po 'di pensiero e contemplazione fa la differenza.

PS. Voglio dire 5 forse dieci minuti, non ore a scrivere una grande specifica.


1

Alcune buone risposte già, solo un po 'più di cibo per se in aggiunta a ciò che altri hanno detto.

Imparare dai propri errori. Non continuare a fare gli stessi ancora e ancora.

Assicurati di coprire i casi limite durante la programmazione: quelli sono luoghi in cui ci sono spesso bug.

Prestare attenzione al requisito. Anche se funziona ma non fa ciò che il requisito specificato, è un bug.

I registri delle eccezioni possono essere di grande aiuto quando qualcosa va storto tra sei mesi. Avere l'abitudine di registrare le eccezioni.


0

I miei due pensieri principali sono 1) Scrivi un codice migliore che fallirà quando fai qualcosa di inaspettato 2) Diventa migliore al debugging

Il mio codice è disseminato di

if(value!=null) throw new NotImplementedException();
if(obj.v>0) throw new Exception(); //sometimes i dont write NotImplementedException
if(value=="thing") throw ...;

Ogni volta che eseguo quel pezzo di codice viene generata l'eccezione che provoca l'arresto del debugger che mi consente di programmare le nuove funzionalità o evitare le condizioni piuttosto che confondermi su ciò che sta accadendo / avere un bug

Per migliorare il debugging in giro con lo stack di chiamate, i punti di interruzione (con condizioni), la finestra immediata (nota anche come finestra prompt o sostituisci), le variabili "watch" e quant'altro.

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.