Skip to main content

Async-First Engineering: How I Keep Remote Teams Productive Without Meetings

Author
Ignacio AmatIgnacio Amat
Published
Reading Time4 min
Remote development team working asynchronously across time zones

I’ve been working remotely for over 6 years, the last 4 with distributed teams across multiple time zones. My conclusion: synchronous meetings are the last resort, not the first option.

Async-first work doesn’t mean “never talk.” It means prioritizing written, deferred communication so each person can work at their most productive time without constant interruptions.


The pillars of async-first

PillarConcrete practice
Written documentationADRs, RFCs, feature READMEs
PRs as communicationDetailed descriptions, context, decisions
Deferred decisionsWritten proposal → 24h for comments → decision
Minimal overlap2-3 hours/day overlap, rest async
Public recordSlack/Teams as archive, not urgent chat

PRs as the unit of communication

A pull request is not just code. It’s the primary vehicle for technical communication:

## Description
Implements recurring payment processing from CSV upload.

## Context
We've been processing payments manually each month. This automates 
the workflow: validate rows → enqueue jobs → notify on errors.

## Key decisions
- **Each row is a separate job**: so a single bad row doesn't block the rest.
- **CSV parsed in a job, not the controller**: keeps response under 200ms.
- **Notifications via Laravel Notifications**: can be email, Slack or both.

## How to test
1. Upload `tests/fixtures/valid_payments.csv` via the admin panel
2. Run `php artisan queue:work --once`
3. Check `database/notifications` for results

## Screenshots
[Link to screen recording of the flow]

Closes #452

A PR like this lets the reviewer understand context, decisions, and how to test without needing a meeting.


ADRs: decisions that don’t get lost

Every relevant technical decision gets documented as an Architecture Decision Record:

# ADR-023: CSV Payment Processing

## Status
Accepted

## Context
We need to process recurring payments from CSV uploads.
Options: sync processing, batch job, or per-row jobs.

## Decision
Per-row jobs dispatched to a dedicated queue.

## Consequences
+ Partial failures don't block entire batch
+ Can retry individual failed rows
+ Easier to monitor per-payment
- More Redis/RAM usage for job metadata
- More complex error reporting (per-row status)

## Alternatives considered
1. Sync processing in controller: blocked for large CSVs, timeout risk
2. Single job for entire CSV: one bad row fails everything

ADRs live in docs/adrs/ and are referenced from PRs. Anyone on the team can understand why a decision was made without asking.


The async-first daily rhythm

Time (CET)Activity
08:00-09:00Review pending PRs, issues, deferred Slack
09:00-12:00Deep code block (no Slack, no meetings)
12:00-13:00US/EU overlap: standup, pair programming, dailies
13:00-14:00Lunch
14:00-17:00Second block: code, PRs, documentation
17:00-18:00Review team PRs, update issues

Those 3-hour uninterrupted blocks are where real work happens. A single 30-minute meeting in the middle of deep work can cost 2 hours of lost productivity (recontextualization time).


Meetings that are worth it

I’m not anti-meeting. I’m anti-meeting-without-an-agenda. These meetings have a clear purpose:

TypeWhenDuration
Daily standupOnly if there are blockers to unblock10-15 min
Sprint planningStart of sprint30-45 min
RetroEnd of sprint30 min
Pair programmingComplex feature or onboarding1-2h (scheduled)
1:1 with managerWeekly25 min

Rule: if there’s no written agenda 24h before, the meeting is cancelled.


Tools I use

  • PRs and code: GitHub + GitHub Actions
  • Documentation: Markdown in the repo (ADRs, READMEs)
  • Async communication: Slack (topic channels, not urgent DMs)
  • Recordings: Loom for complex explanations
  • Issues: Linear
  • Decisions: ADRs in docs/adrs/

Conclusion

Async-first work is not an abstract philosophy. It’s a set of concrete practices: writing PRs with context, documenting decisions, blocking time for deep code, and reducing meetings to the necessary minimum.

If you’re looking for a senior profile who already works this way and can help your team adopt these practices, check my availability.


Related articles

Review my developer profile

If this article matches the kind of product work your team is facing, review my stack or professional availability.

Tell me what you need

You can reach out about a role, contract, technical collaboration, question, or general inquiry. A few lines of context are usually enough for me to reply within 24 business hours.

0/500
Availability