There are three types of technical debt: code debt, design debt, and testing debt. Technical debt increases complexity, but regular refactoring can help manage and reduce this complexity. Refactoring is not an end in itself; it serves the business goals and strategy to meet those goals.