With flakes it seems a lot easier to understand where all the parts are coming from. You give it git repo urls and it gives you a workable package. If you want to use a branch, or unstable, or whatever, it’s right there in the flake. Also, input and output are clearly marked.
It’s not doing anything new, really, but as a stand-alone unit it seems easier to wrap my head around.
In my experience, it’s easier to understand everything as a single project with the mind map of flakes. Although it is as you mentioned that a lot of complexity is hidden and can bit you in the ass, like home manager not (necessarily) using the systemwide nixpkgs, yet as a beginners it feels easier to grasp how everything is one big derivation and your home manager config is only a dependency of this derivation.
I've been using flakes exclusively for project dependencies, not for system config. I've been doing this for a year or so but I still feel like a newbie.
What I like about flakes is that they (appear to) let you hide complexity.
I haven't seen this happen in a real community yet, but one could imagine JimBob's flake for foo-type work. JimBob has put a lot of thought into which tools you need and has his flake up on github for other foo-workers to use. JimBob is kind of a big deal in the foo community.
Then you've got Susie, who has been using JimBob's flake, but she doesn't really know all of its ins-and-outs. Eventually she needs something extra, because she specializes in bar (a subset of foo). With flakes, if I understand them, she can use JimBob's flake as an input, add the piece she needs, ad publish her own JimBob-with-Susies-tweaks flake.
In this way you can sort of imagine a constellation of flakes (I've been imagining the nix snowflake as a nix flake with three inputs and three outputs) which represent the various needs of the community that's using them.
In a config without flakes, my feeling is that there are fewer boundaries, so you have to keep more in your head about what's already in place. If you've enabled a service in /etc/nix/nix.conf and you're using home manager as a module, you can't disable it there because the values will conflict.
Granted, I don't actually know what a system configure with flakes looks like, but I hope it lets me compose flakes in a way that mirrors what JimBob and Susie are doing. I want to log in and say:
> give me base_system -> my_print_drivers -> image_tools
...and those flakes will compose so that I can use gimp and print photos. But since `my_printer_drivers` is a flake, I can also reference it from a different machine like:
> give me other_base_system -> my_print_drivers -> document_tools
This is unlikely, but let's suppose my printer is super fancy and can print in silver and gold ink, but in order to make this work the image tools flake has to change something about the printer driver. In a "flat" system config you're going to get a conflict, right? my_print_drivers to be one way, image_tools wants it to be another way, so you're going to have to sort that out.
But flakes are portable and composable in a way that lets you ignore the big picture and just focus on what you need. If you take something as an input and make an output where that thing is changed... it's changed. You can get away with ignoring more.
Of course that's the real question. can you get away with ignoring that much? I hope so.