Tableau
Le carnet
Technique··6 min de lecture

Pourquoi nous avons commencé par le hors-ligne

Traiter le réseau comme une option, et non comme un acquis, change l'architecture entière d'un produit éducatif. Voici ce que cela coûte, et ce que cela rend possible.

La plupart des outils éducatifs traitent la connexion comme un acquis, et la perte de réseau comme un incident. On affiche alors un message, on met en cache ce qu'on peut, et on attend que ça revienne.

Là où nous travaillons, ce n'est pas un incident. C'est mardi après-midi.

Une petite école isolée, une seule fenêtre éclairée, aucune antenne à l'horizon
Aucune tour, aucun câble — et la leçon continue quand même.

Ce que « hors ligne » veut vraiment dire

Il y a plusieurs degrés dans ce mot, et ils n'engagent pas du tout la même architecture :

  • Tolérer la coupure : l'application ne plante pas, mais elle n'avance plus.
  • Mettre en cache : ce qui a déjà été vu reste consultable.
  • Fonctionner : la leçon se déroule entièrement, du début à la fin, sans qu'aucune requête ne parte.

Nous avons choisi le troisième. C'est le plus coûteux, et c'est le seul qui tienne quand un élève ouvre son téléphone à la maison, à vingt kilomètres de l'antenne la plus proche.

Une addition posée sur le tableau du téléphone : 54 au-dessus de 23, alignés en colonnes, avec la barre de lecture en bas
Tout ce qui compose cet écran — le moteur, la police manuscrite, les tracés — est déjà sur l'appareil. À ce stade, plus aucune requête ne part.

Le prix à payer

Une leçon ne se charge pas au fil de l'eau : elle se télécharge en entier, puis vit sur l'appareil. Cela impose une série de contraintes en cascade.

Les polices doivent être embarquées. Une police appelée depuis un service distant paraît anodine — jusqu'au jour où le tableau s'affiche dans une police de repli, sans que rien ne signale l'erreur. Nous hébergeons donc la nôtre, et le moteur l'attend explicitement avant de tracer le premier caractère.

Les fichiers doivent être servis localement. L'application démarre un petit serveur HTTP sur le téléphone lui-même, et la leçon s'ouvre sur 127.0.0.1. C'est plus lourd qu'ouvrir un fichier directement — mais les requêtes et le stockage local se comportent enfin normalement.

Et surtout : la mise à jour devient un problème à part entière.

L'erreur qui nous a coûté le plus cher

Pour éviter de retélécharger ce qui n'avait pas changé, nous comparions la taille de chaque fichier avec celle annoncée par le serveur. Taille identique, fichier conservé. C'était rapide, et c'était faux.

Un fichier échappait systématiquement à cette règle : la page d'entrée. D'une version à l'autre, elle ne change souvent que par les empreintes des fichiers qu'elle référence — huit caractères hexadécimaux remplacés par huit autres. Taille rigoureusement identique.

Le fichier était donc conservé, pointant sur un script que le nettoyage venait de supprimer.

Résultat sur le téléphone : une page qui se charge, aucun script qui s'exécute, et un élève devant un écran vide qui ne répond à rien. Le tout sans la moindre erreur visible.

La règle est maintenant explicite : on ne garde un fichier que si son nom porte une empreinte de son contenu. Pour tous les autres, on retélécharge. C'est quelques centaines de kilo-octets de plus à chaque mise à jour. C'est le prix d'un module qui s'installe juste.

Ce que cela rend possible

Une leçon complète — moteur, police, tracés manuscrits, données — pèse environ 410 Ko. Elle s'installe une fois, quand une connexion se présente, puis ne demande plus rien à personne.

La même leçon affichée sur fond clair, chiffres sombres sur fond blanc
Le thème clair, pour lire en plein jour, fait partie du même paquet : en changer ne redemande rien au serveur.

C'est ce qui permet à un élève de réviser dans un endroit où aucun service en ligne ne fonctionnerait. Et c'est, accessoirement, ce qui rend le produit utilisable sur les téléphones qui existent déjà là-bas, plutôt que sur ceux qu'il faudrait acheter.