Fresh features, frameworks and an endless path of external dependencies are forces which conspire to amass towering mountains of technical debt. As this debt piles ever higher we risk catastrophic failure and emergency patches caused by avalanching broken dependencies.
The problem is compounded when active developers create and maintain dozens of such apps for personal and professional reasons. Each and every application has its own idiosyncrasies and versioned dependencies. It's no small miracle that anyone can maintain clean working environments. Fortunately there are excellent system management tools to keep the nest of dependencies organized.
Web development would be a nightmare without environment tools like RVM, PythonBrew, and NVM1 to keep installations and dependencies clear. For instance, RVM ensures that all gems installed for a given Ruby environment are consistent with the active version they are installed with. And even more than that, rvm helps migrate to new versions of Ruby by installing all gems for the new environment. Unfortunately if you're a Windows Rubyist rvm isn't available to you.
The skilled folks responsible for crafting and maintaining many of the Ruby gems and utilities I rely on take great pains to minimize external requirements. They go through the arduous labor of removing all nonessential dependencies to avoid conflicts, ie two gems both depend on different versions of another gem.
The combination of proper version management utilities along with well designed library tools are potent weapons against the ever threatening avalanche of dependency debt.