In this section, I'm mostly referring to JSON/YAML/TOML/ini files, which are the most common config formats I encounter.

I'll refer to such configs as plain configs. Not sure if there is a better name for it, please let me know!

An incomplete list of my frustrations:

JSON doesn't have comments , by design 🤯

, by design 🤯 bits of configs can't be reused For example, while YAML, in theory, supports reusing/including bits of the config (they call it anchors), some software like Github Actions doesn't support it Usually, you just don't have any means of reusing parts of your config and have to copy-paste. .gitconfig uses a custom syntax for merging the configs

can't contain any logic This is considered as a positive by many, but I would argue that when you can't define temporary variables, helper functions, substitute strings or concatenate lists, it's a bit fucked up. The workarounds (if present) are usually pretty horrible and impose cognitive overhead. Programming language constructs are reinvented from scratch : variables and string interpolation Ansible uses Jinja templates (!) for variable manipulations. Github Actions use a custom syntax for that In addition, they've got their own set of functions to manipulate the variables. Have fun learning a new language you never wanted to! scoping I.e. there are several custom scopes for env directive in Github Actions. control flow for loop: build matrices and 'excludes' always give me a headache if statement: e.g. when in CircleCI



can't be validated You can validate the config syntax itself (i.e. check JSON for correctness), but you can't do semantic checks. This is kind of a consequence of not having logic in the config files. Typically you'll have to write a supplementary program to check your configs and remember to call it before passing to a program. Very few programs bother with that and usually, your program crashes because of something that would be trivial to catch with any simple type system .

YAML simply stands out with its implicit conversions and portability issues There are enough rants about it, so I'll just leave a link to a good one: "YAML: probably not so great after all".

Summary: we spend time learning useless syntax, instead of productive work.