I have been on both sides of remote developer interviews: as a candidate for contract roles from Aligarh, and interviewing developers for agency projects. The format is different from an in-person loop, and most candidates prepare for the wrong things. They grind algorithms; the interview asks them to design a rate limiter on a shared screen, then write a paragraph explaining a trade-off, then discuss a take-home in a call. This is the four-week plan I give people, built around what remote-first companies actually test.
What remote interviews actually test
| Round | What they are checking | Common format |
|---|---|---|
| Screening call | Can you explain your work clearly in 3 minutes? Are you the person on the CV? | 30 min video, "walk me through a recent project" |
| System design | Structure, trade-offs, communication under uncertainty | 45–60 min, shared whiteboard (Excalidraw/Miro), "design X" |
| Live coding | Process, correctness, how you handle being stuck | 45–60 min, shared editor, a practical problem (parse, aggregate, API) |
| Take-home | Real code quality, scoping, documentation | 2–6 hours, small app or feature, then a review call |
| Written / async | Can you work without meetings? | Design doc review, PR description, "reply to this incident thread" |
| Values / team fit | Ownership, feedback, remote habits | Behavioural questions with the STAR structure |
System design: the template
The interviewer is not looking for the "right" architecture; they are watching whether you can take an ambiguous problem to a defensible design while talking. A fixed template removes the risk of blanking:
Worked example, condensed, for "design a URL shortener":
- Requirements: create short link, redirect, basic click stats. 100 M links, 10:1 read/write, redirects under 50 ms p99, links never expire (or 5 years).
- Estimates: 1,000 redirects/s peak; 100 M × ~500 bytes ≈ 50 GB; trivial bandwidth.
- API:
POST /links {url} → {code},GET /:code → 302,GET /links/:code/stats. - Data:
links(code PK, url, created_at, owner_id); clicks as an append-only table or a counter in Redis flushed hourly. - High level: CDN/edge for redirects with a cache; API behind it; Postgres; Redis for hot codes; queue for click events.
- Deep dive: code generation (base62 of a DB sequence vs random with collision check), and why redirects are cacheable at the edge.
- Trade-offs: 301 vs 302 (stats vs caching), consistency of click counts, what a custom-alias feature changes about the key space.
The building blocks you need to be fluent in are the ones in System Design Fundamentals, plus indexing and service boundaries. Practise by recording yourself designing a system for 30 minutes on a blank Excalidraw board, then watching it back. It is uncomfortable and it is the fastest way to improve.
Live coding: process over completion
Remote live coding usually means a practical problem in a shared editor: "parse this log format and return the top 5 endpoints by error rate", "implement a rate limiter class", "write a function that merges these two sorted feeds". Many companies now allow AI assistants and documentation, because that is how the job works; what they watch is how you use them.
The process that interviewers grade well:
- Restate the problem in your own words and confirm. Thirty seconds, prevents solving the wrong thing.
- Ask two clarifying questions: input size, edge cases (empty, duplicates, malformed), what to return on error.
- Write the plan as comments before code. Three lines. The interviewer can correct your approach early.
- Write the simplest version that works, narrating as you go. Say "I'll handle the malformed line case after the happy path" rather than silently skipping it.
- Test it aloud with a normal input, an empty input and an edge case. If you can run it, run it.
- Discuss improvements: complexity, what you would do for 10 GB of logs, how you would test it properly.
// Example: "top N endpoints by error rate from an access log". Plan as comments first.
// 1. parse each line → { path, status }; skip malformed lines but count them
// 2. aggregate per path: total, errors (status >= 500)
// 3. compute rate, filter paths with < minRequests to avoid 1/1 = 100% noise, sort desc, take N
type Agg = { total: number; errors: number };
export function topErrorEndpoints(lines: Iterable<string>, n = 5, minRequests = 10) {
const byPath = new Map<string, Agg>();
let malformed = 0;
const re = /"(?:GET|POST|PUT|PATCH|DELETE) (\S+) HTTP\/[\d.]+" (\d{3})/;
for (const line of lines) {
const m = re.exec(line);
if (!m) { malformed++; continue; }
const path = m[1].split('?')[0]; // normalise: drop query strings
const status = Number(m[2]);
const agg = byPath.get(path) ?? { total: 0, errors: 0 };
agg.total++; if (status >= 500) agg.errors++;
byPath.set(path, agg);
}
const ranked = [...byPath.entries()]
.filter(([, a]) => a.total >= minRequests)
.map(([path, a]) => ({ path, total: a.total, errors: a.errors, rate: a.errors / a.total }))
.sort((x, y) => y.rate - x.rate || y.total - x.total)
.slice(0, n);
return { ranked, malformed };
}
// Talk track: "O(lines) time, O(paths) memory. For 10 GB I'd stream the file and, if paths are unbounded,
// use a count-min sketch or pre-aggregate per hour. I'd add tests for: empty input, a line with no status,
// query strings, and the tie-break ordering."
If you get stuck, say so, and say what you are considering. Silence is the worst outcome; "I'm deciding between a Map and sorting the array, the Map is O(n) so I'll go with that" is a good outcome even if the next line has a bug. Being stuck and recovering gracefully is a signal in your favour.
Take-homes: scope small, document well
Take-homes are where remote candidates separate most clearly, because they mirror real remote work: unsupervised, with a deliverable and a written explanation. The pattern that wins:
- Respect the time box. If they say four hours, spend four hours and say what you would do with more. Twenty hours of gold-plating reads as poor prioritisation.
- Make it run in one command.
docker compose upornpm install && npm start. If the reviewer cannot run it in two minutes, they review the README only. - Tests for the core logic, not everything. Five meaningful tests beat forty trivial ones.
- A README with a "Decisions" section. Why this structure, why this library, what you skipped and why, what you would change for production. This is the part they discuss in the follow-up call and the part that shows seniority.
- Production instincts in miniature: input validation, a health endpoint, sensible error responses, environment config. The REST API skeleton is a good mental model even for a 300-line take-home.
## Decisions
- **Express + Zod, no ORM.** Two tables and four queries; an ORM would add more setup than it saves. Raw SQL with parameters keeps it obvious.
- **In-memory rate limiter.** Fine for one process; noted in "production" below where I'd move it to Redis.
- **Skipped auth.** The brief didn't require it; I'd add session cookies + CSRF before exposing this.
- **Cursor pagination** instead of offset, since the list endpoint is the hot path.
## What I'd do for production
Postgres instead of SQLite, Redis rate limiter, structured logging with request IDs, CI with the test suite, and a Dockerfile (a sketch is in `docs/`).
## Time spent
~3.5 h: 1 h design + setup, 1.5 h implementation, 0.5 h tests, 0.5 h README.
The written and async rounds
Remote-first companies increasingly add rounds that test whether you can work without meetings: review a design doc and leave comments, write a PR description for a given diff, or respond to a simulated incident thread. What they grade:
- Structure: a summary line first, then details, then a clear ask or next step. Nobody should have to read to the end to know what you want.
- Specificity: "the retry loop in
sync.ts:42has no back-off and will hammer the API on outage" rather than "error handling could be better". - Tone: direct, kind, and assuming competence. Comment on the code, not the person.
- Judgement about what to escalate: in an incident thread, say what you know, what you are doing, when you will update next.
Practise by writing real PR descriptions and design notes on your own projects to the standard you would want to receive. This is also the skill the age-of-AI post argues is now central to the job, so the preparation is not wasted even if the interview goes differently.
The four-week plan
| Week | Focus | Concrete practice |
|---|---|---|
| 1 | Foundations | Reread caching/queues/rate limiting, indexing, auth basics. Write your three project stories in STAR form (situation, task, action, result) with numbers. |
| 2 | System design | Four recorded 30-min sessions: URL shortener, rate limiter, news feed, file upload service. Use the template. Watch each back; fix one habit per session. |
| 3 | Live coding | Six timed 40-min practical problems with a talk-aloud, in the shared editor tools companies use (CoderPad, a shared VS Code). One with an AI assistant allowed, practising how you narrate its use. |
| 4 | Take-home + async | One polished take-home to a 4-hour box with the README format above. Write two PR descriptions and one design-doc review on real code. Mock screening call with a friend. |
Remote-specific details that cost people offers
- Setup: wired internet if possible, a backup (phone hotspot), a headset, a camera at eye level, a plain background. Test the screen-share tool the day before. A dropped call in a design round is survivable; an unreadable screen share is not.
- Time zones: state your overlap plainly ("I'm in IST; I can cover 9 am–1 pm Eastern daily") and put it in your portfolio's hire-me page so it is never a surprise.
- Portfolio and GitHub: interviewers open them during the screening call. Make sure the pinned repos run and the portfolio has case studies with numbers, because "tell me about a project" is easier when they are already looking at it.
- Questions for them: how do decisions get made asynchronously, what does the on-call look like, how is code reviewed, what happened in the last incident. These signal that you have worked remotely before and tell you whether you want the job.
The candidates I remember hiring were not the ones with the most complete solutions. They were the ones who told me what they were thinking, asked the right question early, wrote a README I could act on, and were honest about what they did not know. Those are habits, not talents, and four weeks is enough to build them. The longer story of how remote work came together for me is in Building a Remote Web Career from Aligarh.