That's the wrong way to think about it. NixOS is best compared to Arch and Gentoo. It is a
meta distribution. You can swap in DMs, DEs, WMs and kernels in your system config as as you like or just take some defaults. You might even be able to pick a libc. You are stuck with systemd, though service definitions are completely wrapped and declared in the nix language instead. Services are still controlled live and audited through the normal systemd tools. If that is a deal breaker, consider Guix, GNU's version of nix, which uses their own Guile based init system.
If you track nixos unstable, you will keep up to date with whatever is the latest set of package definitions that built successfully on master, and they are updated individually so you are not waiting on the release.
Nix is crazy customisable, which is not everyone's preference. I have so far only recommended nix to gentoo and arch users, who are, incidentally, overrepresented in the user community. Nix is, I would say, more customisable than Gentoo. Both are source based, and both allow you to set configuration options of a package's compile phase. But nix has a more fine grained override system that is far easier to reason about than Gentoo's USE flags. Moreover, because of nix's emphasis on reproducible builds, it is able to cache most binaries, so you compile far less frequently than on Gentoo.
I would personally be sold on declarative configuration management, especially one such as Nix which shims all the separate and disparate configurations of most of its software. Nix also swallows the package management of other software, including node, Python, Haskell and even Emacs. But Nix also offers extremely lightweight, isolated and reproducible environments, competing in this space with docker and even offering full declarative cloud deployment, all built on the same powerful language and core concepts.
I will soon be buying a new laptop. To install nix, I will copy over my declarative config, ask Nix to build it, and so have a system up and running with all the software I want ready to go.
As I upgrade core packages, I might find something breaks on a reboot. No worries, all my previous services, kernels and configurations are still on the system and I can just rollback. Nix is happy for arbitrarily many conflicting versions of packages to be on the same system, isolated from each other but sharing reproducibly identical dependencies wherever they exist, and so not wasting too much space. Nix has a very clever and elegant way to achieve this.
Because all environments are isolated, any user can install software without admin privileges. Different users can install different versions of the same package without conflict.
For development, I have per project nix configurations which pull in whatever dependencies and dev tools I want to hack on that project. To start hacking, I tell nix to put me into the described dev environment. Different dev environments can pull in different dependencies of the same package, and I can hack on them side by side. I can also move them to other machines, bring up the environment and continue hacking. This replaces the ugly brutishness of Python development sandboxes, and alleviates much of dependency hell.
In my last job, I was hacking Ocaml, and we found ourselves needing to patch the Ocaml compiler to give us new runtime features. Easy: just override the fetch target for the compiler in a nix file, and now all our Ocaml dependencies are built against the patched compiler. My boss, a Mac user, could download the nix package manager for MacOS and work on the project using my configuration without even needing Linux.
Server side, I configure dovecot, postfix, IRC, ssh, murmur and my Haskell web server in a single configuration file.
According to the 18.03 release notes, it also has backwards-compatibility issues, which would seem to challenge the ease-of-upgrade statement....have you had to deal with those?
None applied to me. They were mostly minor changes to how system packages are configured.
Now I stress that I almost never recommend Nix to people. I have specific tastes and use cases and am pretty far removed from a normal desktop user. I have never really cared for the ever distant coming of the year of the linux desktop and still won't touch desktop environments. I live mostly in emacs, firefox and terminals, or terminals emulated in emacs. I hate most desktop software, and have never been happier with email since I ditched thunderbird for mu4e, an Emacs mode for reading and sending mail.
My brother has really taken to Nix though. He got frustrated by Ubuntu breaking and leaving junk from broken uninstalls. He would find himself having to manually install loads of system dependencies to work on a one shot python project, only to struggle with the clean up afterwards. Whether a better solution existed, he would periodically reinstall the entire damn os to get a clean state.
That hasn't happened to me in three years on Nix, thanks to environment isolation and isolation of each package's FSH. If you do:
nix-shell -p firefox
you will pull down firefox if it's not already on your filesystem and enter a one shot environment with the browser now in your path. Exit the shell and it's like it was never there, the file resources sleeping in a FSH under a unique hash, linked statically to its dependencies under their own hashes, to be used again if that environment is summoned again, or deleted in the next garbage collection. When my brother realised he could install software in such a cavalier and safe fashion without polluting his system state or even using sudo, he was blown away and signed on to the distro. It's far more lightweight and pleasant than docker will ever be.
And finally, I really like the programming language used for configuration: it is an extremely elegant pure, lazy functional language. It has the cuteness of lua, and has some really ingenious ways to do oopish things using lazy recursive records. Not to everyone's taste, however.
Phew! Congrats if you made it to the end of this overly long post.