The Computing Series

Real Systems

Linux kernel modules: The kernel enforces module boundaries through explicit symbol exports. A module can only depend on exported symbols. Unexported internals are invisible to other modules. This boundary enforcement has allowed the kernel to evolve over thirty years without the dependency graph collapsing.

Java package-private visibility: Methods and classes declared without a visibility modifier are accessible only within their package. This is a language-enforced module boundary. Teams that ignore this and make everything public pay the connascence cost later — they cannot change internal implementation without affecting external callers.

npm package ecosystem: Each npm package is a module boundary enforced by version. A package’s package.json declares exactly what it depends on. The downside: dependency resolution is a graph problem, and circular dependencies between npm packages cause resolution failures — the same architectural problem at ecosystem scale.

Go module system: Go enforces package boundaries through explicit exports (capitalised identifiers are public; lowercase are private). The go mod system makes the dependency graph explicit and version-pinned. Import cycles are compilation errors, not runtime surprises — the compiler refuses to build a program with a cycle.

Concept: Modularity and Boundaries Thread: T8 (Divide & Conquer) ← Book 1, Ch 5 (Recursive decomposition) → Ch 13 (Domain-Driven Design) Core Idea: Modules divide a codebase into units that can change independently; the import graph makes the true dependency structure visible, and cycles in that graph merge intended-separate modules into one coupled unit. Tradeoff: AT8 — Coupling/Cohesion: strong internal connascence (cohesion) is healthy within a module boundary; strong connascence across boundaries creates resistance to independent change. Failure Mode: FM8 — Schema/Contract Violation: module interfaces that change without coordinating dependents break every caller; the risk scales with the number of modules that import the changed interface. Signal: When a change to one module unexpectedly breaks tests in an unrelated module, the import graph contains coupling that the team did not intend. Maps to: Reference Book, Framework 8 (Patterns)

Read in the book →