Run a search
IntroducingAssert

Technical interviews, for the AI era

We run async technical interviews based on your context, so you can focus on culture and team fit — rather than language fundamentals.

# charge.py
import stripe
from ledger import Account
def capture(payment):
acct = Account.load(payment.id)
charge = stripe.charge(
amount=payment.total,
currency="usd")
if charge.paid:
return acct.settle()
return acct.retry()
Candidate
Claude
Codex
Cursor

Based on the interview structures we've run at

OVO
J.P. Morgan
HSBC
Bloomberg
Octopus Energy
AWS

Every engineer, verified to senior+

We vet every engineer to a senior-plus bar — benchmarked on a mix of FAANG-style fundamentals and real-world problems. It's not just whether they can write code, but how they think, design, work with a team, solve real problems and use AI to maximize their output.

It covers the full breadth of skills you need — any stack, from Python to TypeScript to Rust— contextualized against your role, product and platform. You see every output, from video to code, so you can spend valuable interview time on team-fit and culture rather than “do they have the technical skills?”

We validate everything

One bar for every engineer we place — how they think, build and communicate, on real problems from the actual job, not timed puzzles. Staff and applied-AI roles are validated on more, not different.

1

Fundamentals

Fundamentals that traverse any language. Whether an engineer writes clean, idiomatic code that another engineer — or an AI agent — can reason about, and can explain the choices behind it.

Idiomatic code Following the conventions and patterns native to the language.

Data structures Matching the structure to the access pattern, and its complexity trade-off.

Abstraction Encapsulating complexity behind interfaces at the right level of granularity.

Language built-ins Higher-order functions, iterators, error handling, immutability, concurrency — without a dependency or framework.

Code structure Decomposing into functions and classes, each with a single responsibility.

// reconcile.test.ts
type Entry = { account: string; amount: number; settled: boolean }
function reconcile(entries: Entry[]): Map<string, number> {
return entries
.filter((e) => e.settled)
.reduce((acc, e) => {
acc.set(e.account, (acc.get(e.account) ?? 0) + e.amount)
return acc
}, new Map<string, number>())
}
3 passing · 0 failing
2

Real-world problems

Applying code in the context of real problems. Whether an engineer can put a language and its frameworks to work — the right libraries and primitives for the problem, and the reasoning behind them, built to hold up in production.

APIs The right architecture — REST, RPC or GraphQL — with correct HTTP verbs and status codes, clean resource boundaries, and authentication and authorization.

UIs Composing framework primitives — state, effects, component boundaries — with form handling, validation, and loading, empty and error states.

Platform Containerization and IaC to manage cloud services, weighing self-hosted, managed and off-the-shelf on cost, lock-in and ops.

api/routes.ts
GET/users
POST/orders
PATCH/orders/:id
Designing a cursor-paginated feed for the activity timeline — keeping order stable as new events stream in.
3

Day-to-day

The parts of the role that aren't writing new code — but equally important. Whether an engineer can handle the maintenance, judgement calls and firefighting that fill an actual working day.

Debugging Symptom to root cause in unfamiliar code — reproduce, hypothesize, and prove it with logs, a debugger or a bisect.

Testing & QA Testing at the right level — unit, integration, E2E — with tests that pin behavior, not implementation.

Managing technical debt Knowing which debt to take on deliberately, which to pay down, and when.

Handling incidents Contain the impact, find the cause under pressure, then turn the post-mortem into prevention.

Weighing trade-offs A defensible call with no clean answer — speed vs correctness, build vs buy, now vs later.

Managing technical debt

Knowing which shortcuts to take on purpose, and paying them down before the interest starts to bite.

Automated testing

Choosing what to test and at which level, with tests that pin behavior rather than implementation.

Handling incidents

Diagnosing what went wrong under pressure, communicating clearly, and turning the post-mortem into prevention.

4

Use of AI

Delivering with AI agents — beyond basic prompting. Whether an engineer can direct them to build production-grade software and multiply their output.

Agent-ready specs Context, constraints, acceptance criteria and the files that matter — a brief precise enough for an agent to run end to end.

Guardrails The types, tests, linters and CI that contain what an agent can merge.

Environment setup The tools, context and harness an agent runs on, with a feedback loop it can drive itself.

Thorough PR reviews Dissecting and understanding the large PRs coding agents produce, line by line.

Model limits Where a model is unreliable — subtle logic, unfamiliar or fast-moving APIs, large refactors — and adjusting: breaking the task up or pushing past it.

Add idempotency to @charge.ts — on a retry with the same key, return the original result, never double-charge.
Reading charge.ts and the current handler…
Claude
Codex
Cursor
5

Workstyle

Seniority is as much about people as code. Whether an engineer can operate in a remote team with little oversight — planning their own work, carrying others along, and communicating clearly.

Proactive communication Flagging blockers, progress and direction before anyone asks.

Written & spoken Clear, structured communication, spoken and written — the docs, updates and calls a remote team runs on.

Plain-language decisions Making a technical call and its trade-offs legible to a PM, designer, marketing or any other stakeholder.

Working with the team Reviewing code, unblocking other engineers, and moving the work forward together.

Scoping & estimating Breaking an open-ended ask into defined work, estimated and sliced into self-contained increments.

Dunder Mifflin
Channels# general# engineering# product# design# marketing# random
# product
PL
Priya L.Eng10:19

Standup notes are up — nothing blocking on my end today.

MR
Maya R.Eng10:24

Before I start the reporting rebuild — the full version is ~2 weeks. If we skip the custom export for now, I can ship 90% of the value in 3 days. Hold the export?

MS
Michael ScottPM10:26

Great pushback 🙌 let's ship the 3-day version and revisit exports next sprint. Thank you!

Message #product
LinearAtlassianLoom
6

System design

Building production-grade systems — above the application level. Whether a staff engineer can design a whole system and defend the trade-offs against business value and the roadmap.

Data & storage Modeling the data and where it lives — relational vs document, partitioning and consistency.

Performance & redundancy How it behaves under load and under failure — where latency and throughput bottleneck, and how it degrades and fails over when a component dies.

Patterns & boundaries Where the service boundaries fall and which patterns connect them — queue, cache, event stream, read replica — chosen for where the system is heading, not just today.

Observability Metrics, logs and traces — a system's health visible in production, and a failure traceable to its source.

Cost Build, maintenance and the real operating bill of the infrastructure.

Nginx
Node.js
Redis
PostgreSQL
Kubernetes

Find your next engineer

Run a search