Software design can refer to two things: the structure and
implementation of a piece of software, and the plan how to structure and
implement a piece of software.
Technical debt refers to the future cost of reworking a solution
that was chosen because it was faster and easier to implement instead of
making it more flexible from the beginning.
When software is not well-designed, technical debt accumulates.
Dependencies need to be managed as well as the code itself.
Coupling refers to what extend the components of a piece of
software are connected. Ideally, the components are loosely coupled so
that if one component is changed, the others do not have to be changed
as well.
There are many techniques and best practices to achieve loose
coupling, information hiding, abstraction, and the Single Responsibility
Principle are some of them.