In questi ultimi giorni ho, volente o nolente, parecchio a che fare con Enel. L’esperienza utente con i sistemi Enel spazia dal piuttosto pietoso al disastroso.

Lasciatemi usare l’ultima cosa che mi è appena successa come spunto per una riflessione:

  • alle 17.50 mi arriva un SMS che mi informa di controllare la mail
  • secondo loro dovrei cliccare sul link presente nella mail per completare la procedura di attivazione della bolletta online
  • alle 18.43 la mail non è ancora arrivata

E uno si chiede: come credi si possa sentire un non informatico in questa situazione? Come minimo brancola nel buio. Tra un’oretta comincia a chiedersi dove ha sbagliato; infine domani mattina chiamerà il servizio clienti.

Ovvio che è sbagliato

Lo sottolineo giusto così per precauzione, un approccio come il seguente è sbagliato, ripetete con me sba | glià | to.

using( var tx = new TransactionScope() )
{
   UpdateCustomerStatus(123, true);
   SendMail(MailType.OnlinePaymentActivation);
   SendSMS(SMSType.OnlinePaymentActivation);
}

La cosa che più mi fa imbestialire è che un mondo complesso come quello di Enel è forse il mondo in cui sarebbe più semplice risolvere il problema di cui sopra.

Un errore terribile

In sistemi complessi le parti sono tante, le applicazioni ancora di più i servizi di appoggio non si smette mai di censirli. In sistemi complessi la comunicazione non può essere sincrona e lo snippet usato come esempio nasconde un errore terribile.

Nasconde la convinzione che farsi un bus fatto in casa ricada sotto il vecchio adagio: ma si, che ci vuole.

Quel codice esprime un intento che dovrebbe essere:

using( var tx = new TransactionScope() )
{
   UpdateCustomerStatus(123, true);
   QueueSendMail(MailType.OnlinePaymentActivation);
   QueueSendSMS(SMSType.OnlinePaymentActivation);
}

Nel qual caso diventerebbe ovvio che accodare l’invio dell’SMS è pericoloso perché se il servizio di invio mail è giù generiamo immediatamente il pastrocchio di cui sopra.

Tutta la nostra vita è una macchina a stati

Quindi perché fare tutti questi sforzi per negarlo? Non sarebbe molto più semplice prendere atto della cosa e progettare il software con questa innegabile verità come linea guida?

  1. Aggiorno lo stato del cliente
  2. Pubblico un evento significativo
  3. Reagisco all’evento e invio la mail relativa
    1. Attendo conferma che la mail sia sul server di posta del destinatario*
  4. Pubblico un evento significativo
  5. invio l’SMS

Sono le 19.11 e della mail ancora nessuna traccia.

* che è quello che fa Amazon, non è al 100% affidabile ma abbatte il numero di casistiche di inconsistenza, e di conseguenza il numero di chiamate al servizio clienti.