A practical lesson on using cohesion, coupling, and boundary tension to evaluate whether a service is shaped well internally and interacts with neighbors in a proportionate way.
Cohesion asks whether the things inside a service belong together for reasons the business and the owning team can explain. Coupling asks how much that service depends on other boundaries to do normal work. Those two ideas are the most practical way to judge whether a service is well shaped. When cohesion is weak or coupling is high, the boundary starts to show stress. In this guide, that stress is called boundary tension.
Boundary tension is not one metric. It is the observable pressure that appears when a service is too internally confused or too externally coordinated. That pressure shows up in change patterns, incident patterns, contract growth, and workflow friction.
flowchart LR
A["Internal change pressure"] --> C["Boundary tension"]
B["External coordination pressure"] --> C
C --> D["Consider split"]
C --> E["Consider merge"]
C --> F["Consider contract redesign"]
What to notice:
Strong cohesion usually means:
For example, a pricing service may reasonably contain:
Those concerns change together and revolve around one coherent capability.
Weak cohesion often looks different:
Coupling is not the same as any communication at all. Healthy services still collaborate. The problem is excessive or routine dependency. High coupling often shows up as:
This is why coupling has both runtime and organizational forms. A service can be tightly coupled even if the APIs are technically separate.
Boundary tension becomes visible when the service is carrying conflicting signals such as:
One practical scorecard can help make this concrete:
1service: checkout
2cohesion_signals:
3 coherent_business_language: medium
4 shared_change_drivers: low
5coupling_signals:
6 synchronous_dependencies_per_request: high
7 release_coordination_with_other_teams: high
8operational_signals:
9 incident_bounce_rate: medium-high
10boundary_tension: high
11review_bias: redesign-contracts-or-redraw-boundary
What this demonstrates:
Not every service needs zero coupling. A cohesive service may still depend on a few authoritative neighbors. For example:
The issue is not dependency itself. The issue is whether the dependency is proportionate and meaningful. A few clear business interactions are different from a long chain of low-level remote lookups.
The most dangerous case is when:
That usually means the service is too small, too layered, or too politically shaped. It carries neither a strong internal model nor clean external independence. This is the point where “microservice” becomes mostly packaging.
The right response depends on where the stress is coming from:
That is why boundary tension is a decision aid rather than a single conclusion.
An inventory service owns stock reservation, warehouse synchronization, low-stock alerts, supplier replenishment hints, and a batch export API for reporting. The same service also participates in several synchronous workflows and requires frequent cross-team contract changes. What should the review ask first?
The review should first determine where the tension is strongest. If the core inventory model is still cohesive but external coordination is the main problem, the first fix may be contract redesign or read models. If the internal domain itself is confused and the change drivers diverge sharply, a split may be justified. The key is not to jump to “split” or “merge” before understanding whether the dominant stress is internal or external.