Cos'è il tempo?
Sant'Agostino rispondeva così a questa domanda: Se non me lo chiedono lo so!. Ed è proprio dietro a quel naturalmente di Nadia che si nasconde la genesi del problema, la risposta del padre della chiesa e fors'anche una sua possibile soluzione.
Nadia vuole che naturalmente, un'applicazione web, allo scoccare di un nuovo giorno notifichi ai suoi utenti un qualcosa,e quel naturalmente ha un doppio significato:
- la richiesta funzionale dell'invio di una notifica è una conseguenza necessaria che viene fuori quasi da sé come risultato naturale di come l'applicazione è stata pensata;
- il tempo dell'applicazione è naturalmente molto simile al tempo del mondo reale, ed è questa similitudine che rende scontato il fatto che, così come nel tempo reale ogni tanto succede qualcosa, anche nel tempo della nostra applicazione, ogni tanto deve succedere qualcosa: la spedizione di una notifica.
Tutto accade così naturalmente nel tempo che il tempo stesso è un dato quasi scontato, inutile da sottolineare o un'entità poco problematica. Eppure adesso abbiamo due problemi:
- scoprire che cos'è il tempo;
- creare un tempo dell'applicazione che sia il più possibile simile al tempo reale per far succedere qualcosa nel suo flusso.
Da Aristotele ad Einstein
Se vogliamo costruire il bitTempo o tempo di un'applicazione come una struttura il più possibile simile al tempo naturale allora risulta abbastanza chiaro il perché sia importante rispondere alla domanda su cosa sia il tempo reale. Per simulare al meglio qualcosa,dobbiamo farci un'idea dell'originale.
Come possiamo leggere qui sopra, Aristotele da una definizione del tempo per noi molto interessante. Per il filosofo greco infatti il tempo non esisterebbe se non ci fosse una qualsiasi sorta di movimento o cambiamento.
Credo che questa definizione si adatti benissimo al tempo di un'applicazione di tipo informatico. Pensate infatti ad un qualsiasi programma che rimanga in attesa che l'utente faccia qualcosa. Se l'utente non fa nulla, l'applicazione rimane sempre nel medesimo stato, dal suo punto di vista quindi, nulla è cambiato; è come se fosse congelata in quello stato che solo l'intervento umano può cambiare e quando ciò accade, ecco che improvvisamente il cambiamento di stato dell'applicazione implica una differenza e quindi in un qualche senso, un prima ed un poi.
La definizione aristotelica si adatta molto bene come tempo di una applicazione, ma essa non fa altro che mettere in luce in maniera ancora più evidente il problema che dobbiamo risolvere: a noi serve costruire un bitTempo che scorra e che faccia succedere qualche cosa anche se non cambia nulla nello stato dell'applicazione.
Newton
Newton, come S. Agostino, non si avventura in una definizione di tempo, giustificandosi con il fatto che la nozione di tempo è comune a tutti, tanto naturale come conoscenza da non richiedere nessun tipo di specificazione se non il chiarimento che la nozione comune di tempo è un po' come se fosse la brutta copia del tempo assoluto che scorre indipendentemente da tutto, regolarissimo e per sempre. Ciò che è più o meno regolare è la nostra misurazione del tempo, che può avvenire in relazione a qualche cambiamento, e può essere più o meno perfettibile.
Rispetto alla definizione aristotelica, qui il cambiamento o il movimento non è messo in relazione direttamente con il tempo, ma con la possibilità di misurarlo in qualche modo, più o meno imperfettamente. Il tempo è invece qualcosa che esiste da sé, perfetto nel suo scorrere, quasi fosse un sottofondo necessario attraverso il quale le cose accadono.
E' proprio il tempo newtoniano, quello che stiamo cercando per risolvere il nostro problema. Qualcosa che scorra indipendentemente dalle azioni che compie l'utente. Un contenitore dentro al quale far succedere qualcosa ogni qual volta il tempo scorre.
Einstein
La relatività ristretta di Einstein ci dice che il tempo non è assoluto ma dipende dal sistema di riferimento. Due osservatori in movimento relativo misureranno tempi diversi per gli stessi eventi.
Per la nostra applicazione web, però, possiamo tranquillamente ignorare la relatività: il nostro bitTempo sarà newtoniano, assoluto e universale per tutti gli utenti dell'applicazione.
Implementazione del bitTempo
La soluzione tecnica al problema consiste nel creare un thread che, indipendentemente dalle azioni dell'utente, scorra in background e scateni eventi periodici. Questo thread rappresenta il nostro bitTempo.
public class BitTempo extends Thread {
private long intervallo;
private boolean running = true;
public BitTempo(long intervallo) {
this.intervallo = intervallo;
}
public void run() {
while(running) {
try {
Thread.sleep(intervallo);
scatenaEvento();
} catch(InterruptedException e) {
// gestione interruzione
}
}
}
private void scatenaEvento() {
// notifica giornaliera agli utenti
}
}
Conclusioni
Abbiamo visto come il concetto di tempo, apparentemente semplice e naturale, nasconda in realtà complessità filosofiche e implementative. Per le nostre applicazioni web, il bitTempo newtoniano rappresenta la soluzione ottimale: un thread che scorre indipendentemente dalle azioni utente e permette di schedulare operazioni periodiche.
