20 ottobre 2014

Reverse Millennium bug

Ebbene si... il Millennium bug esiste ed è esistito (anche se non ha prodotto eventi catastrofici come ci hanno fatto credere ne I Simpson) ma non solo! Esiste pure la sua variante che personalmente ho scoperto in questa fetenzia di progetto sul quale ho lavorato per circa 3 anni!

Dovete sapere che MultinazionaleCazzara ha un modo di fare un po' particolare: tende ad acquistare progetti di software inizialmente creati da piccole aziende, per poi gestirli in proprio e rivendere il prodotto a clienti più o meno grossi. Si tratta di programmi/portali/qualisasialtracosaeseguibilesuunserver che difficilmente potrebbero essere venduti senza un grande nome dietro, poiché i ClientiPecoroni che MC riesce a contattare valutano lo stesso solo in base al marchio che ci sta sopra. Poco importa se il prodotto in questione è una ciofeca progettata e sviluppata a canem cazzum come dicevano gli antichi Romani: basta una banalissima demo per far impressionare MC e convincerla a poterci fare soldoni, tralasciando completamente un'analisi della parte tecnica.

Questo prodotto, a cui è stato dato il nome di un animale istinto per cui per comodità lo chiamerò DODO, ha più di 10 anni ed ha praticamente visto tutte le possibili tecnologie e framework Java esistenti. E quando dico "visto" intendo che nello stesso progetto (composto però da più moduli) sono stati usati proprio TUTTI i framework e standard di tendenza: si è partito con la tripletta Struts+Spring+Hibernate, con supporto di un gran numero di framework JS (usati tutti pure sulla stessa pagina) tra cui JQuery, Prototype, DWR e Dojo per arrivare a roba un po' più recente come JPA, CDI, EJB3 ed altro. Alcuni moduli per fortuna sono stati rifatti da zero, altri invece non hanno avuto ancora modo di ricevere l'eutanasia e sono diventati praticamente l'esempio migliore di quello che si definisce vero software legacy, roba per cui il termine "spaghetti code" è poco esplicativo.

Tanto per mettere il dito nella piaga, la grande idea di MC nell'acquistare DODO fu anche quella di non usare un team locale di sviluppatori per il mantenimento e lo sviluppo di nuove funzionalità ma di usare invece un team di Cinesi di MC, poiché costano molto di meno.

Ebbene si... pure nel magico mondo del bodyrentalconsulenza dobbiamo avere paura del made in china. Ma ovviamente come lo è per i prodotti fisici fatti dai Cinesi, anche quelli software fanno cagare e si rompono solo dopo un paio di giorni di utilizzo.

Ed è proprio uno di questi Cinesi dal nome impronunciabile che è stato in grado di creare un Reverse Millenium bug.

Come ha fatto? Semplice... in DODO c'è la necessità di estrarre da un oggetto di tipo java.util.Date una stringa nel formato yyDDD, ovvero una stringa contenente le due cifre dell'anno e le tre cifre per indicare il giorno nell'anno.

Per esempio il 20 ottobre del 2014 diventerebbe 14293.

Il Cinese in questione che chiamerò Sohunasegahio non conosce la teoria del "mai reinventare la ruota" (teoria molto importante di cui cercherò di parlare più approfonditamente più in là) ed è convinto che non si possa implementare una funzionalità del genere in queste tre righe di codice:

Date date = new Date();
SimpleDateFormatter formatter = new SimpleDateFormatter("yyDDD");
String code = formatter.parse(date);

Sohunasegahio ha pensato invece di implementare un algoritmo di una trentina di righe (che purtroppo non posso incollarvi) che fa dei calcoli astrusi con divisoni, multipli, sottomultipli e cazzi e mazzi chiamando addirittura metodi a cascata.

In ogni caso l'algoritmo implementato da Sohunasegahio funziona perfettamente... solo per le date il cui anno è compreso tra il 2000 e il 2100. Anche basandosi sulla speranza che DODO non vedrà mai il finire di questo secolo, rimangono purtroppo le date comprese nel 900, che producono dei codici lunghi dalle 6 alle 8 cifre che ovviamente non corrispondono al voluto.

La fortuna di Sohunasegahio però sta nel fatto che tale algoritmo, per circostanze che non sto a spiegarvi, elaborerà sempre e comunque date non troppo passate rispetto alla data odierna, per cui non c'è mai stata e probabilmente né ci sarà mai la possibilità per cui si scoprirà effettivamente questo bug.

L'algoritmo non l'ho toccato minimamente poiché è diventato il punto di riferimento sulla mia tesi: Un team di sviluppatori di Indiani o Cinesi potrebbe pure risultare conveniente in termini di costi, ma se tu paghi in noccioline non stupirti poi se a lavorare sul tuo progetto ci stanno delle scimmie ammaestrate che farebbero meno danni a lavorare nelle risaie.


Nessun commento:

Posta un commento