cswork / libraryOpen practice workspace

Interview guides · Archer Daniels Midland

Archer Daniels Midland Software Engineer Interview Guide

Archer Daniels Midland Software Engineer interview guide: Phone Screening and In-Depth Interview, reported questions, STAR stories and a 7-day plan.

The 60-second brief

Archer Daniels Midland (ADM) is an agricultural processor whose operations run from grain processing through food production and supply chain logistics. Candidates describe the Software Engineer role as building and maintaining applications for business functions, working with cross-functional teams to turn requirements into software. Reported project areas include automation, data management and system integration, with work touching topics from food safety to logistics.

This guide is for candidates applying for a Software Engineer position at ADM, at the entry level up to roughly three years of experience as candidates describe the requirements. It covers both reported rounds, the behavioral, problem-solving, technical-discussion and coding questions candidates report, and the stack the requirements list: Java, Python or C++, SQL and NoSQL databases, Agile or Scrum, and Git, with cloud (AWS, Azure) and cybersecurity named as nice-to-haves.

Candidates report two rounds over roughly 2-4 weeks: a Phone Screening on background and fit, then an In-Depth Interview that mixes behavioral questions, technical assessments and time with potential teammates.

Focus areas

  • Behavioral Interviewing
  • STAR Method for Interview Responses
  • Interview Fit / Person-Position Fit Assessment

Overview

The reported questions split into four groups. Technical and domain questions ask about your languages, a hard problem you solved and how you keep code maintainable. Behavioral questions cover a difficult teammate, a project you led and how you prioritise competing deadlines. Problem-solving questions ask how you would diagnose a performance issue, adapt when requirements change quickly and gather requirements from stakeholders. The coding group is small and classic: reverse a linked list, optimise a slow algorithm and compare data structures. Very little of this is company-specific trivia, so the preparation is mostly about having concrete, rehearsed material.

Most questions are open-ended, so they are won by specifics. For each of the three technical-discussion questions, pick one real project and prepare names, numbers and decisions: which language you used and why, what the hard bug or design problem was, and which practices (code review, tests, small functions, naming, branching in Git) kept the code maintainable. Candidates describing the role mention code reviews and troubleshooting as part of the day, so examples involving review feedback and production fixes fit well.

The stack the requirements list is broad rather than deep: Java, Python and C++ as example languages, SQL and NoSQL, Agile or Scrum, Git. Choose the language you will code in and be fluent enough to write a linked-list reversal without an editor's help. Be ready to say when a relational table fits and when a document or key-value store does. For the scenario questions, rehearse a sequence rather than a slogan: measure before changing anything in a performance case, and use short iterations and written acceptance criteria when requirements move.

Because the role works with cross-functional teams on operations-oriented software, stakeholder communication is as rehearsable as an algorithm. Prepare a short account of how you would learn what a non-engineering user needs, confirm it in writing and keep them updated when scope shifts. Pair that with a STAR story for each behavioral prompt, and you have covered the whole reported question list.

The Archer Daniels Midland interview process

Candidates describe two stages. The second combines behavioral questions, technical assessments and team interactions, so most of the reported question list is practised for that round.

Phone Screening

Candidates report a Phone Screening that reviews your background and your fit for the role. No question list is tied to this stage, so treat it as a spoken version of your CV: the languages you work in, the projects you can talk about in detail and the reason you want a Software Engineer job at an agricultural processor. The question about which languages you are proficient in and which you prefer is a natural thing to prepare here, because it connects directly to the stack the requirements list (Java, Python, C++, SQL and NoSQL).

What to demonstrate

  • Your background as you describe it, and its fit with an entry-level to three-year Software Engineer role
  • How clearly you explain past projects out loud, without slides or code to point at
  • Familiarity with the languages and tools the requirements list, such as Java or Python, SQL and Git

How to prepare

  • Write a walk through your CV where each role or project has one concrete sentence on what you built, the language and database used, and one outcome you can defend
  • Prepare a direct answer on languages: name your strongest one with a project that proves it, name the others you can use, and explain a real reason for your preference
  • Write two or three honest reasons you want to build software for grain processing, food production and supply chain operations, tied to work you have done
  • Prepare questions about the team's projects and stack to ask at the end

In-Depth Interview

Candidates report a more detailed interview that includes behavioral questions, technical assessments and interactions with team members. This is the stage where the behavioral prompts (difficult teammate, project you led, prioritising deadlines) belong, along with the technical-discussion, problem-solving and coding question types. Prepare in three layers: STAR stories for the behavioral prompts, a repeatable method for the scenario questions (diagnosing performance, changing requirements, gathering requirements), and a coding warm-up that includes linked-list reversal and a comparison of common data structures.

What to demonstrate

  • Behavioral answers about teamwork, leadership and prioritisation, told with a clear situation, action and result
  • Working code and a spoken explanation of your approach on a coding exercise such as reversing a linked list
  • Structured reasoning on scenario questions about performance problems, shifting requirements and stakeholder needs
  • Technical discussion of your projects, including code quality and maintainability

How to prepare

  • Write a STAR outline for the difficult-teammate, led-a-project and multiple-deadlines questions, using three different projects so the answers do not overlap
  • Reverse a singly linked list iteratively and recursively, state the time and space cost of each, and run both on empty, one-node and two-node lists
  • Rehearse a performance-diagnosis sequence: reproduce, measure, find the bottleneck, change one thing, measure again
  • Prepare a data-structure comparison (arrays, linked lists, hash maps, stacks, queues, trees, heaps) by access pattern, and practise scenario answers aloud because team interaction is part of the reported format

Where candidates lose points

Answering the languages question with a list of everything on your CV

Name one primary language with a project that proves it, add the other languages you can work in, and give a real reason for your preference. Java, Python and C++ appear in the reported requirements, so be ready to talk concretely about whichever you list.

Reversing a linked list and losing the rest of the list or crashing on short input

Hold three references (previous, current, next), save the next node before you redirect the pointer, and return the previous reference. Test on an empty list, a single node and two nodes, and state the O(n) time and O(1) space cost aloud.

Answering the performance-diagnosis question with a guess such as 'add caching' or 'add more servers'

Describe the order of work: reproduce and baseline the slowness, profile or read logs to locate the bottleneck (database query, I/O, CPU, memory, a downstream call), change one thing, and measure again.

Telling a difficult-teammate or leadership story with no personal action or result, or with the other person as villain

Write each story in STAR form. Spend most of it on what you did, name the result, and say what you would change. Practise it aloud so it does not run long.

Giving generic answers to the changing-requirements and gathering-requirements questions

Tie them to concrete practices: short iterations with a reviewed backlog, written acceptance criteria, a demo after each increment, and confirming requirements with stakeholders in writing. Include an example of a requirement that moved on a project you worked on.

Questions & practice

Write a function to reverse a linked list. Explain your approach.

Medium · Coding / Algorithms

Approach

  1. Iterative version with three pointers: prev = null, curr = head; on each step save next = curr.next, set curr.next = prev, then advance prev = curr and curr = next. When curr is null, prev is the new head. O(n) time, O(1) extra space.
  2. Save the next pointer before overwriting curr.next. Rewiring first loses the rest of the list, and that is the most common bug in this question.
  3. Recursive version: reverse the rest of the list from head.next, then set head.next.next = head and head.next = null, and return the new head from the base case. Still O(n) time, but O(n) call-stack space, so it can overflow on very long lists.
  4. Edge cases to state and test: empty list (return null), a single node, two nodes, and checking that the old head now points to null so no cycle remains.
  5. Trace a three-node list on paper or in the editor to show the pointer states after each step before calling it done.

Follow-up

  • Reverse only the nodes between positions m and n in one pass.
  • Reverse the list in groups of k nodes, leaving a final group with fewer than k nodes unchanged.
  • How does the solution change for a doubly linked list?

How would you approach optimizing an algorithm with a high time complexity?

Medium · Coding / Algorithms

Approach

  1. Measure first: confirm with a profiler or timing on realistic input sizes that this algorithm is the bottleneck, and find the dominant term (for example a nested loop that makes it O(n^2)).
  2. Remove repeated work with the right data structure: a hash set or hash map turns an O(n) lookup inside a loop into an average O(1) one, so pair-finding or duplicate detection goes from O(n^2) to O(n) time at the cost of O(n) memory.
  3. Use sorting when order helps: sort once in O(n log n), then use two pointers or binary search (O(log n) per lookup) in place of a full scan for each element.
  4. For overlapping subproblems, add memoisation or bottom-up dynamic programming (naive recursive Fibonacci goes from exponential to O(n)); for running totals use prefix sums; for top-k use a heap of size k (O(n log k)).
  5. Check the result: same outputs on a test suite including edge cases, a benchmark at the old and new sizes, and an explicit note on the memory you traded for speed.

Follow-up

  • Your optimised version uses too much memory for the input size. What do you trade back?
  • How do you choose between a hash map and sorting when both reach a better complexity?
  • When is it not worth reducing the asymptotic complexity?

Can you explain the differences between various data structures and their use cases?

Medium · Coding / Algorithms

Approach

  1. Arrays and dynamic arrays: O(1) access by index and cache-friendly; appending to a dynamic array is amortised O(1), but inserting or deleting in the middle is O(n). Use them for indexed, mostly append-only data.
  2. Linked lists: O(1) insert or delete when you already hold the node, but O(n) search and no random access. Stacks (LIFO) suit undo and expression parsing; queues (FIFO) suit BFS and job processing.
  3. Hash maps and sets: average O(1) insert and lookup, worst case O(n) when many keys collide, and no ordering. Use them for lookups, counting and deduplication.
  4. Balanced binary search trees (red-black, AVL; TreeMap in Java, std::map in C++): O(log n) insert and lookup with keys kept in order, so they support range queries and nearest-key lookups that hash maps cannot.
  5. Heaps: O(1) peek at the min or max, O(log n) push and pop, O(n) to build from an array; use them for priority queues, scheduling and top-k. Graphs: adjacency lists for sparse graphs, an adjacency matrix for dense graphs or O(1) edge checks. Tries for prefix search.

Follow-up

  • Why can a hash map lookup degrade to O(n), and how do real implementations limit that?
  • How would you implement an LRU cache, and which structures would you combine?
  • When would you choose a sorted array with binary search over a balanced BST?

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?

Write the update path that detects a concurrent edit

Medium · optimistic concurrency · transactional outbox · audit history

resource carries version INT NOT NULL DEFAULT 1. resource_revision holds revision_id, resource_id, version, actor_user_id, change_kind, patch JSONB, request_id, created_at with UNIQUE (resource_id, version). outbox_event holds aggregate_type, aggregate_id, aggregate_version, event_type, payload, status. A PUT carries the version the client read. Write the exact statements for the single transaction that applies the edit, records the revision and enqueues 'resource.updated', and give the handler's branch on zero affected rows. Then say what PostgreSQL 16 does under READ COMMITTED when two of these updates hit one row at once.

Approach

  1. One transaction, three writes, no network call inside it: UPDATE resource SET title = $3, version = version + 1, updated_at = now() WHERE resource_id = $1 AND tenant_id = $4 AND version = $2; then INSERT the resource_revision row at version $2 + 1; then INSERT the outbox_event row at the same aggregate_version. The event goes to a table rather than a broker because no transaction spans both.
  2. Branch on the affected-row count before doing anything else. Zero has three causes — stale version, wrong tenant, row gone — so re-read once and map to 409 carrying the current version, or 404 for an id outside the caller's tenant, which also stops the endpoint confirming that another tenant's id exists.
  3. State the engine behaviour instead of assuming it. Under READ COMMITTED the second UPDATE blocks on the row lock, and when the first commits PostgreSQL re-evaluates the WHERE clause against the newly committed row, so the version predicate now fails and the statement reports zero rows. Under REPEATABLE READ the identical collision raises SQLSTATE 40001 instead, so the handler must fold both shapes into one conflict response.
  4. Keep UNIQUE (resource_id, version) even though the predicate already serialises writers. It is what makes a lost update unwritable if any other path ever reaches the revision table, and it converts a logic bug into 23505 rather than into a silently missing history row.

Follow-up

  • A client sends the version it read ten minutes ago and the resource has moved three versions. What is in your 409 so it can resolve the conflict without a full re-fetch?
  • Two editors, two disjoint fields, no overlap. Does your answer still refuse the second write, and should it?

What programming languages are you proficient in, and which do you prefer for developing applications?

Medium · Technical / Domain Questions

Approach

  1. Lead with one or two languages you can actually code in live, and back each with a concrete project: what you built, roughly how large it was, and which libraries or frameworks you used. The requirements candidates describe for this role list Java, Python and C++, so say plainly where you stand on each.
  2. Give the preference as a trade-off, not a taste: Python for fast iteration, scripting and data work; Java for statically typed, long-lived services with mature tooling on the JVM; C++ when you need manual control of memory and latency, at the cost of more ways to introduce defects.
  3. Show depth in your main language with one real mechanism: in standard CPython builds the GIL lets only one thread run Python bytecode at a time, so CPU-bound work goes to multiprocessing; in Java, generational garbage collection and checked exceptions; in C++, RAII and smart pointers (unique_ptr vs shared_ptr).
  4. Mention SQL separately if you use it, since database work (SQL and NoSQL) appears in the reported requirements, and be ready to write any code in the next round in the language you named first.

Follow-up

  • In your preferred language, what happens in memory when you create an object and it goes out of scope?
  • If a service you wrote in Python became CPU-bound, what would you change, and when would you rewrite part of it in another language?
  • How did you learn the last new language or framework you picked up, and how long until you shipped code in it?

Can you describe a challenging technical problem you solved and the approach you took?

Medium · Technical / Domain Questions

Approach

  1. Pick one problem where you personally did the diagnosis or design, and use "I" throughout. Open with the constraint that made it hard (data volume, a legacy system, an intermittent failure, a deadline), not with background about the team.
  2. Walk through the hypotheses in order: what you suspected first, the evidence that ruled it out, and the measurement or experiment that finally pointed to the cause. This sequence is the technical substance of the answer.
  3. Name the fix and the alternative you rejected, with the reason (complexity, risk, cost, time). A trade-off you can defend is worth more than a clever fix.
  4. Close with a measured result (latency before and after, error rate, hours saved) and what you put in place so it would not recur: a test, an alert or a documented runbook.

Follow-up

  • What would you do differently if you met the same problem again tomorrow?
  • How did you verify that your change caused the improvement and not something else?
  • What did you rule out, and what made you confident enough to drop it?

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

Medium · Technical / Domain Questions

Approach

  1. Structure the answer as layers: automated checks (formatter and linter, such as Black or Ruff for Python, Checkstyle or SpotBugs for Java, clang-tidy for C++), tests that run in CI on every pull request, and human code review on small, focused changes in Git.
  2. Be specific about tests: unit tests for pure logic, integration tests at the database or API boundary, and a regression test added for every bug fixed. Say that coverage on changed code is a useful signal, but 100% line coverage does not prove correctness.
  3. Explain maintainability in code terms: clear names, functions with one responsibility, dependencies injected behind interfaces so they can be swapped and mocked, and no copy-paste of business rules across modules.
  4. Cover what you review for in someone else's change (correctness, edge cases, error handling, readability, test coverage) and how you record decisions: README, docstrings, or a short design note for anything non-obvious.
  5. Tie it to one real example: a review comment that caught a bug, or a refactor that made a later change cheap.

Follow-up

  • How do you handle a teammate who pushes back on your code review comments?
  • When would you accept technical debt on purpose, and how do you make sure it gets paid back?
  • What would you add first to a codebase that has no tests and no CI?

How would you approach diagnosing a performance issue in a software application?

Medium · Problem-Solving / Case Studies

Approach

  1. Define the symptom before touching anything: which operation is slow, for whom, since when, and in which metric (p50 vs p95/p99 latency, throughput, CPU, memory). Check whether it lines up with a deploy, a config change or a data-volume change.
  2. Reproduce and measure rather than guess: check resource saturation (CPU, memory, disk I/O, network, connection pools), then profile the hot path with a real profiler (cProfile or py-spy for Python, Java Flight Recorder or async-profiler for the JVM, perf for native code).
  3. Check the database early, because it is a common cause: run EXPLAIN ANALYZE on slow queries, look for sequential scans where an index should be used, N+1 query patterns from an ORM, lock contention, and unbounded result sets.
  4. Look at application-level causes next: an O(n^2) loop over growing data, synchronous calls to slow downstream services without timeouts, memory leaks or long garbage-collection pauses, and missing caching for repeated expensive reads.
  5. Change one thing at a time, measure again under the same load, then lock the fix in with a performance test or an alert on the metric that regressed.

Follow-up

  • The slowdown only happens in production and you cannot attach a profiler. What do you do?
  • A query is fast in isolation but slow under load. What are the likely causes?
  • How would you decide between adding a cache and fixing the underlying query?

Given a hypothetical scenario where a project's requirements change rapidly, how would you adjust your develop

Medium · Problem-Solving / Case Studies

Given a hypothetical scenario where a project's requirements change rapidly, how would you adjust your development process?

Approach

  1. Shorten the feedback loop: work in short iterations (Agile and Scrum appear in the reported requirements), keep one prioritised backlog with a single owner, and show working software often so changes surface early instead of at the end.
  2. Deliver thin vertical slices that are usable end to end, and keep work in progress small so a changed requirement throws away days of work, not weeks.
  3. Make change cheap in the code: modules behind clear interfaces, configuration over hard-coded rules, feature flags to ship incomplete work safely, and an automated test suite so refactoring does not break existing behaviour.
  4. Separate reversible from irreversible decisions: defer schema, public API and vendor choices until requirements settle, and avoid building speculative abstraction for changes that may never come.
  5. Make every change visible: record what changed and why, state its effect on scope or date to stakeholders, and agree what drops out when something new comes in.

Follow-up

  • A stakeholder changes a requirement two days before release. What do you do?
  • How do you tell the difference between requirements changing and requirements that were never understood?
  • How would you keep the database schema flexible when the data model keeps changing?

What steps would you take to gather requirements from stakeholders?

Medium · Problem-Solving / Case Studies

Approach

  1. Start by mapping who is affected: the people who will use the software daily, the people who own the business outcome, and the teams whose systems it touches. Each group gives different requirements.
  2. Interview with open questions and watch the current workflow where possible: what they do today, where it breaks, and what a good outcome looks like in numbers. People describe solutions; ask why until you reach the underlying problem.
  3. Capture functional requirements as user stories with acceptance criteria, and ask explicitly for the non-functional ones people forget: data volume, response time, availability, audit and security needs, and integration with existing systems.
  4. Prioritise together (for example MoSCoW: must, should, could, won't), then confirm understanding with a mock-up, prototype or walkthrough before building, since users react to something concrete far better than to a document.
  5. Write the agreed requirements down, get sign-off from the owner, and set up a way to handle changes later, such as a regular review of the backlog.

Follow-up

  • Two stakeholders give you conflicting requirements. How do you resolve it?
  • How would you gather requirements from users who are hard to reach, such as operators on site?
  • What do you do when a stakeholder cannot say what they want until they see it?

Every query on one table stalls for forty seconds mid-deploy

Medium · lock contention · ddl · migrations

During a release on PostgreSQL, every query touching resource times out for about 40 seconds and then recovers with no intervention. The release ran one migration, ALTER TABLE resource ADD COLUMN archived_reason TEXT, and the migration log shows it completing in 6 ms. Unrelated tables showed no change in error rate. Explain how a 6 ms statement caused a 40-second stall, give the ordered checks you would run on a live system to confirm it, and give the migration procedure that prevents a repeat.

Approach

  1. Separate the statement's duration from the lock's duration. ADD COLUMN with no default is a catalogue-only change and genuinely runs in milliseconds, but it requires ACCESS EXCLUSIVE, and it cannot acquire that until every transaction already touching the table has finished.
  2. Account for the queueing, which is the part that surprises people. A lock request that is waiting blocks later requests for conflicting modes behind it rather than letting them overtake, so one long-open transaction holds the DDL and the DDL holds all the traffic. The stall length is set by the longest open transaction, not by the size of the change.
  3. Confirm on a live system in this order: pg_stat_activity for that table ordered by xact_start, looking for the oldest transaction and specifically for state = idle in transaction; then pg_locks where granted = false to find the waiter; then join them on pid to name blocker and blocked. pg_blocking_pids() does that join for you and is the fastest single call.
  4. Prevent rather than merely time it better. Set lock_timeout to a second or two on the migration session so the DDL abandons the queue after a bounded wait and is retried, instead of holding it for as long as the oldest transaction lives. Be exact about what that buys: queries arriving during the wait still queue behind the pending ACCESS EXCLUSIVE request, so each attempt costs them up to one lock_timeout of added latency. The outage goes from 40 seconds to about one second per attempt, not to zero. Also run migrations away from deploy-time peaks, and put a statement timeout and an idle-in-transaction timeout on the analytics role that opens the long transactions.

Follow-up

  • The same release also wants NOT NULL on that column. What is the sequence that gets there without a long lock?
  • Your lock_timeout retry fails ten times in a row because the analytics transaction is always open. What do you change?

Suggested practice checklist

The plan follows the two reported rounds. It begins with your own material and the STAR stories, then covers the technical-discussion, coding, performance and requirements questions, and ends with a mixed rehearsal.

Day 1 — Map the loop and gather your project material

  • Write the two reported rounds, Phone Screening and In-Depth Interview, and note which question types belong to each: spoken background for the first, behavioral, technical and coding for the second.
  • List three to four projects and, for each, record the language, database, your role, one hard problem and one measurable result. Every later answer will draw on this sheet.

Deliverable: A one-page loop map and a project sheet with language, database, role, hard problem and result for each project.

Day 2 — Write the three behavioral stories

  • Write STAR outlines for the difficult teammate, the project you led and the multiple deadlines questions, each from a different project.
  • Say each aloud and cut it until the action and result take most of the time. Replace every 'we' with what you personally decided.

Deliverable: Three STAR outlines, one per behavioral question, each with a stated result and a stated lesson.

Day 3 — Prepare the technical discussion answers

  • Write your answer on languages you are proficient in and the one you prefer, with a project as evidence.
  • Write the challenging-problem story in a structure of symptom, investigation, fix and lesson.
  • List your code-quality practices (review, tests, naming, small functions, Git workflow, linting) and one example of each in use.

Deliverable: Three spoken-ready answers: languages, hardest technical problem and code quality, each tied to a real project.

Day 4 — Coding warm-up: linked list and data structures

  • Write the iterative reversal of a singly linked list in your chosen language, then the recursive version. Run both on empty, one-node and two-node inputs.
  • Write a one-table comparison of array, linked list, hash map, stack, queue, tree and heap with access, insert and delete costs, and a use case for each.
  • Take one slow nested-loop solution and speed it up, naming the data structure you used and the new complexity.

Deliverable: Working reversal code in both styles, a data-structure comparison table and one before-and-after optimisation with complexities.

Day 5 — Performance diagnosis and database work

  • Write a diagnosis sequence for a slow application: reproduce, baseline, locate the bottleneck, change one thing, re-measure. Include what you would check in the database layer.
  • Write a short note on when you would pick a relational database versus a NoSQL store.

Deliverable: A written diagnosis checklist, solutions to two practice database questions and a short relational versus NoSQL note.

Day 6 — Requirements and change scenarios

  • Outline how you would gather requirements from a non-technical stakeholder: questions to ask, how you confirm them in writing, how you split scope into increments.
  • Write how you would adjust a plan when requirements change rapidly: backlog re-ranking, short iterations, acceptance criteria and a demo. Attach a real example.

Deliverable: A requirements-gathering checklist, a change-management outline with one real example and a worked concurrency exercise.

Day 7 — Full mixed rehearsal

  • Run a rehearsal in the order of the second round: one behavioral story, one scenario question and the linked-list reversal, speaking aloud as you write.
  • Record yourself on the language and why-this-company answers from the phone-screen stage and trim any filler.
  • Prepare three questions for the team about their projects, tools and code-review routine.

Deliverable: A recorded rehearsal with a list of the two weakest answers to fix, plus three prepared questions for the team.

Behavioural preparation

Candidates report behavioral questions in the In-Depth Interview, and the reported question list includes a difficult teammate, a project you led and managing multiple deadlines. The requirements candidates describe also mention collaboration, communication and working with stakeholders, so choose stories that show you working with other people on shipped software. Write each as situation, task, action and result.

  1. Tell me about a time requirements changed in the middle of a project and how you adjusted.
  2. Describe a time you worked out what a non-technical stakeholder needed before you built anything.
  3. Tell me about a disagreement during a code review and how it ended.

Describe a time when you had to work with a difficult team member. How did you handle the situation?

Medium · Behavioral / Leadership

Approach

  1. Pick a conflict about how the work was done (missed handoffs, review disputes, unclear ownership), not a personality clash. Spend two sentences on the situation, name the effect on the project, and state your role in it.
  2. Show what you did first: a private, direct conversation in which you asked about their constraints before judging. For example, 'I asked what was blocking their reviews and learned they were pulled onto another task.'
  3. Describe a concrete change you made together, such as a review turnaround agreement, a written interface contract or a split of ownership, and say you escalated to a manager only after trying that.
  4. Finish with the result for the project and the working relationship, and one thing you changed in your own behavior. The story fails when the teammate is a villain and you are a bystander.

Follow-up

  • What would you have done if that conversation had not worked?
  • How did you keep the project on track while the conflict was unresolved?
  • What did that teach you about your own working style?

Can you give an example of a project where you took the lead? What were the outcomes?

Medium · Behavioral / Leadership

Approach

  1. Choose a project where you owned the plan and the outcome. An internship, university or side project counts for an entry-level candidate if you made the decisions. State the goal, the team size and your role in two sentences.
  2. Describe what leading meant in practice: breaking the work into tasks, agreeing a Git branching and code-review routine, assigning work by strengths, unblocking people and giving stakeholders regular status updates.
  3. Include one hard moment, such as a missed estimate, a disagreement over design or a teammate falling behind, and what you decided. Without it, the story sounds like a project summary.
  4. Give a result you can verify, such as a shipped feature, a bug count or a time saved, and only claim numbers you know. Say 'I' for your own decisions and 'the team' for shared work.

Follow-up

  • What went wrong on that project, and how did you handle it?
  • How did you respond when someone disagreed with your plan?
  • What would you change about how you led it?

How do you prioritize tasks when you have multiple deadlines?

Medium · Behavioral / Leadership

Approach

  1. Open with the method, then back it with a story. List every commitment with its deadline, effort, the person waiting on it and the cost of missing it. Rank by impact and urgency, and put work that blocks others ahead of work that only you depend on.
  2. Say how you make trade-offs visible: when two deadlines collide, you tell the stakeholders early, offer a smaller scope or a later date, and let them choose rather than silently dropping something.
  3. Mention the routine that keeps the order honest, such as a written task list, sprint backlog or daily re-ranking, and the buffer you leave for urgent bugs.
  4. Give one real example with the outcome, including something you deferred and how you communicated it. 'I work longer hours' is the answer that sinks this question.

Follow-up

  • Two stakeholders each say their deadline comes first. What do you do?
  • Tell me about a time you missed a deadline.
  • How do you handle an urgent production bug in the middle of planned sprint work?