Comments explaining what the next block of code does, what a function returns, or how a parameter is meant to be used.
Names of functions, variables, and types tell the reader what the comment was trying to say. Comments survive only when WHY is non-obvious.
Smellier version
// charge the customer's stored payment method, including taxcharge(c, t * 1.1);
Fresher version
chargeWithTax(customer, total);
The code didn't reveal its intent — the comment is patching an unnamed function or unclear variable; comment and code drift over time.
Renaming to express what a comment said increases churn across consumers and history; some legitimate comments (non-obvious WHY, hidden invariants, workaround references) are harder to convey through names alone.
No more stale comments; readers trust names; reading the code is the path to the answer.
Deleting every comment as part of a cleanup pass — including ones that document hidden constraints, historical context, or invariants that names genuinely can't express.