The Computing Series

Tradeoffs

AT8 — Coupling/Cohesion: High connascence within a boundary, low connascence across boundaries is the target state. A module with strong internal connascence is cohesive — its parts belong together. Across boundaries, strong connascence is a liability. Every import creates a dependency; every dependency constrains independent evolution. The tradeoff is between having a natural home for each concern (cohesion) and keeping boundaries thin enough that modules can change without affecting each other (low coupling).

AT3 — Simplicity/Flexibility: Strict module boundaries make systems flexible — each module can be replaced independently. The cost is structure. A small codebase with two developers does not need elaborate module boundaries; the cognitive overhead of enforcing them exceeds the benefit. A codebase with thirty engineers and eight services needs explicit boundaries enforced by tooling, or the import graph will collapse into a ball of mud within a year.

Read in the book →