TODO Comments Are Your Architecture Documentation
After 47 years of writing code that nobody understands (including myself), I’ve discovered the ultimate documentation strategy: TODO comments. Why waste time with wikis, diagrams, or ADRs when you can just scatter cryptic notes throughout your codebase?
The TODO-Driven Documentation Philosophy
Traditional documentation is for companies with “spare time” and “budgets.” Real engineers document through intent, not execution. And what better way to express intent than a comment that says “fix this later”?
# TODO: This whole module needs a rewrite
# TODO: I have no idea why this works
# TODO: Ask Dave about this (Dave quit in 2019)
# TODO: Figure out what this function actually does
# TODO: This is definitely a security issue
# TODO: URGENT - fix before launch (commit date: 2021-03-15)
def process_payment(amount):
return amount * 0.99 # TODO: What is this 0.99?
See? Every TODO tells a story. It’s like a novel, except the ending never comes.
The TODO Taxonomy
Not all TODOs are created equal. Here’s my classification system, refined over decades:
| TODO Type | Meaning | Actual Outcome |
|---|---|---|
TODO |
“I’ll do this later” | It will never be done |
FIXME |
“This is broken” | It will remain broken forever |
HACK |
“I’m ashamed of this” | It will outlive the company |
XXX |
“This is dangerous” | It will become critical infrastructure |
NOTE |
“I’m explaining myself” | Nobody will read it |
OPTIMIZE |
“This is slow” | It will become slower |
BUG |
“Known issue” | It’s now a feature |
As the wise Wally from Dilbert once said: “I can only please one person per day. Today is not your day. Tomorrow isn’t looking good either.” Same applies to TODOs - they can only be addressed one at a time, and that time is never.
The Architecture Emerges
Want to understand the system architecture? Just grep for TODOs:
$ grep -r "TODO" src/ | wc -l
2,847
$ grep -r "FIXME" src/ | wc -l
1,203
$ grep -r "HACK" src/ | wc -l
892
$ grep -r "help" src/ | wc -l
47
That’s 4,989 architectural decisions, all meticulously documented! Compare that to your empty Confluence page that just says “Architecture Overview - Coming Soon.”
Dating Your TODOs
Some junior developers add dates to their TODOs, thinking they’ll be accountable:
// TODO (2019-03-15): Refactor this before the demo
// TODO (2020-01-08): This deadline was optimistic
// TODO (2021-06-22): Still on the roadmap, I promise
// TODO (2022-11-30): New year, new me, new deadline
// TODO (2024-04-01): At this point it's historical preservation
The dates serve as a fascinating archaeological record of broken promises. Future developers will study these like ancient ruins.
The FIXME Escalation Ladder
When a regular TODO doesn’t convey urgency, escalate:
// TODO: Fix this
// FIXME: Really fix this
// FIXME!!!: I'm serious
// FIXME!!!!!!: WHY HASN'T ANYONE FIXED THIS
// FIXME: Okay I've accepted this is permanent
Each exclamation point represents a sprint where someone said “we’ll get to it next sprint.”
The Self-Documenting TODO
Why write documentation when you can write TODOs that explain themselves?
# TODO: This function does something with users
# TODO: I think? Or maybe orders?
# TODO: Just don't touch it
# TODO: Seriously, don't
# TODO: Last person who touched this was let go
# TODO: (unrelated to the code, I'm sure)
def mystery_function(x)
# TODO: What is x?
return x.transform_somehow
# TODO: What does transform_somehow do?
end
Relevant xkcd: Code Quality - because someone will always ask about the quality of your TODO comments.
TODOs as Tribal Knowledge
The best TODOs reference people who no longer work at the company:
// TODO: Ask Marcus about the edge case (Marcus: 2015-2017)
// TODO: Sarah said this was fine (Sarah: 2018-2020)
// TODO: Check with the payments team lead (position eliminated 2021)
// TODO: Verify with legal (we don't have legal anymore)
// TODO: Sync with DevOps (they're called Platform Engineering now)
// TODO: Get sign-off from CTO (we've had 4 since this was written)
It’s like a memorial wall, but for technical decisions.
The TODO-to-Ticket Pipeline
Some companies try to “track” TODOs by converting them to tickets:
Sprint 47 Backlog:
- [LOW] TODO from file.js:234 (created 2019)
- [LOW] TODO from utils.py:891 (created 2020)
- [LOW] TODO from app.rb:12 (created 2018)
... 2,844 more items
This is just moving the graveyard, not resurrection. As the Pointy-Haired Boss would say: “Let’s prioritize the low-priority items as high-priority so they become medium-priority.”
The TODO Retirement Plan
TODOs never die. They evolve:
// 2019: TODO: This is temporary
// 2020: TODO: This temporary thing is now critical
// 2021: TODO: We built three services on top of this temporary thing
// 2022: TODO: Temporary thing is now the core of our business
// 2023: TODO: Document the temporary thing
// 2024: TODO: Train new hires on the temporary thing
// 2025: TODO: The temporary thing is permanent, stop calling it temporary
// 2026: This is our architecture. Accept it.
The Ultimate TODO Architecture Document
Here’s a template for your README:
# Project Architecture
See TODOs in codebase for:
- Design decisions (grep "TODO")
- Known issues (grep "FIXME")
- Technical debt (grep "HACK")
- Historical context (grep "NOTE")
- Security concerns (grep "XXX")
For the full picture, run:
$ grep -rn "TODO\|FIXME\|HACK\|XXX\|NOTE" src/
That's it. That's the documentation.
Conclusion
Every great codebase is just a collection of TODOs waiting to become someone else’s problem. Documentation fades, wikis get deleted, but TODOs? TODOs are forever.
Remember: a TODO today is an archaeological artifact tomorrow.
The author has 12,847 open TODOs across various projects. He’s confident about getting to at least 3 of them this year.