Elk ander scherm in deze app heb je zelf geopend. Dit scherm niet — je tikte op iets anders, en de blokkade greep in plaats daarvan in. Dat verschil verandert de technische opdracht compleet. Een scherm dat je zelf hebt aangevraagd, mag best een moment op zich laten wachten; niemand kijkt daarbij op een stopwatch. Een scherm dat je onderbreekt, krijgt maar één kans om niet aan te voelen als een hapering in je telefoon, en die kans moet het waarmaken in minder dan een derde van een seconde.
De enige meting die telt
Niet de lengte van de intro-animatie — de leegte vóórdat die begint. Deur, binnenlopen, vloer, plafond, bord, bordje, klok: de reeks heeft een vaste tijdlijn, en elk van die vertragingen is met de hand gekozen en opnieuw gecontroleerd. Niets daarvan doet ertoe als de tik zelf al hapert. Een prachtige entree van 800ms achter een leeg wit beeld van 400ms leest als "deze app is traag", punt uit — die finesse wordt nooit gezien, omdat het oordeel al geveld is bij het lege beeld.
Het echte doel is dus niet "de animatie oogt soepel". Het is "er verschijnt iets voordat de gebruiker de tijd heeft om zich af te vragen of zijn tik wel is aangekomen". Dat is ongeveer hetzelfde budget als het wisselen tussen systeem-apps — een paar honderd milliseconden — en dat is een veel strengere lat dan de meeste overgangen binnen een app moeten halen.
Blokkeer de blokkade nooit
Het klaslokaal kan niet op het netwerk wachten. Welke vraag er ook gesteld wordt, die moet komen uit gegevens die al op het toestel stonden voordat je tikte — vooraf opgehaald en gecachet, op jouw voorwaarden, niet pas aangevraagd op het moment dat je al geïrriteerd naar een laadwieltje staart. Is die cache ooit leeg, dan is de eerlijke uitweg een eenvoudigere, statische vraagkaart — geen laadwieltje voor een leraar die nog niet is komen opdagen.
Dezelfde regel geldt voor assets. Een lettertype- of afbeeldingsverzoek op het kritieke pad is een afhankelijkheid van een snel netwerk, precies op het moment dat je middenin een onderbreking zit — en dus precies wanneer je het minste geduld hebt. Dat deze site zijn vier lettertypen zelf host, is dezelfde ingeving toegepast op de app: niets wat de intro nodig heeft mag kunnen mislukken omdat iemand op belabberde hotel-wifi zit.
Waar de frames écht naartoe gaan
Alleen goedkope animatie-eigenschappen — positie en dekking, het soort dat een telefoon kan bewegen zonder de layout eronder opnieuw te berekenen, nooit iets dat halverwege de reeks een reflow afdwingt. Een klaslokaal dat zo vaak moet verschijnen, kan zich niet één eigenschap veroorloven die duur is op een ouder toestel — want "ouder toestel" is hier geen randgeval, het is een groot deel van wie de telefoon precies op het moment vasthoudt dat hij naar iets geblokkeerds grijpt.
Het gevolg is dat het meeste wat in de intro op beweging lijkt, in werkelijkheid heel weinig beweging is, alleen goed geregisseerd. Een deur die opengaat, een figuur die vier stappen loopt, een bord dat op zijn plek zwaait — geen van dat alles is veel pixels die veranderen, het zijn veel *getimede* pixels die veranderen, en dat is een goedkopere truc dan het van buitenaf lijkt.
Waar we nog niet zeker van zijn
Een koude start is de eerlijke zwakke plek. De allereerste onderbreking nadat de telefoon opnieuw is opgestart of de app op de achtergrond is afgesloten, is trager dan elke onderbreking daarna, omdat nog niets "warm" is — geen gecachete vraag, geen lettertypen die al geparst zijn, geen JS-bundel die al in het geheugen zit. Voor die eerste-tik-belasting hebben we geen nette oplossing, behalve de app zo licht mogelijk houden en hopen dat het besturingssysteem hem niet te gretig uit het geheugen zet. Voelt jouw allereerste blokkade van de dag een tikje trager dan de rest, dan komt dat daardoor — en dat is iets waar we ons bewust van zijn, niet iets wat we hebben besloten te negeren.
Low-end Android is de andere open vraag — de telefoons waar dit het meeste toe doet, omdat een hapering van twee seconden daar een veel groter deel van het budget van 300ms opeet dan op een topmodel. We bouwen tegen die beperking aan, niet tegen het toestel dat we toevallig zelf vasthouden.