- YAML est utilisé comme un standard dans DevOps et les configurations de CI, mais à cause des conversions de type implicites et des différences entre parseurs, une même configuration peut être interprétée autrement que prévu
- En YAML 1.1, des valeurs comme
NO,07,08,04:30,0666peuvent être transformées en booléens, nombres, heures ou octaux ; il faut donc expliciter clairement l’intention lorsqu’on veut une chaîne - Les exemples de GitHub Actions, Kubernetes, CloudFormation et de plusieurs services de CI montrent que la syntaxe YAML et les structures propres à chaque service peuvent conduire à des commits répétés, à des échappements imbriqués et à des représentations disparates des jobs
- Les liens de référence regroupent aussi du YAML exécutable, les différences de comportement entre parseurs, la notation des chaînes multilignes, le problème d’une version
1.70parsée comme1.7, ainsi que les raisons de conception de StrictYAML - Des alternatives comme Nickel, Dhall, CUE et Jsonnet sont aussi proposées, mais la page elle-même ressemble à un immense champ de texte éditable, prolongeant la satire de l’utilisabilité de YAML
YAML comme langage de configuration DevOps : une satire
- YAML est couramment utilisé pour les configurations DevOps, mais cette page exprime une fatigue liée à YAML avec des formulations du type « personne n’a envie d’utiliser YAML »
- Elle énumère de façon paradoxale les raisons d’utiliser YAML comme technologie DevOps
- Elle ironise en disant qu’il se compile toujours et peut toujours être déployé
- Elle se moque du fait qu’il n’y ait pas de gestion forcée des erreurs pendant le développement et que les problèmes éclatent au runtime en production
- Elle suggère qu’un message du type « quelque chose est cassé » vaut mieux qu’une stack trace avec numéros de ligne
- Elle exprime l’agacement de devoir y passer du temps lorsqu’on crée un nouveau pipeline CI
- Elle raille la situation où YAML est considéré comme un choix sûr simplement parce que Kubernetes l’utilise
- Elle mentionne aussi son avantage par rapport à JSON : la prise en charge des commentaires
Les pièges des conversions de type implicites
- En YAML 1.1,
NOpeut être parsé comme un type booléenNO: Norwaypeut provoquer un problème d’interprétation booléenne plutôt que représenter un code pays- Si l’intention est une chaîne, il faut l’entourer de guillemets, comme
"NO" - La page souligne que la spécification YAML 1.1 prévoit 22 façons d’écrire
trueoufalse
- Les valeurs qui ressemblent à des nombres peuvent aussi être interprétées différemment selon les parseurs
- Les exemples
07et08montrent que le résultat peut diverger, par exemple[ 7, "08" ] - La page en fait une satire avec un cluster Kubernetes qui se déploie jusqu’au septième élément puis échoue au huitième
- Les exemples
- Les chaînes qui ressemblent à des heures peuvent aussi être converties automatiquement
04:30peut devenir16200, c’est-à-dire une valeur en secondes depuis minuit, plutôt que la chaîne horaire saisie par l’utilisateur- Si l’intention est une chaîne, il faut l’indiquer explicitement avec
!!str 04:30
- Les différences de notation octale en YAML ajoutent aussi à la confusion
- YAML 1.1 utilise la notation
0666 - YAML 1.2 utilise la notation
0o666 - Le fait que Kubernetes utilise YAML 1.1 est présenté comme un « rite de passage DevOps »
- YAML 1.1 utilise la notation
Problèmes de versions, de SHA et de traitement des chaînes
- Les versions de paquets peuvent être parsées comme des nombres à virgule flottante
foo: 1.7etbar: 1.70peuvent être interprétés comme la même versionfizz: 1.7.0etbuzz: 1.70.0peuvent être traités comme des chaînes de version différentes
- Les SHA Git courts utilisés en CI peuvent eux aussi ne pas être sûrs
- Un SHA à 8 caractères peut être composé uniquement de chiffres
my.flaky_version, qui insère${GIT_SHORT_SHA}sans guillemets, peut ne pas être une chaîne- La valeur est présentée comme étant une chaîne dans environ 98 % des cas, et comme une chaîne dans 100 % des cas si elle est entourée ainsi :
"${GIT_SHORT_SHA}"
- Un cas lié à la toolchain Rust est aussi inclus dans les liens de référence
Les coûts visibles dans la CI et la configuration d’infrastructure
- Un exemple raconte qu’en apprenant GitHub Actions, une personne a fait 8 commits/pushs en une heure, avec comme dernier message de commit « I don't really like yml »
- La page montre aussi à quoi ressemblerait SQL s’il était écrit en YAML
- Des structures SQL comme
SELECT,FROM,WHERE EXISTS,AND,EQUALS,LTdeviennent des structures YAML imbriquées - Elle se moque de la transformation d’une expression SQL courte en une forme YAML longue et verbeuse
- Des structures SQL comme
- Chaque service de CI a sa propre manière de représenter les jobs et les steps
- Azure DevOps utilise une forme avec
jobs, puisjob,steps,script - CircleCI utilise une forme avec
jobs,job1,steps,checkout,run - L’exemple d’un « système de CI du futur » montre que la même tâche pourrait être représentée par encore une autre structure imbriquée
- Azure DevOps utilise une forme avec
- Dans CloudFormation, lorsqu’on place une fonction
SEARCHdansDashboardBodyde CloudWatch, un exemple montre qu’il faut ré-échappper du contenu déjà échappé et fermer tout le JSON avec des guillemets doubles
YAML exécutable et différences entre parseurs
- L’expression « executable yaml » est reliée à des problèmes de parsing YAML liés à la sécurité
- Les problèmes de compatibilité entre parseurs YAML sont aussi traités dans une ressource séparée
- Every YAML parser is a custom YAML parser
- Elle est présentée comme une ressource montrant que le comportement peut varier d’un parseur à l’autre
Ressources liées et alternatives
- Des ressources de référence sur les problèmes de YAML sont regroupées
- Today we’re going to look at some general problems with the YAML format
- We replaced 1,000 lines of YAML with 10 structs and people started contributing again
- What if you used the same language and tools you use to define your app to define your infrastructure?
- A YAML file is almost always still 'valid' even if it is trunca
- the bug was that the YAML parser ignored the negative signs ... so negative GPS coordinates became positive ones
- There are 63 different ways to write multi-line strings in YAML
- StrictYAML Design Justifications
- Plusieurs outils et approches sont listés comme alternatives au DevOps centré sur YAML
Réactions à la page elle-même
- La sélection de réactions Reddit prend aussi pour cible le design de la page
- Certains disent que le site web est un immense champ de texte éditable
- Certains disent que les hyperliens ne sont pas cliquables
- Une blague dit qu’on peut sélectionner tout le texte de la page et le supprimer, ce qui résout le problème
- Certains disent être d’accord avec la critique de YAML, tout en trouvant discutables les choix de design du site
- La dernière phrase indique que la page a été délibérément rendue « aussi utilisable que YAML »
1 commentaires
Avis de Hacker News
Mon casse-tête préféré, c’est celui-ci :
0708Le résultat devient
[ 7, "08" ]À cause d’une hypothèse sur les octaux et les chaînes de caractères.
Cette hypothèse a été découverte dans du YAML généré par template trois niveaux plus bas, et a provoqué une panne complète de notre cluster k8s, mais seul le cluster
08a cassé. Les sept premiers fonctionnaient bien.0.Ce commentaire m’a fait rire, mais quand on pense qu’en 2023 presque personne n’utilise d’octaux dans des fichiers de configuration, ce comportement et cette hypothèse n’ont aucun sens. Pour de l’hexadécimal, pourquoi pas ; le décimal, évidemment ; mais l’octal, c’est un peu violent.
La partie qui a généré ça n’a clairement pas sérialisé les données avec une bibliothèque. Si elle l’avait fait, elle aurait converti les types dans le bon format.
YAML a beaucoup de problèmes, mais je pense que le vrai problème central, c’est de vouloir mettre de la logique dans la configuration.
Si on utilise YAML uniquement pour les données et pas pour la logique, c’est l’un des formats de données les plus agréables à lire et à écrire par des humains.
En CI/CD, il y a toujours une certaine dose de logique, et ça se termine rarement avec du YAML pur ; des templates bizarres viennent s’y ajouter. Je me demande pourquoi on ne fournit pas plutôt une vraie API pour un vrai langage de programmation.
Il y a 15 ans, on avait le même problème avec Ant basé sur XML, et ce n’était pas la faute de XML.
Le principal problème de YAML, à mon avis, c’est le manque de sûreté de typage : mauvaise indentation, fautes de frappe dans les clés, chaînes parsées comme des booléens, etc.
À part ça, je trouve que c’est un bon format : concis, avec beaucoup moins de bruit syntaxique que d’autres formats. C’est pour cela que j’ai créé https://github.com/crdoconnor/strictyaml afin que les gens puissent utiliser du YAML typé de façon sûre et recevoir des messages d’erreur immédiats et clairs pour ce genre de problèmes.
Parce qu’ils introduisent des abstractions en pensant en avoir besoin. C’est pourquoi j’évite toujours d’utiliser un langage de programmation Turing-complet comme format de configuration.
J’ai déjà passé des heures à suivre pas à pas de l’AWS CDK avec le débogueur JavaScript. Avec un simple fichier yaml/Json/peu importe, bête et méchant, ce problème n’aurait pas existé. C’était un petit projet, et cette complexité n’était pas nécessaire.
C’est aussi pour ça que, pour la configuration des outils JS, je préfère JSON à JS. C’est l’une des raisons pour lesquelles les configurations webpack deviennent ingérables. Dès qu’on peut utiliser un vrai langage, le « capteur DRY » des gens se déclenche et ils rendent les choses plus complexes.
En déclaratif, il est aussi plus facile de suivre les pratiques standard et le support des outils est meilleur. Si package.json devenait réellement comme build.gradle, ce serait bien pire.
Il suffit de décider : « exécuter le script dans un interpréteur Python placé dans un cgroup très restreint, et le résultat doit être un dictionnaire appelé
CONFIG». La logique d’enveloppe n’a plus qu’à le sérialiser de la manière la plus pratique pour le programme à configurer.C’est un peu comme se plaindre de la complexité ou de la rigidité de
helm. Les charts Helm ne s’écrivent pas tout seuls. Je suppose qu’il est plus facile de se plaindre et d’ignorer le problème que de le comprendre et de l’implémenter.En tant que format de fichier, YAML a ses avantages et ses inconvénients. Mais le vrai problème, c’est de vouloir exprimer des conditions, des boucles, des fonctions, voire des classes/sous-classes via des templates, dans un format de fichier équivalent à JSON.
YAML convient aux petites configurations. Mais dès qu’un flux de contrôle, quel qu’il soit, devient nécessaire, cela se transforme très vite en spaghetti propre à chaque fournisseur.
Jinja dans du YAML me semble clairement être un anti-pattern
On dirait que cela vient du fait qu’on n’a pas conçu dès le départ une programmabilité suffisante, puis que les gens ont imité des projets qui ont réussi en choisissant cette voie par la suite
L’article mentionne des alternatives comme Dhall et Jsonnet, mais on peut en envisager deux autres
Premièrement, créer une bibliothèque de configuration pour un vrai langage de programmation, et faire en sorte que cette bibliothèque génère des fichiers de configuration JSON. Ce JSON ne serait pas destiné à être édité à la main, mais seulement traité comme un artefact vérifiable. L’utilisateur versionnerait une configuration sous forme de code avec prise en charge par les outils. Le fait que les corrections d’urgence directement sur le serveur deviennent plus difficiles est à la fois un inconvénient et un avantage
Deuxièmement, Starlark. C’est un langage dérivé de Python, non Turing-complet, initialement développé pour le système de build Bazel. Il existe plusieurs implémentations et je ne sais pas jusqu’où va leur compatibilité, mais il y a aussi des bindings Python : https://github.com/caketop/python-starlark-go, https://github.com/inducer/starlark-pyo3
{%et{{sont tous deux des caractères YAML, ce qui oblige à mettre entre guillemets tous les endroits où on les utiliseLes approches comme
${{dans GitHub Actions, ou<%,<<, me semblent bien meilleures. Bien sûr, il y a le risque que<<:fasse partie de la syntaxe YAML, mais ce n’est pas du Jinja valideSi cela veut dire qu’il ne faut rien mettre d’exécutable dans du YAML, je pense que ce navire a déjà pris le large. Les gens ont compris que laisser les parties littérales par défaut et n’insérer de l’exécutable que de temps en temps était une bonne façon de produire du contenu, comme avec ASP/JSP/PHP
Si vous voulez lancer une guerre de trolls sœur dans ce fil, il suffirait de parler de HCL et de
for_each, mais mieux vaut sans doute éviter de le faire iciJe ne sais pas quelle part relève de CDK et quelle part vient du fait que CloudFormation n’est pas terrible à la base
J’aime Jsonnet et Starlark, mais en pratique, la plupart des cas d’usage n’ont pas besoin d’un nouveau langage de programmation. En général, on veut simplement créer un document de base puis le modifier en appliquant des patchs. Tout devient alors beaucoup plus simple
L’expérience d’utiliser du YAML pur n’est pas si mauvaise en soi. Le format a quelques aspects assez douteux, mais il est utilisable. À mon avis, le problème apparaît dans la complexité des solutions qu’il faut ajouter pour adapter les documents à plusieurs environnements
J’ai entendu dire qu’il existait autrefois un vrai DSL Python utilisable à la place de YAML, mais il semble avoir été abandonné. Résultat, les boucles et les if-then deviennent maintenant d’horribles blocs interminables en YAML, et Jinja les interprète de façon totalement imprévisible
jsonnetÀ mon avis, YAML en soi est très bien. Ce qui ne l’est pas, c’est le fait que nous ayons rendu la partie déploiement du CD beaucoup trop difficile
Je reconnais que notre configuration dans Azure DevOps n’est pas extraordinaire, mais je trouve étonnant qu’il existe des organisations où plusieurs équipes, ou 5 à 6 personnes côté ops, doivent manipuler ce genre d’outils. Pour des endroits comme Google, je ne sais pas, mais dans une entreprise ordinaire avec au maximum 50 000 utilisateurs simultanés, et généralement bien moins, ça me semble excessif
Au début des années 2000, déployer une application web d’entreprise sur un IIS on-premise, où moins de 0,25 ETP gérait toutes sortes de choses comme la répartition de charge et le réseau, était plus facile que de déployer la même chose dans une configuration « moderne » actuelle
Bien sûr, les pipelines modernes ont des avantages. On a beaucoup dépassé les problèmes du type « ça marche sur ma machine », et on a nettement amélioré le contrôle qualité grâce à de meilleurs points de validation. Mais le déploiement réel reste un cauchemar en 2023
Ce n’est peut-être pas un problème pour les programmeurs de HN qui travaillent dans de vraies entreprises tech ou dans des sociétés disposant d’une bonne équipe DevOps dédiée. Mais dans le monde des entreprises non tech, le CI/CD n’a jamais été aussi mauvais dans ma carrière
On peut accuser YAML, ou le fait qu’il faille beaucoup trop de YAML pour faire quoi que ce soit et que les templates soient difficiles. Mais à mon avis, c’est bien davantage un problème d’organisation qu’un problème technique. Les outils de CD devraient être beaucoup plus automatisés pour éviter que les développeurs aient à décrire l’infrastructure sous forme de code
C’est bien que ce soit possible, mais la réalité, c’est qu’on demande à des millions de développeurs de déployer une infrastructure qu’ils comprennent peut-être à peine. Je n’ai jamais vu un développeur qui ne préférerait pas simplement fournir un conteneur et laisser le réseau et les « trucs côté serveur » se gérer tout seuls
Si on ne fait pas ça, on se retrouve avec une quantité de VNET et de sous-réseaux dont personne ne comprend vraiment le fonctionnement, et l’organisation perd beaucoup d’argent parce que les développeurs ne savent pas qu’ils pourraient faire ça avec
/xOn écrit hors ligne une sorte de « définition de job » que l’on soumet à un système partagé propriétaire, on attend dans une file, puis on reçoit un fichier de logs généré par un système que l’on ne contrôle pas. Comme on ne peut pas exécuter localement sur sa station de travail le code du système propriétaire, la boucle d’itération interne prend au mieux des dizaines de minutes, et au pire des heures ou des jours
Il n’y a pas de mode aperçu ou « what if », ni de « dry run ». Même si on appelle ça un « test », comme il n’y a qu’un seul système, on travaille en pratique en production
Le vrai problème n’est pas YAML. Peu importe si le pipeline était scripté dans le langage de programmation de Dieu
Si le développement logiciel sur station de travail est devenu si populaire par rapport aux mainframes centraux en temps partagé, c’est parce qu’il accélérait spectaculairement les itérations internes, isolait de l’environnement de production et remettait le contrôle entre les mains des développeurs
La génération actuelle de pipelines CI/CD annule en grande partie tout cela
Kubernetes sur une seule machine permet de retrouver l’essentiel des avantages du développement sur station de travail, mais c’est encore un système très récent, avec beaucoup de douleurs de croissance
Problème connexe : il existe d’excellentes solutions pour un développeur seul qui exploite une application en cliquant dans une interface, et d’excellentes solutions pour les très grandes entreprises qui automatisent à grande échelle pour des milliers de développeurs. Mais entre les deux, dans la zone où quelques développeurs d’entreprise gèrent des dizaines d’applications, c’est juste le chaos
Il m’est arrivé plusieurs fois que ça fonctionne très bien dans mon image Docker, mais que ça casse dans l’image déployée
Ce sont des problèmes qu’on ne peut résoudre que si l’ensemble du pipeline de build et de déploiement est totalement transparent, qu’on a un accès complet au registre d’images et qu’on peut réellement contrôler les instructions de build. C’est aussi contraignant que de contrôler le système d’exploitation local, et je pense que ça échouera dans autant d’organisations que celles où le code cassait quand on le déplaçait vers une autre machine
Configurer ça dans n’importe quel système CI/CD me semble assez intuitif
Je pense qu’il existe une solution pour préserver la paix si tout le monde respecte universellement une seule règle : n’utilisons pas YAML en dehors de l’écosystème Python
Ainsi, les personnes qui aiment les formats de scripting ésotériques privilégiant la lisibilité à l’exactitude, à la robustesse et à la maintenabilité pourront continuer à utiliser les tabulations, le typage lâche et une syntaxe obscure. Les autres n’auront plus à le faire. Les personnes qui préfèrent les syntaxes de style C pourront garder leur santé mentale
Je crois qu’on touche enfin au cœur du problème. Pour moi, développeur habitué aux syntaxes C, les espaces syntaxiques relèvent de la pure folie. Les espaces sont de la mise en forme, pas de l’information ni des instructions. Une bonne mise en forme aide et est utile, et un bon développeur en syntaxe C se soucie aussi d’une mise en forme lisible
En Python et en YAML, la mise en forme est une information directive. Cela a l’avantage de rendre lisible tout code qui fonctionne. Mais pourquoi le code devrait-il nécessairement être lisible pour fonctionner ?
Il suffit d’imaginer travailler avec un collègue qui serait comme YAML. Vous lui envoyez un long message, et il répond : « Quoi ? Ça n’a aucun sens ». En fait, le sens a été cassé parce que vous n’aviez pas mis de lignes vides entre les paragraphes. Vous remettez les lignes vides et renvoyez le message, et là seulement il peut le lire. Sans mise en forme syntaxiquement correcte, l’information envoyée n’avait aucun sens
Il existe d’innombrables façons de formater le code, et je préfère que les gens utilisent un linter quand ils écrivent du code. Si possible, le même linter que moi
Ces langages imposent des structures syntaxiques standard. Cela réduit les façons d’écrire du code difficile à lire, et c’est une bonne chose
Mais j’en viens à penser que la différence n’est pas philosophique, qu’elle relève plutôt des outils. Certains outils, par exemple les éditeurs de texte ou les clients e-mail, prennent bien en charge les espaces significatifs, et d’autres non
Tous les éditeurs de texte que j’utilise sont configurés pour afficher les espaces et les tabulations, et les montrent différemment. En général, comme des points discrets et des tirets discrets. J’y suis habitué, ça ne me dérange pas du tout
De mon point de vue, le code n’est pas du texte arbitraire. On utilise une police à chasse fixe qu’on n’emploierait pas dans un livre, et la syntaxe est distinguée par des couleurs. Il n’y a pas non plus de raison de ne pas rendre les espaces visibles
Je continue à préférer les langages sans espaces significatifs, mais je ne les déteste pas. Pour moi, ce n’est pas du tout un problème
En revanche, si vos outils préférés ne prennent pas bien en charge les espaces significatifs, ne rendent pas les espaces visibles, voire si vous codez avec une police à chasse variable, alors vous ne pouvez que haïr passionnément les espaces significatifs et les voir comme de la pure folie
Ce qui m’a fait changer d’avis, assez étonnamment, c’est CoffeeScript. Je n’aime pas beaucoup JavaScript, mais utiliser CoffeeScript donnait l’impression d’une version épurée de The Good Parts de Crockford. Il était impossible de produire accidentellement les mauvaises parties
En plus, la façon dont l’indentation devient du code était plutôt agréable. Le seul inconvénient était qu’avec Vi, on ne pouvait pas appuyer sur
%sur une accolade ouvrante ou fermante pour trouver l’autre extrémité du bloc. À l’inverse, grâce à l’indentation, quand le code avait l’air bizarre, il l’était souvent réellementCela dit, je n’ai toujours pas beaucoup appris Python. Aujourd’hui j’utilise TypeScript, mais si un jour CoffeeTypeScript sortait…
C’est pour ça que j’ai commencé à créer moi-même un format appelé BCL : https://github.com/wkhere/bcl
Ça n’aidera pas immédiatement tous les cas d’usage de YAML, mais au moins ça peut devenir une meilleure façon de définir des ressources dans un style à la Terraform. En fait, ça aide déjà dans un projet interne comme remplaçant de HCL, et c’est ce qui m’a finalement motivé à le créer
Plus largement, je ne sais pas comment régler le problème de l’omniprésence de YAML dans Kubernetes. Plus de la moitié de mon problème avec mon
$daily_jobvient du fait que l’assemblage du chart Helm final à partir de plusieurs sources est beaucoup trop bricoléJe ne veux pas dire que Helm est intrinsèquement un mauvais outil, ni que mon entreprise a choisi Helm d’une façon particulièrement mauvaise. Je pense que tout le monde fait de son mieux compte tenu du contexte
Mais manipuler des templates texte avec des espaces significatifs est beaucoup trop propice aux erreurs, et celles-ci sont détectées beaucoup trop tard. Kubernetes aurait été bien mieux avec un format personnalisé fondé sur une syntaxe de style C, plutôt que d’essayer de prouver à quel point YAML est formidable. D’autant que YAML n’est même pas formidable
Tout ce qui génère du JSON peut servir à générer du YAML
Nickel peut être évalué en JSON : https://nickel-lang.org/
https://youtu.be/SEA1Qm8K4gY?feature=shared
Ça a l’air assez similaire
C’est un effet de plateforme interne. À mesure qu’une application grossit, sa configuration s’étend elle aussi jusqu’à devenir un langage de programmation, mais un langage truffé de bugs, mal spécifié et à l’ergonomie épouvantable
On déclare la faillite de la configuration et on choisit un nouveau format de configuration. Puis ça recommence
Bien sûr, le format lui-même n’est pas totalement innocent. Plus il est flexible, plus il est facile de le recycler en mauvais langage de programmation
Après avoir répété cette erreur plusieurs fois, aujourd’hui je choisirais le format de configuration le plus simple possible pour les réglages de base. Même
.inipeut être trop puissant. Pour la « configuration » plus complexe, je déléguerais à un vrai langage de programmation, si possible celui dans lequel l’application est écriteL’écrasante majorité des exemples du type « YAML, ce n’est pas terrible » se résolvent en mettant entre guillemets tous les littéraux bizarres
Oui, YAML peut parfois être pénible. Par exemple, les listes de maps deviennent vite étranges, et les espaces significatifs finissent presque toujours par vous jouer un mauvais tour. Mais ces articles donnent, au mieux, une impression d’un certain manque de rigueur
Tout l’écosystème YAML pousse à écrire les valeurs sans guillemets. La plupart du temps, ça marche bien, puis ça casse juste assez souvent pour vous faire trébucher en production
EDN est un sous-ensemble de Clojure : https://github.com/edn-format/edn
C’est clair, utilisable en streaming, extensible et insensible aux espaces. Il existe toutefois des conventions de mise en forme pour la lisibilité
En revanche, je ne vois pas bien quelle est la différence sémantique entre une liste et un vecteur. Dans mon esprit, les tableaux et les listes chaînées sont des détails d’implémentation de structures de données dans le code, pas des différences de format de données
Mais il n’y a absolument aucun jeu d’indentation sémantique. Le fait que les virgules soient considérées comme des espaces et soient inutiles est élégant
Quand les étudiants rendent leurs devoirs via la plateforme d’e-learning, nous recevons toutes les soumissions dans un fichier XML assez volumineux
Nous lisons les soumissions, les transmettons à l’analyse statique et à l’exécution d’exemples, puis nous écrivons, pour chaque devoir, un fichier YAML contenant toutes les soumissions, les indications de correction, les commentaires et les champs de saisie des notes
Ensuite, à partir du fichier YAML, nous générons des rapports, des statistiques et des PDF de feedback en passant par markdown+lecture (Pandoc)
Pour nous, YAML convient très bien. Il est facile d’ajouter du feedback avec la syntaxe Markdown. Par exemple, quelque chose comme
- you missed a \NOT` here`, correctement indentéGrâce aux différentes façons d’échapper le texte en bloc, on peut afficher joliment les soumissions SQL sans caractères d’échappement, même si les étudiants utilisent divers délimiteurs SQL
Comme tout est en texte brut, nous n’utilisons qu’un éditeur de texte, et nous stockons le tout dans git pour assurer la responsabilité de la correction. Comme tout est conservé sous une forme lisible par machine, nous pouvons aussi tester de nouveaux outils d’analyse statique sur d’anciennes soumissions
Mais comme il faut aussi écrire les pipelines CI et la configuration de domotique en YAML, je comprends la douleur
Dans TOML, il faut soit renoncer à l’indentation des chaînes multilignes, au détriment de la lisibilité, soit mettre une barre oblique inverse à la fin de chaque ligne. Aucune des deux solutions n’est idéale
C’est pourquoi YAML est assez adapté aux DSL ou aux configurations qui doivent contenir du Markdown ou d’autres formats texte, et il a un avantage sur des formats comme TOML
Mais je ne mettrais pas toute la responsabilité de la « fatigue YAML » uniquement sur les outils de CI et de DevOps qui ont choisi YAML comme format de transport pour leurs DSL. Comme l’article original le résume bien, YAML lui-même a aussi de gros problèmes
Le célèbre « problème de la Norvège » a été résolu dans YAML 1.2, et le problème du parsing des zéros initiaux comme nombres octaux l’a également été dans YAML 1.2. Les conversions de type trop agressives pour les nombres, les dates, les heures, etc., peuvent prêter à confusion. Les modes de traitement des chaînes multilignes peuvent aussi être assez déroutants. La sérialisation non sécurisée n’est pas un problème avec les parseurs modernes, mais il faut rester prudent quand on utilise YAML dans d’anciens langages dotés de fonctionnalités dynamiques comme Ruby, Python ou Java
Tout cela relève de problèmes propres à la spécification YAML