Nei titoli e nei testi troverete qualche rimando cinematografico (ebbene si, sono un cinefilo). Se non vi interessano fate finta di non vederli, già che non sono fondamentali per la comprensione dei post...

Di questo blog ho mandato avanti, fino a Settembre 2018, anche una versione in Spagnolo. Potete trovarla su El arte de la programación en C. Buona lettura.

domenica 20 ottobre 2019

Debugger? No, grazie!
considerazioni sull'uso del Debugger con il C

(...una premessa: questo è un articolo della serie "filosofica" come lo erano, ad esempio, "Variabili Globali? No, grazie!" oppure "No Comment". Quindi quella che esporrò è la mia personale filosofia, che non necessariamente è perfetta o è l'unica possibile. E lo preciserò di nuovo, come ho fatto nell'ultimo articolo: non sono il messia, sicuramente dico e faccio tante scemate, ma a volte ci azzecco, e quindi: i permalosi e/o privi di senso dell'umorismo sono esentati dalla lettura dell'articolo, e chi continua non dica che non l'avevo avvertito...)
Michele: Mi si nota di più se vengo e me ne sto in disparte o se non vengo per niente? Vengo. Vengo e mi metto, così, vicino a una finestra, di profilo, in controluce. Voi mi fate "Michele vieni di là con noi, dai" ed io "andate, andate, vi raggiungo dopo".
Nel bel Ecce Bombo, Michele, il protagonista, ha molti problemi esistenziali e filosofici, tipo quello sulla convenienza ad andare/non andare a una festa. E oggi di quello parleremo, di filosofia e gravi problemi della vita odierna, tipo: "Mi si nota di più se uso il Debugger o se non lo uso?". Per la precisione, tutto quello che segue da qui in avanti si riferisce all'uso "classico" o, se preferite, alla "accezione comune" del Debugger, e cioè: "Ho un blocco o un comportamento inaspettato di un programma: analizzo e risolvo il problema eseguendo passo-passo con un Debugger". Gli altri usi più profondi tipo l'analisi di un Core Dump o il Disassembly per usi (si spera leciti) di analisi di un codice eseguibile, non fanno parte di questa trattazione.
...mi si nota di più se uso il Debugger o se non lo uso?...
Allora, tanto per evitare fraintesi vi mostro subito quale è il mio pensiero al riguardo, e userò per l'occasione una interessante definizione circolare:
- Il Debugger serve solo a risolvere problemi facili.
- Se un problema è facile posso risolverlo senza usare il Debugger.
Il succo della definizione qua sopra è evidente: Il Debugger non serve a niente! Ovviamente non metto in dubbio che ci sono Debugger ben fatti e con alte prestazioni ma, semplicemente, io penso che la loro utilità sia molto limitata, perlomeno per il debugging classico ed elementare. E c'è un dato di fatto: io faccio l'Analista Programmatore (e lo faccio egregiamente, modestia a parte) da molto tempo e non uso praticamente mai il Debugger: sono un miracolato? Sono una mosca bianca? Sono solo molto fortunato? Boh, fate vobis...

Ed è già ora di fare qualche esempio reale:
  • Sei un Programmatore Esperto, stai lavorando su una tua applicazione e devi risolvere un problema: l'applicazione è tua, il codice l'hai scritto tu, quindi dovresti (anzi: devi) avere il controllo del flusso del programma, e quindi hai tutti i mezzi per capire quello che sta succedendo. Se per seguire "il giro del fumo" hai bisogno di scomodare un Debugger... mai pensato di cambiare lavoro? 
  • Sei un Programmatore Esperto, stai lavorando su una applicazione non tua, ma ben scritta e ben documentata, e devi risolvere un problema: l'applicazione è, ripeto, ben scritta e ben documentata, quindi dovresti (e vabbè, tolgo il devi) avere ugualmente il controllo del flusso, e quindi hai tutti i mezzi per capire quello che sta succedendo. Se per seguire "il giro del fumo" hai bisogno di scomodare un Debugger... mai pensato di fare un piccolo sforzo per leggere attentamente codice e documentazione e acquisire il controllo totale del flusso del programma? Ti potrebbe tornare molto utile nel prosieguo del lavoro...
  • Sei un Programmatore Esperto, stai lavorando su una applicazione non tua, scritta da cani e senza documentazione, e devi risolvere un problema: a parte inviare le dovute maledizioni al pregiato autore del codice-ciofeca su cui stai lavorando, cosa puoi fare? E vabbè, sarò generoso: in questo caso ti permetto di usare un Debugger, ma non te lo consiglio: anche in tali condizioni sarebbe molto utile cercare di acquisire il controllo completo e, magari, approfittare per documentare e migliorare il codice. Comunque a fine lavoro ricordati di inviare le dovute maledizioni, mi raccomando... e già che ci sei: riserva una rispettosa maledizione anche a un tuo (eventuale) capo se ti ha detto "risolvi solo il problema, è inutile che migliori e documenti il codice, non abbiamo tempo": il tuo capo è colpevole come l'autore del codice-ciofeca, anzi è un suo complice.
Avete notato che negli esempi precedenti non ho specificato se il problema da risolvere era piccolo o grande? Beh, se il motivo non vi è chiaro vi consiglio di rileggere la definizione circolare con cui ho introdotto l'argomento. E notate bene: ho evidenziato il termine "Programmatore Esperto", perché è di questo che stiamo parlando. I Programmatori Inesperti o Novizi, sono un caso a parte, e hanno una Dispensa Papale sull'uso del Debugger, visto che per loro potrebbe risultare istruttivo. Poi, se poi continuano a usarlo anche quando passano allo stadio di Programmatore Esperto, per loro è pronta una Scomunica Papale (con relativa retrocessione allo stato di Novizio). So di cosa parlo, sono stato un Programmatore Novizio anch'io...

Ed ora definiamo il concetto di problema facile o difficile: molti dicono: "il Debugger bisogna usarlo sempre, forse solo in alcuni casi di complessi programmi multithread un normale Debugger non aiuta molto, e bisogna seguire un approccio diverso"... uhm, sbaglio o rientriamo nella definizione circolare introduttiva? Io lavoro praticamente sempre su "complessi programmi multithread": sono solo sfortunato o quello di risolvere problemi complicati è, giustamente, il compito dei Programmatori Esperti? Senza offesa eh, ma se vi danno da fare solo lavori facili in cui potete usare liberamente (anche se non serve) il vostro amato Debugger, forse non vi considerano Esperti...

E poi veniamo alla parte più strana, quella delle leggende urbane, quelle che "Non usi il Debugger? Allora sei della vecchia generazione!". In questo caso mi tocca, mio malgrado, chiedere aiuto a quell'irascibile di mio cuggino, che ha sempre qualche aneddoto da raccontare. True Story? Può darsi...
un programmatore: Ah, ma tu non usi il Debugger perché sei della vecchia generazione, tu sei abituato a usare solo un editor e un compilatore e via!
mio cuggino: Non è vero: ai miei tempi, quando scolpivo il codice nella roccia tra una caccia al Mammut e l'altra, usavo già il Debugger, ma solo quando era strettamente necessario, esattamente come faccio oggi. 
un programmatore: Ma come? Esistevano già i Debugger? 
mio cuggino: Uhm... fai un po' te, su UNIX negli anni '70 esistevano già DB, ADB e SDB. Negli anni '80 poi sono usciti DBX e (nel 1986) GDB. Per quanto riguarda il MS-DOS, nel 1989 era già disponibile il famosissimo Borland Turbo Debugger. 
un programmatore: DB, ADB, SDB, DBX, GDB, Turbo Debugger... mai sentiti, ma di cosa stai parlando?
mio cuggino: E vabbè, continuiamo così, facciamoci del male... 
Per concludere citerò una bella frase che è molto usata ultimamente: "Non sono d'accordo con quello che dici, ma difenderò fino alla morte il tuo diritto a dirlo". È, spesso, attribuita erroneamente a Voltaire ma è invece di una sua biografa, Evelyn Beatrice Hall: ma questo dettaglio non importa, quello che importa è il potentissimo contenuto, che io vorrei sempre applicare. Quindi, lungi da me criticare i colleghi che lavorano in modo diverso dal mio, anzi, quando posso li appoggio. Le mie azioni e i miei articoli sono (o vorrebbero essere) pura critica costruttiva, e devo dire (con somma soddisfazione) che alcuni colleghi, lavorandomi affianco, hanno cambiato un po' lo stile (tipo smettere di essere schiavi del debugger!). Comunque ho il massimo rispetto per chi ha altre convinzioni e non vuole cambiarle. E ho detto tutto!

(...apro una parentesi un po' OT: la frase qui sopra è adatta a esperimenti sociologici interessanti, tipo attribuirla apposta a Voltaire per vedere se qualcuno, invece di soffermarsi sulla bellezza della frase, ti riprende unicamente e furiosamente per l'errore di attribuzione. Diffidate di questi irosi tuttologi che "guardano il dito invece della luna": frequentano blog, fori e conferenze sperando, ansiosamente, in qualche errore del relatore che gli fornisca una scusa per evidenziare che solo loro detengono la sapienza universale. Gentaccia...)

Beh, credo che con questo posso considerare concluso un altro capitolo della mia personale lotta ai "Luoghi Comuni dell'Informatica", e ne seguiranno altri. E se volete chiamarmi "Il Pedante Informatico" fate pure, in effetti lo sono...

Ciao, e al prossimo post!