Software Packaging Is a Nightmare
What the author calls &quot;software environments&quot; are actually called &quot;software distributions&quot;.<p>And yes, being able to install a single version of each package is rather limiting.<p>The main idea of a software distribution, is that all software is packaged in coordination, and the versions in the repositories work with one another. E.g.: the packaged firefox will be built to work with the packaged version of libpng and fontconfig. And all other software packaged works with the same version of fontconfig too.<p>If there is a version mismatch and conflicts, this is usually resolved at a distribution level. Keep in mind that distributions nowadays are a lot more vanilla than the original BSD idea of a distribution. In BSD, a distribution has _ports_ of the software that is packaged, which uses the upstream source (of say, Firefox) plus patches to make it build and run on the distribution with the dependencies that it provides.<p>This approach substantially minimises the amount of build time required, the amount of storage required for packages and the amount of network consumed for distributing. It also makes security a lot easier, because all packages link to the system openssl, so in case of a security issue, only the openssl package needs to be updated (which is also a pretty small download compared to rebuilding everything that depends on it).<p>The modern model of &quot;just put each thing it its own docker container with all its dependencies&quot; is simple and works. It takes a lot less developer time to get things working, at the expense of essentially duplicating all dependencies for each package, making security a nightmare to follow, and rebuilding and distributing becomes a lot more expensive. But hey, if developer hours are expensive, maybe the cost of duplicating so much is smaller ir comparison.<p>A big problem nowadays is that many modern languages have evolved without consideration for users wanting multiple versions of a given dependency.<p>Let&#x27;s look at Python for example. If you want to install a package, it goes into &#x2F;usr&#x2F;lib&#x2F;python3.11&#x2F;site-packages&#x2F;$PACKAGE. Do you want two version of it? That&#x27;s not possible. This is ultimately a language design issue.<p>Shared objects don&#x27;t have this issue. For example, libssl3 on my system provides &#x2F;usr&#x2F;lib&#x2F;libssl.so.3, but there&#x27;s nothing preventing another package from providing &#x2F;usr&#x2F;lib&#x2F;libssl.so.4 or &#x2F;usr&#x2F;lib&#x2F;libssl.so.2, which means that I can concurrently install multiple versions of it. The same is true for libpng and a bunch of other tools.<p>Finally, I&#x27;ll say that while NixOS and Flatpak provide novel approaches to solving these problems, they bring with them their own pile of complexity. However, I&#x27;m still thankful that someone develops these projects: what we learn through them will definitely help us continue iterating on how we distribute package in software in the future (although I honestly don&#x27;t think either of those is the future).