I've had the opposite experience. In my day job I already write plenty of YAML, so I didn't want to do the same for Home Assistant.
Setting up a simple flow such as "Turn on the robot vacuum at 10PM unless the 3d printer is running, in which case please wait for it to be done and then continue" it's as simple as connecting two nodes together.
The main issues I had were:
* If there's no node that does what you want, it can become messy very quickly to replicate the functionality. Either that, or you use a script node (which kinda defeats the purpose)
* In particular for Home Assistant, it can be annoying if there's no entity already defined in HomeAssistant and you have to hunt down some field inside a message payload. Or maybe you have to craft some special json to do what you want.
* There doesn't seem to be a lot of logic on what nodes available out of the box. For example, if one wanted to have a 'for loop'. It doesn't really exist out of the box (but there are libraries for this). It seems to have evolved organically, rather than something that was designed
* You can connect anything to anything even when it doesn't make sense
* Debugging seems to be mostly done by adding a debugging node and looking at logs. Being an event-driven and message passing environment, the graphical debugging capabilities should be way better than they are.