Covidoudou


Journal de déconfinement.

Préambule #

Il est rare que j’écrive sur mon travail avec aussi peu de recul. J’avais déjà partagé une expérimentation avec data.gouv.fr et l’aventure Zam sur ces deux dernières années. Ici, le contexte est un peu particulier et s’apparente davantage à un sprint. Il concerne potentiellement 68 millions de français·es (👋🐢🤔), ce qui met la barre assez haute.

Récit de ce qu’il se passe parfois derrière le rideau de vos écrans.

Jour 1 (5 mai) : Un démarrage étrange #

Cela fait quelques temps avec l’équipe que l’on se demande quoi faire car la suite annoncée n’est pas aussi réactive que ce que l’on eu espéré, contexte sanitaire oblige. On essaye de se positionner sur des produits où l’on pense pouvoir être utiles et qui ne soient pas du solutionnisme technologique.

On nous propose de faire un questionnaire pour le Ministère des Solidarités et de la Santé qui soit à l’opposé d’un autre produit développé en parallèle par le gouvernement :

Jusque là, c’est plutôt alléchant mais le timing est quand même serré : le déconfinement est prévu pour le 11 mai. Soit 6 jours plus tard. Gloups.

En plus de l’urgence, d’autres voyants sont au rouge : on évoque une équipe en mode commando et il y a déjà beaucoup d’attentes bien qu’aucune ligne de code n’ait été produite… sans compter le fait que nous ne sommes ni des développeurs JavaScript, ni familiers des plateformes de distribution des GAFAM+. Par choix.

On finit par accepter car l’intention nous semble louable. Opération : Covidoudou.

Jour 3 (7 mai) : Doutes techniques #

What is clear: right now, if you’re using a framework to build your site, you’re making a trade-off in terms of initial performance—even in the best of scenarios.

Some trade-off may be acceptable in the right situations, but it’s important that we make that exchange consciously.

The Cost of Javascript Frameworks (cache)

Beaucoup d’interrogations relatives aux performances et à la complexité que l’on souhaite déléguer dans ce domaine. On s’attend à avoir potentiellement une charge non négligeable à encaisser. On évalue plusieurs solutions mais aucune ne nous satisfait pleinement, aussi on décide de faire un premier jet avec une succession de vues en JavaScript à la main qui reprennent des éléments template pré-chargés dans le HTML. Lorsqu’on fait un compromis, il s’agit toujours de tenter de trouver la solution la moins pire pour un contexte donné.

But I think there are a lot of problems that are better solved some other way.

Second-guessing the modern web (cache)

En parallèle, on commence à implémenter l’algorithme. Il est décrit dans des fichiers du genre Copie de algo_deconf_final_V3.xlsx (véridique) et mis à jour par un comité d’experts médecins qui se l’échangent par courriel. On reçoit plusieurs versions par jour !

On fait une première démo à l’équipe rapprochée.

Jour 5 (9 mai) : Un algorithme récalcitrant #

L’objectif est simple : on a une série de questions et en fonction des réponses on affiche des conseils personnalisés en fonction de la localisation, des caractéristiques, des antécédents et des symptômes ou contact à risque potentiels.

Sauf que tout bouge très vite, autant les questions que les conseils ou l’arbre logique qui permet de passer des unes aux autres. Sans compter qu’il a été écrit par des médecins dans une feuille de calcul et qu’il faut aller repêcher les informations à la main. Pas évident.

En parallèle, on publie le code source sous licence MIT et on est maintenant en capacité de faire une démo à l’équipe élargie. Les retours sont plutôt bons et ça tranquillise beaucoup de monde.

Jour 7 (11 mai) : Tenir la charge #

If you are in charge of a web site that provides even slightly important information, or important services, it’s time to get static.

Get Static (cache)

Ronan s’occupe de faire en sorte que l’architecture tienne le coup, on évoque une annonce à la télévision et apparemment ça peut faire un gros pic dans les courbes. Surtout dans cette période anxiogène. Heureusement que l’on ne sert qu’une page statique relativement légère (cache) au final. Sans recompiler (cache) trop de choses dans le navigateur.

De mon côté, j’extrais toutes les chaines de caractères dans des fichiers markdown et je documente l’algorithme en faisant des liens vers chaque fichier. Je ne sais pas où je vais mais j’ai l’intuition que ça sera moins galère que l’historique des révisions d’une (ou plusieurs !) feuille(s) de calcul.

On commence à avoir des retours d’associations de patients pour nous aider à rendre le contenu intelligible par des non-médecins/techniciens. C’est chouette.

Jour 9 (13 mai) : Lancement officiel #

On a enfin une adresse officielle : mesconseilscovid.sante.gouv.fr, en seulement 9 jours ! Ça peut vous sembler long mais obtenir un sous-domaine en .gouv.fr est parfois un très très long périple.

Capture d’écran du site
Capture d’écran du site.

On peaufine le cache mais aussi sa mise à jour. Il faut que l’application soit conforme à des doctrines gouvernementales changeantes dans un contexte où la réactivité est cruciale. Notre connaissance de la maladie évolue et les conseils pour y échapper aussi.

Même avec les polyfills qui vont bien, il semblerait que l’élément template soit un peu capricieux avec Internet Explorer 11 et on espère que le site soit utilisable par le plus de personnes possibles. Cela occasionne une veillée à revenir sur notre façon d’écrire les pages/vues. Pas vraiment la partie la plus fun…

Jour 11 (15 mai) : Structuration et consolidation #

Jusqu’à présent, on a favorisé la vitesse au détriment de la robustesse. On ne peut pas avoir les deux en si peu de temps. Mais par contre, il faut être suffisamment lucide pour savoir s’arrêter à temps et consolider l’existant. Alors on écrit plus de tests, on ré-arrange le code pour le rendre plus compréhensible.

Côté contenus, la proposition de passer par Microsoft Github pour éditer les contenus (et peut-être à terme l’algorithme lui-même ?!) a été bien acceptée et on commence à recevoir des pull-requests de médecins.

Poussés par le besoin, on a créé une nouvelle façon technique d’interagir. Un framework nous aurait probablement trop contraint pour avoir cette liberté d’innovation. Difficile de se prononcer avec certitude toutefois.

Jour 15 (19 mai) : un CMS statique #

Suite à une réunion de travail, on se rend compte qu’il est difficile d’avoir accès à l’intégralité des contenus disponibles pour pouvoir rester cohérent dans les formulations. Aussi, un découpage par dossier s’impose et permet d’avoir un fichier README.md qui va compiler l’ensemble de ces contenus par type. Cela fournit un lien pour aller éditer le bon contenu depuis ces index.

On sent naître aussi la nécessité d’un CHANGELOG afin que toutes l’équipe élargie sache ce qui est implémenté et déployé. C’est intéressant — et un peu effrayant — de voir à quel point on a réussi à faire contribuer des médecins peu techniques en utilisant nos outils de développeurs·ses.

Aussi, je m’éclipse pour une vingtaine d’heures en forêt.

Jour 18 (22 mai) : Prise de recul #

Prioritisation isn’t easy, and it gets harder the more factors come into play: user needs, business needs, technical constraints. But it’s worth investing the time to get agreement on the priority of your constituencies. And then formulate that agreement into design principles.

Principles and priorities (cache)

Voici venu le temps de se ré-interroger sur nos intentions, les attentes, les outils employés, nos pratiques. C’est pour moi l’un des meilleurs moments d’un produit, ce petit coup d’œil régulier dans le rétroviseur. Celui qui permet de réajuster une trajectoire naissante en désignant un nouveau cap.

Particulièrement côté technique, on a intentionnellement évité tout les outils JS jusqu’à présent. Il y a peut-être des petites briques à récupérer de-ci de-là sans télécharger la moitié du web. Je me réjouis que l’on ait réussi à conserver une page performante et relativement accessible pour l’instant :

Une série de A depuis l’outil WebPageTest
L’andouillette du développeur Web.

Autre victoire non négligeable, tout reste dans le navigateur. Les seules statistiques que l’on ait sont celles de téléchargement de la page et toutes les dix minutes un ping pour vérifier que les conseils sont bien à jour. Vous pouvez refaire le test 15 fois et on ne le saura pas. Vous pouvez mettre n’importe quoi et ça ne changera rien de notre côté. Bon, ça peut planter et on ne le sait pas non plus…

En parallèle, des démo sont faites à des personnes plus ou moins importantes qui vont déboucher sur des annonces plus ou moins officielles/diffusées. Jusqu’ici ça tient.

J’ai travaillé 14,5 jours sur ces 18 derniers jours.

Jour 25 (29 mai) : peaufinage et outillage #

Dans ce « désert sémantique emplis d’échos confus », nous avons besoin d’un « quelconque fétiche prestigieux » qui puisse servir de « doudou ».

Sur la pandémie actuelle, d’après le point de vue d’Ivan Illich (cache)

On intègre des illustrations qui donnent des repères visuels aux différentes sections. Cela permet de faire un rappel entre la question et les conseils associés. Ces illustrations sont issues de unDraw et sont libres de droits.

On passe aussi une partie de la semaine à finalement s’outiller en JavaScript avec Parcel et à ré-arranger notre code afin de le rendre plus résilient. Fini le fichier fourre-tout avec des variables globales et des dépendances non explicites. Cela nous permet aussi de passer à des tests automatisés, ce qui nous met suffisamment en confiance pour reprendre l’algorithme.

En parallèle, on essaye de savoir via les logs HTTP et goaccess d’où viennent nos visiteur·ses. Ce n’est pas si simple car il faut agréger ceux-ci depuis plusieurs machines.

Mine de rien, le site commence à être utilisé.

Jour 33 (10 juin) : orientation et pédiatrie #

Les retours des testeuses et testeurs nous indiquent qu’il serait pertinent d’ajouter des informations relatives à la pédiatrie. On ajoute une page dédiée pour les moins de 15 ans.

Autre amélioration, on implémente l’algorithme d’orientation pour les personnes présentant actuellement des symptômes afin de prodiguer des conseils plus pertinents dans ce cas là.

Je résume mais il y a bien évidemment une somme de petites retouches apportées ici et là pour rendre le site plus utile.


Je vais m’arrêter là pour le moment, je ferai sûrement une nouvelle entrée dédiée lorsqu’on décidera de mettre un terme au produit. D’ici là vous pouvez suivre le CHANGELOG dédié.