What could possibly be difficult about developing something you use every day, like app stores or package managers?
The article provides an in-depth analysis of the complexity behind software package management, pointing out that what appears to be a simple installation process actually involves complex dependencies, specifically directed acyclic graphs (DAGs). The author compares mainstream solutions: global package managers (such as apt) save space but face dependency conflicts characterized as NP-complete problems and destructive upgrades; divide-and-conquer strategies (such as venv, Docker) avoid conflicts through environment isolation but lead to resource redundancy; monolithic approaches bundle dependencies together, simplifying management at the cost of shared resources. Additionally, the article introduces the functional, immutable, and deterministic build advantages of Nix, as well as the clever design of NuGet, which combines centralized storage with monolithic packaging. Finally, it notes that there is currently no universal solution in the industry; typically, a divide-and-conquer approach combining monolithic packaging with container technology is adopted to balance dependency conflicts and resource efficiency, revealing the hidden technical challenges behind modern software distribution.