Symptom

A single conceptual change forces edits in many small places — adding one logging field means touching 17 files spread across the codebase. The reviewer's rises because every site has to be verified independently, the team's multiplies with the count of scattered sites, and one missed site ships broken.

Goal

All code that varies together lives together — applied so a single axis of change maps to a single edit site. Adding a new field is one change in one module; the reader sees the axis in the module name, and reviewers verify the change in one place rather than reconstructing it from N partial diffs.

Smellier version

// Five files each have:
log(`event=${event}, user=${user}`);

Fresher version

// One file:
function logEvent({ event, user }) {
// one place to evolve
}
Example source: Illustrative example written for this site, not a quotation from any source.
Pressure

Easy to miss a site; reviewers can't verify completeness without re-running the same search the committer did, and small changes feel disproportionately risky. The team's compounds across every scattered site; a change that broke one of the 17 instances ships because the reviewer trusted that the listed files were the complete set.

Tradeoff

Consolidating the scattered code into one module can pull together responsibilities that genuinely belong apart, and the cure forces a coordinated migration across every original site. The of the consolidation touches every caller during the move; teams must align on the rename and import paths before the new module can be reasoned about as the single source.

Relief

Change cost becomes proportional to the conceptual change, not to how widely the concept was scattered. The team's per axis drops to the work the axis actually requires; the team's also drops because adding a capability to the axis touches one module instead of N, and reviewers verify completeness by reading one file.

Trap

Pulling every superficially-related edit into one module creates a god-module that becomes the new shotgun target — change cost migrates rather than vanishing, and the new module accumulates as unrelated axes share a file. Readers carry the cognitive load of the whole god-module to reason about any one axis it owns.