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?
- Aggiorno lo stato del cliente
- Pubblico un evento significativo
- Reagisco all’evento e invio la mail relativa
- Attendo conferma che la mail sia sul server di posta del destinatario*
- Pubblico un evento significativo
- 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.