The debt lives in the plumbing
ML code is the tip of the iceberg
Google's classic paper Hidden Technical Debt in Machine Learning Systems makes one uncomfortable point: the model code is a tiny box in a sprawling diagram of configuration, data collection, feature extraction, serving infra, and monitoring. The debt lives in the plumbing, not the model.
Name the anti-patterns so your team can call them in review:
- Glue code — endless adapters around a vendor library.
- Pipeline jungles — scrapes and joins accreted until no one dares change them.
- Dead experimental codepaths —
if EXPERIMENT_42:branches that never got cleaned up. - Configuration debt — hundreds of flags, half undocumented.
- CACE — Changing Anything Changes Everything: a model's inputs are entangled, so tweaking one feature silently shifts the decision boundary everywhere.
Unlike normal tech debt, ML debt is invisible at the code level — it hides in data dependencies and feedback loops a linter can't see.