Everyone agrees the following two things are good:
1. small number of function names
2. clearly named arguments with minimial interactions
The only problem is that they pull the interface in opposite directions.
At one extreme is the hierarchical CmdStan structure, though
arguably, that breaks down into a few subfunctions based on
whether it's "sample" or "optimize" and then again based
on the engine (can't recall if that's overloaded for sampling
At the two extremes, we have
stan(engine=hmc, algorithm=static, adapt=yes, mass=diag_e, ...)
stan(engine=nuts, algorithm=fixed, adapt=yes, mass=dense_e, ...)
In the former case, all the interaction is hacked into the names.
To learn the whole command structure, you need to understand the
range of functions. In the latter case, you need to understand how
all the arguments interact.
The doc for the former will require a high-level overview, then a lot
of redundancy per function; the doc for the latter will in one place,
but it'll be deep and have argument interactions.