I veri programmatori usano i debugger? [chiuso]


15

Se i programmatori esperti utilizzano effettivamente i debugger e, in tal caso, in quali circostanze. Anche se nella risposta a questa domanda ho detto "mesi" fa probabilmente intendevo "anni" - in realtà non uso un debugger. Quindi la mia specifica domanda di risposta è in quali circostanze, come programmatore esperto, useresti un debugger?


14
È come chiedere se programmatori esperti stiano usando la tastiera ... Non capisco quale esperienza abbia a che fare con essa - pensi che siano dei e crei un codice perfettamente funzionante senza errori dall'inizio? E anche in questo caso cosa significa per te - smetterai di usare il debugeer quando ne avrai bisogno e star dicendo: "Non uso il debugger, quindi sono un programmatore reaa" ... :) BTW. Dubito che qualsiasi professionista risponderà a tale domanda ...

3
@Wooble: la domanda di base "i programmatori esperti usano i debugger" è buona. In realtà mi ha sorpreso di aver scatenato una mini guerra santa.
Kevin,

19
I veri programmatori, ovviamente, usano le farfalle
Rein Henrichs,

4
La maggior parte dei debugger esistenti sono vecchio stile, hanno interfacce scadenti e richiedono al programmatore di conoscere e comprendere concetti e paradigmi che sono difficili da padroneggiare e, al giorno d'oggi, non è giusto aspettarsi che la maggior parte dei programmatori utilizzi o sappia. Di conseguenza, i programmatori più moderni ed esperti, fanno di tutto per apprendere le competenze necessarie per scrivere il tipo di codice che raramente deve mai essere eseguito il debug in un debugger, per evitare il dolore dell'esperienza. Quindi "sì, lo usano" e "il meno possibile"
blueberryfields

7
Programmatori esperti che "non usano i debugger" probabilmente pensano in termini di gdb / SoftICE e non hanno mai usato un debugger integrato (e probabilmente non usano un IDE per quella materia). Sono così indietro rispetto ai tempi che è doloroso.
BlueRaja - Danny Pflughoeft

Risposte:


44

Direi che non usare un debugger è un segno di inesperienza. Scorrere il codice riga per riga è il modo migliore per tracciare il flusso di esecuzione.


30
strano quindi che dopo oltre 30 anni di programmazione in assemblatore, fortran, C, C ++ ecc. ecc. non ho voglia di usarne uno.

59
Fare qualcosa per molto tempo non ti rende necessariamente bravo.
Ceejayoz,

31
Non essere in grado di utilizzare un debugger è un segno di inesperienza. Comprendere il flusso di un programma semplicemente leggendo il codice non lo è. Naturalmente, i programmatori esperti avranno bisogno del debugger di tanto in tanto, ma se riesci a leggere il codice, non è necessario e non renderà il processo di debug più veloce.
GolezTrol,

10
@Karl Bielefeldt: Vorrei nominare un paio di famosi esempi di programmatori che non usano i debugger per il debug. Linus Torvalds, autore di Linux. Larry Wall, autore di Perl. Software abbastanza complesso per te?
btilly

9
@Neil: quanto tempo impieghi a lavorare sul tuo codice e quanto a mantenere il codice scritto da altre persone? E in particolare, quanto codice di mantenimento scritto da altre persone che non avrebbero mai dovuto essere autorizzato vicino a un linguaggio di programmazione?
Carson63000,

28

Uso spesso il debugger, perché lavoro su un sistema di grandi dimensioni e quindi faccio schifo. http://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html

Non importa quanto sia breve e letto frequentemente il tuo codice, ci sarà sempre la possibilità che abbia dei bug. http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

Errare è umano e non si può mai dimostrare che un programma sia corretto, quindi perché non usare strumenti come debugger / test automatizzati per aiutarci in questa difficile attività?

Se il codice è abbastanza corto, eseguiranno test semplici. Inoltre, se è breve e conosci la natura del bug, la lettura del codice può essere sufficiente. Tuttavia, una volta che la base di codice è ampia, coinvolge diverse lingue mescolate insieme, più 3 livelli, allora devi semplicemente avere una buona copertura del test su molti livelli più un ottimo debugger - altrimenti perderai molto tempo.

Quindi, quando non ho bisogno di un debugger?

Non sono il programmatore più intelligente, né il più esperto, ma comunque, a volte non ho bisogno di usare il debugger. Questo è quando:

  • Il codice è mio o ben scritto AND
  • È scritto in una lingua leggibile E
  • Il progetto complessivo è di piccole dimensioni.

Quando faccio molto affidamento su un debugger?

  • Risposta breve: spesso .
  • Quando un'applicazione si arresta in modo anomalo. Soprattutto quando viene distribuito. Avere VS2010 installato su quel computer può fare la differenza tra "Errore sconosciuto" e FileNotFoundException.
  • Quando una libreria di terze parti si arresta in modo anomalo o si comporta in modo anomalo.
  • Quando il codice è scritto male. Soprattutto se lo stesso file è stato toccato da 10 persone diverse negli ultimi 10 anni, 7 dei quali non sono più con l'azienda.
  • Quando il progetto è grande
  • Quando il codice è piuttosto monolitico.
  • Quando sono coinvolti più livelli (GUI, SQL, BL).

Si noti che "debugger" può fare riferimento a più di uno strumento. Uso anche il debugger di Visual Studio, il debugger SQL (principalmente per i proc memorizzati) e il profiler SQL (per capire quale SP viene chiamato). Avrei bisogno di strumenti di questo calibro che stavo scrivendo un veloce script Python di sysadmin? No. Se avessi creato il mio piccolo strumento basato sulla GUI? Dipende. Se è .Net WinForms - probabilmente no. Se è WPF - sì.

Cosa definisce comunque un programmatore "reale"? Uno che è veloce? esperto? È bravo negli algoritmi? Scrive una buona documentazione? Proprio quando si laurea esattamente in questo nuovo titolo? Quando si attraversa la linea magica?

Direi che un programmatore che non si è sporcato le mani in uno sforzo di oltre 100 anni uomo non ha avuto la possibilità di essere umiliato dalla complessità e dai propri limiti (oltre che frustrato dalla qualità del codice).

Personalmente cerco di utilizzare il miglior debugger disponibile per me e tendo a usarlo spesso. Se un'attività è abbastanza semplice e non richiede un debugger, allora non la utilizzo. Non ci vuole troppo tempo per capire se ne ho bisogno o no.

...

Ora, in teoria, ho potuto leggere la base di codice per così tanto tempo, che avrei capito. Tuttavia, l'approccio pratico funziona meglio, inoltre spesso voglio riscrivere quello stupido codice che sto vedendo. Purtroppo mi occorrerebbero più di 10 anni per ripulire la base di codice in cui mi trovo. Quindi, usare il debugger è un ovvio primo passo. Solo quando scopro quale di 5 milioni di righe di codice sta funzionando, eseguo la scansione del file su e giù per cercare di capire cosa sta facendo quella classe.


+1, risposta eccellente, concordo in particolare con l'aspetto "quando ci sono più livelli coinvolti", quello che viene raramente menzionato dai sostenitori di "basta leggere il codice e trovare l'errore".
Carson63000,

Sono contento che tu abbia potuto leggere tutto.
Giobbe

+1 per un'ottima risposta e per esaminare la definizione di "vero programmatore". L'uso di questa frase ha reso l'OP sleale, interessante e potenzialmente infiammatoria (a causa di implicazioni denigratorie o insinuazioni).
Smandoli,

1
"non si può mai dimostrare che un programma è corretto" Non è vero.
GManNickG,

1
@GMan, ti preghiamo di approfondire la tua dichiarazione. Come ho appreso, molti precedenti tentativi di dimostrare la correttezza di brevi frammenti di codice per una lingua specifica sono falliti, ad esempio diversi bug sono stati trovati dopo che la prova è stata completata (da un professore specializzato in tali prove). Alcuni programmi molto banali potrebbero essere dimostrati corretti, suppongo. Sono curioso di scoprire il tuo angolo qui.
Giobbe

17

"Non mi piacciono i debugger. Mai, probabilmente non lo farò mai." - Linus Torvalds

D'altra parte, non ha un account Stack Overflow, quindi non sono sicuro che tu sia interessato alla sua opinione :)


3
Non molti di noi sono Linus Torvalds, per il resto di noi semplici umani abbiamo bisogno del debugger.
Nodey The Node Guy,

7
i kernel non si appoggiano bene ai debugger.

7
Sì, la programmazione del kernel è un campo diverso rispetto alla programmazione dello spazio utente. In genere non sono d'accordo con le opinioni di Linus per lo spazio utente, ma sono sicuramente rispettabili quando si tratta di kernelspace.
alternativa

16
"Non mi piacciono i debugger" non significa "Non uso i debugger". Quello che Linus ha effettivamente detto è "Non mi piacciono i debugger. Mai, probabilmente non lo farò mai. Uso sempre gdb, ma tendo a usarlo non come debugger, ma come disassemblatore di steroidi che puoi programmare." (So ​​che alcuni proveranno a distorcerlo per significare che Linus non usa un debugger, ma non è accurato.)
Kristopher Johnson,

6
Sembra Linus Torvalds e non sono mai d'accordo su niente.
BlueRaja - Danny Pflughoeft

12

Quindi la mia specifica domanda di risposta è in quali circostanze , come programmatore esperto, useresti un debugger?

  • Quando non riesci a "eseguire il debug" leggendo il tuo codice.
  • Quando non sei in grado di prevedere quali valori hanno determinate variabili in un determinato momento.
  • Quando il tuo modello mentale del tuo codice non si adatta all'output dato dal tuo codice

Modificare:

Ho avuto la fortuna / la sfortuna di non sapere come usare un debugger nel mio viaggio di programmazione. Quindi in passato sono stato costretto a eseguire il debug senza un debugger. Tuttavia, dopo aver imparato a usare un debugger -> Sono diventato 100 volte più produttivo nella ricerca di bug.


+1 per "Quando il tuo modello mentale del tuo codice non si adatta all'output dato dal tuo codice"
utente

8

Dare una prospettiva leggermente diversa dalle risposte attuali; Come ingegnere del software incorporato che lavora su sistemi che spesso hanno un componente in tempo reale, uso raramente un debugger.

A volte un debugger può essere uno strumento straordinario e ogni volta che sono in grado di creare ed eseguire il codice su un desktop, utilizzerei sempre un debugger.

Su chip, con vincoli in tempo reale, c'è un pesante onere associato al tentativo di utilizzare un debugger. Non appena si interrompe l'esecuzione, è probabile che si rovini, possibilmente fatalmente, i tempi del resto del sistema. Generalmente su chip, printf in codice non critico e IO in un codice critico nel tempo sono lo strumento migliore e in realtà più semplice. Non è buono come un debugger, ma è molto più economico iniziare a lavorare con un sistema reale.


1
potresti voler investigare su schede di debugger basate su hardware
Steven A. Lowe,

@Steven grazie; sfortunatamente, mentre alcuni dei sistemi su cui lavoro hanno un adeguato supporto hardware, altri no. Mentre generalmente abbiamo l'opzione di un analizzatore logico, questo tende ad essere ancora più costoso in termini di tempo.
Luke Graham,

Sono l'esatto contrario. Uso un debugger molto più spesso su sistemi embedded. Sono d'accordo sul fatto che sconvolga i tempi, però. Ci vuole uno sforzo considerevole per filtrare e / o minimizzare le modifiche causate mettendo un debugger nel loop.
Karl Bielefeldt,

7

Penso che i programmatori esperti utilizzino quasi esclusivamente i debugger, quando sono necessari. Quale modo migliore per rintracciare un bug che seguire effettivamente l'esecuzione del codice ...

Sei convinto che gli Skeets of the world non commettano errori o sappiano semplicemente tutto? Tutti tranne i programmi più banali si comportano in modi inaspettati in alcune circostanze. È un dato di fatto che i problemi dovranno essere investigati. Quindi le scelte sono usare le istruzioni di stampa, a un'estremità dello spettro, o guardare esaminare cosa è successo, post mortem, dall'altra, o guardare nel mezzo mentre il codice viene eseguito e capire cosa sta succedendo.

Forse un modo migliore di pensarci è che i programmatori esperti sanno quando usare un debugger. Nel codice con poche dipendenze guardare una traccia dello stack è probabilmente sufficiente per capire cosa non va. Ma ci sono scenari complicati in cui il tuo codice funziona con altri codici e hai bisogno di un debugger per guardare le cose che non hai scritto.


4
Bene, questo è esattamente ciò che sto cercando di indagare: sono un programmatore estremamente esperto e non ne uso mai uno.

5
@neil, forse non hai bisogno. State tranquilli, arriverà il momento in cui il debugger sarà il modo più semplice per arrivare alla fine di un problema, indipendentemente dal fatto che si finisca effettivamente per
usarne

Riesco a leggere cose che non ho scritto anch'io. E se non posso, è utilmente perché è un codice errato. In altri casi, utilizzo il debugger.
GolezTrol,

Se la lingua che usi supporta le eccezioni e se le stai usando + un framework di registrazione in modo appropriato (ad esempio log4j o qualcosa del genere) finirai sempre con una traccia dello stack che punta alla riga del tuo errore. Il 99% delle volte è un'eccezione puntatore null dove non te l'aspettavi. Cos'altro ti dirà un debugger? Ora, quando stavo programmando in c, c'erano cose che semplicemente non si potevano trovare senza un debugger (ad es. Corruzione dello stack). Ma questi tipi di cose non accadono più nelle lingue di alto livello.
Kevin,

1
@kevin, giusto, penso che ci sia una classe di problemi tra quei due in cui il debugger è il modo più naturale per arrivare alla fine di un problema. Forse voglio vedere le proprietà dinamiche messe su un oggetto in un framework linguistico dinamico come grails. Forse voglio vedere esattamente dove qualcosa che penso non sia nulla è resa nulla (NPE ti dice dove si trova l'eccezione, non perché la cosa è nulla). Forse vorrei che il mio debugger si fermasse su un'eccezione in modo da poter vedere quale combinazione di codice ha causato un'eccezione, non solo che si è verificato nello stacktrace.
hvgotcodes,

4

Non lo so, e sto programmando da oltre 10 anni. Prima, quando programmavo in c / c ++. Ora programma in Java. La verità è che se si esegue correttamente la registrazione, si otterrà una traccia dello stack che è sufficiente per la maggior parte degli sviluppatori esperti. Inoltre, se stai scrivendo (buoni) test unitari e test funzionali, questo elimina un'intera classe di bug.


Se chiarisce di più, conosco molti programmatori Java che usano un debugger. Sono quasi tutti fuori dalla scuola.
Kevin,

1
stacktraces non mostra i dati - devi aggiungere tali informazioni tu stesso - ma poi sono oro puro.

1
@ Thorbjørn: possono mostrare dati, in realtà: vedi il modulo cgitb di Python , per esempio. (Il CGI nel nome è prevalentemente vestigiale, lo scopo originale del modulo era quello di presentare tracce di stack utilizzabili quando un CGI si arrestava in modo anomalo.) Naturalmente, a volte, si ottengono così tanti dati che diventa difficile navigare nello stack cornice di interesse. Adoro cgitb.enable(format='text')comunque, comunque.
SamB

Non uso davvero i debugger e uso C ++ ..
Nikko

@SamB Kevin ha parlato di Java, che non può farlo

4

Che importa? Quello che voglio sapere è che l'uso di un debugger mi impedirà di essere un programmatore migliore a lungo termine? Forse i debugger erano di qualità inferiore quando molti sviluppatori esperti hanno iniziato quindi erano un ostacolo. È una stampella che impedisce una comprensione più profonda?

Alcuni programmatori, probabilmente meglio di tutti noi, hanno trovato la necessità di un debugger e ne hanno creato uno (non ho idea di chi abbia creato il primo.). Sono sicuro che sono stati più produttivi di conseguenza. Dubito che la motivazione fosse quella di consentire ai mortali minori di scrivere codice.


3

Raramente.

I tuoi metodi dovrebbero essere abbastanza piccoli / semplici da essere compilati ed eseguiti dalla tua mente, i test unitari dovrebbero coprire la funzionalità. Se trovi un bug, scrivi un test. Eseguilo, risolvilo.

Tendo a utilizzare il debugger solo quando ho avuto comportamenti imprevisti da codice non verificabile, come il framework ASP.NET.


3
c'è qualche vero odio in questo thread ...

2
NESSUN motivo per votare in fondo - ha ragione.
wadesworld,

11
-1 perché questa affermazione è come dire che il modo per fare soldi a Las Vegas è semplicemente vincere ogni mano. Ciò non riflette la realtà della situazione e l'affermazione che tutto il codice sarà semplice esiste solo in piccoli problemi isolati. Inoltre, l'affermazione "eseguilo, correggilo" ignora completamente il modo in cui risolvi il problema. Stavo per lasciarlo scivolare, ma poi insinuando che tutti coloro che non sono d'accordo valgono la pena di effettuare il downvoting.
whatsisname

2
-1: "I tuoi metodi dovrebbero essere piccoli / abbastanza semplici da essere compilati ed eseguiti dalla tua mente" è disconnessa dalla realtà. È come dire che una funzione che è più lunga di 20 righe è troppo lunga. Senza senso.
John Dibling,

3

In Smalltalk, mi sviluppo quasi interamente nel debugger:

  1. Scrivi un test che so fallirà.
  2. Esegui il test. Quando fallisce, si apre il debugger.
  3. Scrivi, nel debugger, il codice necessario per passare il test.
  4. Riprendi l'esecuzione.
  5. Se ricevo un semaforo verde, vai al passaggio 1 con un nuovo test fallito. Altrimenti, nel debugger scopri cosa ho fatto di sbagliato e risolvilo.

2

Uso un debugger quando è necessario. Questo non è quotidiano, ma succede occasionalmente. A volte è meglio scorrere il codice per vedere cosa succede esattamente.

Devo ammettere che utilizzo sempre meno i debugger. Sto sviluppando a Delfi da oltre 10 anni. Scrivo anche stored procedure in PL / SQL. Da un paio di mesi sono anche uno sviluppatore di PHP.

Uso principalmente il debugger in uno di questi casi se trovo un codice oscuro che è stato scritto anni fa e devo modificarlo. A volte aiuta a scoprire esattamente come funziona un programma se è difficile leggere il codice. In PHP questo non è quasi mai necessario, ma in Delphi, che è basato sugli eventi, a volte aiuta quando hai un framework complesso.

Ma come dici tu, usare il debugger è un'eccezione. La maggior parte dei problemi viene risolta semplicemente leggendo il codice e correggendo eventuali errori che tu (o qualcun altro) hai commesso.

Ma questo vale per passare attraverso il codice. Uso abbastanza spesso lo stack di chiamate quando si verifica un'eccezione e ogni tanto metto un punto di interruzione da qualche parte per ispezionare una variabile. Ma quasi sempre in un pezzo di codice che necessita comunque di un completo refactoring.


2

Di tanto in tanto codice senza debugger, ma solo quando sono costretto a sotto minaccia, ad es. gunge incorporato legacy su un 8051 o Z80.

IMHO, è necessario un debugger e accedere a qualsiasi lavoro complesso. Once non è un sostituto dell'altro. Un sistema di registrazione non può essere d'aiuto se l'app inserisce un driver, ad esempio, dove l'unica cosa che il codice può fare è interagire con l'hardware e impostare un semaforo.

Un debugger non può essere d'aiuto con un errore di sistema in cui le app funzionano correttamente in base al modo in cui le hai scritte, ma il sistema continua a non funzionare a causa di un errore intermittente del protocollo di comunicazione.

Quindi, ho bisogno del debugger per rimuovere gli stupidi bug e i bug hardware. Ho bisogno di una buona registrazione per rilevare bug di integrazione del sistema intermittenti.

Devo avere entrambi - ho bisogno di tutto l'aiuto che posso ottenere!


2
z80 è abbastanza grande per i debugger. CP / M aveva ZSID.

1

Uso un debugger solo quando questi passaggi falliscono:

  1. Ottieni l'errore riproducibile. Pensare. Questo è spesso tutto ciò che serve.
  2. Controllare eventuali tracce e registri dello stack.
  3. Aggiungi più registrazione intorno al codice offensivo.

Questi passaggi si occupano del 95% di tutti i casi. Ciò significa che uso raramente un debugger e, quando lo faccio, tende a darmi troppe informazioni e mi impantana in dettagli non correlati. Ciò è particolarmente vero se si lavora su un sistema multi-thread, in tempo reale.

Le dichiarazioni di registrazione posizionate in modo giudizioso fanno molta strada.


1

Potrebbe essere semplicemente che programmatori molto esperti sono gli stessi di programmatori molto vecchi e hanno imparato a programmare e hanno formato le loro abitudini, quando i debugger non erano sempre disponibili e talvolta non molto buoni?

Se sei davvero bravo nel debugging di printf (e negli anni ottanta, non avevamo molta scelta ma diventare davvero bravo), forse un debugger non aggiunge molto.


0

È una questione di scelta personale.

Sinceramente penso che i debugger siano utili in certe situazioni in cui aiuta molto a sapere cosa succede sul tuo ram in ogni dato passaggio dell'esecuzione del tuo programma.

L'utilità principale di un debugger è di arrestare un programma senza che il programma sia progettato per arrestarsi: questa funzionalità è piuttosto importante.

A parte queste 2 caratteristiche, non penso che un debugger sia davvero necessario; qualsiasi programma complesso che fai dovrebbe avere una sorta di modalità "verbosa", cioè dire tutto ciò che sta facendo con printf o std :: cout, quali scelte ha fatto e molti altri parametri.

Immagina di creare un programma e l'utente ha problemi ad usarlo: come sapere se lo sta usando nel modo in cui è stato progettato per essere utilizzato o se la cosa di cui si lamenta potrebbe essere un bug?

I debugger sono come lo sterzo elettrico della tua auto: è più comodo averne uno, ma non migliorerà la tua guida.

La programmazione riguarda progettazione e logica, il modo in cui gli strumenti possono aiutarti a tracciare le cose non ti rende un programmatore migliore.

Inoltre i debugger sono utili per i linguaggi compilati, tanto meno per quelli interpretati.


2
Non capisco cosa c'entra la compilazione o l'interpretazione.
Michael Burr,

bella domanda: neanche io.
jokoon
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.