divendres, 14 de novembre de 2008

En Bunny i els Statics

Bé, es veu que en Bunny va aterrar a un altre país amb la seva caseta, però això és una altre història que explicaré algun altre dia.

El punt és que en Bunny es va haver de malguanyar la vida treballant de programador d'aplicacions distribuïdes. Bé, un dia en Bunny va tenir un problema.

En Bunny programava en Java sabeu? Estava remenant una part crítica d'un sistema, estava fent unes modificacions bastant importants i urgents i clar, s'havia de testejar bé abans de que els canvis fossin 'live' com en diuen aquí.

Com tot bon conillet programador en Bunny sabia que els canvis havien de passar una sèrie de Unit Tests. Cap problema! En Bunny va fer els canvis, va pujar el codi al Subversion de l'empresa i va esperar que el sistema d'integració continua confirmés que el que havia fet anava bé.

Ostres tu! Hi havia dos tests que fallaven, que estrany! Si a la màquina d'en Bunny no fallaven! Bé, doncs res, en Bunny mira l'error, torna a còrrer els tests i carai tu, ara si que fallen, estrany, molt estrany.

Vinga va tornem-hi. Ara només en falla un, però que estrany!, vinga va, en Bunny treu el debugger i comença a còrrer pel codi. Res de res, de cop tota l'execució rebenta i apareix un stack trace amb un NullPointerException de 25 linies de profunditat que anava a parar dins del codi del framework que estava utilitzant. Això pinta sèrio.

Mira per aquí, mira per allà, ara el test falla, ara no, ara bé del framework, que està llegint un fitxer, però què és nul? I per què no fallen els altres tests, si és exactament el mateix!

Mira que miraràs.... vinga va, que en Bunny ja feia dos hores ben bones que estava buscant l'error. Es gira i agafa a la morsa que té al cantó, aquesta, amb tota la bona voluntat del món l'intenta ajudar. Res de res. I el pingüí que és un expert en debuggers i Junit tests? Res!!! tampoc el pot ajudar, ningú troba l'error. En Bunny es posa nerviós, havia dit que allò aniria “live” aquesta setmana.... bé, ànims, és dilluns :)

Dijous:
En Bunny té ulleres de no dormir, 11 hores de jornada laboral diàries. Els testos continuen fallant aleatòriament. Les tasses de café i les pastanagues mig rosegades s'apilonen als voltants de la seva taula. En Bunny està desesperat pobret. El pingüí expert en debuggers i Junit tests s'apiada d'ell, se li assenta al cantó i el torna a ajudar.

Mira per aquí, mira per allà, el debugger es torna boig, no troba les classes, ara peta, ara no... i de cop el pingüí obre els ulls com plats i diu:

Bunny, why is this object static?

En Bunny mira i veu que a la classe base de la que hereda el test que falla hi ha una variable que està declarada així:

private static LookupHelper lookupHelper;

Els testos que fallen tenen dues funcions que corren paral·leles, les dues funcions criden a classes que hereden d'aquesta classe base, les dues modifiquen el fitxer, i per tant toquen l'InputStreamReader que està contingut dins el LookupHelper.

El LookupHelper està declarat static.
Els dos objectes fan servir el mateix LookupHelper.
Els testos funcionen per race condition.

Sang, foc i destrucció.

Teorema de l'static: Si fas servir static és que no ho estàs fent bé.
Corol·lari 1: Si algú et diu que els statics van bé, aquest algú no t'estima.
Corol·lari 2: Aquest algú es mereix morir.

2 comentaris:

Neus ha dit...

No he entès res de res, però m'ha fet riure. M'agradaria saber qui és el pingüí i la morsa... :)

Lluís R. ha dit...

Està clar, les coses estàtiques són caduques, del passat, no evolucionen, incordien i per tant no valen res.

Mort a tot lo estàtic.

Viva tot lo que sigui dinàmic!