Parliamo un poco di grandi maestri. In questo blog ho già nominato Bjarne Stroustrup, sicuramente uno dei più grandi. Parliamo qui adesso di Andreas Zeller. Professore ordinario all'Universität des Saarlandes in Saarbrücken, Germania, è grazie a lui se noi oggi parliamo di “breakpoint”, “variable content”, “code completition”, o più in generale di debugger visuali. Infatti, assieme a Dorothea Lütkehaus, nel 1994 ha scritto il primo debugger visuale della storia. Nato come frontend del già famoso GNU gdb, “ddd” è sicuramente una conoscenza ben nota di chi abbia bazzicato un po' nella programmazione UNIX. Cosa molto più importante, Zeller ha definito una teoria scientifica del debugging. Riporto qui di seguito le sue parole tratte da uno dei suoi articoli più famosi (contenuto anche nello splendido libro che ogni programmatore dovrebbe leggere: “Beautiful Code”). Zeller dice:
“Quando i programmatori debuggano un programma, è per ricercare la causa di una failure. Questa può essere originata dal codice, dagli input o dall'ambiente dove il programma gira. Questa causa deve essere trovata ed eliminata. Una volta eliminata la causa, il programma riprenderà a funzionare. Se così non dovesse essere, nonostante aver eliminato la causa, è giunta l'ora di rivedere le nostre credenze sulla causa che ha generato la prima failure. Il processo generale di ricerca delle cause è chiamato 'metodo scientifico'. Questo metodo, applicato alle failures di un programma funziona come segue:
Si osserva la failure del programma.
Ci si costruisce un'ipotesi per la causa di questa failure che sia consistente con l'osservazione.
Si usa questa ipotesi per fare previsioni.
Si testano le previsioni sperimentando e facendo nuove previsioni.
Se la sperimentazione e l'osservazione soddisfano le previsioni, si rifinisce l'ipotesi iniziale, altrimenti bisogna trovare un'ipotesi alternativa.
Bisogna ripetere questo processo finché l’ipotesi iniziale non si possa più raffinare ulteriormente.
A volte le ipotesi possono diventare teorie. Questo vuol dire che abbiamo un 'Framework concettuale' che spiega e predice alcuni aspetti dell'universo. Infatti, il nostro programma malfunzionante può essere un aspetto veramente piccolo dell'universo, ma nonostante questo la nostra teoria ci può dire esattamente dove intervenire per eliminare la causa della failure.
Per ottenere questa teoria, i programmatori applicano il metodo scientifico descritto sopra ripercorrendo all'indietro la catena causa-effetto che origina la failure. Quindi essi osservano la failure (l’output è sbagliato oppure si origina un’eccezione), fanno ipotesi su quale potrebbe essere la causa della failure (la causa potrebbe essere che Y ha un valore errato), fanno una previsione (se Y è sbagliato, il suo valore potrebbe dipendere dalla funzione f() alla linea 632), testano la loro previsione (corretto! Y ha un valore errato alla linea 632), traggono le appropriate conclusioni (questo vuol dire che f() restituisce un valore errato e adesso vediamo perché).
Comunque, al di la di ogni metodo, espediente o trucco, l’uso consistente e disciplinato del metodo scientifico, è la chiave per raggiungere una certa maestria nel debugging. Questo significa tre cose:
Siate espliciti.
Formulate le vostre ipotesi esplicitamente. Scrivetele su un pezzo di carta o spiegate il problema ad un vostro collega. Tenere una traccia scritta del vostro problema vi può permettere di interrompere il lavoro e riprenderlo il giorno dopo a mente fresca.
Siate sistematici.
Siate sempre consapevoli di quello che state facendo. Non investigate e non fate cambiamenti a caso senza avere un’ipotesi chiara ed una previsione certa. Assicuratevi di aver preso in considerazione tutte le possibili cause.
Cercate le cause partendo dalle più probabili.
Il metodo scientifico vi garantirà di trovare la causa della vostra failure, ma non vi dirà quando. Quindi, come prima cosa identificate le possibili cause del vostro problema e concentratevi prima sulle più probabili e su quelle che richiedono lo sforzo minore.
Sfortunatamente, i debugger visuali come li conosciamo oggi, non supportano il metodo scientifico. Sicuramente questi sono strumenti estremamente utili per investigare il codice ed i risultati che produce, ma sono utilizzabili solo da programmatori con grande esperienza, che conoscono come usare sistematicamente un debugger. La mia idea, è quella di insegnare ai programmatori ad usare il metodo sistematico piuttosto che elaborati strumenti di debugging (…e un pochino mi sento colpevole avendo scritto io stesso un elaborato strumento di debugging)”.
Che dire. Dopo le parole di Zeller non mi rimane molto da commentare. Facciamo nostro l’insegnamento del maestro.
Parafrasando il motto di una vecchia pubblicità, posso solo dire: “Meditate, gente. Meditate!”
Luca Ciciriello