Bugfencing: quando il bug diventa feature
November 19th, 2007 di Dario Violiin bug, coding, flash, pensiero laterale, programmazione | Letture: 4384
Pur non essendo programmatore, mi trovo sempre piu spesso (per passione o per lavoro) a scribacchiare codice, soprattutto in fase di prototipazione. Il bugfencing è una tecnica di programmazione utilizzata proprio in questo specifico momento del ciclo di vita di un software e consiste sostanzialmente nel mantenere i bug e sfruttarne la presenza al fine di ottenere nuove features.
L’ambiente di sviluppo ideale per il bugfencing è preferibilmente di alto livello (applicativi flash o ajax, grammatiche polygen o aiml, scripting MEL o LSL) . Pensiamo per esempio a Flash: flash è un ottimo ambiente per realizzare prototipi; inoltre la possibilità di affiancare scrittura di codice e editing WYSIWYG e l’immediata visibilità del risultato creano le condizioni ideali per la proliferazione e il mantenimento dei bug.
Iniziamo con una case study abbastanza nota: Matrix.
The first Matrix I designed was quite naturally perfect, it was a work of art, flawless, sublime. A triumph equaled only by its monumental failure. The inevitability of its doom is as apparent to me now as a consequence of the imperfection inherent in every human being, thus I redesigned it based on your history to more accurately reflect the varying grotesqueries of your nature. However, I was again frustrated by failure. I have since come to understand that the answer eluded me because it required a lesser mind, or perhaps a mind less bound by the parameters of perfection. Thus, the answer was stumbled upon by another, an intuitive program, initially created to investigate certain aspects of the human psyche.
[The Matrix Reloaded]
Con queste parole l’Architetto di Matrix spiega a Neo l’esigenza di un approccio progettuale non-logico al fine di migliorare il proprio software. Ecco cosa si evince dalle enigmatiche frasi:
1) Il fallimento delle prime Matrix dipende dal cattivo design della user experience e non da problemi di programmazione
2) La soluzione giunge da una mente meno vincolata a parametri di perfezione
3) La soluzione giunge per caso
4) L’architetto è probabilmente un designer e l’oracolo uno psicologo (cognitivo?)
Perchè una mente troppo vincolata a parametri di perfezione non è in grado di giungere alla soluzione? La risposta è semplice: un approccio eccessivamente logico difficilmente farà scoperte per caso.
lo stesso de Bono ci ricorda, tra l’altro, come il concetto stesso di ’scoperta fatta per caso’ sia errato in partenza, frutto di una cultura troppo legata all’approccio logico-deduttivo: il ‘caso’ mette in continuazione davanti ai nostri occhi la soluzione a centinaia di problemi, ma è poi compito nostro scovare le risposte e riconoscerle come tali. Al posto di Fleming, un altro ricercatore avrebbe gettato tra i rifiuti il campione di coltura batterica ‘rovinato’ senza così compiere il primo passo verso l’isolamento della penicillina. Da questo presupposto nasce il bugfencing.
Ma torniamo alla case study:
Il problema non era nel codice, ma nelle features di Matrix, che risultavano incompatibili con le aspettative del target d’utenza. L’introduzione nel Sorgente di Matrix di un’anomalia (un bug) risolve questa issue progettuale, con una coraggiosa decisione da parte del team di sviluppo che opta per una migliore user experience a discapito della stabilità del sistema.
Che cos’è un bug?
A software bug is an error, flaw, mistake, failure, or fault in a computer program that prevents it from behaving as intended (e.g., producing an incorrect result). [da wikipedia]
Il concetto di bug fixing, cioè l’idea che un comportamento differente da ciò che ci si aspetta sia per definizione errato e che la sua causa vada cercata ed eradicata, ricorda il modus operandi degli inquisitori: profondamente violento e culturalmente antievoluzionista.
Il bugfencing è una sorta di eresia informatica, è la negazione di questo modus operandi, è la non eliminazione del bug unita alla sua trasformazione in feature.
Il termine letteralmente significa ’schermare con i bug’.
La scherma, nella sua più antica (non sportiva) accezione, era una forma di difesa armata, uno ’schermo’ contro il nemico; e come ogni arte marziale che si rispetti, anche la scherma tradizionale è costellata di tecniche per sfruttare la forza del nemico contro di lui. Ed ecco l’idea del bugfencing: usare la ‘forza’ del bug a proprio vantaggio.
In realtà il concetto è un pò più “raffinato” e parte dall’idea che dietro ad ogni problema si celi un’opportunità; o, ancora meglio, che non esistano problemi, ma solo opportunità. Quando si sviluppa un software il bug arriva per caso: è il risultato di un errore, come la muffa su una coltura batterica, e il bugfencer deve saperne cogliere il potenziale, deve trovarci la penicillina. Un comportamento inaspettato va accuratamente osservato, se necessario isolandolo dal contesto: forse non avrà nulla a che fare con il software che si sta sviluppando, ma si tratta comunque di una novità che, magari, potrebbe anche tornare utile in futuro o servire da spunto per altre idee.
Basti pensare al dna: il dna è un codice.
La riproduzione sessuata è difficile, pericolosa e sporca; perchè allora la natura si è impegnata così tanto a renderla estremamente piacevole? Perchè sottrarre tempo alla ricerca di cibo e mettersi maggiormente in luce agli occhi dei predatori attraverso una pratica scomoda come la riproduzione sessuata? Perché è evolutivamente vincente: aumenta il caos, aumenta le probabilità di mutazioni e quindi aumenta il potenziale evolutivo. Ciò che evolutivamente si chiama mutazione, può essere informaticamente inteso come bug. Il bugfencing sta quindi alla programmazione standard come la riproduzione sessuata sta alla mitosi. E come lo scopo della riproduzione sessuata non è quello di generare nuovo dna, ma di produrre il cambiamento, così l’obiettivo del bugfencing non è la produzione di codice, ma la realizzazione di nuove features. L’uso del bugfencing in fase di produzione sarebbe infatti estrememente rischioso, vista l’imprevedibilità legata a questa tecnica. L’aumento di instabilità di un software non va esattamente a braccetto con le logiche di mercato (almeno in teoria).
Il bugfencing è una tecnica da utilizzare quando la stabilità di un software non è richiesta, quando è essenziale che il software muti ed evolva: il bugfencing raggiunge la sua massima espressione nella prototipazione.
Tanto più il progetto è ‘giovane’, quanto più le nuove features potranno esservi integrate. Man mano che il progetto si definisce, infatti, i comportamenti anomali del software tendono ad essere ignorati o scartati, mentre all’inizio della sua esistenza, quando anche i suoi stessi obiettivi non sono ancora del tutto chiari, l’errore generato dal caso diviene fonte di ispirazione, il prototipo diventa esso stesso interlocutore di chi sviluppa il prototipo, i suoi comportamenti inaspettati che derivano dal mantenimento dei bug sono ottimi spunti per l’implementazione di nuove features.
Fare bugfencing durante la definizione di un concept è come fare brainstorming con il destino.







November 19th, 2007 at 11:11 pm
[…] E’ uscito su Idearium un articolo che aspettavo da tempo: “Bugfencing: quando il bug diventa feature”, di Dario Violi. […]
November 20th, 2007 at 11:12 am
Beh, che dire? Potrei andare avanti per ore… nel Grande Libro dei Bug non parlo ESPLICITAMENTE del Bugfencing, nel senso che non uso mai il termine, ma i concetti sono presenti in piu’ e piu’ punti… anzi, a dire il vero TUTTO IL LIBRO gira intorno a concetti simili. Ad esempio, DEVO ricordare “Change” di Watzlawick, che spiega perche’ l’approccio Zen sia cosi’ importante, e il BASE - Birra Aided Software Engineering, che ho inventato io durante un Media Party in Conchetta nel 1992 (e non aggiungo altro). Ma anche le varie tecniche marziali che usano la forza dell’avversario e gliela rivoltano contro - Ju Jitsu, certo, ma anche Jeet Kune Do dove “la miglior difesa e’ l’attacco”… tra essere beta tester Microsoft ed essere ninja c’e’ una differenza lieve, gente, non c’e’ nulla da fare…. Bellissimo articolo, col tuo permesso ne citero’ alcuni punti nella prossima iterazione del Grande Libro (http://www.babeledunnit.org/WriteBBOB.htm).
November 20th, 2007 at 10:34 pm
Mitico Nobil Dario!
November 21st, 2007 at 12:10 pm
Dario da bugfencing con le lightsaber master replica.
Dario è quello a destra.
November 21st, 2007 at 1:30 pm
@Babele Dunnit
Sono venuto a conoscenza del Grande Libro dei Bug ad articolo praticamente finito ed ho preferito aspettare a leggerlo per non esserne influenzato.
Ovviamente sarei onoratissimo se il mio articolo fosse citato!
November 22nd, 2007 at 9:48 am
1) [La riproduzione sessuata] aumenta le probabilità di mutazioni
2) Ciò che evolutivamente si chiama mutazione, può essere informaticamente inteso come bug
3) La produzione dei bug è inversamente proporzionale alla qualità del codice
da che si deduce:
3) peggio si scrive codice, melgio si sostituisce una buona scopata.
Ecco spiegata la natura evolutiva dei nerds.
November 22nd, 2007 at 5:11 pm
bella Zeno
In verita’ (questa notte ci ho pensato su, a questo articolo) la potenza della riproduzione sessuata (e degli Algoritmi Genetici) e’ sfruttare pezzi di “DNA” (o sequenze di parametri… insomma, ci siamo capiti) gia’ “buoni”, reincrociandoli alla ricerca di corredi genetici ancora migliori. Cioe’, quello che in generale viene chiamato “mutazione” in qs articolo deve essere scisso e guardato con attenzione quando si usa la terminologia genetica corretta, ovvero Mutazione contro Crossover… se la Mutazione (genetica) e’ puntuale e generalmente distruttiva e in natura serve solo per togliersi da vicoli ciechi, peraltro con probabilita’ di riuscita assai basse, il Crossover - ovvero scambiare un intero codone del padre con quello della madre e viceversa - e’ come fare una sorta di “ricerca binaria” delle soluzioni migliori nell’ N-spazio delle variabili del problema.. questo e’ il motivo per cui gli Algoritmi Genetici sembrano magici: e’ una esplorazione dello spazio delle soluzioni che ha una efficienza inimmaginabile, come un super-simplesso ad N variabili contemporanee. Questo e’, per inciso, anche quello che i “creazionisti a tutti i costi” non capiscono, quando dicono “noi non possiamo essere venuti fuori per caso, ergo Dio e’ necessario”. Sarebbe cosi’ se esistessero solo le Mutazioni del DNA, e non il Crossover. Allora si che la riproduzione seguirebbe il Caso, quello vero, quello della Seconda Legge della Termodinamica, e la nostra probabilita’ di esistenza sarebbe praticamente nulla. Ma Il Crossover Genetico rende Dio - agli effetti della esistenza della Vita per come la conosciamo - non indispensabile.
Che poi Dio ci serva - magari senza barba bianca e comunque per altre cose - e’ un altro discorso.
November 22nd, 2007 at 5:45 pm
Babele …. posso farmi una maglietta con su scritto “Io, sono amico di Aaron!”?
November 22nd, 2007 at 7:11 pm
[…] Ho scritto un articolo (il mio primo su idearium.org) per spiegare questa la tecnica un po’ bizzarra (battezzata, appunto, bugfencing), la quale consste nel creare le condizioni ideali per la proliferazione dei bug affinchè il comportamento inaspettato del software, che dalla loro presenza deriva, generi nuove funzionalità inizialmente non previste. Vi assicuro che, a livello di prototipazione software, l’approccio bugfencing si rivela molto produttivo. […]
November 27th, 2007 at 4:07 pm
@Babele:
Aaahh. Quante bestemmie sugli algoritmi genetici! Può essere affascinante parlarne (e pensarli) così ma, ahimé, non funzionano come dici. E l’efficienza di esplorazione dello spazio delle soluzioni non è proprio delle migliori…
December 13th, 2007 at 3:03 pm
[…] “Personas e Scenari” di Dario Violi su HTML.it + un suo interessantissimo articolo su Idearium […]
May 1st, 2008 at 11:50 am
[…] Con un’idea vagamente ispirata al bugfencing, mi sono chiesto come si sarebbe comportato GDocs se avessi inserito nuovamente l’elenco delle persone autorizzate all’accesso, ma come visitatori. Ha funzionato. […]
April 22nd, 2009 at 11:47 pm
@ipsilon: pensa, passo di qui dopo molto, molto tempo dalla tua risposta. Se mai dovessi ripassare anche tu, magari lascia un tuo recapito/indirizzo/coordinata, e/o spiegami un po’ perche’ “non funzionano come dico”… no, perche’ ormai e’ un po’ che li uso per ottimizzare di tutto, e a me sembra che funzionino egregiamente… soprattutto per esplorare lo spazio delle soluzioni di funzioni tetragone ad una analisi matematica “classica” (ovvero che devi simulare/eseguire esplicitamente per calcolarne la fitness). In quel caso TI SFIDO a trovare un sistema piu’ efficente degli algoritmi genetici (vedi lo Holland Scheme Teoreme). Quali metodi SEMPRE APPLICABILI (a qualsiasi funzione, intendo) conosci che esplorano lo spazio delle soluzioni in maniera migliore? E’ ovvio che per casi particolari ci sono soluzioni analitiche molto piu’ efficienti (vedi appunto il simplesso, ad esempio, o banalmente lo studio di funzioni che si fa ad Analisi 1), ma - che io sappia - di algoritmi che puoi usare SEMPRE c’e’ solo quello (in tutte le sue varianti)… e che noi si venga proprio da li’ non lo ritengo un caso.