What we deliver

Two things, both from your own resume.

Your resume as a map

Every point you wrote, and what it invites.

100%
Hit these: Tenant id on every table · Injected by the repository, not by hand · Row-level security as the second net · A test that proves it
Say these numbers: Postgres RLS · 40+ organisations
Keep in mind: They will ask what happens if someone forgets the filter. The honest answer is the repository makes it impossible, not that people remember.
Hit these: Name the metric first · Give the baseline and the window · Say what you deliberately excluded
Say these numbers: 40 a month to under 30 · One quarter either side
Keep in mind: Do not round it up. If they ask for the raw numbers and you have inflated them, the whole answer goes.
Hit these: Key comes from the client · Written in the same transaction as the charge · Unique constraint does the work
Say these numbers: One unique index
Keep in mind: If you say 'we check if it already exists first', they will ask what happens when two requests check at the same time.
Hit these: Detect the gap, do not fill it · Flag rather than interpolate · Model treats missing as missing
Say these numbers: Two years of hourly data · Gaps over two readings
Keep in mind: Be ready for 'why not interpolate'. The answer is that a zero and a missing reading mean opposite things here.
Hit these: Say exactly which parts · Name what you did not do · State the author position
Say these numbers: Second author
Keep in mind: Claiming the whole paper is the fastest way to lose a panel that has read it.
Hit these: The load range is the reason · Percentage error is comparable across hours · Squared error is dominated by the peak
Say these numbers: 4.1% MAPE · Held-out month
Keep in mind: They may ask when MAPE is a bad choice. Near-zero actuals, which is why it suits load and not, say, error counts.
Hit these: Name the actual day · Say what the model assumed · Name the missing feature
Say these numbers: About a third over · One holiday in the test month
Keep in mind: Have the fix ready: a holiday calendar as a feature. Saying 'it just struggled' sounds like you never looked.
Hit these: Say what disagreed and by how much · Name both modelling errors · Say what closed the gap
Say these numbers: About 8% after the fix
Keep in mind: Do not blame the software. The disagreement was a modelling choice, and saying so is what makes the answer credible.
Hit these: Name the load cases · Closed form first, then ANSYS · Say why that order
Say these numbers: Three standard cases
Keep in mind: If you only checked against ANSYS you have verified nothing, because both could be wrong the same way. Say the closed form came first.
Hit these: Scope at the repository, not the page · Role comes from the session · Two roles, clearly separated
Say these numbers: Three batches used it
Keep in mind: They will try 'what if I change the id in the URL'. The answer must be that the id in the URL is never trusted.
Hit these: Define it by the result, not the mesh · Say how you test it · Give the stopping rule
Say these numbers: Under about 2% change
Keep in mind: A common trap is answering 'more elements is better'. Say what you stop at and why.
Hit these: Low selectivity is the case · Random reads versus a sequential scan · Writes pay for every index
Keep in mind: If you say 'indexes always help', expect a follow-up on write-heavy tables.

And any answer, broken into what to hit.

Walk me through how one tenant’s data stays invisible to another.

Hit these, in order

  1. 1Tenant id on every table, no exceptions
  2. 2Repository layer injects it from request context
  3. 3Row-level security as the second net
  4. 4What I would change at larger scale

Say these numbers

  • 40+ organisations on one instance
  • Postgres row-level security
  • Invoice errors down 30%

All together

Every table carried a tenant id, and all queries went through a repository layer that injected it from the request context, so no query could be written without it. On top of that we turned on row-level security in Postgres as a second net, for when application code got it wrong. For noisy neighbours we rate-limited per tenant at the gateway. If I were building it again for larger customers I would look at a schema per tenant, because the single-table approach made per-tenant backups harder than I expected.

Keep in mind

They will almost certainly follow up with "what if the filter is missed" — lead with the second net rather than waiting to be asked.

The questions, and what to say

Worded the way a panel asks them.

You

Right, so every table had a tenant id on it, no exceptions. And rather than trusting people to remember the filter, all our queries went through a repository layer that put it in from the request context, so you physically could not write a query without it. On top of that we switched on row-level security in Postgres, which was really our second net for when application code got it wrong. If I were doing it again for bigger customers I would probably look at a schema per tenant, because backing up a single tenant was harder than I expected.

Project · Billing platformVery likely

Try it on your own resume