DEV Community

Cover image for We Didn’t “Align” — We Argued (and Shipped a Better System)
Art light
Art light

Posted on

We Didn’t “Align” — We Argued (and Shipped a Better System)

Software projects rarely fail because someone can’t write code.
They fail because people quietly disagree, assumptions go unchallenged, and everyone is “aligned” right up until production is on fire.

This is a story about a project where collaboration didn’t look pretty — but it worked.

The Setup: Parallel Work, Parallel Universes

We were building a product with a fairly standard setup:

  • Frontend: React + TypeScript
  • Backend: REST API
  • Multiple engineers working in parallel
  • Tight deadlines (the fun kind)

Everything looked fine… until it didn’t.

The frontend assumed fields that the backend hadn’t implemented yet.
The backend refactored response shapes without realizing the frontend relied on them.
Types existed — just not in the same universe.

Nothing was broken enough to stop development, but bugs kept appearing late.
The worst kind. The “why didn’t we catch this earlier?” kind.

The First Real Collaboration Moment (aka The Argument)

At some point, someone asked the dangerous question:

“Why don’t we just define the API first?”
Enter fullscreen mode Exit fullscreen mode

This triggered:

  • A backend engineer worrying about losing flexibility
  • A frontend engineer worried about slowing down
  • Someone else saying “we can just fix it later” (classic) Instead of pretending we agreed, we argued it out.

And that was the turning point.

The Decision: API First (But Practically)

We didn’t adopt API-first as a buzzword.
We adopted it as a collaboration contract.

What we actually did:

  • Defined OpenAPI specs early
  • Generated types for the frontend
  • Treated breaking API changes as actual breaking changes, not “oops”

Trade-offs we accepted:

  • Backend lost some freedom to “just rename stuff”
  • Specs required discipline and review
  • Changes took slightly longer upfront

What we gained:

  • Predictable frontend types
  • Fewer late surprises
  • Much calmer PR reviews

The Unexpected Benefit: Better Conversations

The biggest win wasn’t technical — it was human.

Instead of:

“Why is this field missing?”
Enter fullscreen mode Exit fullscreen mode

We started asking:

“Should this field even exist?”
Enter fullscreen mode Exit fullscreen mode

Specs forced us to:

  • Name things clearly
  • Argue about responsibility
  • Make decisions visible

Design reviews became real design reviews — not post-mortems.

Mistakes We Made (So You Don’t Romanticize This)

Let’s be honest — it wasn’t smooth:

  • We over-specified early on and had to loosen things later
  • One spec PR was longer than some novels
  • We once broke the API and forgot to regenerate types (yes, that hurt)

Collaboration doesn’t remove mistakes.
It just makes them cheaper and earlier.

Humor Break: The “One Small Change” Lie

Every team has this moment:

“It’s just a small backend change.”
Enter fullscreen mode Exit fullscreen mode

Famous last words.

With shared specs, that sentence became:

“It’s a small change… but it touches 12 endpoints.”
Enter fullscreen mode Exit fullscreen mode

Which is exactly the kind of honesty you want before merging.

What Senior Collaboration Actually Looks Like

From this experience, here’s what I now believe:

  • Collaboration is surfacing disagreement early
  • Silence is more dangerous than conflict
  • Tools don’t fix teams — they expose them
  • Clear contracts reduce ego-driven decisions

Senior engineers don’t avoid friction.
They manage it productively.

Final Takeaway

Good collaboration isn’t about being nice.
It’s about being clear, honest, and occasionally uncomfortable — together.

When teams stop optimizing for speed today and start optimizing for trust tomorrow, the codebase follows.

And yes — sometimes that starts with an argument.

Top comments (1)

Collapse
 
traviticus profile image
Travis Wilson

Interesting perspective. I've been experiencing this from a different angle - as a solo founder using AI as my primary collaborator, I've been able to sidestep a lot of these alignment battles entirely.

The trade-off you describe (less flexibility for backend engineers, discipline around spec maintenance) assumes humans on both sides who have opinions and preferences. When it's me + Claude, I don't have to negotiate syntax choices or convince anyone that a breaking change is worth it. I just make the call and move on.

But here's the thing - that only works because I invested heavily in the architecture first. Consistent patterns, clear service boundaries, good test coverage. The AI doesn't push back on conventions, it follows them. Which means the "arguing" phase you describe gets replaced by "did I set up the system so the AI can do this without hand-holding?"

Different problem, same underlying truth: the system design matters more than the individual interactions