Coupling refers the to strength of dependencies in your code. Coupling can be either explicit or implicit.

For example, if an application has code that depends on other code that is coupling. If there are modules which depend on other modules that is coupling.

Coupling occurs in many forms and is unavoidable for even the smallest application. Managing an application’s coupling though is a critical skill and important to understand for making architectural decisions.

If an application is tightly coupled it is more difficult to make changes without impacting other parts of the application. Vice-versa if an application is lightly coupled a part of the application could change, and assuming the functionality didn’t then it might not require changes elsewhere in the application.

APIs are a form of implicit coupling. If I define an API endpoint, for example, which takes a query parameter ?expectedvalue= then I’ve defined an implicit coupling. Implicit coupling is where a contract is established between different parts of a system and the contract is an agreement that for the most part changes will only add to an API and will NOT break the API.

These contracts / agreements between parts of a system give the ability for a module to be extensible while ensuring that dependents are able to still function.