  The common use case of code smells assumes causality: Identify a smell,
remove it, and by doing so improve the code. We empirically investigate their
fitness to this use. We present a list of properties that code smells should
have if they indeed cause lower quality. We evaluated the smells in 31,687 Java
files from 677 GitHub repositories, all the repositories with 200+ commits in
2019. We measured the influence of smells on four metrics for quality,
productivity, and bug detection efficiency. Out of 151 code smells computed by
the CheckStyle smell detector, less than 20% were found to be potentially
causal, and only a handful are rather robust. The strongest smells deal with
simplicity, defensive programming, and abstraction. Files without the
potentially causal smells are 50% more likely to be of high quality.
Unfortunately, most smells are not removed, and developers tend to remove the
easy ones and not the effective ones.
