martedì 5 gennaio 2010

Code Katas (raccolta Video)

Qual'è il significato e l'utilità dei Code Katas? Non potremmo capire attraverso un esempio particolare? Si, lo "String Calculator Kata". In particolare di esso vedremo una intera raccolta di esecuzioni di grande valore tecnico e "artistico". Una vera performance e un grande spettacolo!

Non ho saputo resistere alla tentazione di raccogliere questo prezioso materiale e di presentare il lavoro svolto dai tanti amici dello XPUG di Milano e di SIAgile, da cui sto imparando a lavorare veramente bene, i quali dedicano il loro tempo con passione e professionalità alla disciplina dello sviluppo del software secondo la metodologia di Extreme Programming di Kent Beck & Co. Questo è una ghiotta, pratica e concreta occasione per vedere in cosa consiste il TDD o Test Driven Development e per capire cosa vuol dire sviluppo incrementale o design emergente. Il tema non viene esaurito certamente in questo post, ce ne saranno altri, ma sicuramente stuzzicherà alcuni lettori ad approfondire gli argomenti e lo sviluppo Agile.

Premessa

Lo sviluppo del software è una disciplina. Il suo scopo è soddisfare le esigenze dei clienti, fornire delle soluzioni automatiche a problemi articolati più o meno ricorrenti, rispondere ai requisiti espressi e inespressi di persone che interagiscono e comunicano nell'ambito di attività lavorative e ludiche. Dovrebbe servire a migliorare la vita delle persone, giusto?

Quindi non si tratta di un arte marziale, non si tratta neanche di un'arte, a mio parere. Come dice bene Zio Bob scrivere software è un artigianato. Sebbene qualche cosa di marziale credo ci sia. Sviluppare software infatti vuol dire spesso combattere contro la complessità, vuol dire ridurre rischi di incidenti i cui danni potrebbero essere incalcolabili, vuol dire spesso lottare contro i mulini a vento, è senz'altro una lotta contro il tempo e contro le avversità della realtà, una realtà che si cerca di astrarre, semplificare, dominare. Per dirla alla Karpov "lo sviluppo del software è uno dei giochi più crudeli al mondo". E a peggiorare le cose, si aggiunge il fatto che si tratta di un'attività praticamente invisibile ai più.

Come ogni disciplina che si rispetti e che amiamo padroneggiare - pensiamo alla musica, allo sport, alla danza, allo Yoga, alla politica e allo spettacolo - anche lo sviluppo del software va esercitato. L'esercitazione è tanto più importante quanto meno vogliamo trovare alibi per non avere il tempo necessario a produrre software di ottima qualità, come giustamente sottolinea Gabriele Lana nel suo articolo. Ora abbiamo lo strumento che ci serviva per procedere in questa vitale esercitazione.

Definizione

Ecco che, come nelle arti marziali, sono nati i Kata informatici (Code Katas) dalla vocazione di Dave Thomas (coautore del libro The Pragmatic Programmer).
Kata è un termine giapponese che indica una sequenza prestabilita di movimenti coreografici praticati da soli o in due, che rappresenta un ipotetico combattimento con uno o più avversari immaginari. Lo scopo è acquisire dimestichezza, aumentare l'agilità, acquistare spontaneità nei movimenti stessi attraverso la ripetizione e la pratica.
In informatica i Code Katas sono costituiti da una serie di requisiti presentati in un determinato ordine che simulano i desideri di un ipotetico cliente. La loro esecuzione, in una forma anche piuttosto spettacolare, con una coreografia musicale o ev. accompagnata da una voce narrante e che descrive il percorso, deve essere svolta in meno di 30 minuti, diciamo in un Pomodoro di Francesco Cirillo.

String calculator Kata

Il Code Kata di cui parliamo oggi è quello ideato da Roy Osherove chiamato String Calculator. Si tratta della seguente sequenza di requisiti:

  1. Creare un semplice calcolatore di stringhe/testo con un metodo int Add(string numbers)

    1. Il metodo può prendere numeri 0, 1 o 2, e ritorna la loro somma (la stringa vuota ritornerà 0) Per esempio “” or “1” or “1,2”
    2. Inizia col semplice caso di test di una string vuota, poi prova con il numero 1, e poi con 2.
    3. Ricorda di risolvere le cose nel modo più semplice possibile, per cui forzi te stesso a scrivere test a cui non avevi pensato
    4. Ricorda di rifattorizzare (fare Refactoring) ad ogni singolo test che diventa "verde"( ossia che funziona correttamente)


  2. Consenti al metodo Add di gestire un numero imprecisato di numeri
  3. Permetto al metodo Add di gestire gli "a capo" (new lines) tra i numeri dati (al posto della virgola).

    1. il seguente testo è ok:  “1\n2,3”  (sarà uguale a 6)
    2. il seguente testo NON è ok:  “1,\n” 
    3. assicurati di testare solo gli input validi. Non è necessario prevedere input non validi per questo kata.


  4. Permetti al metodo Add di gestire differenti delimitatori:

    1. per cambiare un delimitatore, all'inizio del testo figura una linea separata come la seguente:   “//[delimiter]\n[numbers…]” per esempio “//;\n1;2” deve restituire 3, dove il delimitatore di default è ‘;’.
    2. la prima linea è opzionale. Tutti gli scenari precedenti devono continuare a funzionare.


  5. Chiamando Add con un numero negativo, verrà lanciata un'eccezione “negatives not allowed” - e il numero negativo che è stato passato. Se ci sono più di un numero negativo, allora mostrali tutti nel messaggio dell'eccezione prodotta)
  6. [...]
(la versione completa del kata prevede 11 punti da realizzare in meno di 30 minuti!)

Ho voluto riportare il testo tradotto in italiano per favorire la didattica di questo Kata e consentire a tutti di leggerlo.

Le esecuzioni














Esso è stato svolto da diverse persone e in diversi linguaggi di programmazione, le quali poi hanno avuto la buona idea di registrarne in video tutta la loro esecuzione. Qualcuno ha messo come sottofondo persino delle musiche che rendono il tutto veramente gradevole. Un vero spettacolo!

Le cose interessanti di queste esecuzioni sono tante, e in particolare vorrei evidenziare le seguenti:
  • il tempo di esecuzione della maggioranza dei Kata è stato inferiore ai 15 minuti! Questo vuol dire, per esempio, che possiamo ripetere il Kata ogni mattina prima di metterci al lavoro, un po' come una forma di riscaldamento "muscolare", cercando ogni volta di ottimizzare maggiormente i tempi di sviluppo e affinare le tecniche adottate.
  • avete notato come, senza nessuna fretta di realizzare la funzionalità completa già al primo colpo, gli autori abbiano proceduto a piccoli passi, attendendo che l'esigenza di un certo design o implementazione emergesse dai requisiti e non perché era ovvio a priori? Adoro questi micro-passaggi.
  • l'importanza rivestita dalla leggibilità del test è imperativa, difatti esso viene rifattorizzato almeno una volta da quasi tutti gli autori. Il test rappresenta il requisito, che deve essere semplice, completo e chiaro come una documentazione, anzi esso è una documentazione, è documentazione dinamica ed eseguibile. Formidabile!
  • si tratta senz'altro di un benchmark ideale per valutare e confrontare diversi linguaggi utilizzati
  • eseguire un Kata è un approccio ideale anche per apprendere un nuovo linguaggio
  • alcuni autori hanno usato dei tool di BDD (Behavior Driven Development) per scrivere i test. Non lo trovate anche Voi un approccio molto elegante e al tempo stesso semplice?
  • avete visto com'è potente lavorare con il meta-programming in alcuni linguaggi come Ruby e C#, per esempio esso ci consente di estendere la classe String con nuovi e comodi metodi nei test? Pensate invece quanto codice di troppo si scrive spesso in Java! (anche se la libreria lambdaj di casa nostra aiuta molto)
Un ringraziamento va agli autori di questi Kata, perché ci consentono di apprendere tecniche e linguaggi nuovi con molta facilità. Vi starete chiedendo perché non figuri anche il mio nome nella lista. Non dubitate, ho anche io eseguito questo Kata svariate volte, sfiorando il tempo di pomodoro e appena arriverò ad un livello decente e di soddisfazione personale, provvederò a linkare la mia performance su uno screencast nei commenti a questo post. Per il momento il mio compito è quello di dare luce a questa gente in gamba.

Mi piacerebbe in futuro vedere e produrre una varietà di esecuzioni come questa anche per un'altro Kata molto interessante e che a me è piaciuto particolarmente: il Birthday Greetings Kata di Matteo Vaccari.

Conclusioni

Non ci sono più alibi: scrivere del buon codice e velocemente è possibile. Bisogna esercitarsi ovviamente. Se sei un datore di lavoro, ti consiglio di pretendere dal tuo team questo tipo di esercitazioni quotidiane. Lo stesso Osherove suggerisce di eseguire i Kata più volte al giorno fino a giungere al suo svolgimento in meno di 30 minuti (Kata completo). I risultati non si lasciano attendere, si vedono da subito. La qualità dal software che verrà nel tempo prodotto creerà un clima virtuoso, meritocratico e rilassato, permettendo all'organizzazione di alzare le proprie ambizioni commerciali ed economiche senza dover necessariamente aumentare i costi di sviluppo, anzi.