Systemd suffers from being an underspecified declarative system. They look great when things work, but when they go wrong you're left with an opaque mess. For example, creating a dependency loop results in arbitrary units simply being dropped at boot time. On a desktop machine, you might only realize this when trying to figure out why some service didn't start and digging through the logs!
Of course there is nothing else systemd could possibly do instead, given a loop in a dependency DAG (besides refuse to boot completely). The problem is the design decision of using a simplistic data model that fails in that spectacular and unintuitive way.