cswork / libraryOpen practice workspace

Interview guides · Assured

Assured Software Engineer Interview Guide

Assured Software Engineer interview guide: the 3 reported rounds, voice-file storage design, REST vs GraphQL, linked-list and sorting coding prep.

The 60-second brief

Candidates describe Software Engineer work at Assured as building cloud-based applications and improving systems that already exist. The topics reported from two loops all relate to storing audio in the cloud: cloud storage, audio file handling, file upload and download workflows, the object storage model, and integration with cloud APIs. For this role, candidates list Java or Python, hands-on experience with cloud technologies and APIs, and familiarity with Agile or Scrum as the core requirements. DevOps and CI/CD pipelines, data structures and algorithms, and front-end frameworks such as React or Angular appear as nice-to-haves. Candidates also mention code reviews, troubleshooting existing applications, and working with product and design.

This guide is for software engineers interviewing for the Software Engineer role at Assured, especially those with a few years of backend or full-stack experience in Java, Python or JavaScript. It covers the three reported stages and all thirteen reported questions: a system design question on storing voice files, API and engineering-practice questions (REST versus GraphQL, version control, debugging, code quality, performance), two coding questions (reversing a linked list and implementing a sort), a case-style question, and four behavioral prompts. Each one comes with a concrete approach and likely follow-ups.

Candidates report three rounds over roughly 3-5 weeks. First comes an Initial Screening with a recruiter or hiring manager, then Technical Interviews on problem-solving and coding, and finally Behavioral Interviews with team members and senior leadership.

Focus areas

  • Cloud Storage
  • Audio File Handling
  • File Upload/Download Workflows

Overview

The reported questions fall into two groups. One is classic interview material: reverse a linked list, implement a sort of your choice, and explain how you debug. The other is applied and cloud-focused. One design question asks for a cloud storage system for voice files, and the topics reported from two loops (object storage, upload and download workflows, audio file handling, cloud API integration) all point the same way. If you prepare only algorithms, you will be ready for the two coding questions and little else.

For the design side, learn one end-to-end story well. A client gets a pre-signed URL and uploads the audio straight to object storage, using multipart upload for large files. A completion event triggers a worker that validates the file, transcodes it and extracts metadata. A metadata database records each file's status. Downloads go through signed URLs or a CDN and support HTTP range requests. The REST-versus-GraphQL question and the cloud API integration topic connect to this same story, because file transfer is the case where GraphQL is usually the wrong tool.

The engineering-practice questions on version control, debugging, code quality and performance are open-ended. They go much better with a real example from your own work than with a list of good habits. For each one, prepare a two-minute answer that names the tools you used, what went wrong, and what you measured. Several of these questions can share the same project, which keeps your behavioral stories consistent.

Candidates say the behavioral stage includes team members and senior leadership, so tell each story in a way that works for both. Engineers will want technical detail. Leaders will want to know the outcome and what you personally decided. The four reported prompts cover a hard project, conflict, influence and learning quickly, so you need at least four distinct stories, not one story told four ways.

The Assured interview process

Candidates report these three stages, in this order, over about 3-5 weeks. Each one below covers what candidates describe and how to prepare for it.

Initial Screening

Candidates describe this as a relaxed conversation with a recruiter or the hiring manager about your background and your interest in the role. There are no reported technical questions here, but it is your first chance to connect your experience to the topics reported from the loop: cloud storage, file upload and download flows, and cloud APIs. Open with a short walkthrough of your career that ends on the cloud or API work closest to those topics, explain why this role interests you, and ask which kinds of technical and behavioral interviews come next so you can plan the rest of your preparation.

What to demonstrate

  • How well your background matches the reported requirements: Java or Python, cloud technologies and APIs, Agile or Scrum
  • Your interest in the role and how clearly you explain your motivation
  • How clearly you summarise your own experience

How to prepare

  • Write a two-minute career walkthrough that ends on a project involving cloud storage, file transfer or a third-party cloud API, and say it out loud until it sounds natural.
  • List your main language (Java, Python or JavaScript) and two cloud services you have used in production, each with one concrete thing you built on it.
  • Prepare two questions on what the technical and behavioral stages will cover, so you can adjust days 3-5 of the plan below.

Technical Interviews

Candidates report one or more interviews focused on problem-solving and coding. The reported technical questions include two coding problems (reverse a linked list, and explain and implement a sort of your choice), a design question about cloud storage for voice files, an API comparison, and open questions on debugging, code quality, version control and performance. Candidates do not say which of these come up in which interview, so prepare all of them. For coding, say your plan before you type, write working code in your strongest language, and walk through the empty, single-element and duplicate cases yourself. For design and discussion questions, ask about scale and constraints first, then build up from the simplest version that works.

What to demonstrate

  • Writing correct, working code for data-structure and algorithm problems
  • Breaking an open problem into steps and explaining your reasoning aloud
  • Your technical judgement in discussions of design, APIs and engineering practice

How to prepare

  • Implement linked-list reversal both iteratively and recursively, and merge sort plus quicksort, from a blank file in Python or Java, with your own tests for edge cases.
  • Work through the voice-file storage design end to end: pre-signed multipart upload, the metadata status model, a processing worker, CDN download with range requests, and lifecycle tiers.
  • Prepare a comparison of REST and GraphQL covering caching, errors, versioning and file upload, and be ready to say which one you would pick for an audio upload API.
  • Prepare spoken answers on debugging, code quality, version control and performance, each built around one real incident from your own work.

Behavioral Interviews

Candidates report behavioral interviews with team members and senior leadership, focused on past experience and cultural fit. The reported prompts are a challenging project, handling conflict in a team, influencing others, and learning a new technology quickly. Plan a different story for each, and tell each one in the first person with a clear decision you made and a measurable result. Because both engineers and senior leaders are reported here, practise each story at two levels of detail: a technical version, and a one-paragraph version focused on the outcome.

What to demonstrate

  • Past experience, judged through specific stories
  • How you work with teammates: handling conflict, influencing others, adapting
  • Cultural fit, as reported by candidates

How to prepare

  • Write four STAR stories, one for each reported prompt (challenging project, conflict, influence, learning a technology quickly), each with a number in the result.
  • For each story, add a two-sentence version for a non-technical listener, since candidates report senior leadership in this stage.
  • Prepare one example of explaining a complex technical idea to a non-technical person, and one example of prioritising under a tight deadline.

Where candidates lose points

Designing voice-file storage so that audio bytes pass through the application servers, or stored as blobs in a relational database.

Learn the pre-signed URL flow: the API creates a metadata row and returns a signed upload URL, the client uploads straight to object storage with multipart upload, and an event-driven worker handles processing. Keep only metadata and object keys in the database, and serve playback through signed URLs or a CDN with range requests.

Losing the rest of the list or returning the wrong head when reversing a linked list on the spot.

Practise until you can write the three-pointer loop without thinking: save next, rewire, advance, return prev. Before saying you are done, walk through the empty, one-node and three-node cases out loud.

Naming a sorting algorithm but not knowing its worst case, its stability or its space use, or freezing halfway through the merge step.

Memorise a short comparison of merge sort, quicksort, heap sort and insertion sort (time, space, stability, best input), and implement your chosen sort from a blank file at least three times before the interview.

Answering the debugging, code quality, version control or performance questions with a generic list of good habits.

Tie each answer to one real incident: what broke or was slow, the exact tools you used (git bisect, a profiler, an EXPLAIN plan, a CI check), what you changed and the number that moved. One story per question, ready to tell.

Behavioral stories told as 'we', with no personal decision and no measurable result, or the same project reused for every prompt.

Prepare four separate STAR stories for the four reported prompts, each centred on a choice you made and ending with a metric. Practise a short version as well, because candidates report senior leadership in this stage.

Questions & practice

Write a function to reverse a linked list.

Medium · Coding / Algorithms

Approach

  1. Iterative approach with three pointers: prev = null and curr = head. In a loop: save next = curr.next, set curr.next = prev, then move prev = curr and curr = next. Return prev as the new head. O(n) time, O(1) extra space.
  2. Recursive alternative: reverse the rest of the list, then set head.next.next = head and head.next = null, and return the new head from the recursion. O(n) time but O(n) call stack, which can overflow on very long lists in Python or Java.
  3. Edge cases to state and test: empty list (return null), a single node, two nodes, and checking that the old head's next becomes null so no cycle is left behind.
  4. The most common bug is rewiring curr.next before saving the next node, which loses the rest of the list. Returning head instead of prev is the second most common. Walk through a three-node list by hand after coding.

Follow-up

  • Reverse only the nodes between positions m and n.
  • Reverse the list in groups of k.
  • How would you check whether a linked list is a palindrome in O(1) extra space?

Explain and implement a sorting algorithm of your choice.

Medium · Coding / Algorithms

Approach

  1. Pick an algorithm and state its properties. Merge sort: O(n log n) in every case, stable, O(n) extra space for arrays. Quicksort: O(n log n) on average, O(n^2) worst case (avoided with a random or median-of-three pivot), in place, not stable. Heap sort: O(n log n), O(1) extra space, not stable. Insertion sort: O(n^2) in general but O(n) on nearly sorted input, and good for small arrays.
  2. Implement merge sort cleanly: return early when the length is 1 or less, split at the midpoint, sort both halves recursively, and merge with two indices using <= so equal keys keep their order (stability). Then append whatever is left over.
  3. If you choose quicksort, use Lomuto or Hoare partitioning with a random pivot, and say how many duplicates degrade it (three-way partitioning fixes that).
  4. Mention what real libraries do. Python's sort and Java's sort for objects use Timsort, a stable merge and insertion hybrid that takes advantage of runs that are already sorted. Java sorts primitives with dual-pivot quicksort, where stability does not matter.
  5. Test empty input, one element, all duplicates, already sorted and reverse sorted input.

Follow-up

  • When does stability matter? Give an example.
  • How would you sort a file of records too large to fit in memory?
  • Which algorithm would you use to sort a linked list, and why?

Archive a resource graph without breaking live references or recursing

Medium · graph traversal · topological order · tenant isolation

Resources reference other resources within a tenant; for the largest tenant the reference table holds up to 2,000,000 nodes and 8,000,000 edges. Archiving a resource must archive everything reachable from it that nothing outside the set still references, refuse when a live external referrer exists, and terminate when references form cycles, which they legitimately do. Produce the archive order and the refusal list, targeting O(V+E). Say what stops the traversal crossing a tenant boundary, and why recursion is the wrong control structure at this size.

Approach

  1. Load the subgraph with the tenant predicate on both endpoints of the edge, not only on the side you started from. Scoping the left table alone is the classic cross-tenant leak: one mis-entered edge then pulls another tenant's resources into the traversal and, worse, into the archive.
  2. Traverse iteratively with an explicit stack. A 2,000,000-node graph can hold a chain deep enough to exhaust a native stack in the low tens of thousands of frames, and that failure is a process crash rather than an error you can return.
  3. Treat cycles as data rather than corruption: compute strongly connected components with Tarjan in O(V+E) using its own explicit stack, then condense. The condensation is a DAG, so a topological order over it gives the archive order, and every member of a component archives in one transaction because no order within a cycle is valid.
  4. Decide refusals with reverse edges. A candidate is archivable only if every in-edge originates inside the candidate set, so build the transpose or count in-degrees restricted to the visited set, and emit each blocked resource with the id of the external referrer, which is the only part of the answer an operator can act on.

Follow-up

  • The graph is read in one query and the archive writes a minute later. What can change in between, and how do you make the write safe?
  • The candidate set is 400,000 resources. Is that one transaction, and if not, what does a half-finished archive look like to a reader?

Replace offset paging on the resource feed with keyset

Easy · keyset pagination · composite index · sort order

resource holds resource_id, tenant_id, owner_user_id, title, body_ref, version, status ('draft','active','archived','deleted'), created_at, updated_at, deleted_at, with an index on (tenant_id, status, updated_at DESC, resource_id DESC). The listing endpoint returns active resources for one tenant, newest update first, 50 per page, today with LIMIT 50 OFFSET n. Tenants reach page 400 and rows are created while they read. Write the keyset query, define what the cursor carries and how it is encoded, and say which part of the index each predicate uses. Assume PostgreSQL 16.

Approach

  1. Name the two failures separately. OFFSET 20000 makes the server produce and discard 20,000 rows, so page cost grows with depth rather than with page size. Independently, any write that changes how many rows sort above the offset moves the window between two fetches, and the direction decides which anomaly you get: an insert lands at the head of updated_at DESC and pushes already-returned rows down past the boundary, so they are returned a second time; a delete above the offset, or a row whose updated_at is bumped above the cursor, pulls rows up and one is never returned at all. Nothing in the response reveals either.
  2. Write the seek: WHERE tenant_id = $1 AND status = 'active' AND (updated_at, resource_id) < ($2, $3) ORDER BY updated_at DESC, resource_id DESC LIMIT 50. The row-value comparison is one index range rather than a disjunction, and both columns are NOT NULL, which is what makes that comparison well defined.
  3. Map each predicate onto the index: tenant_id and status are equality on the leading columns, (updated_at, resource_id) is the range, and the ORDER BY matches the index order so no Sort node appears and the scan stops after 50 rows. The DESC in the definition only matters for mixed directions — a plain ascending btree on the same columns is read backwards for this query.
  4. Put both sort columns in the cursor and nothing the client can tamper with into another tenant: base64 of (updated_at, resource_id), validated server-side, with tenant_id taken from the principal.

Follow-up

  • The client asks for 'jump to page 400'. What do you offer instead, and what does the honest version cost?
  • Sort order becomes user-selectable across four columns. How many indexes is that, and which would you refuse to add?

Keep soft-deleted accounts from blocking re-registration

Easy · soft delete · unique constraints · engine differences

app_user holds user_id, tenant_id, email CITEXT, password_hash (NULL for SSO principals), email_verified_at, auth_version, status ('invited','active','suspended','deactivated'), created_at, updated_at, deleted_at. Two live accounts for one address inside a tenant must be impossible, but an address freed by a soft delete must be reusable, and the same tenant may delete and re-register it repeatedly. Write the uniqueness DDL for PostgreSQL 16, then the equivalent for MySQL 8 where partial indexes do not exist, and say what each permits once three deleted rows already hold that address.

Approach

  1. Start from what is actually unique: not (tenant_id, email), but (tenant_id, email) among live rows. PostgreSQL says that directly — CREATE UNIQUE INDEX app_user_live_email ON app_user (tenant_id, email) WHERE deleted_at IS NULL. A full constraint over the same two columns burns the address permanently the first time someone deletes an account.
  2. Keep case-insensitivity in the type or the index, never in the application: CITEXT as given, or UNIQUE (tenant_id, lower(email)) as an expression index where the extension is unavailable. A case-sensitive unique column is exactly how two accounts for one human appear.
  3. For MySQL 8 the predicate has to move inside the key: add a discriminator column that is a constant 0 while the row is live and is set to user_id on delete, with UNIQUE (tenant_id, email, deleted_marker). Live rows share the constant and still collide; deleted rows differ from each other and stop colliding.
  4. State the NULL variant and its dependency: leaving the marker NULL for deleted rows also works, because a unique index treats NULLs as distinct — true in MySQL, and true in PostgreSQL only under the default NULLS DISTINCT, which PostgreSQL 15 lets you reverse. Check the polarity against the three existing deleted rows: constant-on-live is what preserves the collision you want, and reversing it silently admits duplicate live accounts.

Follow-up

  • A deleted account re-registers with the same address the next day. Do the old resource rows follow the new user_id, and how does the API keep the two principals apart?
  • How do you honour an erasure request while resource_revision.actor_user_id still references this table?

How would you design a cloud-based storage system for voice files?

Medium · Technical / Domain Questions

Approach

  1. Start with requirements. How long are the recordings and how large are the files? Which codecs are uploaded? How long are files kept? Who can play them back? Is playback streaming or a full download? Do you need near-real-time access after upload? Also state the read and write ratio you are assuming.
  2. Upload path: the client asks the API for an upload. The API creates a metadata row with status PENDING and an object key such as tenant/yyyy/mm/uuid, and returns a pre-signed URL (multipart for large files). The client uploads straight to object storage, so audio never passes through your app servers. Abandoned multipart uploads are removed by a lifecycle rule.
  3. Processing: an object-created event goes to a queue. A worker checks the file type and checksum, transcodes to a standard playback format, extracts duration, sample rate and size, and moves the status to READY or FAILED. The worker must be idempotent, keyed on the file id, because events can arrive more than once.
  4. Read path: an authorization check, then a short-lived signed GET URL, ideally behind a CDN. Support HTTP range requests so playback can seek without downloading the whole file. Metadata queries (list my recordings) go to the database, never to a bucket listing.
  5. Durability and cost: object storage replication and versioning, encryption at rest with managed keys, and lifecycle rules that move older audio to colder tiers. Handle deletion and retention in both the database and the bucket. Explain why you do not store blobs in the database: it bloats the database and backups, and every byte flows through the app servers.

Follow-up

  • How do you let a user on a flaky mobile connection resume an upload that failed partway through?
  • How would you detect and handle the same recording being uploaded twice?
  • What changes if users need to hear the audio while it is still being recorded?

Explain the differences between REST and GraphQL APIs.

Medium · Technical / Domain Questions

Approach

  1. Core difference: REST exposes resources at URLs and works with HTTP verbs and status codes. GraphQL exposes one endpoint and a typed schema, and the client chooses exactly which fields it gets, often across related objects in one request.
  2. Data fetching: GraphQL avoids over-fetching and the chain of under-fetching round trips that a REST client hits when a screen needs several resources. REST endpoints are simpler to reason about and to rate-limit one by one.
  3. Caching and errors: REST GET responses work with HTTP caches, CDNs and ETags out of the box. GraphQL usually sends POST to one URL, so caching moves to the client (a normalized cache) or to persisted queries. GraphQL often returns HTTP 200 with an errors array and partial data, so clients must check both.
  4. Server-side costs of GraphQL: N+1 resolver calls (fix them with batching such as a DataLoader), query depth and cost limits to stop expensive queries, and field-level authorization. Versioning differs too: REST often versions URLs or headers, while GraphQL adds fields and deprecates old ones.
  5. Give a decision rule: GraphQL for clients that put together many related entities (mobile and web UIs), REST for simple, cacheable, public or service-to-service APIs. For binary uploads such as audio, either way the API should hand out a pre-signed URL rather than carry the file through a GraphQL mutation.

Follow-up

  • How would you stop a client from sending a deeply nested GraphQL query that overloads the database?
  • How do you paginate a large list in each style, and why is cursor pagination better than offset?
  • Where would you put file upload in a GraphQL API?

How do you ensure code quality and maintainability?

Medium · Technical / Domain Questions

Approach

  1. Automate what you can: a formatter and linter in CI, static type checks where the language supports them, and a test pyramid with many fast unit tests, fewer integration tests against real dependencies (for example an object storage emulator), and a few end-to-end tests.
  2. Code review: small pull requests with one purpose, a description that explains why, and reviewers who focus on correctness, naming and boundaries rather than style, since tooling already handles style.
  3. Design for maintainability: clear module boundaries (for example, keep the storage client behind an interface so it can be swapped or mocked), explicit error handling instead of swallowed exceptions, and configuration kept out of code.
  4. Make debt visible: track it in the backlog, set aside time for it each sprint, and prefer refactoring bit by bit behind tests over big rewrites. Mention a trade-off, such as when you accepted lower test coverage to ship and how you later paid that back.
  5. Back it with a measurement from your own work, such as fewer escaped bugs after adding integration tests, or shorter review times after a size limit on pull requests.

Follow-up

  • What do you not unit test, and why?
  • How would you bring a large untested legacy module under test safely?
  • How do you handle a reviewer who blocks a pull request over style preferences?

How would you approach optimizing an existing application for better performance?

Medium · Problem-Solving / Case Studies

Approach

  1. Define performance before touching code. Which metric matters (p95 or p99 latency, throughput, memory, cold start, page load), what is the current baseline, and what is the target? Measure under realistic load, not on a laptop with a toy dataset.
  2. Profile to find the bottleneck: application traces to see where time goes, a CPU profiler or flame graph for hot code, EXPLAIN plans for slow queries, and network timing for chatty calls to downstream services.
  3. Fix the usual causes in order of payoff: N+1 queries and missing indexes, synchronous work that belongs in a background job (such as transcoding), large payloads (pagination, compression, field selection), repeated reads (a cache with an explicit invalidation and TTL strategy), and static or media content that should come from a CDN.
  4. State the trade-offs: caches add staleness and invalidation bugs, async jobs add eventual consistency and retries, and denormalisation adds write cost. By Amdahl's law, speeding up a part that takes 10% of the time saves at most 10%.
  5. Verify with the same load test and the same metric, roll out gradually, and keep monitoring so the improvement does not slip back.

Follow-up

  • Your cache improved average latency but p99 got worse. Why might that be?
  • How would you speed up a list endpoint that takes several seconds on a large table?
  • How do you stop performance from regressing after you fix it?

Present a solution to a common software engineering problem you have encountered.

Medium · Problem-Solving / Case Studies

Approach

  1. Pick a problem every engineer recognises and that you actually solved, for example duplicate processing caused by retries (fixed with idempotency keys), flaky tests, slow or failing large-file uploads (fixed with resumable multipart upload), or a slow query (fixed with an index or keyset pagination).
  2. Present it as a case study: the symptom and its cost, the root cause you found, two or three options you considered with their trade-offs, the one you chose and why, and the measured result.
  3. Include the constraints that shaped the choice (deadline, team size, backward compatibility). This shows judgement rather than a recited textbook answer.
  4. End with what you would improve next and what you would do differently. Keep a second example ready in case the first sounds too small.

Follow-up

  • Why not the simplest option you ruled out?
  • How did you roll it out without breaking existing clients?
  • What did monitoring show after the change?

What strategies do you use for debugging and troubleshooting code?

Medium · Technical / Domain Questions

Approach

  1. Reproduce the problem first. Pin down the input, the environment and the version that fail, and reduce it to the smallest failing case. A bug you cannot reproduce gets investigated through logs and metrics, not guesses.
  2. Read the evidence before guessing: the full stack trace, logs around the failure (correlated by request id), and what changed recently (deploys, configuration, dependencies, data). For regressions, git bisect between a good and a bad commit is a mechanical search, O(log n) in the number of commits.
  3. Form one hypothesis at a time and test it with a breakpoint, a focused log line or a unit test that fails for the reason you expect. Separate the trigger (a deploy or a large file) from the root cause (for example, an unchecked null or a buffer limit).
  4. Know the hard cases: race conditions and intermittent bugs (add timestamps and thread ids, stress-test, look for shared mutable state), problems that happen only in production (use tracing or a safe debug flag rather than attaching a debugger), and memory growth (heap snapshots compared over time).
  5. Close the loop: add a regression test that fails without the fix, write a short root-cause note, and add the alert or log line that would have caught it sooner. Tell one real debugging story using this sequence.

Follow-up

  • An upload fails for about 1% of users and you cannot reproduce it locally. What do you do first?
  • How do you tell whether a slowdown comes from your code, the database or a downstream API?
  • How do you debug something that disappears when you add logging?

Suggested practice checklist

Each day of the plan works on Assured's reported questions and topics: two coding days, two days on cloud storage and API design, one day on engineering practice, one behavioral day, and a final day of case answers and a screening pitch.

Day 1 — Linked-list reversal and its variants

  • Write the iterative three-pointer reversal in your main language from a blank file, then the recursive version, and explain the O(n) stack cost of the recursive one.
  • Test both against empty, single-node, two-node and five-node lists with your own assertions.
  • Solve two variants: reverse between positions m and n, and reverse in groups of k.

Deliverable: Two tested reversal implementations, two solved variants, and a list of the bugs you hit along the way.

Day 2 — Sorting: implement and compare

  • Implement merge sort (stable, with <= in the merge) and quicksort with a random pivot from scratch, and test them on empty, duplicate-heavy, sorted and reverse-sorted input.
  • Write a one-page comparison of merge sort, quicksort, heap sort, insertion sort and Timsort covering worst case, space and stability.
  • Explain out loud how you would sort data that does not fit in memory (external merge sort).

Deliverable: Two tested sort implementations, a one-page comparison of the algorithms, and a recorded spoken explanation of external sorting.

Day 3 — Design: cloud storage for voice files

  • Sketch the full design: requirements, pre-signed multipart upload, the metadata table and its status values, an event queue and an idempotent processing worker, CDN download with range requests, and lifecycle tiers.
  • Write down how the design handles resumed uploads, duplicate uploads, corrupt files and deletion requests.
  • Present the design out loud from start to finish, then answer the follow-ups on resumable upload and real-time playback.

Deliverable: A design diagram with a failure-case table and a recorded walkthrough of the voice-file storage system.

Day 4 — APIs and cloud API integration

  • Write a one-page comparison of REST and GraphQL covering fetching, caching, errors, versioning, N+1 resolvers and file upload, ending with your decision rule.
  • Design the REST endpoints for the voice-file system: start upload, complete upload, get metadata, get a playback URL, and list recordings with cursor pagination.
  • Work through the keyset-paging practice question to make the cursor pagination concrete.

Deliverable: An API comparison sheet, an endpoint specification for the voice-file system, and a solved keyset-paging query.

Day 5 — Engineering practice: version control, debugging, quality, performance

  • For each of the four practice questions, pick one real incident from your work and write a short outline: the problem, the tools, the change, the metric.
  • Rehearse the git details: rebase versus merge, revert versus reset, reflog recovery, and bisect.
  • Answer each question out loud and cut anything that is a general habit rather than part of your example.

Deliverable: Four written incident outlines, a git command cheat sheet, and four recorded spoken answers.

Day 6 — Behavioral stories for the final stage

  • Write four STAR stories, one each for a challenging project, team conflict, influencing others, and learning a technology quickly, each with a first-person decision and a number.
  • Write a two-sentence version of each story for a non-technical listener.
  • Tell each story out loud and check that no two rely on the same project or the same lesson.

Deliverable: Four full STAR stories, four short versions, and recordings of each.

Day 7 — Case answer, screening pitch and full run-through

  • Prepare the 'present a solution to a common problem' case: problem, root cause, options, choice, result, next step, with a second example in reserve.
  • Polish the two-minute career walkthrough for the screening call so it ends on your cloud or API work.
  • Run one mixed mock session: one coding problem from days 1-2, the voice-file design, and two behavioral stories, back to back.

Deliverable: A case-study outline with a backup example, a final screening pitch, and notes from the mixed mock session on what to fix.

Behavioural preparation

Candidates report behavioral interviews with team members and senior leadership, focused on past experience and fit. The reported prompts below cover four different situations, so prepare a separate first-person story with a measurable result for each, plus a short version for a non-technical listener.

  1. Describe a time you had to explain a complex technical concept to a non-technical audience.
  2. Describe a time when you identified a significant issue in a project and how you resolved it.

Describe your experience with version control systems.

Medium · Technical / Domain Questions

Approach

  1. Name what you actually use, for example Git with a hosted review tool. Explain your team's branching model (trunk-based with short-lived feature branches, or GitFlow with release branches) and why it suited how often you released.
  2. Show working knowledge: when you rebase a local branch versus merge, why you never rewrite history on a shared branch, how you undo a pushed commit with git revert, and how you recover lost work with git reflog.
  3. Bring one concrete story. For example, you found the commit behind a regression with git bisect, or you untangled a messy merge conflict on a long-running branch and changed the team's process so it did not happen again.
  4. Connect it to quality: small focused commits with clear messages, pull requests that need review and a green CI run, and tagged releases so you can roll back.
  5. For a team that handles audio, mention keeping large binaries out of the repository (Git LFS or object storage for test fixtures) and keeping secrets out of history.

Follow-up

  • A teammate force-pushed over your commits on a shared branch. How do you recover them?
  • When would you squash commits when merging, and when would you keep the history?
  • How would you structure branches to support a hotfix while a release is in progress?

Describe a challenging project you worked on and how you overcame obstacles.

Medium · Behavioral / Leadership

Approach

  1. Pick a project where you owned the hard part. Good obstacles are technical (a scaling limit, a migration, an unreliable dependency) or organisational (unclear requirements, a slipping deadline), not 'the work was a lot'.
  2. STAR: two sentences of situation and task, most of the time on actions in the first person (what you investigated, which options you weighed, what you chose and why), then a result with a number such as latency, error rate, delivery date or cost.
  3. Show at least one point where a plan failed and you changed course. That is what makes it a story about overcoming obstacles rather than a status report.
  4. Finish with what you would do differently. A story told only with 'we', or one where the obstacle was solved by someone else, does not answer the question.

Follow-up

  • What was the hardest trade-off you made on that project?
  • If you had half the time, what would you have cut?
  • How did you keep stakeholders informed when the plan changed?

How do you handle conflicts within a team?

Medium · Behavioral / Leadership

Approach

  1. Choose a real disagreement with a teammate about a technical or priority decision, such as a design choice, a review dispute or scope, where both sides had reasonable positions.
  2. Show the steps: you talked to the person directly, stated their view back to them accurately, agreed on decision criteria (for example latency, cost, delivery date), then settled it with evidence such as a prototype, a benchmark or data.
  3. Give the outcome and the relationship afterwards. If your view lost, show that you committed to the decision and helped it succeed.
  4. Avoid stories where the manager settled it for you, where you were obviously right and the other person was careless, or where the conflict is described only as 'a communication issue'.

Follow-up

  • What would you have done if the evidence had not settled it?
  • When would you escalate a disagreement, and how?
  • What did you learn about working with that person?

Can you give an example of how you influenced others in a project?

Medium · Behavioral / Leadership

Approach

  1. Pick a case where you had no formal authority: you got a team or a peer group to adopt a tool, a design, a testing practice or a change of priorities.
  2. Explain how you built the case: you found what each stakeholder cared about, brought evidence (a prototype, numbers from an incident, a short written design), and changed the plan based on their objections.
  3. Name who was hardest to convince and what finally changed their mind.
  4. Give the measurable result and whether the change lasted. A good story shows you listening and adjusting, not only persuading.

Follow-up

  • Tell me about a time you tried to influence a decision and failed.
  • How did you handle the person who disagreed most?
  • How did you know the change actually helped?

Discuss a time when you had to learn a new technology quickly.

Medium · Behavioral / Leadership

Approach

  1. Set the stakes: which technology (for example a cloud service, a framework or a language), why you had to learn it, and the deadline or delivery that depended on it.
  2. Describe your learning method: read the official docs and core concepts first, build a small throwaway prototype, read existing production code that uses it, and ask an expert targeted questions instead of general ones.
  3. Show what you shipped with it and one mistake you made while learning, plus how you caught it (a review, a test, a production alert).
  4. Explain what you now do differently when learning something new. If the technology is cloud storage or a cloud API, that also connects to the reported topics.

Follow-up

  • What did you skip learning at first, and did it come back to hurt you?
  • How did you make sure your code was production-quality while you were still learning?
  • How would you get a new teammate up to speed on the same technology?