Chi controlla i controlli nel codice?

Non sempre giocare sulla difensiva paga.

E’ il caso dell’abuso di controlli e verifiche nel codice nonchè del loro impatto concreto su di esso.

Sono sempre più dell’idea che esista un qualche compromesso che garantisca una certo fiducia nel proprio codice senza forzare all’uso esteso/estensivo di verifiche, probe e altro (es: testare a ogni piè sospinto se tutte le variabili sono non-nulle).

Parlo di inserire dei controlli in modo accorto e misurato, senza eccedere in prassi assurde come tentare di “proteggere” ogni singola riga di codice o, peggio ancora, nell’inscatolare il corpo di intere funzioni dentro a blocchi try-catch.

Vero è che il supporto delle eccezioni non sempre è a regola d’arte e ci sono linguaggi così precisi (pedanti?) che generano tonnellate di eccezioni diverse, una per ogni tipo di condizione problematica. Ma questo non è mai una scusa valida per una loro gestione “pigra” e raffazzonata.

Personalmente sono dell’idea che:

  1. un controllo in più non guasta se e solo se è dimostrabile che serve davvero a qualcosa (es: una correzione nota ad un problema ricorrente);
     
  2. è inutile o comunque discutibile provare a catturare e gestire ogni errore/eccezione in un colpo solo (Pokemon Exception Handling“?);
     
  3. è stupido catturare errori/eccezioni per poi ignorarli (a meno che non si tratti di qualcosa veramente da ignorare come un warning ridicolo o stupido da parte di un compilatore, come questo);
     
  4. meglio essere estremamente pedanti in fase di debug (assert, unit testing, programmazione difensiva a gogo …) e rimuovere i controlli ragionevolmente non più necessari in fase di release.

I bug sono ovunque!

Il quarto punto è quello che mi interessa di più ed è il motivo di questo post.

Rilasciare la versione di debug è sempre sconsigliabile tantopiù che di solito include controlli addizionali inseriti automaticamente nei binari dal compilatore (o chi per esso) più tutti i vostri, compresi quelli che potete ragionevolmente togliere.

Ad esempio verifiche pedanti sugli indici degli array, comodi in fase di debug per stanare eventuali “sforamenti” – tipo un off-by-one – e spesso inutili nelle versioni da rilasciare.

La parte rischiosa, tuttavia, è proprio la loro presenza.

Checchè se ne dica,

i controlli sono codice a tutti gli effetti e, come tale, soggetti essi stessi a bug, problemi di interazione col resto del codice, idiosincrasie, ecc…

Per questo è bene rimuoverli, se e quando hanno raggiunto il loro scopo.

Vige pur sempre la regola del “più roba c’è, più roba si può rompere” e stando a quel che dice Murphy, possiamo aggiungere “certamente lo farà“.

Immaginate che tristezza nel vedere il vostro programma fallire perchè vi siete dimenticati di togliere un controllo nella versione di rilascio e questo è “buggato“. Pensate sia un caso così raro e sfortunato da non meritare menzione? Sfortunatamente non è così.

Allo stesso modo abbondare con controlli precisissimi, perfino quelli apparentemente utili, può essere controproducente.

Ad esempio, tempo fa, mi son ritrovato con del codice che crashava in un blocco finally, all’atto di scrivere sullo stdout!

Questo per dire che i bug possono infilarsi ovunque, perfino dove ci si aspetterebbe di trovarli.

Da qui il titolo del post: “chi controlla i controlli?

Che ne pensate?

Contrassegnato da tag ,

14 thoughts on “Chi controlla i controlli nel codice?

  1. innovatel scrive:

    Probabilmente sbaglio la risposta visto che il sonno è molto elevato in questo momento.

    Il problema è il controllo di cui parliamo. Mi spiego meglio, o almeno ci provo.

    Se è un controllo scritto “in casa” è probabile che i bug passano via e fanno danno. Senza considerare la possibilità che potrebbe anche non uscire.

    Se il controllo è di tipo “Open Source” o “Proprietario” e quindi con una comunità e/o azienda dietro la gestione dei bug è più semplice. Il perchè?

    _ controllo fatto da “A”
    _ Il controllo è usabile dal mondo intero (nel caso migliore) e quindi viene stressato il più possibile nelle modalità migliori e più assurde
    _ Il fatto che con la diffusione possano uscire più bug -> “A” viene informata in tempi rapidi e sistema il controllo.

    mi sono spiegato? Ho preso la risposta’ :D

    Per quanto riguarda il numero dei bug … possiamo spegnere il pc per ridurli invece di lavorare e produrne di nuovi ogni giorno :D

  2. jp scrive:

    @innovatel: ciao, quanto tempo! Diciamo che forse ho capito quello di cui parli e il mio post era principalmente sui controlli “caserecci” che poi rimangono nel codice e, talvolta, sono essi stessi buggati. Ovviamente se, ad esempio, una libreria esterna che utilizzo, Open Source o meno che sia, è bacata, non posso far altro che attendere un fix e, se proprio, trovare un qualche workaround fintanto che il problema non viene risolto.

    Ciau e grazie di essere passato! ^^

  3. Francesco scrive:

    Sono abbastanza d’accordo con quello che dici. Ovviamente ci sono delle eccezioni … tipo la modifica ed il mantenimento di vecchie applicazioni dove per aggiungere nuove funzionalita’ si e’ costretti ad aggiungere i “controlli” :P

    Ma per un progetto nuovo si. Il discorso fila :)

  4. gabriele renzi scrive:

    pokemon exception handling è geniale :D

  5. Joel scrive:

    Personalmente uso solo i controlli necessari a far girare il programma, dopo aver provato più soluzioni possibili in fase di test per capire se l’utente possa seguire un percorso non preventivato in fase di sviluppo.

    Ma gli errori si trovano comunque, oggi ho trovato un bellissimo bug (in PHP)

    if (var == $var2)
    bla bla

    var non aveva la $ davanti tipica della variabile PHP e $var2 era indicata come variabile ma non lo era, era una stringa costante “var”, :-D

  6. jp scrive:

    @Francesco: sì, perchè in quel caso ricadi ampiamente nel punto 1, cioè il controllo in più è giusticato. Stessa cosa se lo si mette in qualcosa di cui non ci si fida del tutto come, ad esempio, del codice non scritto da noi.. :P

    @gabriele renzi: quando l’ho letto, sono scoppiato a ridere, Però poi ci ho riflettuto un po’ su e, come si vede in questo post, ora non sono più così convinto che sia una bella cosa, nonostante il nome spassoso… :D

    @Joel: beh, diciamo che non è un “bug” per l’interprete (sintatticamente è corretto), ma qualcosa che verosimilmente lo è per l’utente.

    Sarà che sono abituato bene, ma mi aspetterei almeno un warning da parte dell’interprete PHP, qualcosa tipo “trovato $XYZ. se non è un errore, disattiva il warning o aggiungi una coppia di parentesi in più“.

    Il GCC, ad esempio, lo fa se scrivi qualcosa tipo “if(a = b) …“…

    Esempio:

    // FILE: test.c
    int main()
    {
    	int a = 2;
    
    	if(a = 5)      // warning if -Wall is enabled! => "maybe a bug?"
    	{ /* ... */ }
    
    	if((a = 5))    // no warning because of the extra parentheses =>
    	{ /* ... */ }  // "ok, your decision acknowledged and honored"
    
    	return 0;
    }
    
    // gcc -Wall test.c -o test
    // test.c: In function 'int main()':
    // test.c:6:10: warning: suggest parentheses around assignment
    //                used as truth value
    

    Ciao & grazie per essere passati! ^^

  7. Stefano scrive:

    Grazie JP perché dal tuo link sulle Pokemon Exception Handling ho scoperto di fare spesso uso delle ‘yoda conditions’ (adesso le chiamerò sempre così) .. :)

    P.S. io sono per il maggior numero possibile di controlli in fase di produzione, per poi ‘alleggerire’ il codice in release. (gli unit test aiutano anche in questo)

  8. jp scrive:

    @Stefano: LOL! Pensa che è consigliato in vari libri… :P

    Beh, vedere il codice debuggato, girare a velocità piena quando si produce una release ha un che di liberatorio… E’ come liberare una colomba ferita e vederla prendere il volo… :P

  9. Stefano scrive:

    Che poesia !

  10. jp scrive:

    @Stefano: sì, è poesia pura… :P

  11. recenso scrive:

    Laddove parliamo di controlli non previsti nell’analisi tecnica, è’ l’esperienza e la conoscenza del linguaggio di programmazione e del sistema che stiamo sviluppando, che ci fa che controlli vanno messi e come (IMHO)

  12. jp scrive:

    @recenso: sì, ma senza esagerare. Ho sentito gente giustificare tonnellate di codici dicendo che “per esperienza non facevano mai male…“. :P

    Ciau & grazie di essere passata! ^^

  13. recenso scrive:

    Mah, se dicono così avranno fatto esperienza a modo loro :)

  14. jp scrive:

    @recenso: oh, sì sì. Siccome è andato bene una volta, … :P

Lascia un Commento

Fill in your details below or click an icon to log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Log Out / Modifica )

Foto Twitter

You are commenting using your Twitter account. Log Out / Modifica )

Foto di Facebook

You are commenting using your Facebook account. Log Out / Modifica )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 259 other followers