I'm not very familiar with Nix, but one rather unique feature of Spack is the concept of combinatorial builds.
Suppose we have a big HPC cluster, and suppose also that this is a fairly heterogeneous cluster in terms of CPU architectures. We might have, for example, 3 different generations of Intel chips. We would also have several different compilers, and several versions of MPI (e.g., OpenMPI, MVAPICH, etc.).
Using Spack, it is trivially simple to build a piece of software with all possible combinations of compiler-architecture-MPI.
Spack also integrates very nicely with LMOD, so managing Spack installs using the LMOD module system is extremely convenient.
I would also argue that the user experience with Spack is phenomenal, but that's just a personal preference.
Suppose we have a big HPC cluster, and suppose also that this is a fairly heterogeneous cluster in terms of CPU architectures. We might have, for example, 3 different generations of Intel chips. We would also have several different compilers, and several versions of MPI (e.g., OpenMPI, MVAPICH, etc.).
Using Spack, it is trivially simple to build a piece of software with all possible combinations of compiler-architecture-MPI.
Spack also integrates very nicely with LMOD, so managing Spack installs using the LMOD module system is extremely convenient.
I would also argue that the user experience with Spack is phenomenal, but that's just a personal preference.