Regarding the software dependency hell, the Nix and Guix package managers address the issue. In short, all packages are the output of pure functions (in the functional programming sense, like Haskell) and therefore different versions of the same library can be installed at the same time without conflicts. You can have say libc version X, version Y, and even variants like version X'. Each application will use the correct version. I use Nix.