Strategic vs Tactical Programming
- Categories
- Complexity
- Sources
- A Philosophy of Software Design
Two stances toward writing code. Tactical programming optimizes for getting the current feature working as fast as possible. Strategic programming treats working code as necessary but not sufficient, and invests continuously in a good design.
Why it Matters
Complexity accumulates one shortcut at a time. A tactical mindset trades small, invisible amounts of future understandability for immediate speed, and those debts compound until the system is slow to change. The investment is small (often cited as ~10–20% extra effort) and pays back over the system's life.
Signals
- "I'll clean it up later" becomes the default and never happens.
- A tactical tornado: a developer who produces features fast while leaving a wake of complexity others must absorb, and is sometimes rewarded for it.
Benefits
A codebase that stays cheap to change. The investment mindset keeps each change leaving the design slightly better, so velocity holds over time instead of decaying.
Risks
Strategic taken too far becomes over-design and speculative generality, which is its own form of complexity. The investment should be continuous and small, not a grand up-front architecture.
Tensions
Directly conflicts with short-term delivery pressure and with metrics that reward visible output over maintainability. The payoff is real but deferred and hard to measure, which is why tactical work often wins in the moment.
Examples
Spending an extra hour to find the design that removes a special case, rather than bolting on the special case to ship today, is the strategic choice. Doing the reverse repeatedly is how a clean codebase becomes unworkable.