I think the rendering pipeline for D3 is actually the hard/strange part, and to be honest, the less-valuable part too (can be swapped with React). The rest of the API is great. The new strange, unordered observablehq examples with extra DSL interspersed aren't helping.