Hiring for this role?

Start free with this plan

Free for your first open role.

Why Hirezen?
  • Every interviewer runs the same script and marks the same signals.
  • AI drafts the write-ups, and the debrief puts every read side by side.
  • No ATS to set up first, and no bot in the call.

Software Engineer interview questionsTechnical Interview round

A 60 min interview plan with a time-boxed script, what each question is for, and the signals to score against. Key skills: Debugging, change risk and test design on a daily email that arrives an hour early after the clocks change: why, what a colleague's fix would break, and which tests would have caught it, pitched at a mid-level software engineer.

Opening

Who is interviewing, how the round will run, and a question to settle the candidate in. The standard opening

An hour early since Sunday

22 min
What this part is for

Purpose

Runs over a one-page brief you share when the round starts and leave on screen. Nothing is sent ahead, so the first three or four minutes are reading time. It is pitched at a mid-level software engineer — a few years of shipping and supporting production code, new to this codebase — and every fact it turns on is on the page or in your hands, so nothing depends on having met this bug before. Build the page to this composition. A task-management product emails its 2.1 million digest subscribers a "Your day" digest each morning. 62% have never changed the default, 08:00 in the time zone on their profile — an IANA name such as `Europe/Berlin` — and every minute `digest-scheduler` finds the zones where it is now 08:00 and queues those users' digests. The other 38% chose a time on the settings page, which sends the chosen time and the browser's current offset from UTC in minutes — +120 in Berlin in summer — to a handler that stores `digest_minute_utc = (hours × 60 + minutes − offset) mod 1440` and `digest_updated_at`; every minute the scheduler also queues the users whose `digest_minute_utc` is the current minute of the UTC day. The clocks: the UK and the EU went back an hour last Sunday; most of the US and Canada go back this Sunday; New Zealand and most of Australia went forward at the end of September and the start of October. Three things changed last week, none of them in the settings code: a redesigned digest template; the email provider's batch size, raised from 100 to 500; and `digest-scheduler`, moved to a new cluster on Friday, where its log shows a run at the start of every minute since. The tickets: 286 since Monday, all from users in Europe, saying the digest now arrives an hour early; 9 since early October, from Australia and New Zealand, saying it arrives an hour late; none this week from North America or East Asia. Custom times shipped in January, so March was the first clock change they met. In March and April, 14 tickets from Europe and North America said the digest had started arriving an hour late, and 2 from Australia that it had started arriving an hour early; each time, support asked the user to save the setting again, the next digest came on time, and the ticket was closed as "cannot reproduce". The settings handler has one test, written in July: it saves 08:00 for a Berlin user, taking the offset from Berlin's zone at the current date as a browser would, and asserts 360. It has failed on every run since Monday, and on Tuesday it was marked flaky and skipped. Keep three facts off the page and give each only when asked, because which ones a candidate asks for is part of the read: no user on the default time is affected; of the 312,000 users with a `Europe/` zone who chose their own time, 188,000 saved it during summer time, 103,000 during winter time, and 21,000 are in zones such as `Europe/Istanbul` and `Europe/Moscow`, whose clocks have not changed for years; and one affected user in Berlin chose 08:00 in June and was sent today's digest at 06:00:04 UTC, 07:00 her time. The foot of the page holds a colleague's fix for the second topic; keep it covered until then. Titled "Fix digest times after the clock change" and approved once, it adds a migration that adds 60 to `digest_minute_utc`, wrapping at 1440, for every user who chose their own time and whose zone starts with `Europe/`, with the note "reverse this on the last Sunday of March"; changes the handler to ignore the browser's offset and use the offset of the profile's zone at the moment of saving; and adds a test, with the clock pinned to 15 January, that saving 08:00 for a Berlin user stores 420. Two things are fine and are there to be left alone: the scheduler, which ran on time throughout, and the default-time path. Book 70 minutes; the candidate's questions come after the hour.

•

I'm [YOUR_NAME], one of the engineers you would work with at [COMPANY_NAME]. This page is a service you have never seen, in the week a support escalation about it lands with you. Take a few minutes with it, ask me for anything that is not on the page — there is more — and think out loud. How you narrow it down matters more to me than how fast.

What this line is for

Purpose

Frames the hour as a ticket on an unfamiliar codebase, which is how this job meets most of its bugs, and makes asking for evidence part of the work. Say once that there is more and leave it there; which facts the candidate asks for is part of the read.

•

Support has 286 tickets since Monday from users in Europe whose digest now arrives an hour early. From the page, tell me what is happening, who else it affects and when, and what you would check to be sure.

What this question is for, and what to listen for

Purpose

Debugging from evidence, in code the candidate did not write. The read is whether one mechanism is made to explain every group of tickets on the page — this week's, April's and Australia's — rather than "the clock change" being recognised and left there. Most candidates find the stored offset. Fewer explain April's tickets and why re-saving cured them, and fewer still say who is next.

Signals to score

  • Starts from early rather than late: nothing between the scheduler and the inbox can send an email early, which clears the template and the batch size
  • Reads the handler: the setting is a minute of the UTC day, fixed with whatever offset the browser had when the user pressed Save
  • Connects it to Sunday: a time saved in summer is now an hour early, and one saved in winter was an hour late all summer
  • Explains the March and April tickets with the same mechanism, including why re-saving the setting made them go away
  • Explains Australia and New Zealand as the mirror image: their clocks went forward, so times saved in their winter now arrive late
  • Says who is next: most of North America from this Sunday, and Europe again in March
  • Rules out the scheduler's move: a wrong clock would move default-time users and North America too
  • Asks for the check that would prove it — whether any default-time user is affected, or when the affected users saved their setting
  • Notices the flaw is wider than daylight saving: a setting saved from a browser on another zone's time is wrong by hours all year

Follow-up questions

  • Can anything after the scheduler make an email arrive early?
  • Why did re-saving the setting cure April's tickets?
  • Who gets the wrong time next, and when?
  • What would you ask me for, to be sure?

Plus sixty for Europe

20 min
What this part is for

Purpose

Change risk, read on a fix written by someone who found the cause and then fixed the symptom. If the first topic did not reach the stored offset, give it now — the setting is a UTC minute fixed with the offset at the moment of saving — so this topic reads change risk rather than the first miss a second time. Then uncover the foot of the page.

•

This is the fix a colleague opened this morning. It has one approval, and they want it out today. Tell me what it fixes, what it breaks, and what you would ship instead, in what order — North America's clocks go back on Sunday.

What this question is for, and what to listen for

Purpose

Tests change risk where a mid-level engineer meets it most: a colleague's pull request whose arithmetic is right. Its defects are in who its `WHERE` clause selects, in what the handler still stores, and in the nights and the day the change has to survive — found by asking questions, not by checking the sums.

Signals to score

  • Notices that the migration also moves users who saved in winter, who are on time today and would be an hour late after it
  • Asks whether every `Europe/` zone changes its clocks, and sees users in zones that never change moved an hour wrong
  • Says it does nothing for Australia and New Zealand or for North America on Sunday, and has to be reversed by hand in March
  • Sees that the new handler still freezes an offset at the moment of saving — the profile zone's instead of the browser's — so every save made in summer repeats the bug
  • Reads the test pinned to 15 January as blind to the bug: it checks what a winter save stores, never when it is sent in summer
  • Proposes storing the chosen local time with the profile's zone and working out each send in that zone, as the default-time path already does
  • Says what happens to a chosen time that does not exist, or happens twice, on a changeover night, and makes it one email either way
  • Plans the backfill: rebuilds each local time from the stored minute and the offset in force when it was saved, as a dry run first, checked against choices it knows
  • Covers the switchover day, so that no user gets two digests or none when the new schedule takes over
  • Orders the work against the calendar: what must be live before Sunday, and what can wait for March

Follow-up questions

  • A user in Munich saved 08:00 in January. What does this migration do to her?
  • Which zones start with `Europe/`, and do all of them change their clocks?
  • With the new handler, what does a Berlin user who saves 08:00 in July store?
  • In your version, a user chose 02:30 in Berlin. What happens on the last Sunday of March?
  • On the day the new schedule takes over, what stops a user getting two digests?

The test marked flaky

18 min
What this part is for

Purpose

Test design, read on the bug the candidate has just diagnosed and the fix they have just reviewed.

•

The settings handler had a test, and on Tuesday it was skipped as flaky. Tell me what its failure meant, which tests would have caught this in March, which go in with the real fix, and which you would not write.

What this question is for, and what to listen for

Purpose

Separates knowing the names of test types from choosing tests. Useful answers start from the property that broke — one digest a day, at the time the user chose — test it where it is cheap and cannot flake, and say which tests are not worth their upkeep.

Signals to score

  • Says the test was not flaky: it failed because the date it ran on changed, and the code depended on that date
  • Says what was wrong with the test itself: its expected value was a summer constant, so it could only pass in one season
  • Injects the clock and pins it to chosen instants, the changeover days among them, instead of reading today's date
  • States the property: one digest per user per local day, at the chosen local time whenever that time exists
  • Tests the days the clocks change in a zone with the EU's dates, one with other dates, and one whose clocks never change
  • Tests 02:30 in Berlin on both changeover nights: one digest each, never two and never none
  • Generates cases over every day of a year and many zones, asserting the property instead of hand-written values
  • Tests the backfill as a dry run on a production snapshot, judging the rebuilt times against known choices rather than only that it finished
  • Adds a production check: users with no digest or two in one local day, or a send minute that differs from the chosen one, alerting a person
  • Names what not to test — the time zone library's own conversions — and keeps tests whose expected values depend on today's date out of the suite

Follow-up questions

  • It failed on every run since Monday. Was it flaky?
  • Where should a test get the current date from?
  • Which zones and dates would you pick, and why those?
  • How do you test that 02:30 on the last Sunday of October sends once?
  • In March, how would you know within a day if this had come back?

Closing

That's everything on the page. Your turn: ask me how this team finds out about a bug like this one, who reviews a change like that one, or what our own tests would have missed.

What this line is for

Purpose

Scores nothing. Answer plainly; anything telling goes in the notes, not the score.

And one thing you would learn in your first month anyway, so you may as well hear it now: [name one true, specific weakness in how your own team ships — tests that read today's date, a fix that has to be repeated on a calendar, a kind of bug only support ever notices]. You would be working on it.

What this line is for

Purpose

An honest flaw in your own team's practice, said plainly, is the best evidence that the round reflects the work, and a fair warning to anyone hoping for a team that has it solved. Check it is still true on the day.

Their questions for you, and what happens next. The standard closing

Software Engineer interviews — common questions

Who is this Software Engineer interview plan for?
It is written for the interviewer, not the candidate: the hiring manager, engineer or panel member running the Technical Interview round for a Software Engineer role. It gives you a 60 min script to follow in the conversation — 3 questions with what each one is for and the signals to score against — so you are not writing the round from scratch the night before.
What does the Technical Interview round assess?
This round is focused on: Debugging, change risk and test design on a daily email that arrives an hour early after the clocks change: why, what a colleague's fix would break, and which tests would have caught it, pitched at a mid-level software engineer. It works through An hour early since Sunday, Plus sixty for Europe and The test marked flaky, scoring against 29 observable signals, with follow-up prompts on all 3 questions for going deeper where an answer is thin.
How is the 60 min split up?
60 min on 3 questions. The questions take in An hour early since Sunday (22 min), Plus sixty for Europe (20 min) and The test marked flaky (18 min). The timings are there so the round stays on schedule and every candidate gets the same shape of interview — which is what makes two candidates comparable afterwards.
What other rounds should I run for a Software Engineer?

A single round does not cover a whole role. The other rounds in this library for a Software Engineer:

Hiring for this role?

Open this plan in Hirezen and make it a position in one click.

  • Every interviewer runs the same script and marks the same signals.
  • AI drafts the write-ups, and the debrief puts every read side by side.
  • No ATS to set up first, and no bot in the call.
Start free with this plan

Free for your first open role.