Come migliorare la capacità di eseguire il debug del codice esistente [chiuso]


Risposte:


32

Non dare per scontato nulla

Spesso è allettante dire semplicemente "oh, so cosa sta facendo questo codice, va bene". Non farlo. Metti alla prova ogni ipotesi e passa in rassegna tutto con attenzione.


2
+1. Assolutamente. Preparati a stupirti di come alcune cose, pensavi di sapere, ti giocheranno.
aufather,

funziona per me :)
setzamora,

3
Il debug del codice degli altri è un enorme spreco di tempo, un killer della produttività, ma è così. L'unica volta in cui ha davvero senso correggere i bug degli altri è quando se ne sono andati. Cosa odio Odio Odio sta attraversando un codice oggettivamente scadente da parte di un programmatore senior, quindi devo fare una domanda per fare progressi tempestivi e ottenere una lezione su come migliorare le mie abilità nell'apprendimento della base di codice esistente. A differenza dello studio della madre natura, risolvere i problemi causati dall'uomo non è affatto divertente. Almeno ho la mia risposta. La situazione inversa non accadrà, perché sto solo meglio e lascio meno bug.
Giobbe

1
@Job: ... ok? Intendevi lasciare questo commento sul post, forse? :)
Adam Lear

Questo! È sciocco fidarsi ciecamente di qualsiasi piccola parte del codice se si esegue il debug di uno strano problema e il codice sembra a posto.
Dan,

7

Test in modo incrementale .

Approfondisci prima il codice e testalo dal modulo più piccolo che si sposta gradualmente verso l'alto, in questo modo non sei troppo stressato cercando di capire dove potrebbe essere esattamente il problema.

Significa anche che influenza meno codice alla volta poiché ti stai spostando in modo incrementale ... come a volte ho avuto problemi in cui ho risolto qualcosa e che porta a rompere molte altre cose. Rendo merito al mio capo per questo mentre mi ha insegnato questo quando ho fatto un casino.


4

Dividere e conquistare è un buon approccio. Prova a identificare alcuni input visibili (input utente / evento di rete ...) e output (registro, output per l'utente, messaggio di rete in uscita ...) tra cui esiste il problema. Prova a mettere stampe in blocchi considerevoli o punti significativi tra loro e cerca di restringere la posizione del bug nel codice.

Divide and conquer può anche funzionare molto bene in caso di regressioni rispetto al codice controllato dalla versione. Trova due build: una dove funziona come previsto, l'altra con la regressione. Riduci il divario fino a quando non rimani con un mucchio di check-in come potenziali sospetti.


4

Invece di tagliare il bug binario, scrivi i test nel modulo

  • Dato...
  • Quando...
  • Aspettarsi...

Per verificare ciò che effettivamente sai essere vero sul funzionamento dell'app rispetto a ciò che ritieni essere vero.

La maggior parte degli IDE semplifica l'estrazione di metodi e la generazione di stub di test xUnit. Usalo.

Perché non cospargere i debug? Perché dopo aver finito, probabilmente dovrai annullare gran parte di tale lavoro ed eliminare una buona quantità di tali debug. Quando scrivi i test, il tuo debug ti aiuterà nella prevenzione e nel rilevamento di futuri bug.


2

Continua il debug. Se esegui il debug molto, migliorerai.


Il debugging assoluto è nell'arte in sé, in particolare il debug del codice di altre persone.
Gratzy,

2

Come altri hanno già detto, non dare per scontato nulla. Ciò è particolarmente vero se hai scritto il suo codice. Quando esegui il debug di altri codici, è più probabile che rallenti perché il codice è nuovo per te o non ti fidi del programmatore. Quando esegui il debug del tuo codice è troppo facile presumere che tu l'abbia scritto correttamente, rallenta!

Per l'effettivo processo di debug:

  • Scrivi unit test se non esistono già.
  • Aggiungi la registrazione appropriata se non esiste già.
  • Quindi utilizzare il debug.

Aggiunta dei test unitari e registrazione prima più efficiente dell'utilizzo del debugger. Hai anche il vantaggio di avere i test unitari per non introdurre bug futuri e la registrazione aiuterà le sessioni di debug in futuro.


1

Prima di scavalcare un piccolo pezzo di codice, vedi se riesci a determinare con precisione il risultato. Questo tende a volare di fronte a non dare per scontato nulla (che ho votato a proposito BTW) ma man mano che acquisisci esperienza, può aiutare a restringere il punto in cui cercare.

Questo può sembrare banale, ma impara le sfumature del tuo debugger e impara i tasti di scelta rapida. A volte i debugger possono essere abbastanza lenti che la tua mente si chiede quando passi. Se riesci a tenere il passo con la macchina e non stai scherzando, questo può aiutare.

Se è possibile modificare il codice durante il debug:

  • considerare di affermare le condizioni pre e post. A volte è quindi possibile scavalcare, anziché inserire il codice.
  • se affermazioni con espressioni complicate, considera qualcosa (alcuni potrebbero disapprovarlo ma funziona per me)

piace:

bool isLessThan5 = a < 5;
bool isGreaterThan10 = a > 10;
if ( isLessThan5 || isGreaterThan10 )
{
   // more code here
}

invece di:

if ( a < 5 || a > 10 )
{
   // more code here
}

Per i casi non è possibile eseguire il debug di tutto, per qualsiasi motivo, imparare a "paperella di gomma" con un collega. A volte l'atto di spiegare fa luce. (ok, forse questo non è esattamente nel tema delle domande, ma penso che sia abbastanza vicino da giustificare la menzione)


1
La denominazione delle sottocondizioni richiede un passo in più, vale a dire il refactoring dei nomi quando scopri a cosa serve la condizione. Potrebbe rivelarsi if (tooCloseToHydrant || overTheBrink) { quando imparerai di più in seguito.

1

Due cose, basate sul passare la maggior parte degli ultimi 22 anni a mantenere il codice scritto da altre persone.

Comprendi i tipi di bug che tendi a scrivere.

Ad esempio, sono un programmatore molto meticoloso, quindi una volta compilato il mio codice, di solito è privo di bug banali. Quindi i miei bug tendono ad essere strane cose complicate come i deadlock dei thread. Il rovescio della medaglia, ho un amico che scrive principalmente bug banali - punti e virgola alla fine di C ++ per i loop, quindi la riga successiva viene eseguita solo una volta, quel genere di cose.

Non dare per scontato che altre persone scrivano gli stessi tipi di bug che fai.

Non so quante volte ho perso tempo a estrarre le grandi pistole di debug, supponendo che un bug fosse il mio tipo di cosa strana davvero sottile, solo per avere il mio amico guardarmi alle spalle e dire "Hai notato quel qualcosa in più punto e virgola?" Dopo anni di questo, per prima cosa vado a cercare il frutto banale e basso quando guardo il codice di altre persone.


Riformatta il codice per vedere se qualcosa si muove?

@ Thorbjørn: se ho preso la proprietà del codice, a volte lo faccio per migliorare la leggibilità, ma non per trovare errori di battitura. Idea interessante!
Bob Murphy,

non devi impegnarlo, vedi solo cosa succede. Consiglio vivamente di applicare una politica che richieda la riformattazione del codice - preferibilmente automaticamente - al momento del check-in.

@ Thorbjørn: mi piacerebbe farlo. Cosa mi consiglia come "prettificatore" di codice? Lavoro principalmente su Linux e Mac.
Bob Murphy,

Uso Eclipse disponibile in entrambi i posti e l'editor Java ha una cosiddetta azione Salva in cui è possibile specificare cosa dovrebbe accadere ogni volta che il file viene salvato. Qui una delle opzioni è la formattazione della fonte. Siamo una piccola squadra, quindi non ho studiato di più al riguardo. Team più esperti consentono hook pre-commit nei sistemi di controllo del codice sorgente, consentendo il rifiuto di un commit del codice sorgente se formattato in modo errato. Molto efficiente.

1

Conosci i tuoi strumenti. Ad esempio, il debugger di Visual Studio ha una fantastica funzionalità chiamata TracePoints che sono come punti di interruzione ma invece di interrompere il codice inserisce invece un'istruzione trace nell'output di debug.

Si consiglia vivamente di leggere libri o seguire un corso su come utilizzare il debugger. Ho preso un paio di lezioni e ho letto alcuni libri di John Robbins che hanno fatto una grande differenza nella mia efficacia come debugger.


0

Comprendi funzionalmente cosa sta cercando di fare il codice. Se non conosci il quadro completo (tutti i casi di test che questo codice deve superare) è difficile eseguire correttamente il debug senza introdurre nuovi bug


0

Scrivi unit test automatici e altri tipi di integrazione e test funzionali.

Più test automatici hai, meno tempo devi dedicare a un debugger.

Inoltre, un buon design: principi SOLIDI. Se stai scrivendo classi piccole e mirate e preferisci la composizione rispetto all'eredità, eliminando la duplicazione, ecc., Il tuo codice sarà sempre più facile da eseguire il debug.

Trovo che un codice ben progettato produca una serie diversa di bug che codifica che non è ben progettato. In generale, un codice ben progettato produce bug che sono più facili da trovare, riprodurre e correggere.

L'eccezione (e ce n'è sempre una) è il codice multithreading :-)


0

Se l'hai ridotto a una piccola area, ma non riesci ancora a individuare l'errore, prova l'opzione "Visualizza codice + assembly" del tuo debugger. Conoscendo abbastanza ASM per dire "qui dovrebbe esserci un ramo" o "perché sta solo copiando la parola bassa?" spesso individuerà l'errore di codifica.


0

Dai un'occhiata al prezioso libro Perché i programmi falliscono: una guida al debug sistematico , di Andreas Zeller. Ti introdurrà a molte tecniche, teorie e strumenti, alcuni dei quali all'avanguardia della ricerca.

Le diapositive per il libro sono disponibili online, ma trovo che il libro stesso sia più facile da leggere.

Il libro ti aiuterà a iniziare e ti farà pensare in modo più scientifico al debug, ma non è un sostituto per la pratica. Potrebbe essere necessario scrivere e eseguire il debug per 10 anni prima di vedere un miglioramento delle prestazioni in ordine di grandezza. Ricordo ancora di aver lasciato a bocca aperta Sun vedendo gli sviluppatori senior, che hanno programmato per Unix per 30 anni, a trovare oscuri bug di multithreading o paralleli in pochi minuti. L'esperienza conta!


Il loro software automatizzato sembra molto interessante.
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.