Ogni altra schermata di questa app l'hai scelta tu di aprire. Questa no — hai toccato qualcos'altro, e il blocco ti ha intercettato. Questa differenza cambia completamente il compito ingegneristico. Una schermata che hai richiesto può metterci un attimo ad arrivare; nessuno controlla il cronometro. Una schermata che ti interrompe ha una sola occasione per non sembrare un difetto del telefono, e deve dimostrarlo in meno di un terzo di secondo.
L'unica misura che conta
Non la durata dell'animazione introduttiva — l'attesa prima che inizi. Porta, ingresso, pavimento, soffitto, lavagna, insegna, orologio: la sequenza ha una tabella di marcia fissa, e ognuno di quei ritardi è stato scelto e ricontrollato a mano. Niente di tutto ciò conta se il tocco stesso ha un'esitazione davanti a sé. Un ingresso magnifico da 800ms dietro un fotogramma bianco vuoto da 400ms si legge come "questa app è lenta", punto — la cura non viene mai vista, perché il verdetto è già arrivato sul fotogramma vuoto.
Quindi l'obiettivo reale non è "l'animazione sembra fluida". È "qualcosa appare prima che l'utente abbia il tempo di chiedersi se il tocco sia stato registrato". È più o meno lo stesso margine di un cambio app di sistema — un paio di centinaia di millisecondi — ed è un criterio molto più severo di quello a cui vengono sottoposte la maggior parte delle transizioni interne all'app.
Mai bloccare il blocco
L'aula non può aspettare la rete. Qualunque domanda venga posta deve provenire da dati già presenti sul dispositivo prima del tuo tocco — recuperati e messi in cache in anticipo, alle tue condizioni, non richiesti nel momento in cui sei già infastidito e fissi una rotellina di caricamento. Se quella cache dovesse mai essere vuota, il fallimento onesto è una carta domanda più semplice e statica, non una rotellina di caricamento davanti a un insegnante che non si è ancora presentato.
La stessa regola vale per le risorse. Una richiesta di font o il recupero di un'immagine sul percorso critico è una dipendenza dal fatto che la rete sia veloce nel preciso momento in cui sei nel mezzo di un'interruzione, che è esattamente quando hai meno pazienza per aspettare. Ospitare in autonomia i quattro font usati da questo sito è lo stesso istinto applicato all'app: niente di ciò che serve all'introduzione dovrebbe poter fallire perché qualcuno è collegato a un pessimo Wi-Fi d'albergo.
Dove vanno davvero i fotogrammi
Solo proprietà di animazione economiche — posizione e opacità, il tipo che un telefono può muovere senza dover ricalcolare il layout sottostante, mai qualcosa che forzi un reflow a metà sequenza. Un'aula che deve comparire così spesso non può permettersi nemmeno una proprietà costosa su un dispositivo datato, perché "dispositivo datato" qui non è un caso limite — è una fetta consistente di chi tiene in mano il telefono nel momento esatto in cui sta cercando di aprire qualcosa di bloccato.
Il corollario è che la maggior parte di ciò che sembra movimento nell'introduzione è in realtà pochissimo movimento, messo in scena bene. Una porta che si apre, una figura che cammina per quattro passi, una lavagna che scatta al suo posto — non sono molti pixel che cambiano, sono molti pixel che cambiano *a tempo*, il che è un trucco più economico di quanto sembri dall'esterno.
Di cosa non siamo ancora sicuri
L'avvio a freddo è il vero punto debole. La primissima interruzione dopo il riavvio del telefono o dopo che l'app è stata terminata in background è più lenta di tutte quelle successive, perché nulla è ancora "caldo" — nessuna domanda in cache, nessun font già interpretato, nessun bundle JS già residente in memoria. Non abbiamo una soluzione pulita per questo costo del primo tocco, se non tenere l'app il più leggera possibile e sperare che il sistema operativo non la termini troppo aggressivamente. Se il tuo primissimo blocco della giornata sembra un attimo più lento degli altri, è per questo, e non è qualcosa che abbiamo scelto di ignorare.
Gli Android di fascia bassa sono l'altra questione aperta — i telefoni per cui questo conta di più, dato che un intoppo di due secondi lì rappresenta una frazione molto più grande di un margine di 300ms rispetto a un top di gamma. Stiamo progettando tenendo conto di quel vincolo, non del dispositivo che capita di avere in mano.