← Back to writing
·1 min read·#engenharia

Spec-Driven Development — What we should have been doing all along, even without AI 🚀

Every time a new "buzzword" pops up in the development world, I notice a curious pattern: the community discovers, with an air of novelty, something that…

Every time a new “buzzword” pops up in the development world, I notice a curious pattern: the community discovers, with an air of novelty, something that good engineers have been doing for decades.

The latest one is Spec-Driven Development (SDD) — the idea of writing a detailed specification before having AI generate code. And I ask, point-blank: why do we need AI to remind us of something so basic?

⚠️ The inconvenient truth

Spec-Driven Development wasn’t invented in 2025. It was rediscovered because, without a clear spec, AI agents produce code that seems to work but violates architecture, breaks contracts, and introduces bugs that only show up in production.

Guess what? Humans have been doing the exact same thing for decades.

The difference is that, with humans, we normalize it. “It’s part of the process,” “we’ll refine it in the sprint,” “we’ll document it later.” With AI, the chaos becomes explicit — and then the industry wakes up.

🪦 The projects we’ve all seen die

Think about the last five troubled projects you’ve witnessed. I bet the story repeats itself:

  • 🧟‍♂️ The backend that turned into a Frankenstein: It started as a simple CRUD. Without a spec, every new feature was pasted on top of the previous one. Six months later, nobody understands the authentication flow anymore. The “documentation” is a 200-message Slack thread.

  • 🔌 The integration nobody validates: Team A delivered an API. Team B consumed it. Each interpreted the fields their own way. In production, they discovered that “status: pending” meant entirely different things in each service. Cost of rework: three weeks.

  • ♻️ The refactor that became a rewrite: The person who wrote the original code left. There’s no spec, no logged decisions. The new team looks at the code and asks: “Is this a business rule or a bug that became a feature?”. Nobody knows. The standard answer: rewrite from scratch. Again.

  • 🏗️ The MVP that never became a product: “Let’s validate quickly, then we’ll formalize it.” Two years later, the “MVP” is running in production, making millions, and nobody wants to touch it because nobody knows what it actually does.

None of these problems were caused by the absence of AI. They were all caused by the absence of declared intention before execution.

📋 What a good spec should have (with or without AI)

Here is the checklist I advocate for — it applies to you, your junior team, the intern, and yes, also to Claude or Copilot:

🎯 Expected outcome: What needs to be true in the world when this is done? Not “implement endpoint X”, but “user can recover their password in under 2 minutes without human support”. 🚧 Scope and non-scope: What is in, and more importantly, what is out. Most projects fail because of what wasn’t said, not what was. ⚙️ Real constraints: Technological, regulatory, performance, deadlines. If it needs to run in 200ms, that’s a spec, not a detail. 🧠 Prior decisions and their whys: “We’re going to use Postgres” is not a spec. “We’re going to use Postgres because we already have mature operations and the team knows it” is a spec — because it logs the rationale that will be revisited in 6 months. 🧪 Verifiable acceptance criteria: If it can’t be tested, it’s not a criterion. It’s a wish. ❓ Acknowledged points of uncertainty: What don’t you know yet? An honest spec admits to gaps. A bad spec fakes omniscience.

Notice something important: none of this requires Spec Kit, Kiro, Tessl, or any modern tool. A well-written Markdown file does the job. A Notion page. A README. The artifact matters much less than the act of thinking before coding.

⏳ But what about the “waste of time”?

I hear this every week: “There’s no time to spec, we need to deliver”. Honest translation: “We’d rather spend three weeks refactoring than three hours thinking”.

Specifying isn’t bureaucracy. It’s the compression of future rework.

Every hour spent on a good spec saves, in my experience, between five and twenty hours of discussion, fixing, and replanning later. The numbers vary — the direction does not.

And no, this isn’t waterfall. A spec doesn’t need to be exhaustive or immutable. It evolves. But it exists. And it’s versioned. And it’s reviewed. And it’s the baseline when someone asks “why was this done this way?”.

🤖 The irony of AI

Here is what bothers me the most about this whole wave: we need autonomous agents generating code to finally take seriously something that has always been a best practice.

AI didn’t create the need for specification. It just made it impossible to ignore. When the “developer” is an LLM that literally executes what you described, the quality of your thinking turns into code in minutes. There’s no longer room for “oh, it knew what I meant”.

And that is the best news about SDD: it finally exposes that the hard part of software development was never writing code. It was thinking clearly about the problem before trying to solve it.

AI won’t replace you. But the lack of a spec — that has been doing it for a long time.

👇 And you? How many of your recent production issues started with “we’ll align on that later”? Let me know your thoughts in the comments.

#SoftwareEngineering #SoftwareArchitecture #TechLeadership #ArtificialIntelligence #SpecDrivenDevelopment #CleanCode #SoftwareDevelopment

Bruno Cunha

Bruno Cunha

Software engineer. I write about performance, .NET and the inner workings of systems that scale.