Sunday 11 November 2012

Testing legacy code with Golden Master

As a warm up for SCNA, the Chicago Software Craftsmanship Community ran a hands-on coding session where developers, working in pairs, should test and refactor some legacy code. For that they used the Gilded Rose kata. You can find links to versions in java, C# and ruby here and for clojure here.

We ran the same session for the London Software Craftsmanship Community (LSCC) early this year and back then I decided to write my tests BDD-style (I used JBehave for that). You can check my solution here.

This time, instead of writing unit tests or BDD / Spec By Example to test every branch of that horrible code, I decided to solve it using a test style called Golden Master.

The Golden Master approach

Before making any change to the production code, do the following:
  1. Create X number of random inputs, always using the same random seed, so you can generate always the same set over and over again. You will probably want a few thousand random inputs.
  2. Bombard the class or system under test with these random inputs.
  3. Capture the outputs for each individual random input
When you run it for the first time, record the outputs in a file (or database, etc). From then on, you can start changing your code, run the test and compare the execution output with the original output data you recorded. If they match, keep refactoring, otherwise, revert back your change and you should be back to green.

Approval Tests

An easy way to do Golden Master testing in Java (also available to C# and Ruby) is to use Approval Tests. It does all the file handling for you, storing and comparing it. Here is an example:


For those not familiar with the kata, after passing a list of items to the GildedRose class, it will iterate through them and according to many different rules, it will change their "sellIn" and "quality" attributes.

I've made a small change in the Item class, adding a automatically generated toString() method to it:
The first time the test method is executed, the line:

Approvals.verify(getStringRepresentationFor(items));

will generate a text file, in the same folder where the test class is, called: GildedRoseTest.should_generate_update_quality_output.received.txt. That mean, ..received.txt

ApprovalTests then will display the following message in the console:

To approve run : mv /Users/sandromancuso/development/projects/java/gildedrose_goldemaster/./src/test/java/org/craftedsw/gildedrose/GildedRoseTest.should_generate_update_quality_output.received.txt /Users/sandromancuso/development/projects/java/gildedrose_goldemaster/./src/test/java/org/craftedsw/gildedrose/GildedRoseTest.should_generate_update_quality_output.approved.txt

Basically, after inspecting the file, if we are happy, we just need to change the .received with .approved to approve the output. Once this is done, every time we run the test, ApprovalTests will compare the output with the approved file.

Here is an example of how the file looks like:

Item [name=Aged Brie, sellIn=-23, quality=-44]
Item [name=Elixir of the Mongoose, sellIn=-9, quality=45]
Item [name=Conjured Mana Cake, sellIn=-28, quality=1]
Item [name=Aged Brie, sellIn=10, quality=-2]
Item [name=+5 Dexterity Vest, sellIn=31, quality=5]

Now you are ready to rip the GildedRose horrible code apart. Just make sure you run the tests every time you make a change. :)
Infinitest

If you are using Eclipse or IntelliJ, you can also use Infinitest. It automatically runs your tests every time you save a production or test class. It is smart enough to run just the relevant tests and not the entire test suite.  In Eclipse, it displays a bar at the bottom-left corner that can be red, green or yellow (in case there are compilation errors and the tests can't be run).

With this, approach, refactoring legacy code becomes a piece of cake. You make a change, save it, look at the bar at the bottom of the screen. If it is green, keep refactoring, if it is red, just hit CTRL-Z and you are back in the green. Wonderful. :)

Thanks

Thanks to Robert Taylor and Balint Pato for showing me this approach for the first time in one of the LSCC meetings early this year. It was fun to finally do it myself.

Monday 5 November 2012

Ratchet & Clank: intervista a Ted Price






Oggi raccontiamo la storia dietro le quinte di un’altra saga iconica del mondo PlayStation, creata dal celebre sviluppatore Insomniac Games. Lo studio di Burbank ha prodotto una marea di titoli per PlayStation memorabili, dall’amato platform per PSone Spyro the Dragon fino al profondo shooter Resistance 3 per PS3. Ma nel 2002 Insomniac è riuscita ad accattivarsi i favori dei giocatori hardcore e di quelli più attenti al canale mainstream con Ratchet & Clank, ibrido shooter-platform dal valore tecnico eccellente che sprizzava stile e carisma da tutti i pori.






Sono passati 10 anni da quel 4 novembre che ha visto debuttare Ratchet & Clank su PS2 e PlayStation.Blog ha incontrato Ted Price, presidente e CEO di Insomniac Games, per conoscere i segreti dietro lo sviluppo di questa pietra miliare dell’universo PlayStation. Per saperne di più sull’evoluzione di questa serie classica non perdete la gallery che racchiude 10 anni di concept art creata dal team del blog ufficiale PlayStation americano.








  • PlayStation Blog: Qual è stata l’idea alla base del gioco?



Ted Price, President and CEO, Insomniac Games: Dopo aver scartato il concept che avevamo chiamato “Girl with a Stick”, dovevamo inventarci qualcos’altro, e dovevamo farlo subito. Brian Hastings, il nostro Chief Creative Officer, ci suggerì l’idea di produrre un gioco su un alieno spaziale che aveva un bizzarro arsenale di gadget e armi. Citò Marvin il Marziano come fonte d’ispirazione. L’idea è piaciuta a tutti e abbiamo iniziato immediatamente a sviluppare il progetto.








  • PSB: Vi rendevate conto che stavate lavorando su qualcosa di speciale? Quali sono stati gli stati d’animo che vi hanno accompagnato nel processo creativo – incertezza, fiducia, terrore?



TP: Di solito non ci rendiamo mai conto che stiamo lavorando su qualcosa di speciale fino alle fasi che seguono l’ispirazione iniziale. Certe volte proviamo quella piacevole sensazione di “Sì, funziona!” mentre stiamo sviluppando il prototipo di un gioco, altre volte arriva durante la produzione più avanzata. Con Ratchet, in particolare, abbiamo capito che avevamo tra le mani qualcosa di promettente quando abbiamo sviluppato il livello test di Metropolis – uno dei primi mondi esplorabili nel gioco. C’era Ratchet che correva sulle piattaforme che componevano questa grande città circondato dal flusso del traffico spaziale. Si poteva scegliere di utilizzare il Cannone a Risucchio, l’Inceneritore, l’Artiglio e (mi pare) il Blastatore. Era molto fumo e niente arrosto perché ancora non stavamo utilizzando il motore grafico finale. Non avevamo creato completamente i poligoni degli edifici. Potevi solo visitare il mondo solo per pochi metri. Ratchet aveva una carnagione “bruna” (sembrava quasi un mutante). Se non ricordo male non c’erano neanche i nemici. Ma quello che avevamo fatto fino a quel momento è stato sufficiente per convincere noi e Sony che il prodotto aveva del potenziale.








  • Avete preso ispirazione da qualcosa in particolare per il look del gioco e per la sua atmosfera?



TP: Abbiamo preso ispirazione dalle fonti più disparate. Cartoni animati, film di fantascienza, cultura pop… Sicuramente abbiamo inserito riferimenti giocosi ad altri proprietà intellettuali, nei concept iniziali così come nei giochi successivi. Captain Qwark è stato ispirato in parte a The Tick. Metropolis con le sue automobili volanti e le sue gole cittadine è un riferimento al Quinto Elemento. Courtney Gears di Ratchet & Clank 3: Up Your Arsenal era una presa in giro di Britney Spears che all’epoca era molto popolare. Ma queste sono eccezioni più che regole. Gran parte di quello che vedete nei giochi della serie è il risultato delle intuizioni avute dal nostro team mentre si divertiva a sviluppare un universo con pochissimi paletti e costrizioni.








  • Era un titolo molto ambizioso per l’epoca. Quali sono state le sfide più grandi che avete incontrato durante il processo creativo che vi ha portato a sviluppare le vostre idee originali?



TP: Rimanere nei binari del progetto iniziale è stata (ed è ancora) la nostra sfida più grande. Stavamo sviluppando una nuova IP su una nuova piattaforma e avevamo poco tempo per farlo. Sapevamo che dovevamo produrre un gioco ambizioso per farlo emergere dalla massa dei giochi di quel periodo; ma sapevamo anche che se avessimo messo troppa carne al fuoco il gioco sarebbe risultato pericolosamente sciocco. Fare i conti con questo vero e proprio terno a lotto non è facile ancora oggi: le aspettative dei giocatori sono sempre altissime ogni volta che sviluppiamo un nuovo titolo.










  • Quanto si avvicina il gioco finito alle vostre idee di partenza?



TP: Non lo so con sicurezza. Qualcuno di noi considera “Girl with a Stick” una parte importante della genesi di Ratchet. Sicuramente Ratchet deve qualcosa a quel concept in termini di meccaniche ed idee. Detto questo, sia Ratchet che Resistance hanno subito dei cambi drastici durante lo sviluppo che li ha portati ad essere dei prodotti finiti. Anche se la versione finale di Ratchet su PS2 ha avuto cambi meno pesanti rispetto al normale. Ratchet ha cambiato aspetto durante lo sviluppo. Quando mi capita di vedere il modello originale vedo una grande differenza rispetto al modello definitivo. Abbiamo anche continuato ad aggiungere elementi nel gioco mentre cercavamo di capire cosa funzionasse e cosa no.








  • Di quali elementi di gioco siete maggiormente orgogliosi?





TP: Le armi folli! Venendo da Spyro, una serie in cui il protagonista non poteva usare delle armi (esclusi il suo fiato infuocato e le sue corna), credo che molti di noi non vedevano l’ora di tornare nel regno delle armi distruttive e fuori misura. Avevamo già visitato quel mondo grazie a Disruptor ma poi ci siamo persi quattro anni di pausa per studiare i quadrupedi viola. Abbiamo utilizzato lo stratagemma delle armi anche per far risaltare Ratchet rispetto agli altri platform, inclusi Spyro 1 & 2, genere che sembrava perennemente legato ai salti, ai colpi in testa e ai pugni. Infine, secondo me, creare delle armi che non rispondevano alle regole del mondo reale ci dava la possibilità di creare a ruota libera – che è l’obiettivo a cui molti nella nostra industria aspirano. Non importava di che TIPO fosse l’arma, l’importante era che fosse soddisfacente e divertente da usare. Questi erano gli unici due parametri che rientravano nel mondo di gioco.








  • Come vuoi che venga ricordato Ratchet & Clank? Cosa ha portato al mondo dei videogiochi?



TP: Ratchet è ancora vivo e vegeto, visto che Full Frontal Assalut uscirà fra qualche settimana. Molti alla Insomniac sono orgogliosi del fatto che Ratchet & Clank sia uno degli ultimi platform esistenti e ancora in piena forma. Pensiamo che Ratchet abbia contributo allo sviluppo dei platform e gli action game in generale usciti nell’ultima decade e mezzo. Per fare un esempio, vedere un menu radiale per la selezione rapida delle armi negli altri giochi è un complimento per noi, perché credo che Ratchet sia stati il primo gioco ad averne uno (ma potrei sbagliare). E sto ancora aspettando di vedere il Pecorator in un altro gioco. Ad essere sinceri, credo che Heretic (1994) ed Hexen (1995) siano stati i primi giochi ad avere armi che trasformavano i nemici in animali da fattoria.








  • Quale personaggio di Ratchet & Clank ti è rimasto nel cuore?





TP: Captain Qwark. Lo amo perché è un personaggio esagerato, sempre sicuro di sé al 100%, e di solito si sbaglia. Mia moglie dice che conosce delle persone così. Sto ancora cercando di capire di chi stia parlando.

Saturday 3 November 2012

Speciale: i 10 videogiochi più venduti nella storia della prima PlayStation






Quali sono i 10 videogiochi più venduti nella storia della prima PlayStation? Guardando i dati di VGChartz possiamo scoprire che nella Top 10 dei giochi più venduti su PlayStation, un gioco è stato
rilasciato nel 1996, tre sono stati rilasciati nel 1997, altri tre sono stati
rilasciati nel 1998, e tre sono stati rilasciati nel 1999.

 





Sommando questi primi 10 giochi più venduti su PlayStation si ottiene un totale di 79.080.000 copie! Solo un gioco, Gran Turismo, è riuscito a superare la soglia dei 10 milioni di unità vendute. Tuttavia tutti i 10 titoli hanno facilmente superato i 6.000.000 di unità vendute. E' possibile notare anche la perfetta parità numerica tra i titoli First Party e i titoli Terze Parti. I cinque giochi First Party hanno però piazzato un totale maggiore di copie con ben 42.040.000 di unità o il 53,2% del totale, mentre i cinque giochi Terze Parti hanno piazzato 37.040.000 di unità o
il 46,8% del totale dei giochi venduti nella top 10.

 

Gran Turismo, Final Fantasy e Crash Bandicoot sono stati i tre brand più importanti per il
successo di PlayStation. La serie Gran Turismo riesce a primeggiare con i suoi due capitoli presenti nella Top 3 per un totale di 20.510.000 di unità o 25,9% del totale dei giochi venduti nella top 10. I due Final Fantasy presenti nella top 10 hanno invece venduto un totale di 17.580.000 di unità o il 22,2% del totale. La serie Crash Bandicoot appare nella top 10 con tutti e tre i capitoli principali riuscendo a superare nel complesso anche la serie Gran Turismo con un totale di 21.530.000 di unità o il 27,2% del totale dei giochi venduti nella top 10.









Analizzando le vendite di software PlayStation in generale, possiamo segnalare che ben altri 18 giochi hanno superato i cinque milioni di unità ed altri 66 hanno venduto due milioni o più di unità. Altri 206 giochi hanno superato il milione o più di unità e altri 383 giochi hanno venduto 500.000 o più unità. Infine 730.73 milioni di giochi sono stati venduti su PlayStation e tra questi ben 212.51 milioni appartengono a titoli First Party, cioè realizzati da Sony.