Six erreurs qui n'en faisaient qu'une : pourquoi un contrôle au vert est plus dangereux qu'aucun contrôle
Six erreurs qui n’en faisaient qu’une
Le Corpus Integrativo réunit dix-huit sources en 3 788 294 formes de 4 735 doculectes sur 225 macrosystèmes, avec la provenance par ligne et une couche calculée de 3 091 596 squelettes consonantiques qu’aucune source ne fournit.
La couche de base est de l’agrégation : chaque forme vient d’ailleurs, et ces ailleurs sont bons. Ce qui est apporté n’est pas « plus de données ». C’est une union auditable jusqu’à la source de chaque chiffre, une représentation phonologique calculée avec les mêmes règles pour les 225 macrosystèmes, et les manques déclarés avec leur coût mesuré.
Mais le plus transférable de l’article est autre chose, et cela occupe sa plus longue section.
Le problème qui ne se manifeste pas comme un problème
Un corpus intégrant dix-huit sources accumule des erreurs qui ne se présentent pas comme des erreurs. Aucune exception, aucune ligne manquante, aucune requête en échec.
Il y a un chiffre légèrement différent de ce qu’il devrait être, et rien ne le signale.
L’article publie, avec le corpus, l’appareil construit pour rendre visible cette classe de défaillance : 60 invariants qui échouent au lieu d’avertir — plus les cinq qui se contentent d’avertir, énumérés un par un — un contrat de schéma déclarant ce que signifie chaque colonne et avec laquelle on la confond, et des méta-contrôles dont l’objet n’est pas la donnée mais la portée de l’appareil lui-même.
Et il publie sa justification : six erreurs réelles de ce projet. Cinq des six ont passé tous les contrôles existant à l’époque.
Les six
1. Le nul qui mesurait notre propre tirage. Trois articles ont publié des chiffres d’enrichissement avec leur intervalle de confiance. Le nul était estimé par quatre-vingt mille battages, et l’intervalle présenté comme s’il mesurait l’incertitude des données. Il mesurait celle du tirage. Découvert en retirant six formes turques et en voyant le nul bouger de 14 % — impossible si l’intervalle décrivait la population. Remplacé par la forme close, les chiffres ont changé : 225× → 218×, 77× → 78×, 39× → 37×.
Ce qui l’a détecté : rien. L’intervalle était large, et un intervalle large ressemble à de la prudence.
2. L’annexe collée trois fois, avec 8/8 contrôles au vert. Six articles portaient leur annexe collée trois fois. Les six passaient les huit contrôles. Le contrôle vérifiait que l’annexe existât. Elle existait. Trois fois.
La différence entre ≥1 et == 1 est toute l’erreur.
3. Cinq scripts sur six donnant un résultat différent à chaque exécution. La requête chargeant les données d’une famille n’avait pas d’ORDER BY. PostgreSQL ne promet aucun ordre sans lui, et n’en donnait aucun. En aval, Counter.most_common(1) départageait les ex æquo par ordre d’insertion. Résultat publié : la table de substitutions indiquait b→p à 0,5× ou b→n à 1,9× selon l’exécution.
Ce qui l’a détecté : rien. Les chiffres étaient plausibles les deux fois. Personne n’exécute deux fois le même script pour comparer.
4. Deux colonnes de même nom et de sens différent. form.source_id est la source de la forme ; lect.source_id, celle de la fiche de langue. Le code chargeait la seconde dans un champ nommé source. Conséquence publiée : une section entière de l’article indo-européen affirmait qu’une source perd 65,6 % de ses formes alors qu’elle en perd 100 %.
L’erreur est née d’un nom.
5. L’invariant de licence annonçant zéro avec 2 140 lignes dedans. Au retrait des sources non redistribuables, le balayage a supprimé 5 971 lignes et l’invariant a annoncé zéro en quarantaine. Il y en avait 2 140 : une table stockait la provenance dans une colonne nommée source, sans suffixe, et ni le balayage ni l’invariant ne la regardaient.
Ce qui l’a détecté fut un autre contrôle — le méta-contrôle des réseaux de cognation, qui s’est plaint d’un réseau sans invariant déclaré.
6. Le méta-contrôle annonçant 120 % de couverture. Le dénominateur, je le calculais moi-même, en dupliquant les expressions régulières de l’analyseur au lieu de lui demander les siennes. Les deux versions ont divergé et le quotient est passé au-dessus de un.
La leçon, en quatre mots : demander à l’analyseur, pas le réimplémenter.
La forme commune, qui est la thèse
Les six sont la même erreur.
Un contrôle qui couvrait moins que ce que son nom promettait, et qui signalait la conformité exactement là où il y avait défaillance.
Le contrôle de l’annexe promettait « l’annexe est bonne » et vérifiait qu’elle existât. L’invariant de licence promettait « rien en quarantaine » et regardait l’une des deux colonnes où la quarantaine peut vivre. Le méta-contrôle promettait « couverture » et divisait par un nombre qu’il inventait.
Dans les trois cas, le vert était plus dangereux que l’absence de contrôle, car un contrôle au vert clôt la question.
Cinq règles, pour quiconque publie des données
- Écrivez ce que chaque contrôle NE couvre PAS, à côté de ce qu’il couvre. Si cela ne peut pas s’écrire, le contrôle n’est pas compris.
- Faites-les échouer, pas avertir. Un avertissement dans un journal de cent lignes n’existe pas.
- Découvrez depuis le catalogue, pas depuis une liste tenue à la main.
- Prouvez qu’ils se déclenchent. Introduisez la défaillance, vérifiez que le contrôle la voit, revenez en arrière. Un contrôle qui ne s’est jamais déclenché n’est pas testé — il n’a simplement pas encore échoué, ce qui n’est pas la même chose.
- Mesurez la couverture de l’appareil lui-même, et faites que cela échoue aussi.
Une note sur la couverture
L’article donne la couverture par couches et non comme un chiffre unique, car ce chiffre n’existe pas : deux consommateurs du même corpus — une couche de consultation de l’histoire d’un mot, et un catalogue de correspondances forme–sens — ont besoin de couches différentes et arrivent à des chiffres différents, tous deux corrects.
Cette section n’est pas une confession. C’est le seul matériau qui démontre que l’appareil sert à quelque chose : un invariant qui ne s’est jamais déclenché n’est pas testé, et un appareil décrit sans les défaillances qui l’ont produit est une liste de bonnes intentions.
L’article : Corpus Integrativo (PDF) · English version
La couche de consultation : Meulemans — nommée en hommage à C. S. Meulemans, fondateur de l’endolinguistique avec J. Á. Elias.