Software Coupling¶
A dependency across software-module boundaries in which a relevant change to one module's contract, data, behavior, or mirrored logic can require coordinated change in another.
Core Idea¶
Software coupling is a dependency across module boundaries: one module relies on another's contract, data, behavior, or mirrored logic such that a relevant change can require coordinated revision. Fowler's original essay uses a change-dependency test and includes duplicated code in separate modules even without an explicit call between them.[^ref-0469c3a02ef6]
Coupling is not automatically bad. A useful program needs communication among its modules; the design question is which assumptions cross each boundary and which changes they expose. A private implementation can change behind a stable interface without forcing caller changes.[^ref-0469c3a02ef6]
Scope of Application¶
The relation applies across routines, packages and other meaningful software units. Budgen's SEI curriculum names data, stamp, control, common-environment and content coupling as roughly ranked historical forms, not a universal numeric scale. It distinguishes coupling between modules from cohesion within a module.[^ref-45d90e8d8f63]
Fowler's layered UI/domain/database example makes dependency directional and nontransitive. A database change need not reach UI unless it alters the domain interface on which UI depends. An optional mapper and interface/implementation split can insulate some changes, but no architecture guarantees independence from every future change.[^ref-0469c3a02ef6]
Clarity¶
The abstraction distinguishes a caller's dependence on a public interface from dependence on private implementation details. It also reveals less visible co-change, such as mirrored logic in two modules with no runtime reference. Editing two files in one commit is not by itself coupling; the relied-on agreement must be specified.[^ref-0469c3a02ef6]
Manages Complexity¶
Rather than treating every source reference alike, map the modules, channel, relied-on assumption, direction and class of change that can propagate. Fowler focuses on high-level package relationships because an undifferentiated count hides the important dependency pattern. Budgen's forms help classify channels but do not replace that conditional analysis.[ref-0469c3a02ef6][ref-45d90e8d8f63]
Abstract Reasoning¶
If the database changes but the domain's exposed interface remains stable, Fowler's UI need not change. If the shared rule represented in duplicated modules changes, both copies may need editing despite the absence of a call. These counterfactuals show that software coupling is about which change crosses which assumed boundary, not a claim that every change ripples.[^ref-0469c3a02ef6]
Knowledge Transfer¶
The same module/assumption/change test transfers literally from duplicated code to layered packages. Outside software, the live prime Coupling captures dynamic subsystem interdependence. Its current full definition requires an interaction channel, strength and timescale; the static duplicated-code case need not instantiate those dynamic roles. This staged software identity is therefore not treated as a prime alias or forced strict child, and its DAG placement remains proposed unparented.
[^ref-0469c3a02ef6]: Martin Fowler, “Reducing Coupling,” IEEE Software 18, no. 4 (2001): 102–104, author-hosted original PDF, pp. 102–104.
[^ref-45d90e8d8f63]: David Budgen, Introduction to Software Design, SEI Curriculum Module SEI-CM-2-2.1 (1989), original PDF, printed p. 8.
[^ref-9cb942c6d756]: Encyclopedia of Abstractions, live prime_abstractions/v2/coupling.md, Core Idea and Structural Signature, inspected 2026-10-01.
Neighborhood in Abstraction Space¶
Software Coupling sits in a sparse region of the domain-specific corpus (69th percentile for distinctiveness): few abstractions share its structure, so a faithful description tends to retrieve it precisely.
Family — Software & Systems Architecture (29 abstractions)
Nearest neighbors
- Functional Design — 0.87
- Interface-Based Programming — 0.85
- Spaghetti Code — 0.84
- Cohesion (software / module-level) — 0.84
- Software Component — 0.83
Computed from structural-signature embeddings · 2026-10-08