cswork / libraryOpen practice workspace

Interview guides · Cesna Group

Cesna Group Software Engineer Interview Guide

Cesna Group Software Engineer interview guide: the phone screening and technical rounds, reported coding and debugging questions, and a 7-day plan.

The 60-second brief

Candidate reports describe Cesna Group as a company that ships software products to users and clients, and the Software Engineer role as building new features and improving existing ones alongside product managers and other stakeholders. The reports do not name a specific product, team or architecture, so use the recruiter conversation to ask what you would work on. What they do list is the working vocabulary of the role: Java, Python or C#, web development frameworks, database fundamentals, Git, code review, and troubleshooting and debugging running applications.

This guide is for candidates interviewing for the Software Engineer role at Cesna Group. It covers both reported stages, the Phone Screening and the Technical Interviews, and prepares you for the reported question groups: technical and domain questions, problem-solving and case studies, behavioral questions, and coding and algorithm questions. It does not cover other roles at the company.

Candidates report two stages over roughly 2-4 weeks: a Phone Screening that reviews your resume and fit, then Technical Interviews that test coding and problem-solving. The reported topics lean toward C, C# and Python, troubleshooting and log analysis.

Focus areas

  • Programming in C
  • Troubleshooting & Diagnostics
  • Programming in C#

Overview

The responsibilities candidates describe are those of a working application developer: build features, turn requirements from product managers into scoped work, take part in code review, and track down faults in running software. The requirements mention Java, Python or C#, a web framework, database fundamentals and data structures, with cloud services, Agile practice and software testing listed as extras. Your preparation should look like that job: code you can write and explain, and faults you can diagnose out loud.

The reported topic list is unusually specific about diagnosis. Troubleshooting and Diagnostics and Logging and Log Analysis appear next to the language topics Programming in C, Programming in C# and Programming in Python. Several reported questions point the same way: a challenging bug you resolved, a slow application, a system that is down, and a time you troubleshot a complex problem. Prepare one reusable method (symptom, reproduction, evidence from logs and metrics, hypothesis, fix, regression test) and two or three real incidents from your own work to hang on it.

Many of the reported technical questions are open prompts about your own experience: which languages you know best, which design pattern you applied, how you keep code maintainable. They have no single correct answer, so the preparation is a short bank of concrete projects. For each language you claim, hold one project, one hard problem and one decision you would revisit. For the design pattern question, pick a pattern you actually used and be ready to name the alternative you rejected.

The coding questions are classic fundamentals: reverse a string, binary search with its complexity, find two numbers that reach a target, stacks versus queues, and building a linked list. They reward clean, tested code in the language you choose and precise talk about edge cases and complexity, not exotic algorithms. Practise writing each one from a blank file, run your own tests, and explain the trade-off aloud. Candidates are also advised to practise under timed conditions.

The Cesna Group interview process

Candidates describe two stages, a Phone Screening and Technical Interviews, and the reported questions are not tied to a particular stage, so prepare every group for the technical stage and keep the behavioral stories ready throughout.

Phone Screening

Candidates report a first conversation with a recruiter that walks through your resume and gauges how well you fit the role. Treat it as the stage where your written history has to hold up when spoken: each language and project on the page needs a concrete example you can narrate in a minute or so. The reported topics for this loop include C, C# and Python, and the requirements mention Java, so be ready to say which of them you have used in real work and for what. Ask the recruiter what the technical interviews will contain and which language you may use.

What to demonstrate

  • How clearly you explain your resume and the projects on it
  • Fit for the Software Engineer role as candidates describe it
  • Which of the languages in the reported topics (C, C#, Python, Java) you have really used

How to prepare

  • Write a language inventory: for each language on your resume, one project, one hard problem and the result, so your answer to which languages you are most proficient in matches your resume.
  • Order your resume story by relevance to application development, code review, debugging and database work, and cut anything you cannot discuss in depth.
  • Prepare questions for the recruiter: what the team builds, which stack the role uses, the format of the technical interviews, and the hybrid arrangements candidates report.

Technical Interviews

Candidates report technical interviews that assess coding skills and problem-solving. The reported question list covers four groups. Technical and domain: languages you know, a challenging bug, REST versus SOAP, code quality, a design pattern you used. Problem-solving: a slow application, a system outage, prioritising competing deadlines, and talking through a specific technical challenge. Coding: reversing a string, binary search, two numbers that hit a target, stacks versus queues, and a linked list. A behavioral group also appears, and the reports do not say which stage it belongs to, so prepare it for both. The reported topics add Programming in C, C# and Python, Troubleshooting and Diagnostics, and Logging and Log Analysis.

What to demonstrate

  • Working code for fundamentals: strings, searching, hash lookups, stacks, queues and linked lists
  • A structured problem-solving process you can describe step by step
  • Practical knowledge of web services, design patterns and code quality
  • Diagnosing faults with logs, which the reported topics include

How to prepare

  • Write all five coding questions from a blank file in your chosen language, with your own test cases for empty input, one element, duplicates and the largest values.
  • Build a one-page REST versus SOAP comparison (message format, contract, error handling, security, when you would pick each) and rehearse it aloud.
  • Rehearse a diagnostic routine for the slow application and outage questions: scope the impact, check recent changes, read logs by request or time window, measure before tuning, then fix and add a regression test.
  • Pick a design pattern you used in real code and prepare its purpose, the alternative you rejected and how it affected tests.

Where candidates lose points

Answering the languages question with a list of names and no project behind each

Name one or two languages from your inventory, say what you built, which problem was hardest and what you would do differently. A language you cannot attach a project to is better left off, since follow-ups on C, C# or Python will test it.

Telling troubleshooting and bug stories that jump from symptom straight to the fix

Narrate the evidence step: how you reproduced it, what the logs showed, which hypotheses you ruled out and how you verified the fix. Finish with the regression test or alert that came out of it.

Solving reverse a string, binary search or the two-numbers-to-a-target question without testing edge cases

After writing the code, run empty input, a single element, duplicates, negatives and an absent target. For binary search, state the loop invariant and compute the midpoint without overflow. State time and space complexity for every solution.

Answering the slow-application or system-down questions with a list of tuning tricks

Start with scope and impact, check recent changes, then measure with logs, metrics or a profiler to find where time goes before changing anything. For an outage, say how you restore service first and investigate the cause afterwards.

Describing REST versus SOAP or code-quality practices as a vocabulary list

Compare them on message format, contract, error handling and security with one case where you would choose each. For quality, name what you actually do: review rules, tests, linting, small functions, and a real defect that practice caught.

Questions & practice

Write a function to reverse a string in your preferred programming language.

Medium · Coding / Algorithms

Approach

  1. Clarify the details first. Can the input be empty or null? Should the reversal be in place or return a new string? Is it ASCII or Unicode text? Strings are immutable in Python, Java and C#, so 'in place' there means working on a char array.
  2. Give the idiomatic answer, then the hand-written one. In Python, s[::-1] is O(n) time and O(n) space. The manual version uses two pointers: i from the start, j from the end, swap and move inward while i < j. That is O(n) time and O(1) extra space on a mutable array, such as a char[] in C# or Java or a char buffer in C.
  3. In C, use strlen to find the end and stop before the terminating '\0', so it stays in place. Check for a NULL pointer, and make sure the buffer is writable: a string literal is not.
  4. Name the traps. Building the result by repeated concatenation in a loop can be O(n^2) because each step copies. Recursion uses O(n) stack. In Java and C#, char-by-char reversal splits UTF-16 surrogate pairs, while Java's StringBuilder.reverse keeps them together. Combining marks need grapheme-aware handling in any language.

Follow-up

  • How would you reverse the order of words in a sentence but keep each word intact?
  • How do you reverse a string containing emoji or accented characters correctly?
  • Can you write the in-place version in C with pointers?

How would you implement a binary search algorithm? Explain its time complexity.

Medium · Coding / Algorithms

Approach

  1. State the precondition: the array must be sorted. Then write the iterative version: lo = 0, hi = n - 1, loop while lo <= hi, compute mid = lo + (hi - lo) / 2 (this avoids integer overflow in C, Java and C#), return mid on a match, else set lo = mid + 1 or hi = mid - 1, and return -1 when the loop ends.
  2. Complexity: each step halves the search range, so it takes O(log n) comparisons. Space is O(1) iterative, or O(log n) for the recursive version because of the call stack. Compare that with O(n) for a linear scan.
  3. Know the boundary variant. For the first index >= target (lower bound), use a half-open range [lo, hi), loop while lo < hi, and set hi = mid when a[mid] >= target. That handles duplicates. Setting lo = mid instead of mid + 1 is the classic infinite-loop bug.
  4. Mention the library versions and what they return on a miss. Python's bisect.bisect_left returns the insertion point. Java's Arrays.binarySearch returns -(insertion point) - 1. C#'s Array.BinarySearch returns the bitwise complement of the index of the next larger element. Test on an empty array, one element, and targets below and above the range.

Follow-up

  • How do you find the first and last positions of a target that appears many times?
  • How would you search a sorted array that has been rotated at an unknown pivot?
  • How can binary search find a minimum feasible value, such as the smallest capacity that ships all packages within a set number of days?

Given a list of integers, find the two numbers that add up to a specific target.

Medium · Coding / Algorithms

Approach

  1. Clarify the details: return indices or values? Is exactly one answer guaranteed? Can the same element be used twice? Can there be negatives and duplicates? Name the brute force: check every pair, O(n^2) time, O(1) space.
  2. Optimal approach: one pass with a hash map from value to index. For each x at index i, check whether target - x is already in the map. If so, return the stored index and i. Otherwise store x. That is O(n) average time and O(n) space.
  3. Explain why you check before inserting. It stops an element pairing with itself, and it still handles duplicates such as [3, 3] with target 6, because the first 3 is stored before the second is examined.
  4. Give the alternative: sort, then move two pointers inward from both ends, which is O(n log n) time. It suits already-sorted input, where it is O(n) with O(1) extra space. Sorting loses the original indices unless you carry them along. In C, Java or C#, note that x + y can overflow a 32-bit int, so use a 64-bit type.

Follow-up

  • How would you return all unique pairs that sum to the target?
  • How does this extend to three numbers summing to a target, and what is the complexity?
  • What changes if the list is too large to fit in memory?

Describe the differences between stacks and queues. Provide examples of when to use each.

Medium · Coding / Algorithms

Approach

  1. Define both by their access order. A stack is LIFO: push and pop at one end, both O(1). A queue is FIFO: enqueue at the back and dequeue at the front, both O(1) with the right implementation.
  2. Cover implementation choices. A dynamic array works well as a stack. A queue needs a circular buffer or a linked list. In Python, list.pop(0) is O(n), so use collections.deque. In Java, ArrayDeque is the usual choice over the legacy Stack class. C# has Stack<T> and Queue<T>.
  3. Give stack use cases: the call stack and recursion, undo history, matching brackets, evaluating expressions, iterative DFS, and monotonic-stack problems like 'next greater element'.
  4. Give queue use cases: BFS for shortest paths in unweighted graphs, job and print scheduling, producer-consumer buffers, and request buffering. Contrast with a priority queue, which serves by priority rather than arrival order and is usually a binary heap with O(log n) insert and remove.

Follow-up

  • How would you implement a queue using two stacks, and what is the amortized cost per operation?
  • How would you design a stack that returns its minimum element in O(1)?
  • How would you make a queue safe for several producer and consumer threads?

Solve a problem related to data structures, such as implementing a linked list.

Medium · Coding / Algorithms

Approach

  1. Define the structure: a Node with a value and a next pointer, plus a list object holding head (and tail, if appends should be O(1)). State the costs: insert at head O(1), append O(1) with a tail pointer (O(n) without one), search and delete-by-value O(n), no random access.
  2. Use a dummy (sentinel) head node so that inserting or deleting at the head follows the same code path as anywhere else. When the deleted node is the last one, update tail too.
  3. Have the classic operations ready. Reverse in place with prev, curr and next pointers in O(n) time and O(1) space. Detect a cycle with Floyd's slow and fast pointers. Find the middle with the same two-speed pointers. Merge two sorted lists with a dummy head.
  4. Test edge cases out loud: empty list, a single node, removing the head or tail, and a value not present. In C, free removed nodes and null out pointers to avoid leaks and dangling references. Be ready to compare with arrays: O(1) indexing and better cache locality versus cheap insertion at a known node.

Follow-up

  • How do you find the node where a cycle begins, not just detect that one exists?
  • How would you build an LRU cache with a doubly linked list and a hash map?
  • When would you choose a linked list over a dynamic array in real code?

Denormalise tenant onto revisions and backfill it live

Hard · denormalisation · online migration · backfill

resource_revision (revision_id, resource_id, version, actor_user_id, change_kind, patch, request_id, created_at) has 400M rows and no tenant column; tenant_id lives only on resource. Two reads need it: a tenant-scoped audit feed ordered by created_at DESC, and an offboarding purge. Both join back to resource today. Justify adding tenant_id to resource_revision against those two reads, name the anomaly the copy introduces and the constraint that prevents it, then give the ordered migration for a live table taking 1.2k writes/second — the lock each step takes, how the backfill is batched, and where each step stops being reversible. PostgreSQL 16.

Approach

  1. Justify from the access path rather than from taste. Without the column, the audit feed either scans resource_revision by created_at and discards other tenants' rows, or resolves the tenant's resource_ids first and probes with them — both proportional to the tenant's whole history rather than to one page. With (tenant_id, created_at DESC, revision_id DESC) it is a seek that stops at 50 rows, and the purge becomes a ranged delete instead of a join.
  2. Name the cost exactly: a second copy of a fact can disagree with the first. Make the disagreement unwritable rather than documented — add UNIQUE (resource_id, tenant_id) on resource so it can serve as a foreign-key target, then FOREIGN KEY (resource_id, tenant_id) REFERENCES resource (resource_id, tenant_id) on the revision table. A revision can then only ever carry its parent's tenant.
  3. Step one, expand: ALTER TABLE resource_revision ADD COLUMN tenant_id BIGINT NULL, with no default, so it is a catalogue change and no rewrite. It still needs ACCESS EXCLUSIVE for an instant, and that instant queues behind the longest open transaction on the table while every later query queues behind it — set lock_timeout to 2s and retry rather than wait.
  4. Step two, dual-write: deploy the writer that populates tenant_id on every new revision while reads still use the join. Reversible by redeploying the previous build, because nothing reads the column yet.

Follow-up

  • The backfill is half finished and a rollback is required. What state is the table in, and what does the previous build do with a half-populated column?
  • How do you verify the backfill actually finished, given rows are still being inserted while it runs?

Hold a per-tenant active cap against concurrent creates

Hard · write skew · isolation levels · constraints

A tenant on the standard plan may hold at most 50 resources with status='active'. The create handler runs SELECT count(*) FROM resource WHERE tenant_id = $1 AND status = 'active', compares to 50, then inserts. Two creates arrive 3 ms apart on different instances and the tenant lands at 51. Name the anomaly, say whether PostgreSQL 16 READ COMMITTED or REPEATABLE READ prevents it and why, then give an implementation that holds the cap at READ COMMITTED with the exact statements. Finally, say what changes when the cap is 'at most one running export per tenant' on job_run.

Approach

  1. Name it: write skew. The two transactions read an overlapping set and write disjoint rows, so there is no row-level conflict for the engine to detect and each commit is individually legal.
  2. Rule out the levels precisely. READ COMMITTED takes a fresh snapshot per statement and takes no lock on the counted rows, so both see 49. PostgreSQL's REPEATABLE READ is snapshot isolation: it removes non-repeatable reads and phantoms within the snapshot but still admits write skew, because the anomaly is not a re-read of a changed row, it is a read of a set that a concurrent transaction invalidates. Only SERIALIZABLE closes it, by tracking the read dependency and aborting one transaction with SQLSTATE 40001 — a guarantee that exists only if the application re-runs the whole transaction from the read.
  3. Convert the set predicate into a single-row conflict: keep tenant.active_resource_count and run UPDATE tenant SET active_resource_count = active_resource_count + 1 WHERE tenant_id = $1 AND active_resource_count < 50 in the same transaction as the INSERT. Zero affected rows is the cap, returned as 409. The row lock serialises the decision at any isolation level, and contention is bounded to one tenant's row — which is also the fair-scheduling unit, unlike a global counter that would convoy every tenant behind one row.
  4. State the cost you just took on: a counter is a second source of truth that can drift, so every path that changes status must adjust it inside the same transaction, and a periodic reconciliation has to exist, with resource_revision as the authority for what the count should have been.

Follow-up

  • A resource moves from archived back to active. Which statements change, and what breaks if the counter update and the status change land in different transactions?
  • The cap becomes plan-dependent and a plan can change mid-month. Where does the number 50 live, and who reads it?

What programming languages are you most proficient in, and how have you applied them in your projects?

Medium · Technical / Domain Questions

Approach

  1. Lead with one primary language and a single project where it carried the work: what you built, its size, and one decision the language shaped, such as choosing Python for a data pipeline or C# for a Windows service. A ranked list of languages with no project behind it gives the listener nothing to follow up on.
  2. Show depth in that language with one runtime detail you can defend. In CPython that could be the GIL, which stops CPU-bound threads running in parallel. In Java it could be type erasure in generics. In C# it could be structs versus classes (value versus reference semantics) or LINQ's deferred execution.
  3. Rate your secondary languages honestly, for example 'production C#, reading-level C'. Have a short example ready for each language you claim, because you may be asked to write code in it on the spot.
  4. Mention the tooling you used around the language (package manager, test framework, profiler, Git workflow). It shows you have shipped and maintained code in it, not just written exercises.

Follow-up

  • How does memory management work in your main language, and when has it caused you a problem?
  • Which feature of that language do you avoid, and why?
  • If you had to rewrite that project in another language, what would get easier and what would get harder?

Describe a challenging bug you encountered in your code. How did you resolve it?

Medium · Technical / Domain Questions

Approach

  1. Pick a bug with a real mechanism you can name: a race condition, an off-by-one at a boundary, a null or dangling reference, a timezone or encoding mismatch, or a memory leak. A typo story has no debugging in it.
  2. Walk through the sequence. First, reproduce it reliably, or say why it would not reproduce. Shrink it to the smallest failing case. Form one hypothesis at a time and test it with logs, a debugger or extra instrumentation. Use git bisect when you know a good commit and a bad one.
  3. Say what the logs or metrics showed at each step and how you read them, for example by correlating timestamps or request ids across services. That turns a bare narrative into a diagnosis.
  4. Finish on the root cause, not the symptom patch. Cover the fix, the regression test that would have caught it, and any guard you added (an assertion, a validation, an alert).

Follow-up

  • What would you have done if the bug only happened in production and never locally?
  • How did you confirm your fix addressed the root cause and not just the symptom?
  • What changed in your process afterwards so this class of bug does not recur?

Explain the differences between REST and SOAP web services.

Medium · Technical / Domain Questions

Approach

  1. Open with the category difference. SOAP is a protocol: an XML envelope with Header, Body and Fault elements, usually described by a WSDL contract, and not tied to HTTP. REST is an architectural style: resources identified by URIs and handled through HTTP's uniform interface, with stateless requests and cacheable responses.
  2. Compare the wire and the contract. SOAP payloads are XML, and most calls go as HTTP POST to one endpoint, with the operation named inside the envelope. REST commonly uses JSON (any representation is allowed), with GET, POST, PUT, PATCH and DELETE on resource paths. An OpenAPI spec is optional, not built in.
  3. Cover errors and semantics. SOAP returns a Fault element. REST uses HTTP status codes (400, 404, 409, 500). In REST, GET, PUT and DELETE are idempotent by definition and POST is not, which decides how safely a client can retry. HTTP intermediaries can cache GET responses, but they generally do not cache SOAP POSTs.
  4. Close with when to pick each. SOAP fits existing enterprise integrations that already publish a WSDL, or that need message-level standards such as WS-Security or WS-ReliableMessaging. REST fits most web and mobile APIs, where lighter payloads, easy browser tooling and HTTP caching matter more.

Follow-up

  • How would you version a REST API without breaking existing clients?
  • Why is PUT idempotent but POST is not, and how would you make a POST safe to retry?
  • Where would you use gRPC or GraphQL instead of either one?

How do you ensure code quality and maintainability in your projects?

Medium · Technical / Domain Questions

Approach

  1. Name the automated layers you actually use. Unit tests cover logic. Integration tests cover database and API boundaries. A CI pipeline runs both on every pull request and blocks the merge when they fail.
  2. Add static checks that catch problems before review: a formatter (black, dotnet format), linters and type checkers (pylint or ruff, mypy, Roslyn analyzers, SpotBugs). Formatting arguments then never reach a human reviewer.
  3. Describe your code review habits: small pull requests, a description of why the change exists, and review comments about correctness and naming rather than style. Treat coverage as a signal for untested paths, not a number to hit.
  4. For maintainability, give concrete practices: functions with one responsibility, dependencies injected so they can be faked in tests, refactoring alongside feature work, and short written records of non-obvious decisions. Back it with one example where this paid off.

Follow-up

  • How would you add tests to a legacy module that has none and is hard to change?
  • What coverage target would you set, and what does coverage fail to tell you?
  • How do you handle a pull request you think should not merge but the author disagrees?

Discuss a project where you implemented a design pattern. What was the pattern, and why did you choose it?

Medium · Technical / Domain Questions

Approach

  1. Start with the problem that forced the pattern, then name the pattern. For example: pricing rules that differed by customer type led to Strategy; a third-party client with an awkward API led to Adapter; retry and logging around a service call led to Decorator; several consumers reacting to one event led to Observer.
  2. Show you know the pattern's structure. For Strategy, a common interface, one class per algorithm, and a context that holds the chosen strategy and is configured at runtime or through dependency injection. Be able to sketch that in your interview language.
  3. State the alternative you rejected and the cost you accepted. A switch statement is simpler for two cases, but it breaks the open/closed principle once a new case arrives every month. The pattern adds indirection and more classes to read.
  4. Mention a pattern you would hesitate to use, such as Singleton, which brings hidden global state and is hard to replace in tests. It shows you choose patterns by trade-off rather than habit.

Follow-up

  • At what point would that pattern have been overkill for the same project?
  • How does the pattern relate to the SOLID principles?
  • Can you write the skeleton of that pattern now in your main language?

How would you approach optimizing an application that is experiencing slow performance?

Medium · Problem-Solving / Case Studies

Approach

  1. Define 'slow' before touching anything. Which endpoint or screen is slow, for which users, and since when? Measure it with a percentile (p95 or p99 latency) rather than an average, and check whether a recent deploy or a growth in data size lines up with the slowdown.
  2. Profile instead of guessing. Use an application profiler (cProfile or py-spy for Python, dotTrace or PerfView for .NET, Java Flight Recorder for the JVM) and request traces or timestamped logs to split the time between application code, database, external calls and waiting on locks.
  3. Check the usual culprits in order of likelihood. On the database side, look for missing indexes (read EXPLAIN plans), N+1 query patterns and oversized result sets. In the code, look for an accidental O(n^2) loop, repeated work that could be cached, or synchronous calls that could be batched or run concurrently. Also check memory and GC pressure.
  4. Fix the largest contributor first and measure again under the same load. Introduce caching only with a clear invalidation rule, and add a performance regression check or an alert so the slowdown is visible next time.

Follow-up

  • How would you spot an N+1 query problem from logs or traces?
  • Your cache fixed latency but users now see stale data. What do you change?
  • How do you tell whether the bottleneck is the database or the application server?

Given a scenario where a critical system is down, how would you handle the situation?

Medium · Problem-Solving / Case Studies

Approach

  1. Start with scope and communication. Confirm the outage from monitoring rather than a single report, work out who is affected and how badly, open an incident channel, and give stakeholders a status update with a time for the next one.
  2. Mitigate before you diagnose. Ask what changed recently (a deploy, a configuration change, a certificate expiry, a dependency outage), then roll back, fail over, switch off the feature flag or add capacity to restore service.
  3. Diagnose with evidence. Read error logs and metrics around the start time, look for the first error rather than the loudest one, and correlate across services with request ids or timestamps. Change one thing at a time and record it in the incident timeline.
  4. Close the loop. Confirm recovery with the same signal that showed the failure. Then write a blameless postmortem with the timeline, root cause, detection gap and owned action items, such as an alert, a test or a safer deploy step.

Follow-up

  • The bad deploy included a database migration, so rollback is not clean. What now?
  • When would you escalate or bring in more people, and how would you split roles?
  • What monitoring would have caught this before users did?

Discuss how you prioritize tasks when faced with multiple competing deadlines.

Medium · Problem-Solving / Case Studies

Approach

  1. Make the work visible first. List every commitment with its real deadline, who depends on it, and what happens if it slips. Some deadlines turn out to be estimates rather than dates that cannot move.
  2. Rank by impact and cost of delay, not by who asked last. Production problems and work that blocks other people usually come first. An urgent/important split (the Eisenhower matrix) is a quick way to show the reasoning.
  3. Negotiate early when everything cannot fit: offer a reduced scope, a later date or a handoff, and let the person who owns the priority make the call. Say so as soon as you know, not on the due date.
  4. Back it with one specific example: the competing items, what you shipped first, what you deferred, and how the people affected heard about it. Explain how you protected focused time for the item that mattered most.

Follow-up

  • Two managers each say their task is the top priority. What do you do?
  • You realise mid-week that you will miss a deadline. When and how do you raise it?
  • How do you fit unplanned work, such as a production bug, into a full week?

If given a specific technical challenge, walk us through your thought process to arrive at a solution.

Medium · Problem-Solving / Case Studies

Approach

  1. Clarify before solving. Restate the problem, ask about input size, constraints and edge cases (empty input, duplicates, invalid data), and confirm the expected output with a small example worked by hand.
  2. Give a brute-force solution and its time and space complexity, then find the bottleneck and the data structure that removes it: a hash map for lookups, sorting plus two pointers, a heap for top-k, BFS for shortest paths in unweighted graphs.
  3. Say the trade-off out loud before coding (memory for speed, simplicity for performance), then write the code in clear steps with meaningful names.
  4. Test your own code: trace one normal case and the edge cases you listed, fix what you find, and finish by stating the final complexity and what you would change if the constraints grew.

Follow-up

  • How does your solution change if the input is a hundred times larger?
  • Which alternative approach did you rule out, and why?
  • How would you test this in production code rather than on a whiteboard?

Listing latency scales with page size, not with filters

Easy · n+1 · latency · query batching

The tenant listing endpoint reads resource filtered by tenant_id and status, ordered by updated_at DESC, and returns each row plus the owner's display name from app_user and the actor of that resource's latest resource_revision. p99 is 55 ms at 10 rows per page and 1.4 s at 200. Database telemetry shows 401 statements per request, each under 1 ms, and nothing in the slow-query log. Diagnose the cause and give the fix, stating the statement count per request and the p99 you expect afterwards.

Approach

  1. Read the counters before forming a theory. 401 statements for 200 rows is one driver query plus two per row, and sub-millisecond execution with an empty slow-query log rules out a bad plan. The time is round trips, which is why it is invisible in every per-query metric and scales with rows returned rather than with filter selectivity.
  2. Name the two per-row statements from their normalised text: a single-row app_user lookup by user_id, and a resource_revision lookup by resource_id ordered by version DESC LIMIT 1. Confirm by dropping those two response fields and watching the statement count fall to one. That locates the calls in the serialisation layer, not the repository.
  3. Check that the arithmetic accounts for the whole gap. Measure one round trip to the replica in isolation; 400 trips at roughly 3 ms of network plus 0.2 ms of execution is about 1.3 s on top of a 55 ms baseline, which matches. If the multiplication had fallen short, the N+1 would only be part of the story and you would keep looking.
  4. Batch both lookups. Collect owner_user_ids and resource_ids from the driver query, then issue WHERE tenant_id = $1 AND user_id = ANY($2) for the users, and PostgreSQL's SELECT DISTINCT ON (resource_id) ... WHERE resource_id = ANY($2) ORDER BY resource_id, version DESC for the latest revision, which the UNIQUE (resource_id, version) index serves directly. On an engine without DISTINCT ON, use a lateral join or a row_number window. Three statements per request at any page size.

Follow-up

  • The page size is capped at 200 today. What breaks first if it is raised to 2,000, and is it still this bug?
  • How do you stop the next N+1 from reaching production, given that no individual query is slow and the endpoint's tests pass?

Suggested practice checklist

The plan follows the two reported stages.

Day 1 — Map the loop and build your language inventory

  • Write the reported sequence (Phone Screening, then Technical Interviews) and the four question groups, and mark the group you are least ready for.
  • For each language on your resume, write one project, one hard problem and its result. Highlight C, C# and Python, which the reported topics name.
  • Write your answer to the question on which languages you are most proficient in and how you have applied them, then check it against your resume.

Deliverable: A one-page loop map with your weakest group marked, a language inventory table, and a written answer to the language-proficiency question.

Day 2 — Coding fundamentals: strings, search and hash lookups

  • Write reverse a string in two ways (in-place two pointers and library slicing) and note when each is allowed, including empty and single-character input.
  • Write binary search iteratively, then state its complexity, why the midpoint is lo + (hi - lo) / 2, and what happens with duplicates or an absent target.
  • Solve the two-numbers-to-a-target problem with a brute-force pass and then a hash map in one pass. Test duplicates, negatives and the case of using the same element twice.

Deliverable: Three tested solutions in your chosen language, each with a complexity note and a list of the edge cases tested.

Day 3 — Stacks, queues and linked lists

  • Write a short comparison of stacks and queues (LIFO versus FIFO, operations, complexity) with two uses each, such as undo history or bracket matching for a stack and task scheduling or breadth-first search for a queue.
  • Implement a singly linked list with insert at head, append, delete by value and reverse, and test empty, one-node and delete-the-head cases.
  • Re-implement a stack with an array and a queue with two stacks or a linked list, and state the cost of each operation.

Deliverable: A written stack-versus-queue comparison and a tested linked list with reverse, delete and a stack and queue implementation.

Day 4 — Web services, code quality and design patterns

  • Write a REST versus SOAP comparison covering message format, contract definition, error handling, security and statefulness, and finish with one case where you would pick each.
  • Write down what you do to keep code maintainable (review rules, tests, naming, small functions, linting) and tie each habit to a defect or review where it paid off.
  • Choose one design pattern you really used. Note the problem it solved, the alternative you rejected, and how it affected testing.

Deliverable: A one-page REST versus SOAP table, a list of quality practices each linked to an example, and a short note on one design pattern you used.

Day 5 — Troubleshooting, logs and performance

  • Write your diagnostic routine for a slow application: scope the impact, check recent changes, profile or time the stages, read the logs, fix the biggest cost, and re-measure.
  • Write your outage routine: confirm impact, mitigate or roll back first, communicate, investigate from logs, then write up cause and prevention.

Day 6 — Database fundamentals and prioritisation

  • Write down the steps and the risk of each.
  • Write how you prioritise competing deadlines: the criteria you use (impact, dependency, effort), how you tell stakeholders about trade-offs, and one real example.

Day 7 — Behavioral stories and a full run-through

  • Write a story outline for each reported behavioral prompt: troubleshooting a complex problem, a difficult team member, taking the lead, feedback, failure and staying motivated.
  • Say each story aloud and trim it so the situation takes two sentences and your decisions and reasoning take the rest. Replace "we" with "I" wherever you made the call.
  • Run a timed mock: one coding question, one diagnosis question and two behavioral prompts, answered aloud without notes.

Deliverable: Six story outlines, a trimmed spoken version of each, and notes on what slipped during the timed mock.

Troubleshooting, teamwork and ownership stories

The behavioral questions candidates report for this role cover troubleshooting a complex problem, a difficult team member, taking the lead on a project, feedback, failure and staying motivated. For an engineering role, give each story technical content: the system, the fault or decision, the evidence you used and what changed afterwards. Prepare each one in the first person singular.

Describe a time when you had to troubleshoot a complex problem. What steps did you take?

Medium · Problem-Solving / Case Studies

Approach

  1. Choose a problem whose cause was not obvious at first: a symptom users or monitoring could see and several plausible suspects. State the symptom and its impact in two sentences, then move to your reasoning.
  2. Walk the diagnostic sequence in order: how you reproduced it (or why you could not), what the logs showed, how you correlated timestamps or request identifiers, which recent deploy or configuration change you checked, and how you narrowed the field by bisecting.
  3. Name the hypotheses you eliminated and the evidence that eliminated them. Then state the precise root cause, the fix, and how you verified it: a failing test that now passes, or an error rate and log pattern back to baseline.
  4. Close with prevention: the regression test, the alert or log line you added, the runbook note. The story fails when it says you looked at everything, or jumps from symptom to fix with no evidence step.

Follow-up

  • What did the logs show that made you drop your first hypothesis?
  • How did you confirm the fix addressed the root cause and not only the symptom?
  • What would you add to the logging so the same fault is found faster next time?

Tell us about a time when you had to work with a difficult team member. How did you handle it?

Medium · Behavioral / Leadership

Approach

  1. Pick friction with a specific, observable behaviour: missed handoffs, review comments that stalled a pull request, requirements that kept shifting. Describe the behaviour and its effect on delivery in neutral terms, not their personality.
  2. Show that your first move was a direct, private conversation to learn their constraints, in your own voice: "I asked what was blocking the review and whether the interface was unclear." Escalating first or venting to others sinks the story.
  3. Show what you changed on your side and how you used evidence instead of opinion: an agreed written interface, a review checklist, a shared ticket board, a short design note you both signed off on.
  4. Finish with the concrete outcome and the working relationship afterwards. If it stayed unresolved, say what you raised with your manager and when. Do not cast the other person as the villain.

Follow-up

  • What would you have done if the behaviour had not changed after that conversation?
  • At what point would you have involved your manager, and what would you have brought?
  • What did the episode teach you about your own working style?

Describe a situation where you took the lead on a project. What was the outcome?

Medium · Behavioral / Leadership

Approach

  1. Choose a project where you set direction, not one where you carried out someone else's plan. State its scale up front: how many people, what had to ship, and the deadline.
  2. Show the mechanics of leading: how you broke the work into pieces, who owned each, which checkpoints you set (code review, short syncs, a ticket board), and how you handled a requirement change with the product manager.
  3. Include one hard trade-off and the reasoning: cutting scope, choosing a library, delaying a release or splitting a service. Say who disagreed and how you settled it.
  4. Report the outcome with figures you actually have (release date met, defects after launch, adoption) and one thing you would change. Saying "we" throughout hides your part, and a vague result sinks the answer.

Follow-up

  • How did you handle a teammate who fell behind?
  • What did you cut, and who had to agree to it?
  • What would you do differently if you ran the project again?

How do you approach feedback, both giving and receiving?

Medium · Behavioral / Leadership

Approach

  1. This question asks for your practice, so give a method for each direction and one real example of each, rather than saying you welcome feedback.
  2. Receiving: ask a clarifying question, restate what you heard, separate the observation from the interpretation, act on it and report back. Use an example such as a code review comment that exposed an unhandled null case or a missing test and changed how you write code.
  3. Giving: be specific about the code, not the person, give the reason and offer an alternative, for instance "I would extract this check into one function because it appears in three places; does that fit?" Say how you adjust for a junior or a more senior colleague.
  4. Include a case where you disagreed with feedback and tested it, with a benchmark or a counterexample, before deciding. Claiming you rarely receive critical feedback is the common mistake.

Follow-up

  • Tell me about feedback you disagreed with and what you did.
  • How do you give feedback to someone more senior than you?
  • What do you do when the same issue keeps recurring in someone's reviews?

Discuss an instance where you failed in your work. What did you learn from it?

Medium · Behavioral / Leadership

Approach

  1. Pick a real failure with a real cost that you owned: a missed deadline, a release that needed a rollback, a bug that passed review. A disguised strength ("I worked too hard") does not answer it.
  2. State in one sentence what you did wrong, then the impact: who was affected, what had to be redone, how long it took to repair.
  3. Spend most of the answer on what you did next: containment (rollback, hotfix, telling stakeholders promptly), the root cause, and a specific process change such as a test, a checklist item or a review step, with evidence it has held since.
  4. Avoid blaming circumstances, and avoid ending on "I learned to communicate more" with no concrete change attached.

Follow-up

  • When did you realise it had gone wrong, and who did you tell first?
  • What check would have caught it earlier?
  • Has the same kind of mistake happened since, and what happened?

How do you stay motivated during challenging projects?

Medium · Behavioral / Leadership

Approach

  1. Answer with behaviour, not slogans. Use one long, difficult project and show what you did when progress stalled: broke the goal into milestones with visible finish lines, shipped small increments, asked for help at a defined point.
  2. Tie it to the engineering work itself. The reported duties include troubleshooting, debugging and continued learning, so give a concrete moment from such work, such as finally reproducing an intermittent bug, that explains what keeps you going.
  3. Add practical habits for low-energy stretches: pairing, alternating hard and easy tasks, stepping away and returning with a fresh hypothesis, resetting scope with your manager when the plan is wrong.
  4. Avoid saying you never feel discouraged and avoid generic statements about passion. A specific habit with an example is convincing.

Follow-up

  • What do you do when the work is tedious rather than hard?
  • Describe a time you lost momentum and how you got it back.
  • How do you keep a team moving when a project drags on?