Nix is built on one radical idea: package installation should be a pure function of its inputs. Same inputs, same output — bit-for-bit, every time, on every machine. From that one idea cascade all of Nix's superpowers and all of its weirdness.
The superpowers are real. Atomic upgrades — you're never in a half-upgraded state; the upgrade either fully succeeds or your system is exactly as it was. Multiple versions coexist — Python 3.10 and 3.13 can be installed simultaneously and used per-project without conflict. Instant rollback — if today's upgrade broke your dev environment, nix-env --rollback takes you back in one second. Reproducible dev environments — a flake.nix in your repo means every teammate gets the same OpenSSL, the same Python, the same Postgres, regardless of OS. The largest package repository in the world — nixpkgs has 80,000+ packages, more than Homebrew, MacPorts, AUR, or any distro repo.
The weirdness is also real. Nix has its own purely functional configuration language (also called Nix). The official documentation has historically been thin and academic. Error messages are infamously cryptic. The learning curve is the steepest in this quest — budget weeks of part-time learning, not hours.
For Mac developers, Nix is most valuable as per-project dev environments via flakes. Even if you don't replace Homebrew with Nix system-wide, dropping a flake.nix into a project gives every contributor identical tool versions on first nix develop — no "works on my machine" debugging.