Shipping quickly is vital for proof of product, but uncontrolled speed creates chaos. The key is making debt a conscious decision.
Conscious shortcuts
I distinguish tactical shortcuts (acceptable prototypes) from dangerous ones. Quick experiments can skip polish, but never contracts. Every shortcut gets a ticket, e.g., "We’ll revisit this module in 14 days." Hidden shortcuts—missing validations, inconsistent models—quietly destroy trust.
Tight tooling
I equip projects with TypeScript, strict ESLint, and targeted tests. Automation prevents noisy commits. Reviews go faster when code follows lint and formatting expectations. Even MVPs get clear contracts and versioned migrations.
Architectural decisions
Structure guides future debt. A readable monolith beats premature microservices. Domains stay clear and modular so debt can be isolated and addressed per area.
I spend time understanding use cases: what data is stored, which operations must be atomic, and which events trigger other systems. That upfront work avoids piling quick fixes that never get replaced.
Lessons learned
I’ve seen teams outgrow their codebases, not because of traffic, but because no one understood the database schema or how to run things locally. I preempt that by documenting, organizing files, enforcing critical tests, and scheduling "tech debt retros" to keep the list visible.
When startups ask me to speed up, I deliver a pipeline where debt is tracked, owned, and addressed on purpose. Speed becomes sustainable instead of a crisis waiting to happen.