kdb+ / q screening
Find out who can actually write q.
Every CV in this market says kdb+. qScreen sets real problems — ticker plant, as-of joins, attributes, functional qSQL, production defects — and marks them by running the candidate’s q against KDB-X, in a sandbox it cannot get out of.
- 100
- questions in the bank
- 661
- hidden test cases
- 13
- production defects to find
VWAP by symbol
Compute the volume-weighted average price for each symbol.
vwap = sum(px*size) / sum(size)
Return a keyed table, keyed by sym, with a single float column vwap.
- Fixture
- t
- Visible cases
- 2
- Hidden cases
- 7
| 1 | solve:{[t] |
| 2 | select vwap:sum[px*size]%sum size |
| 3 | by sym from t |
| 4 | } |
| 5 | |
| 6 | / empty t still comes back keyed |
Sample run · visible cases only
- three symbols, six trades0.4 ms
- one symbol, one trade0.3 ms
Seven further cases are marked on submission and are not shown here — including the empty table, and one built to catch a plausible wrong answer.
An hour of interview cannot tell you who has run a ticker plant.
Whiteboard q measures recall
Asking someone to name an adverb tests vocabulary. The job is choosing the right join when three would compile and one is correct at three million rows.
Generic coding tests measure Python
A LeetCode round in a language nobody on the desk writes tells you the candidate can study. It says nothing about whether they can read a real q file at nine in the morning.
Take-homes measure who had a free weekend
And who had help. qScreen is timed, in the browser, and every submission carries the process that produced it — for a person to read, not for a machine to judge.
Four steps, and no product knowledge.
Choose the client. Choose the assessment. Send it. Read what came back.
- 1
Choose the client
A consultancy screens for several banks. Each is a separate workspace with its own branding, its own candidates and its own results — and they cannot see each other.
- 2
Choose the assessment
A designed ramp in a fixed order, or a pool that deals a different-but-comparable set to every candidate, so a leaked question costs one question rather than the round.
- 3
Send it
Each candidate gets a single-use link, branded as the bank they applied to. No account, no password, no download. It works on a laptop in a coffee shop.
- 4
Read the evidence
Score, their code, which hidden cases failed and why, how long each question took, and where they sit against everyone else in the round.
What the candidate sits
A timed test in the browser, with a real q editor. They can run their answer against the visible cases as often as they like — the same feedback loop they would have at a terminal — and the marks come from cases they never see.
- Six to eight hidden cases per question: the empty table, the single row, several hundred rows, and at least one built to catch a specific plausible wrong answer.
- No account and no password. A signed, single-use, expiring link is the whole of their authentication.
- The editor is served from the application itself, never a CDN — an air-gapped bank network cannot strand a candidate on “loading editor” with a clock running.
VWAP by symbol
Compute the volume-weighted average price for each symbol.
vwap = sum(px*size) / sum(size)
Return a keyed table, keyed by sym, with a single float column vwap.
- Fixture
- t
- Visible cases
- 2
- Hidden cases
- 7
| 1 | solve:{[t] |
| 2 | select vwap:sum[px*size]%sum size |
| 3 | by sym from t |
| 4 | } |
| 5 | |
| 6 | / empty t still comes back keyed |
Sample run · visible cases only
- three symbols, six trades0.4 ms
- one symbol, one trade0.3 ms
Seven further cases are marked on submission and are not shown here — including the empty table, and one built to catch a plausible wrong answer.
The part nobody can prepare for
Then the requirements change, mid-test.
Once a candidate submits an answer, some questions reveal a modification to the problem they have just solved — your solution works, but not when there is no quote before the first trade — and the clock keeps running. They are told nothing about it beforehand, which is the entire point.
Writing q from a blank editor and adapting your own code under time pressure are different skills, and the second one is the job. It is also the half a model cannot sit on someone’s behalf without them understanding what it produced.
A stage may hold interchangeable twists, one dealt per candidate — so two people comparing notes afterwards did not necessarily sit the same test.
Price every trade against the prevailing quote
A production bug report, and code that looks like it works. The defect is silent: it prices a handful of trades against a quote that had not arrived yet.
11m 04s · 2 submissions
submitted · change revealed · clock still running
The replay batch is dirtier than it looked
Their own fix, changed under them: the replayed quotes now arrive out of order and carry duplicates. They were told nothing about this beforehand — a fix you could have prepared for measures nothing.
6m 12s to fix · first keystroke after 48s
What the interviewer is handed
- · a score for each part, and the code they wrote for both
- · time to fix, and how long they read before typing
- · pastes and edit bursts, placed relative to the moment of reveal
qScreen never scores any of that. There is no cheating likelihood, no integrity score, no penalty for a paste. A large paste has honest explanations no machine can tell from the dishonest one. The platform records the process; a person reads it.
A number nobody can interrogate is not evidence.
Every report carries the candidate’s own code, their output for every hidden case they failed, and what that case was asserting — in the author’s q. The expected value stays hidden; the reason it failed does not.
Score distribution
49 candidates, one screening round
median 58% · σ 19 · nobody above 90
Where candidates drop out
cumulative, not a status snapshot
- Invited49
- Started4184%
- Submitted3688%
- Marked36100%
Each stage counts everyone who reached it, including those who went further — so it can never show more submissions than starts.
Which questions are worth asking
item discrimination, measured against real sittings
| Question | Answered | Pass rate | Discrimination | Verdict |
|---|---|---|---|---|
| replayed-quote-join | 36 | 22% | 0.61 | discriminating |
| asof-join-quotes | 34 | 47% | 0.54 | discriminating |
| vwap-by-sym | 36 | 78% | 0.31 | discriminating |
| sum-size-by-sym | 31 | 97% | 0.04 | too easy |
A question almost everyone passes costs a candidate five minutes and tells the hiring team nothing. qScreen measures that against your own candidates and says which ones to replace, rather than asking you to guess.
The figures above are illustrative — they show the shape of the screens, not results from real candidates. In the product every one of them is computed on read from live sittings.
Candidate q is hostile code, and it is treated that way.
q can shell out. Marking somebody’s q means executing a stranger’s program on your infrastructure, and most of this system exists because of that sentence.
Submissions run in a disposable container with no network, a read-only filesystem, no root, capped memory and CPU, and a wall clock — on a host isolated by gVisor, which gives the container its own kernel rather than the machine’s.
Marking is two containers
The first loads the candidate's code and sees only the test INPUTS — no expected value exists anywhere in it. The second never loads their code: it holds the expected values, compares, and scores. Forging a pass means guessing hidden values you have never seen.
42 of 42 containment tests
An adversarial suite that tries to break out — network, filesystem, process, resource exhaustion — run against both supported runtimes on every change.
Isolation enforced twice
Two banks screening through the same consultancy cannot see each other. A query filter in the application AND row-level security in Postgres, keyed on the signed token — never on a header, path or URL.
Your own q, or ours
Run the bundled KDB-X Community Edition, or bind-mount your own licensed binary into an image that ships no KX code at all — the build a bank's InfoSec can approve.
Built to be sold under someone else’s name.
A consultancy screening for six banks gets one workspace per client, each with its own subdomain, logo and colours. The candidate sees the bank they applied to. The invitation email comes from the bank. qScreen’s own mark appears in exactly two places, and neither of them is anywhere a candidate looks.
Adding a client portal needs no DNS change and no restart — the certificate is issued on demand, for hostnames the platform recognises.
One deployment
- northgate.example.com
- vanguard.example.com
- meridian.example.com
A hostname chooses branding and can refuse a request that arrived on another client’s portal. It never grants access — that comes from the account signing in, and nothing else.
Choose the client. Choose the assessment. Send it.
qScreen tells you who actually understands kdb+/q — with the code, the timings and the failed cases to back it up.