The Composition and Decomposition of Software
We build software by combining units of code. The way we combine them greatly affects our ability to test, change, understand, and reuse code. We usually think only about the design of the units and end up with tightly coupled code. By considering how software is composed, we can build simpler, better software.