Interview guides · Clear street
Clear street Software Engineer Interview Guide
Clear Street Software Engineer interview guide: three reported rounds, coding, system design and behavioral questions, and a 7-day prep plan.
The 60-second brief
Clear Street is a financial firm, and candidates describe the engineering work as building and maintaining software behind its trading and financial operations. The products named in candidate reports include trading systems and market data platforms. For a Software Engineer, that means writing code and also designing systems, working with product managers, data analysts and other engineers, and fixing production problems. Candidates report distributed systems, data processing and real-time analytics as typical project areas.
This guide is for Software Engineer candidates at Clear Street. The requirements candidates describe list Java, Go or Python, roughly two to five years of experience (financial services or technology preferred), and working knowledge of distributed systems, data structures, algorithms and software design. AWS or Azure experience and Agile familiarity are listed as nice to have. The guide covers the three reported rounds, the reported questions and a seven-day plan. Finance knowledge is not a listed requirement, but two reported questions touch trading and stock prices, so the plan includes the basics.
Candidates report three stages over about 3-5 weeks: a recruiter screen, a set of technical interviews covering coding, system design and technical discussion, and a final behavioral component.
Focus areas
- Distributed Systems Concepts
- Coding Interviews (Algorithmic Problem Solving)
- Apache Kafka (Kafka)
Overview
The reported questions fall into five groups. The domain questions are REST versus GraphQL, the CAP theorem and handling concurrent requests in a web application. The coding questions are the longest substring without repeating characters, a stack built from queues, and the maximum depth of a binary tree. The design questions are a URL shortening service, a high-frequency trading architecture, and microservices versus a monolith. The case studies are finding trends in historical stock prices, debugging a slow web application and tuning a slow database query. The behavioral prompts are conflict in a team, greatest achievement and prioritizing under several deadlines. Most of these are general software engineering topics; only the trading architecture and stock price questions are finance-flavoured.
Candidates list distributed systems concepts, coding problems, Apache Kafka and system architecture as the topics tested. They also report that coding exercises may run on a platform such as CodeSignal or HackerRank. The stack named for the role is Java, Go or Python, so pick one of those and be fluent enough to write a correct solution without autocomplete. The roles described involve distributed systems, data processing and real-time analytics, which makes message ordering, duplicate delivery, consumer lag and partitioning the vocabulary worth owning.
Because the reported coding questions are classic ones, the difference is made by completeness: a stated complexity, the edge cases (empty input, single element, all duplicates, a degenerate tree) and a few test cases you run yourself. For the design and domain questions, prepare a short trade-off statement for each topic rather than a definition, and one concrete example from your own work. The plan below spends a day on each cluster and ends with the behavioral stories, so that every reported question gets at least one spoken, timed answer.
The Clear street interview process
Candidates describe three stages over about 3-5 weeks: a recruiter screen, several technical interviews, and a final round that includes a behavioral component. Which individual questions appear in which interview is not reported.
Recruiter Screen
Candidates report an opening conversation with a recruiter about your background and your fit for the role. Treat it as the stage where you set up the rest of the process: be ready to summarise your experience against the Java, Go or Python and distributed systems requirements, and use it to learn what the later stages involve.
What to demonstrate
- Your background and how it lines up with the role
- Fit for a Software Engineer position in a financial technology setting
- Whether your experience level matches the reported two to five years
How to prepare
- Write a short career summary that names the languages you have shipped in (Java, Go or Python) and one project with distributed or data-processing work.
- Prepare a specific reason for wanting trading and market data engineering work, based on something you have built or studied.
- Ask the recruiter which stages follow, whether coding runs on a platform such as CodeSignal or HackerRank, and which languages are allowed.
- Have your availability, location needs and notice period written down so the scheduling conversation is quick.
Technical Interviews
Candidates report several technical interviews rather than one, covering coding challenges, system design and technical discussion. Coding may run on a platform such as CodeSignal or HackerRank, and candidates are asked to explain past projects and the technical challenges in them. Distributed systems concepts, database design and system architecture are reported as advanced topics. The reported coding, design, domain and case-study questions in this guide are the types this stage covers; which one comes up in which interview is not reported.
What to demonstrate
- Working code for algorithm and data-structure problems
- System design: scalable, reliable, maintainable architecture
- Technical discussion of your own past projects and choices
- Distributed systems concepts and database design
How to prepare
- Solve the longest substring, stack-from-queues and tree-depth problems in your chosen language in a plain editor, with your own test cases and stated complexity.
- Write a one-sentence trade-off for each of REST versus GraphQL, microservices versus a monolith, and the CAP theorem, each tied to a system you have worked on.
- Sketch the URL shortener and the high-frequency trading architecture on a blank page: components, data flow, the first bottleneck and the failure mode.
- Pick two past projects and write down the problem, your design choices, a failure you hit and what you would change.
Behavioral Component
Candidates report a final round on cultural fit and interpersonal skills that may include a behavioral component. The behavioral questions in this guide (a team conflict, your greatest achievement, prioritizing multiple deadlines) are the type this stage covers. Work in this role is described as collaborative, so prepare stories where you worked with other engineers, product managers or analysts.
What to demonstrate
- Collaboration and communication with teammates
- Interpersonal skills, including how you handle disagreement
- Adaptability and how you handle competing demands
How to prepare
- Write three stories in situation, action, result form, each with a decision you personally made and a result you can measure.
- Make sure at least one story involves a production issue or reliability problem, since troubleshooting production systems is part of the role as candidates describe it.
- Say each story aloud and cut it until the action portion takes the most time.
- Prepare questions about the team, how code review and pairing work, and how on-call is shared.
Where candidates lose points
Describing REST versus GraphQL or microservices versus a monolith with definitions only
For each pair, give the deciding conditions: GraphQL for varied client shapes and fewer round trips, REST for simple caching; microservices when teams and scaling needs diverge, a monolith when they do not. Close with the choice you would make for a specific system.
Reciting the CAP theorem as "pick two of three" without saying what happens in a partition
Explain that partitions are not optional, so the choice is consistency or availability while one occurs. Name a real behavior for each side, such as rejecting writes versus serving stale reads, and say which a trading or market data system needs.
Solving the longest substring or stack-from-queues question without stating complexity or testing edge cases
State the brute force, then the sliding window with a last-seen index (O(n) time, bounded extra space), or the O(1) push and O(n) pop trade-off for the stack. Run empty, single-character, all-repeating and repeated-late inputs before you declare it done.
Answering the high-frequency trading design with a generic web stack of load balancer, cache and database
Start from the requirements that make it different: ordering, latency, replay after a failure and what happens to in-flight orders. Then choose the data path, state storage and failure handling, and say what you give up.
Telling behavioral stories in the plural, with no clear decision of your own
Use "I" for what you personally decided, name one alternative you rejected, and finish with a result you can measure. Rehearse each story aloud until you can say it without notes.
Questions & practice
Describe how you would handle concurrent requests in a web application.
Medium · Technical / Domain Questions
Approach
- Name the concurrency model first: a thread pool per request (Java servlet containers), an event loop with async I/O (Python asyncio, Node), or goroutines in Go. Size the pool, put a bounded queue in front of it, and shed load with 429 or 503 rather than queueing forever.
- Keep handlers stateless and put shared state in the database or cache. Any in-process shared state gets a lock or a concurrent structure (ConcurrentHashMap, sync.Mutex), and the critical section stays as short as possible.
- Prevent lost updates in the database: write an atomic conditional update (UPDATE accounts SET bal = bal - :x WHERE id = :id AND bal >= :x, then check rows affected), use SELECT ... FOR UPDATE, or use optimistic locking with a version column and retry.
- Make retries and double-submits safe with an idempotency key stored under a unique constraint, so a second request with the same key returns the first result.
- Cover the limits: database connection pool size, timeouts on every downstream call, rate limiting, and scaling stateless instances horizontally behind a load balancer.
Follow-up
- Two withdrawals hit the same account at the same moment: write the SQL that prevents an overdraft.
- When does optimistic locking do worse than pessimistic locking?
- How does Python's GIL change your answer for a CPU-bound handler?
Write a function to find the longest substring without repeating characters.
Medium · Coding / Algorithms
Approach
- Brute force checks every substring for uniqueness, which is O(n^3), or O(n^2) with a set. Say it, then move to a sliding window.
- Keep left and right pointers and a map from each character to its last index. For each right, if s[right] was last seen at an index >= left, set left to that index + 1. Then update best = max(best, right - left + 1).
- The check 'last index >= left' is the classic bug: without it, left can move backwards. Trace 'abba' to show the guard works (answer 2).
- Complexity: O(n) time with a single pass, and O(min(n, alphabet size)) space. A fixed 128-slot array works for ASCII; use a dict for general input.
- Edge cases: an empty string gives 0, all characters equal gives 1, all distinct gives n. If the caller wants the substring itself, track the start index of the best window. In Java, surrogate pairs mean a char is not always a full character.
Follow-up
- Change it to the longest substring with at most k distinct characters.
- Return the substring itself, and the first one if several have the same length.
- How would this work on a stream where you cannot store the whole input?
How would you implement a stack using queues?
Medium · Coding / Algorithms
Approach
- State the allowed operations: enqueue at the back, dequeue from the front, peek, size and empty. In Python use collections.deque with only append and popleft; in Java use the Queue interface (offer, poll, peek).
- Push-heavy variant with one queue: enqueue x, then rotate the previous size - 1 elements from front to back so x is at the front. Push is O(n); pop and top are O(1).
- Pop-heavy variant with two queues: push is an O(1) enqueue. Pop moves n - 1 elements into the second queue, returns the last one, then swaps the queues, so pop is O(n).
- Pick by workload: whichever operation is more frequent should be the O(1) one. Unlike queue-from-two-stacks, neither variant gets amortized O(1) for both operations.
- Define pop and top on an empty stack (raise an exception or return a sentinel), and test push 1, push 2, top = 2, pop = 2, top = 1, then empty.
Follow-up
- Now implement a queue with two stacks and prove amortized O(1) per operation.
- Could you make top O(1) in the pop-heavy variant without extra queues?
- How would you make this structure safe under concurrent pushes and pops?
Given a binary tree, write a function to determine its maximum depth.
Medium · Coding / Algorithms
Approach
- Agree on the definition first: count nodes (empty tree 0, single node 1) or edges (single node 0).
- Recursive DFS: depth(null) = 0, otherwise 1 + max(depth(left), depth(right)). O(n) time and O(h) stack space, where h reaches n on a skewed tree.
- Iterative BFS: process the tree level by level with a queue and count the levels. O(n) time, O(w) space where w is the widest level, which is about n/2 for a complete tree.
- For deep trees, Python's default recursion limit (1000) breaks the recursive version on a skewed tree, so use an explicit stack of (node, depth) pairs.
- Test cases: empty tree, a single node, a left-only chain, and a full tree.
Follow-up
- Find the minimum depth, and explain why a node with one child is not a leaf.
- Check whether the tree is height-balanced in O(n) rather than O(n log n) or O(n^2).
- Compute the diameter using the same post-order recursion.
Describe how you would optimize a slow-running database query.
Medium · Problem-Solving / Case Studies
Approach
- Measure before changing anything: run EXPLAIN (ANALYZE, BUFFERS) in PostgreSQL, or EXPLAIN / EXPLAIN ANALYZE in MySQL. Compare estimated and actual row counts, and look for sequential scans on large tables, nested loops over many rows and sorts or hashes spilling to disk.
- Indexes: build a composite index with equality columns first, then the range or ORDER BY column, or a covering index (INCLUDE in PostgreSQL) for index-only scans. Keep predicates sargable: a function on the column (DATE(created_at) = ...), an implicit type cast, or a LIKE pattern starting with % blocks the index, so rewrite these as ranges.
- Rewrite the query shape: select only the columns you need, turn correlated subqueries into joins or EXISTS, aggregate before joining to cut row counts, and replace large OFFSET pagination with keyset pagination.
- Check the environment: stale statistics (run ANALYZE), table bloat (VACUUM), generic plans for parameterized statements, and lock waits in pg_stat_activity and pg_locks. A slow query may be waiting, not computing.
- Weigh the cost: every index slows writes and takes storage. For repeated heavy aggregates, use a materialized view or summary table, and confirm the new plan and timing on production-sized data.
Follow-up
- The index exists but the planner ignores it: list the reasons.
- How do you add an index to a large, busy production table without blocking writes?
- The table is write-heavy: how do you decide whether the index pays for itself?
Explain why the owner filter ignores the listing index
Medium · composite index · query plans · sort elimination
The only index on resource is (tenant_id, status, updated_at DESC, resource_id DESC). A new endpoint returns one user's resources across all statuses, newest created first: WHERE tenant_id = $1 AND owner_user_id = $2 ORDER BY created_at DESC LIMIT 20. On a tenant with 2M rows it takes 900 ms and EXPLAIN shows a sort above a large scan. Explain precisely why the existing index cannot serve it, give the index that can, and state which of these the new index still will not help: owner_user_id alone across tenants; the same query ordered by updated_at. PostgreSQL 16.
Approach
- Separate the two jobs an index does. For filtering, a composite btree is seekable only on a left prefix, so with no predicate on status the scan can at best range over tenant_id and test owner_user_id per row; PostgreSQL 16 has no btree skip scan to jump the unconstrained column.
- For ordering, the index is sorted by (status, updated_at) within a tenant and not by created_at, so the LIMIT cannot stop early: every matching row is read and then sorted. That is the 'Sort Method: top-N heapsort' line, and it is why the plan reads 2M rows to answer with 20.
- Derive the replacement from the access path — equality, equality, then the ordering column: CREATE INDEX CONCURRENTLY ON resource (tenant_id, owner_user_id, created_at DESC). The scan seeks to the (tenant, owner) range and walks 20 entries in order, so the Sort node disappears along with the row-read.
- Treat INCLUDE (title, status) as conditional, not free. An index-only scan still visits the heap for any row whose page is not marked all-visible, so on a table taking 1.2k writes/second the win depends on autovacuum keeping the visibility map current, and the wider index costs more on every insert.
Follow-up
- 90% of rows are status='active'. Would a partial index WHERE status = 'active' change your answer, and for which of the three queries?
- A dashboard runs this for 40 owners in one page load. What changes about the design?
Explain the differences between REST and GraphQL.
Medium · Technical / Domain Questions
Approach
- Contrast the models: REST exposes resources at URLs and uses HTTP verbs and status codes; GraphQL exposes one typed schema, usually behind a single POST endpoint, and the client selects exactly the fields it needs, which removes over-fetching and multi-call under-fetching.
- Caching: REST GET responses cache by URL in browsers, proxies and CDNs. GraphQL over POST needs persisted queries (so GET with a hash works) or a client-side normalized cache.
- Server cost: naive GraphQL resolvers cause N+1 database calls, so batch them with a DataLoader-style loader per request. Cap query depth and complexity so one query cannot fan out without limit.
- Errors and evolution: GraphQL often returns HTTP 200 with an errors array and partial data, so monitoring has to read the body. REST versions through the path or headers; GraphQL adds fields and marks old ones @deprecated.
- Close with when to pick each: REST for simple CRUD, public cacheable endpoints and file transfer; GraphQL when several clients need different shapes of the same graph.
Follow-up
- How would you rate-limit a GraphQL API when one query can cost one resolver call or ten thousand?
- Show how a DataLoader turns N+1 lookups into a single batched query.
- How would you get CDN caching for a GraphQL read path?
What is the CAP theorem, and why is it important in distributed systems?
Medium · Technical / Domain Questions
Approach
- State it precisely: when a network partition happens, a replicated system must either refuse some requests (keeping consistency, meaning linearizable reads) or answer them with possibly stale data (keeping availability). Partitions are not optional, so the real choice is C or A during a partition.
- Give examples: etcd and ZooKeeper are CP (with Raft or ZAB, a minority side stops accepting writes). Dynamo-style stores such as Cassandra lean AP at low consistency levels, and quorum reads and writes with R + W > N make reads see the latest acknowledged write.
- Clear up two mix-ups: the C in CAP is not the C in ACID, and a 'CA' system only exists if you assume a single node or no partitions.
- Add PACELC: even with no partition, replication still trades latency against consistency, and that trade-off matters most of the time.
- Make it a choice per data type: an order or position ledger should refuse writes rather than diverge, while a price display or cache can serve slightly stale data.
Follow-up
- Where does Kafka sit on this spectrum with acks=all, min.insync.replicas and unclean leader election disabled?
- Why does R + W > N give read-your-latest-write, and what breaks it (sloppy quorums, hinted handoff)?
- During a partition, what would you show a user whose balance read cannot reach the quorum?
Design a URL shortening service. What components would you include?
Medium · System Design / Architecture
Approach
- Scope it: create a short link, redirect, optional custom alias and expiry, click counts. Reads far outnumber writes, so estimate the redirect QPS and storage size before choosing components.
- Key generation: base62-encode a unique integer ID. Seven characters give 62^7, about 3.5 trillion codes. Hand each app server blocks of IDs from a counter service so creation needs no per-request coordination. Sequential codes are guessable, so if that matters, shuffle or encrypt the ID or use random codes with a unique-constraint retry.
- Storage: map short_code to long_url, owner, created_at and expires_at, with the code as primary key. That is a pure key-value access pattern, so it shards cleanly by a hash of the code.
- Read path: cache hot codes in Redis with LRU eviction in front of the store. Choose 301 (browsers cache it, fewer hits, analytics lost) or 302 (every click reaches you) deliberately.
- Record clicks asynchronously to a log or queue such as Kafka and aggregate them downstream, so a redirect never waits on an analytics write. Add rate limiting on creation and checks for malicious URLs.
Follow-up
- Two users shorten the same long URL: same code or different, and why?
- One link goes viral: how do you avoid a cache stampede on its key?
- How do expired codes get cleaned up, and can they be reused?
How would you architect a system to handle high-frequency trading?
Medium · System Design / Architecture
Approach
- Clarify which side: a strategy system takes market data in and sends orders out. Lay out the tick-to-trade path: feed handlers (decode, detect sequence gaps and recover), an in-memory order book per instrument, the strategy, inline pre-trade risk checks (position limits, price collars, max order size), and an order gateway speaking FIX or the venue's binary protocol.
- Hot-path rules: single-threaded event loops partitioned by instrument and pinned to cores, no locks or heap allocation per message (preallocated objects, ring buffers in the LMAX Disruptor style), and no GC pauses (allocation-free Java or C++). Kernel-bypass networking and colocation cut network latency.
- Keep durability off the hot path: journal every input event sequentially and asynchronously. Because processing is deterministic, replaying the journal rebuilds state for recovery and audit.
- Correctness controls: unique client order IDs so a resend cannot duplicate an order, a kill switch, and risk checks that fail closed. Downstream consumers (P&L, reconciliation, analytics) read a published event stream, where millisecond tools like Kafka fit.
- Measure tick-to-trade at p99 and p99.9 with hardware or PTP-synchronised timestamps, not just averages.
Follow-up
- The feed shows a sequence gap: what does the book do until it recovers?
- How do you fail over the strategy process without sending duplicate or orphaned orders?
- If the risk check cannot get a position update, do you fail open or closed?
Discuss the trade-offs of using microservices versus a monolithic architecture.
Medium · System Design / Architecture
Approach
- Monolith strengths: one deployable unit, in-process calls, a single ACID transaction across modules, simple local debugging. Weaknesses: every change ships together, the whole thing scales as one unit, and large teams get in each other's way.
- Microservice strengths: independent deploys and scaling, clear team ownership, fault isolation, and a free choice of language per service. Costs: network latency and partial failure, no cross-service transactions, versioned contracts, and heavy observability and ops work (tracing, service discovery, CI per service).
- Consistency across services: one database per service, then sagas with compensating actions and the transactional outbox pattern to publish events reliably, instead of two-phase commit or a shared database.
- Decide on criteria: number of teams, how stable the domain boundaries are, whether components scale differently, and how often each one deploys. A modular monolith with enforced module boundaries is often the right start, with extraction along those boundaries later.
- Give a concrete split: booking a trade and updating its ledger entry atomically is simpler inside one transactional boundary, while a market-data fan-out with very different load is a natural separate service.
Follow-up
- An order service and a ledger service must both update: walk through a saga and its failure cases.
- How would you extract a service from a live monolith with the strangler fig pattern?
- What are the signs of a distributed monolith, and how do you get out of one?
Given a dataset of historical stock prices, how would you identify trends?
Medium · Problem-Solving / Case Studies
Approach
- Clarify the purpose and horizon: a dashboard, a model feature or a trading signal; daily or intraday. Use split- and dividend-adjusted prices, handle non-trading days as expected gaps rather than missing data, and watch for survivorship bias in the symbol list.
- Work in log returns rather than raw prices. Techniques: simple and exponential moving averages and their crossovers, the slope of a rolling linear regression on log price, trailing N-period momentum, and changepoint or regime detection.
- Avoid look-ahead bias: every rolling statistic may use only past data. Two-sided smoothers such as a centred moving average or the Hodrick-Prescott filter leak future data when used as signals.
- Validate statistically: prices behave close to a random walk, so regressing one trending series on another produces spurious fits. Test signals out of sample with walk-forward splits, include transaction costs, and correct for testing many parameter choices.
- Engineering: store bars partitioned by symbol and date. Compute windows with pandas rolling() or SQL AVG(close) OVER (PARTITION BY symbol ORDER BY dt ROWS BETWEEN 49 PRECEDING AND CURRENT ROW). For streaming, update an EMA in O(1): ema = a * price + (1 - a) * ema_prev.
Follow-up
- How would you show that a trend signal is not noise after trying fifty window lengths?
- Compute a 200-day moving average for thousands of symbols incrementally as new bars arrive.
- How do you handle a stock split in the middle of a rolling window?
How would you approach debugging a performance issue in a web application?
Medium · Problem-Solving / Case Studies
Approach
- Pin down the symptom with numbers: which endpoints, p50 versus p99 latency, since when, all users or a segment. Line it up against deploys, traffic, config changes and data growth.
- Find the layer before guessing: browser (DevTools waterfall, time to first byte, bundle size), network, app server, database or a downstream dependency. Distributed tracing spans or APM show where the time goes inside a request.
- On the server, separate CPU work from waiting. Profile with py-spy, async-profiler or JFR for Java, or pprof for Go, and check thread pool and connection pool saturation, GC pauses and lock contention.
- On the database side: the slow query log, N+1 query patterns from the ORM, EXPLAIN ANALYZE on the worst statements, and missing caching for repeated reads.
- Fix one thing at a time and reproduce it under a load test. Compare the same percentile before and after, then add an alert or a benchmark so the regression cannot come back unnoticed.
Follow-up
- p50 is fine but p99 is ten times worse: what causes tail latency?
- You cannot reproduce it locally: what would you instrument in production?
- Latency climbs steadily for days until a restart: what do you suspect?
Suggested practice checklist
The plan follows the reported rounds and question groups: baseline coding, data-structure problems, distributed systems and Kafka, system design, case studies, then behavioral stories. Each day ends with something you can show.
Day 1 — Map the loop and set a coding baseline
- Write the three reported stages (recruiter screen, technical interviews, behavioral component) on one page and list the questions you will practise for each.
- Solve the longest substring without repeating characters question in a plain editor in Java, Go or Python, without hints. Record the complexity and the edge cases that failed.
- List the questions to ask the recruiter: coding platform, allowed languages and the stages after the technical interviews.
Deliverable: A one-page loop map, a working longest-substring solution with tests and a recruiter question list.
Day 2 — Data-structure problems
- Implement a stack using queues twice: with one queue (O(n) push by rotation) and with two queues. State push and pop complexity for each.
- Write maximum depth of a binary tree recursively and iteratively (breadth-first, counting levels). Test with an empty tree and a skewed tree, and explain the recursion depth risk.
Deliverable: Four working implementations with test cases, and a note on which stack variant you would choose and why.
Day 3 — Distributed systems and web fundamentals
- Write a short comparison of REST and GraphQL covering over-fetching, caching, versioning and error handling, and one system where you would pick each.
- Explain the CAP theorem aloud as a choice during a partition, and give one example behavior for each side.
- Write out how a web application handles concurrent requests: thread or event-loop model, shared state, locks versus immutable data, and a race condition you could reproduce.
Deliverable: Three spoken answers you can give from memory, with an example per answer.
Day 4 — Kafka and the trading architecture
- Write one page on Kafka: topic, partition, key, consumer group, offset commit, ordering guarantees within a partition and at-least-once delivery with idempotent consumers.
- Sketch a pipeline from a market data feed to a consumer that computes real-time aggregates. Choose a partition key and say what breaks when a consumer falls behind.
- Answer the high-frequency trading architecture question aloud: requirements, data path, state, recovery after a failure and what you trade away.
Deliverable: A Kafka note, a pipeline diagram and a spoken design answer.
Day 5 — System design practice
- Design the URL shortening service on a blank page: ID generation, storage, read path with caching, collision handling and what grows first.
- Prepare a decision statement for microservices versus a monolith with one concrete team size and scaling scenario for each.
- Do one practice run with the two designs back to back, stating the first bottleneck and a failure case for each.
Deliverable: Two design diagrams and a one-paragraph microservices-versus-monolith decision statement.
Day 6 — Case studies: trends, performance and queries
- Describe how you would find trends in historical stock prices: clean and align the data, moving averages, returns, and how you would test that a trend is not noise.
- Write a debugging sequence for a slow web application: confirm the symptom, check recent changes, measure at each layer and find the slow step.
- Take a slow query through EXPLAIN: look for missing indexes, scans, bad join order and unused indexes, and fix one. Then work the practice question on why a filter ignores an index.
Deliverable: Three structured answers plus one annotated query plan with its fix.
Day 7 — Behavioral stories and a full mock
- Write and say aloud three stories: a team conflict, your greatest achievement and a prioritization under competing deadlines. Each should have a decision, a measurable result and a lesson.
- Run a mock of the full technical set: one coding problem, one design and one behavioral story, speaking aloud throughout.
- Review the weakest answer from the week and rewrite it.
Deliverable: Three finished stories and one recorded mock with a note on the weakest answer.
Behavioural preparation
The final round is reported to assess cultural fit and interpersonal skills, and the role is described as collaborating with product managers, data analysts and other engineers. Prepare stories where you made a clear decision, worked through a disagreement and handled several demands at once. Use "I" for your own actions and give a result you can measure.
- Tell me about a production issue you diagnosed and fixed.
- Tell me about a time you explained a technical decision to a non-engineer.
Describe a time when you had to handle a conflict within your team. How did you resolve it?
Medium · Behavioral / Leadership
Approach
- Choose a conflict about something concrete, such as an approach to a design, who owned a component, or a release decision, rather than a personality clash. State it in two sentences: who disagreed with whom, and what was at stake.
- Show that you understood the other person's position before you argued yours. Say what you asked them, and what they were right about.
- Describe the resolution mechanism you used: a small prototype or benchmark, agreed criteria written down, or bringing in a third person after talking directly. Show that you resolved it with evidence rather than by volume or rank.
- Close with the result and the relationship afterward: what shipped, what the team did differently next time, and how you worked together later.
- The story that sinks this answer is one where you were simply right and the other person was difficult. Pick one where you changed your mind or compromised.
Follow-up
- What did the other person get right?
- What would you have done if your manager had overruled you?
- How do you handle a disagreement when there is no data that settles it?
What do you consider your greatest professional achievement, and why?
Medium · Behavioral / Leadership
Approach
- Pick one achievement where you owned the outcome, and make it relevant to this role: a system you made faster or more reliable, a data pipeline you built, or a service you migrated. State the problem and the constraint in two sentences.
- Spend most of the answer on your decisions: the options you considered, the one you rejected and why, and the obstacle that nearly stopped it. For example, "I chose to batch the writes instead of adding a cache because the stale reads were the real risk."
- Give a measured result in the units that matter, such as latency, error rate, cost, hours saved or users affected. Do not invent numbers: use ones you can defend.
- Answer the "why" explicitly in the last two sentences: what it changed for the team or the business and what you learned.
- Common failures are a team win with no visible personal role, a result with no measurement, and an achievement that is only about effort, not a decision.
Follow-up
- What was the hardest decision in that project?
- What part was yours and what part was the team's?
- What would you do differently if you ran it again?
How do you prioritize tasks when faced with multiple deadlines?
Medium · Behavioral / Leadership
Approach
- Start with the method, then prove it with an example. State how you rank: the real deadline and the cost of missing it, who is blocked on the work, the effort remaining, and whether the work is reversible.
- Make the list visible and talk to the people involved. Say that you ask the stakeholders what can slip, offer an alternative such as a reduced scope, and communicate the trade-off early instead of quietly dropping something.
- Give one real case with specifics: for example, a release due the same week as a production bug and a code review for a teammate. Say what you did first and what you deferred.
- Explain how you handle interruptions, since fixing production problems is part of the work as candidates describe it: you keep time for them, and you re-rank when one arrives.
- The answer that fails is "I work longer hours" or "everything is a priority". Show that you made a call and told someone about it.
Follow-up
- Two stakeholders both say their task is first. What do you do?
- A production incident lands in the middle of a sprint. How does your ranking change?
- Tell me about a deadline you missed and what you learned.