Promemoria ricorrenti: come gestire la complessità nascosta
"Aggiungi un promemoria ogni martedì." Sei parole. Facile a dirsi. Ma dietro questa frase si nasconde uno dei problemi più sottovalutati dello sviluppo di applicazioni: le regole di ricorrenza. Ho passato giorni interi a gestire casi limite che nessuno anticipa prima di incontrarli.
Punti chiave da ricordare:
- I promemoria ricorrenti sembrano semplici ma nascondono un'enorme complessità (gestione di mesi irregolari, fusi orari, eccezioni).
- L'archiviazione ibrida (regola sul genitore, occorrenze generate su richiesta) è il miglior compromesso tra prestazioni e flessibilità.
- L'UX progressiva — semplice per impostazione predefinita, potente come opzione — è la chiave per non perdere nessun utente.
- Un buon sistema di ricorrenza richiede almeno 4 tipi di regole e una robusta gestione dei casi limite.
Perché i promemoria ricorrenti sono così complessi da implementare?
Quando pensi a "promemoria ricorrente", probabilmente immagini un semplice setInterval o un cron job. La realtà è molto più contorta. TAMSIV supporta quattro tipi di ricorrenza: quotidiana, settimanale, mensile e personalizzata. Il caso quotidiano richiede 10 minuti per essere codificato. Il caso "l'ultimo venerdì di ogni mese"? Giorni.
Il problema fondamentale è che il calendario non è regolare. I mesi hanno 28, 29, 30 o 31 giorni. Le settimane si sovrappongono ai mesi. Esistono gli anni bisestili. E i fusi orari aggiungono un ulteriore strato di caos.
Come sviluppatore singolo di TAMSIV, ho dovuto prendere decisioni architettoniche critiche fin dall'inizio per evitare di dover rifattorizzare tutto in seguito.
Come gestire il problema del "31 di ogni mese"?
Questo è il caso classico che ogni sviluppatore di calendari teme. L'utente crea un promemoria il 31 gennaio con ricorrenza mensile. Cosa succede a febbraio? Ad aprile?
Esistono tre approcci:
- Saltare il mese: nessun promemoria a febbraio. Cattiva UX — l'utente pensa che sia un bug.
- Spostamento all'ultimo giorno: il promemoria passa al 28 (o 29) febbraio, 30 aprile, ecc. È intuitivo.
- Forzare il 1° del mese successivo: logico per alcuni casi, ma fuorviante.
Ho scelto l'opzione 2 — lo spostamento automatico all'ultimo giorno del mese. Perché? Perché è quello che l'utente si aspetta senza pensarci. Quando qualcuno dice "ogni mese", intende "più o meno alla stessa data ogni mese". Il pragmatismo batte il rigore matematico.
Questa scelta ha un impatto diretto sul codice. Per ogni occorrenza, calcolo prima la data teorica, poi verifico se esiste nel mese target con Math.min(giornoOriginale, ultimoGiornoDelMese). Semplice in apparenza, ma deve essere fatto per ogni occorrenza generata.
Qual è il miglior modello di archiviazione per gli eventi ricorrenti?
Questa è la domanda architettonica chiave. Due scuole si scontrano:
Opzione A: archiviare tutte le occorrenze. Generi 365 righe nel database per un promemoria quotidiano annuale. Vantaggio: query semplici. Svantaggio: esplosione del database e complessità di modifica (cambiare l'ora del promemoria = modificare 365 righe).
Opzione B: archiviare solo la regola. Mantieni "ogni martedì alle 9" e calcoli al volo. Vantaggio: database leggero. Svantaggio: query complesse per sapere "quali promemoria cadono questa settimana?".
Ho optato per un modello ibrido in TAMSIV: la regola di ricorrenza è archiviata sull'evento genitore, e le occorrenze sono generate su richiesta. Quando un promemoria viene convertito in un evento del calendario — ad esempio tramite il sistema di agenda con filtri — un'occorrenza concreta viene creata nel database.
Concretamente, la struttura del database assomiglia a questo:
- Tabella genitore: contiene il titolo, la descrizione e un campo JSON con la regola di ricorrenza (
type,interval,daysOfWeek,endDate) - Tabella occorrenze: creata su richiesta quando l'utente interagisce (completa, posticipa, modifica)
- Calcolo dinamico: per la visualizzazione del calendario, le occorrenze future sono calcolate lato client
Questo modello ibrido consente di evitare le query N+1 mantenendo il database sotto controllo. Con il sistema di cache ottimizzato, le prestazioni rimangono eccellenti anche con centinaia di promemoria.
Come creare un promemoria ricorrente tramite voce?
Uno dei vantaggi unici di TAMSIV è che puoi creare promemoria complessi parlando naturalmente. La pipeline vocale AI analizza la tua frase ed estrae automaticamente la regola di ricorrenza.
Esempi concreti:
- "Ricordami di annaffiare le piante ogni 3 giorni" → ricorrenza personalizzata, intervallo 3 giorni
- "Riunione del team ogni lunedì e mercoledì alle 10" → settimanale, giorni specifici
- "Pagare l'affitto il primo di ogni mese" → mensile, giorno fisso con gestione dei casi limite
- "Compleanno di Maria il 15 marzo ogni anno" → annuale
Il LLM (tramite OpenRouter) scompone la frase in intenzioni strutturate. La funzione create_calendar_event riceve quindi un oggetto con i parametri di ricorrenza già estratti. L'utente deve solo convalidare — o modificare — prima del salvataggio nel database.
Questa è la forza del dittafono integrato: rendere invisibile la complessità tecnica per l'utente finale.
Quali sono le insidie dei fusi orari con i promemoria?
Se pensi che i mesi irregolari siano fastidiosi, aspetta di vedere i fusi orari. Un promemoria quotidiano alle 9 si attiva alle 9 ora locale. Ma cos'è "9 ora locale" quando l'utente viaggia? Quando interviene il cambio dell'ora legale/solare?
Due possibili strategie:
- Archiviare in UTC e convertire al rendering: pulito ma problematico per "9 tutti i giorni" (che può diventare 8 o 10 a seconda della stagione)
- Archiviare in ora locale con fuso orario: più fedele all'intenzione ma più complesso da gestire nel database
In TAMSIV, ho optato per l'archiviazione in UTC con il fuso orario di riferimento dell'utente. Quando il calcolo dell'occorrenza cade in un giorno di cambio dell'ora, il sistema si adatta per mantenere l'ora locale stabile. Questo è il comportamento che si aspettano gli utenti di Google Calendar o Apple Calendar.
Come progettare l'UX dei promemoria senza sopraffare l'utente?
La sfida UX è altrettanto importante quanto la sfida tecnica. Come presentare regole di ricorrenza potenzialmente complesse senza perdere l'utente occasionale?
La risposta: il design progressivo (progressive disclosure).
Ecco come l'ho implementato in TAMSIV:
- Livello 1 — 4 pulsanti semplici: Ogni giorno, Ogni settimana, Ogni mese, Nessuna ricorrenza. Copre l'80% delle esigenze.
- Livello 2 — Pannello avanzato: accessibile tramite "Personalizza". Giorni della settimana selezionabili, intervallo personalizzato (ogni N giorni/settimane/mesi), data di fine opzionale.
- Livello 3 — Casi complessi: "L'ultimo venerdì del mese", "Il 2° martedì di ogni mese". Interfaccia specializzata per queste regole rare.
Il principio guida: semplice per impostazione predefinita, potente come opzione. L'utente occasionale non deve mai sentirsi perso. L'utente avanzato non deve mai sentirsi limitato. Questo principio guida anche il sistema di onboarding dell'applicazione.
Ho anche implementato la navigazione tramite swipe nelle schermate dei promemoria per fluidificare l'esperienza.
Qual è la differenza con i promemoria di Google Calendar o Todoist?
Le soluzioni esistenti come Todoist o Google Calendar gestiscono bene le ricorrenze. Ma hanno tutte lo stesso difetto: l'inserimento manuale.
Con TAMSIV, la creazione vocale cambia fondamentalmente l'equazione. Dire "ricordami di inviare il rapporto ogni venerdì alle 17" è incomparabilmente più veloce che navigare in 3 menu per configurare la stessa cosa manualmente.
Inoltre, il sistema di gamification ricompensa il completamento dei promemoria ricorrenti, il che crea un circolo virtuoso di produttività. Ogni attività ricorrente completata alimenta la tua serie e ti avvicina al livello successivo.
Quali lezioni trarre dall'implementazione delle ricorrenze?
Dopo aver codificato questo sistema, ecco le lezioni che ne traggo:
- Non sottovalutare i casi limite: il "31 del mese", gli anni bisestili, i cambi d'ora — ogni caso sembra raro individualmente, ma collettivamente toccano migliaia di utenti.
- Testare con dati reali: i test unitari non bastano. Bisogna simulare un intero anno di occorrenze e verificare visivamente.
- Il modello ibrido è il giusto compromesso: né tutto nel database, né tutto calcolato. Il mix offre il meglio dei due mondi.
- L'UX progressiva salva vite: nascondere la complessità dietro livelli di dettaglio è l'unico approccio praticabile per un'app di massa.
Se stai sviluppando un'app di produttività o un sistema di calendario, non sottovalutare mai i promemoria ricorrenti. Quella che sembra una funzionalità da 2 giorni può facilmente richiederne 10.
FAQ
Quanti tipi di ricorrenza supporta TAMSIV?
TAMSIV supporta quattro tipi principali: quotidiana, settimanale, mensile e personalizzata. La modalità personalizzata consente di definire qualsiasi intervallo (ogni N giorni, alcuni giorni della settimana, ecc.) e copre casi avanzati come "l'ultimo venerdì del mese".
È possibile creare un promemoria ricorrente tramite voce?
Sì, è uno dei punti di forza di TAMSIV. Puoi dire "ricordami di inviare il rapporto ogni lunedì alle 9" e l'IA comprende automaticamente il tipo di ricorrenza, il giorno e l'ora. Basta convalidare per creare il promemoria.
Cosa succede se un promemoria mensile cade in un giorno che non esiste?
TAMSIV sposta automaticamente il promemoria all'ultimo giorno del mese. Ad esempio, un promemoria del 31 sarà anticipato al 28 o 29 a febbraio, e al 30 ad aprile, giugno, settembre e novembre. Questo è il comportamento più intuitivo per l'utente.
I promemoria ricorrenti funzionano con la gamification?
Assolutamente. Ogni completamento di un promemoria ricorrente ti fa guadagnare punti esperienza e alimenta la tua serie quotidiana. È un ottimo modo per mantenere una routine produttiva e rimanere motivato a lungo termine.
Come modificare o eliminare una singola occorrenza di un promemoria ricorrente?
Puoi modificare o eliminare un'occorrenza specifica senza influenzare le altre. Il sistema crea quindi un'eccezione per quella data. Il resto della serie continua normalmente secondo la regola definita.