Deprecate like you mean it
Reaction to the article’s proposal (random wrong results)
- Overwhelming consensus that intentionally returning wrong or intermittent results from deprecated APIs is “profoundly awful,” unethical, and indistinguishable from sabotage.
- Main objection: it creates flappy, non-deterministic bugs that are the hardest to debug and destroys confidence in CI and systems.
- Several commenters say if you want to break an API, do it explicitly and predictably, not via hidden behavior changes.
- Many initially missed that the article was sarcastic; the author later added a clarifying note that “it’s better to leave the warts,” and that warnings are weak but intentional breakage is worse.
What people consider good deprecation practice
- Use clear timelines and channels: deprecate with warnings, publish dates/versions for removal, then remove.
- Prefer breaking changes only in major versions (true SemVer) and avoid breaking in minor releases, especially in core libs like urllib, NumPy, etc.
- Suggested flows:
- Warnings → compiler/linter warnings → compiler/linter errors with trivial escape hatch → full removal.
- Hard errors with explicit, ugly config/env flags to temporarily re-enable deprecated behavior.
- Strong dislike for “permanent deprecation” without ever removing, but also for projects that threaten deprecation then never follow through.
Backwards compatibility vs progress
- One camp: bitrot is mostly a series of conscious backward-incompatible changes; old software “should” still run; API churn is negative value and should be extremely rare.
- Other camp: some breakage is necessary for security, maintainability, or performance; Windows, Python 2→3, .NET, Java, etc., show that trade-offs are inevitable.
- Disagreement over whether all progress can preserve backward compatibility; some claim yes in principle, others call that naïve.
Static typing, tooling, and incentives
- Argument that static typing and easy refactoring can encourage maintainers to introduce breaking changes (“it was trivial for me, so it’s trivial for users”).
- Counter-argument: static typing helps enforce contracts and detect breakages earlier; the real issues are culture and project philosophy, not typing.
- Several note that tools and warnings exist, but many teams ignore warnings and don’t pin dependencies, effectively choosing to absorb breakages.
Alternative pressure mechanisms
- Proposed—but controversial—ideas:
- Gradually adding latency (
sleep) to deprecated paths, sometimes exponentially, to create a business incentive to migrate. - Brownouts (temporary, clearly messaged outages) or HTTP 426-style hard failures with upgrade instructions.
- Charging for legacy API support or offering paid contracts/LTS instead of silent rug-pulls.
- Gradually adding latency (
Ethics and user expectations
- Strong view that published APIs are implicit long-term promises; users reasonably expect them to keep working.
- Others stress that contracts and costs matter: nothing can be supported forever, but termination should be explicit, predictable, and clearly communicated.