Managing dependencies well is an essential part
of writing solid code. I've argued (Sutter98) that C++'s greatest
strength is that it supports two powerful methods of abstraction:
object-oriented programming and generic programming. Both are
fundamentally tools to help manage dependencies and, therefore,
manage complexity. It's telling that all of the common OO/generic
buzzwords—including encapsulation, polymorphism, and type
independence—and all the design patterns I know of describe ways to
manage complexity within a software system by managing the code's
interdependencies.