What Async-First Backend Development Actually Looks Like in Practice
by Eric Hanson, Backend Developer at Clean Systems Consulting
Async-first is easy to advocate for in the abstract.
Here's what it concretely requires from the team running it and the contractors working within it.
The gap between the principle and the practice
Most engineering teams would describe themselves as reasonably async — they use Slack, they have a ticketing system, they do written code review. But when you look at how work actually gets defined, clarified, and handed off, most teams are running a hybrid model that leans heavily on synchronous communication for the parts that matter most.
The spec gets written loosely because the engineer will just ask if they have questions. The ticket doesn't include system context because the person picking it up already knows the codebase. The definition of done isn't written down because it's obvious to everyone involved.
That works fine for an internal team where shared context fills in the gaps. It doesn't work for async remote contracting, where the contractor has none of that context and the timezone gap means they can't get it in real time.
What async-first actually requires is more specific than most teams realize before they try it.
What a good async spec looks like
The spec is the foundation everything else builds on. If it's good, the engagement moves. If it's not, the engagement stalls and the communication overhead that replaces the spec becomes more expensive than just writing it well in the first place.
A good async backend spec has four components.
System context. What is this service or feature and where does it fit? What are the adjacent systems it interacts with? What data does it consume and what does it produce? What are the existing conventions the new code should follow? This doesn't have to be exhaustive — it has to be enough that someone unfamiliar with the codebase can form an accurate mental model before writing the first line.
Scope definition. What specifically needs to get built? What is explicitly out of scope? Where are the boundaries of this engagement? A contractor who doesn't know where the work ends will either over-build and waste time or under-build and miss the mark.
Technical specifics. API contracts where they exist. Data models where relevant. Error handling expectations. Performance requirements if they're non-standard. The details that would ordinarily live in the head of the engineer who knows the area.
Acceptance criteria. What does done look like? What tests should pass? What behaviors should be demonstrable? What would constitute a reason to reject the deliverable? These should be specific enough that both sides agree on whether they've been met without a judgment call.
Writing this takes time. Typically an hour or two for a well-bounded project. That investment is paid once and it determines the quality of everything that follows.
What good async communication looks like during an engagement
The spec answers most questions before they arise, but not all of them. The communication patterns during the engagement determine whether the remaining questions get resolved efficiently or generate back-and-forth that slows the work.
Contractors working async-first communicate questions in writing with context. Not "what should I do about X?" but "I encountered X in the implementation — I see two options, which are A and B. A produces Y behavior and B produces Z behavior. Given the acceptance criteria, I'm leaning toward A, but I wanted to confirm before building it out." That format gives the reviewer everything they need to answer without a follow-up.
Client teams respond with specific written answers rather than scheduling a call. The answer is documented alongside the question. The next time the same situation arises — in this engagement or a future one — the answer is findable.
Written updates at natural milestones — not daily status reports, but progress notes when meaningful checkpoints are hit — create visibility without requiring synchronous check-ins. "Completed the data model, tests are passing, starting on the API layer" is enough to maintain awareness without becoming a reporting burden.
What good async code review looks like
Code review is where async-first teams either produce their best work or their most expensive back-and-forth.
Good async code review is specific and actionable. Comments are attached to the exact code they reference. The review explains what the issue is, why it's an issue, and what the preferred approach would be. Comments are written assuming the author will read them without the reviewer present to explain further.
Good async code review distinguishes between blocking issues and suggestions. A contractor working async-first needs to know which review comments require a new commit before the work can be accepted and which ones are observations that can be addressed or deferred. Ambiguity on this point leads to over-correction or under-correction, both of which cost iterations.
Good async code review closes loops in writing. When the contractor responds to a comment and makes a change, the reviewer confirms the change resolves the issue in writing. The thread closes explicitly rather than being assumed closed by silence.
What the handoff looks like when a project is done
A well-run async contracting engagement ends with a handoff that's self-contained.
The contractor documents what was built, how it fits into the broader system, what decisions were made and why, and what wasn't addressed in scope. They flag anything that might affect future work on the area. They provide context for the next engineer who touches the code, regardless of whether that person was involved in the engagement.
This is the asset the client team gets beyond the code itself. A codebase with documented decisions and clear rationale is easier to maintain than one where the context is in the contractor's head. When the engagement ends, everything the contractor knew about the work they did should be findable in writing.
The team habits that make this sustainable
Async-first backend development doesn't run on individual skill — it runs on team habits that are consistent enough to be reliable.
The habit of writing specs before work starts, not after. The habit of documenting decisions at the time they're made. The habit of writing review comments that stand on their own. The habit of closing loops in writing rather than assuming verbal resolution was sufficient.
These habits don't develop instantly. The first few async contracting engagements are slower than they'll eventually be, because the team is simultaneously doing the work and building the process. That's normal and worth tolerating, because the capability that emerges is genuinely useful — not just for contracting, but for the internal team's speed and the quality of what it builds.
Whether your team is ready to run this way
The honest measure is the quality of your current tickets. If your last five backend tickets could have been picked up by someone outside the company with minimal clarification, you're ready. If they rely on shared context that lives in conversations, that's the gap worth closing first.
The form at /contact is a practical way to assess where your team sits — covering the documentation habits, process roles, and structural conditions that determine whether async-first backend development is already how you operate or something you're still building toward.