  Technical debt has become a common metaphor for the accumulation of software
design and implementation choices that seek fast initial gains but that are
under par and counterproductive in the long run. However, as a metaphor,
technical debt does not offer actionable advice on how to get rid of it. To get
to a practical level in solving problems, more focused mechanisms are needed.
Commonly used approaches for this include identifying code smells as quick
indications of possible problems in the codebase and detecting the presence of
AntiPatterns that refer to overt, recurring problems in design. There are known
remedies for both code smells and AntiPatterns. In paper, our goal is to show
how to effectively use common tools and the existing body of knowledge on code
smells and AntiPatterns to detect technical debt and pay it back. We present
two main results: (i) How a combination of static code analysis and manual
inspection was used to detect code smells in a codebase leading to the
discovery of AntiPatterns; and (ii) How AntiPatterns were used to identify,
characterize, and fix problems in the software. The experiences stem from a
private company and its long-lasting software product development effort.
