cswork / libraryOpen practice workspace

Interview guides · Autonation

Autonation Software Engineer Interview Guide

Autonation Software Engineer interview guide: phone screen, technical questionnaire, CoderPad-style coding and panel, with Java, SQL, REST and PII prep.

The 60-second brief

Candidates describe Autonation as an automotive retail business, a network of dealerships, that is also building a cloud-native digital marketplace. Reports for the Software Engineer role mention backend work on the platforms behind customer-facing experiences and internal operations, modernizing older systems, building new microservices, tuning SQL databases, and handling personally identifiable information (PII) securely. The languages and frameworks candidates list are Java with Spring Boot, C# on .NET, JavaScript and SQL, and the exact stack varies by team.

This guide is for engineers interviewing for a Software Engineer position at Autonation, in particular backend-leaning candidates working in Java or C#. It walks through the four reported rounds, covers the reported coding, optimization, REST, PII, code-reading and behavioral questions, and ends with a seven-day plan and a short list of mistakes that cost candidates on questions like these.

Candidates report four rounds over roughly 3-5 weeks: Phone Screen, Technical Questionnaire, Live Coding Interview and Panel Interview. Timing varies, and some candidates wait on panel scheduling.

Focus areas

  • JavaScript
  • String manipulation
  • Java

Overview

The reported questions fall into four groups. The first is string-and-parsing code: translate text into Pig Latin, translate text into an invented language from a table of rules, speed up a string function that runs over millions of records, and solve a math or number puzzle in code. The second is backend and database optimization: a sluggish Java application, a slow SQL query, REST principles, and the size of the payload moving between a frontend and its services. The third is architecture: securing PII across microservices, explaining and improving an unfamiliar block of code, a legacy-to-microservices migration, and the most complex project on your resume. The fourth is behavioral.

Because live coding is reported to lean on string manipulation, the most efficient early preparation is writing small translators and parsers by hand in the language you will use (Java, C# or JavaScript), with the edge cases written down before you code. Practise in a plain online editor without autocomplete, since candidates describe a CoderPad-style environment.

The optimization and architecture questions reward a fixed order of work. For performance, measure first and name the tool: a profiler or thread dump for Java, GC logs for memory, the execution plan for SQL. For PII, walk through the data's life: collection, transit, storage, logs, access and deletion. For REST, tie each principle to a concrete choice in an API you built. Have one real project ready for each of the migration and resume-architecture questions, with the reasons behind the decisions, not just the diagram.

Candidates also report a panel with several directors and architects, sometimes the CIO, and in some cases up to 9-11 directors in one session. Prepare to speak to the whole room, defend a past design choice, and explain technical trade-offs to a mixed audience. The behavioral answers should therefore be short, specific and honest about trade-offs.

The Autonation interview process

Candidates describe four stages, from a recruiter call through to a panel. The order below is what they report, and timing and format can shift by team.

Phone Screen

Candidates report an initial call with an HR recruiter covering your background, what you are looking for, and general fit. No technical exercise is reported for this stage. Treat it as the first test of whether your story about the role is consistent with what you say later to technical leaders, and use it to ask which stack (Java with Spring Boot or C# on .NET) and which formats the later rounds will use. Candidates note that a recruiter's description of a later round may understate the technical content, so confirm the format in writing and prepare for live coding regardless.

What to demonstrate

  • Your background and why you are moving, as you describe it
  • Expectations on role, level and logistics
  • General fit for the team and stack

How to prepare

  • Write a two-minute walk through your last two roles that ends on backend, SQL and API work, the areas this loop emphasizes.
  • Know which of Java or C# you will code in, and say so; ask which the team uses and how the remaining rounds are run.
  • Prepare your compensation, notice period and location answers so the call stays about fit.

Technical Questionnaire

Candidates report an offline technical questionnaire, often a Google Form, covering topics such as REST principles, PII handling and application optimization. Because it is written, there is no chance to adjust to a reaction, so each answer has to stand alone: define the term, give the mechanism, add a concrete example and note a trade-off. The reported question types to rehearse here are REST design, securing PII in a microservices setup, and tuning an application or its data transfer.

What to demonstrate

  • Written command of REST principles and API design
  • How you handle and protect PII
  • Practical knowledge of optimizing an application
  • Clarity when explaining a technical choice in writing

How to prepare

  • Write a one-paragraph answer to the REST principles question that names statelessness, resource-oriented URLs, correct HTTP methods and status codes, and caching, with one example each.
  • Write a PII checklist for microservices: data minimization, encryption in transit and at rest, token or key management, log scrubbing, access control, retention and deletion.
  • Outline a profile-first routine for a slow Java or C# service and for a slow SQL query, ready to paste in brief form.

Live Coding Interview

Candidates report a live coding session on a platform like CoderPad, usually with an engineering director or architect present, with algorithmic problems solved in real time. String manipulation and data parsing come up repeatedly: Pig Latin, translating text with a set of rules, parsing a string into key-value pairs, and occasionally a math or logic puzzle. This is where the coding questions in this guide are practised. Candidates also warn that a loop described as conversational can still include a LeetCode-style problem.

What to demonstrate

  • Working code produced live in the language you pick
  • Edge-case handling and testing of your own solution
  • Choice of data structures and complexity reasoning
  • Narrating your thinking while coding

How to prepare

  • Time yourself writing the Pig Latin and rule-dictionary translators from scratch in an editor without autocomplete, then add tests for empty input, punctuation, capitals and overlapping rules.
  • Practise a key-value string parser that copes with missing values, repeated keys and stray whitespace, in a single pass.
  • Say the clarifying questions out loud before typing: input size, allowed characters, whether the rules can overlap, and what to return on bad input.

Panel Interview

Candidates report a panel with several technical leaders, directors and architects, and sometimes the CIO, with some describing as many as 9-11 directors in the room. Reported content includes deep dives into past projects, code comprehension exercises, technology management and long-term career direction. Prepare for questions to come from many people in quick succession, answer the person who asked, and keep each answer structured so that it is easy to follow around the table.

What to demonstrate

  • Depth on your own past projects and architecture decisions
  • Ability to read unfamiliar code, explain it and improve it
  • Handling of disagreement and technical leadership questions
  • Communication with senior, non-uniform audiences

How to prepare

  • Draw the architecture of your most complex project on one page, with the read and write paths, data stores, failure modes and the three decisions you would defend.
  • Rehearse the legacy-to-microservices migration story with phases, rollout order, data ownership and what you would change.
  • Practise explaining an unseen function aloud: purpose first, trace with a small input, then bugs and improvements.
  • Prepare short answers for the career-direction and delivery-versus-maintainability prompts.

Where candidates lose points

Starting the Pig Latin or rule-dictionary translator without agreeing the rules

Ask what counts as a word, how punctuation and capitals are handled, what happens with words starting with vowels or clusters, and whether dictionary rules can overlap or chain. Write two or three test inputs in the editor first, then code.

Answering the sluggish Java or slow SQL question with a fix instead of a measurement

Open with how you find the cause: profiler, thread dump or GC logs for the application, and the execution plan for the query. Then name candidate fixes, such as an index, a rewritten join, batching, caching or a smaller payload, and say how you would confirm the improvement.

Treating PII as 'encrypt it' and stopping

Walk the data's path across services: what you collect, how it moves, where it is stored, what gets logged, who can read it, and how it is retained and deleted. Name masking or tokenization and key management so the answer covers more than one layer.

Narrating an unfamiliar code snippet line by line without saying what it does

State its purpose in one sentence, trace it with a small input, then list bugs, edge cases and performance problems, and finally propose a rewrite. Practise on code you did not write.

Presenting your most complex project as a list of technologies

Prepare one page that shows the data flow, the failure modes, and three decisions with the alternatives you rejected. Directors in a panel are likely to ask why, so practise answering that for each box in the diagram.

Questions & practice

Write a program to translate a given text string into Pig Latin.

Medium · Coding & Algorithms

Approach

  1. Pin the rules before coding: a word that starts with a vowel gets "way" (or "yay") appended; otherwise move the whole leading consonant cluster to the end and add "ay" ("string" -> "ingstray"). Ask whether "qu" moves as one unit and whether a non-initial "y" counts as a vowel ("rhythm").
  2. Tokenize with a regex such as [A-Za-z]+ so punctuation, digits and spaces pass through untouched, and translate only the letter runs. That keeps "Hello, world!" -> "Ellohay, orldway!" instead of moving the comma into the word.
  3. Find the first vowel index with one scan per word, then build the result as word.substring(i) + word.substring(0, i) + "ay". Append to a StringBuilder rather than += in a loop: repeated String concatenation copies the buffer each time and goes quadratic on long input. Total cost is O(n) in the input length.
  4. Restore capitalization after the move: if the original word was capitalized, lowercase the result and uppercase its first letter. Test the edges: empty string, single letter ("a" -> "away"), a word with no vowels, all caps, apostrophes ("don't") and hyphenated words.

Follow-up

  • Can you write the reverse translator, and is it always unambiguous? (It is not: "eatway" can come from "eat" or "weat".)
  • How would you make the vowel and suffix rules configurable without editing the method?
  • What changes if the input is a multi-gigabyte file rather than a single string?

Given a text input, write a translator that converts it into a fictional "ancient language" based on a provide

Medium · Coding & Algorithms

Given a text input, write a translator that converts it into a fictional "ancient language" based on a provided dictionary of rules.

Approach

  1. Ask what the rules look like before writing anything: whole-word mappings, single-character substitutions, or multi-character patterns ("th" -> "z"). Ask which rule wins when two match and whether unknown words pass through unchanged.
  2. For whole-word rules, load the dictionary into a HashMap<String, String> once and look up each token in O(1) average time; normalize case for the lookup and reapply the original casing to the output.
  3. For pattern rules, never chain replaceAll calls: rule a->b followed by b->c silently turns every a into c. Scan left to right once, at each position take the longest rule that matches (a trie of rule keys makes this O(n * L), with L the longest key), emit its output and jump past the match.
  4. Edge cases to state and test: rules whose keys are prefixes of each other ("a" and "ab"), empty input, punctuation next to words, a rule with an empty replacement, and characters no rule covers.

Follow-up

  • How would you handle hundreds of thousands of rules, and when would Aho-Corasick be worth building?
  • The rule file is loaded at runtime: how do you validate it, and what do you do about conflicting or duplicate keys?
  • How would you unit-test the translator so a new rule cannot silently break existing translations?

How would you optimize a string manipulation function that needs to process millions of records?

Medium · Coding & Algorithms

Approach

  1. Measure first: time the current function on a realistic sample and profile it (Java Flight Recorder or async-profiler) so the fix targets the real hotspot, whether that is CPU, allocation, or I/O.
  2. Fix the usual Java string costs: build output with a reused StringBuilder instead of += in loops; compile any regex once as a static final Pattern, because String.replaceAll and split with a regex argument compile a new Pattern on every call; replace regex with indexOf or a char loop where the pattern is fixed.
  3. Stream the records with a BufferedReader (or a database cursor with a fetch size) instead of loading millions of rows into a list, so memory stays flat and GC pressure drops.
  4. Records are independent, so the work parallelizes: split into batches across a fixed thread pool or a parallel stream, and batch the writes on the output side. State the trade-off: output order must be restored if it matters, and parallelism will not help if the bottleneck is disk or the database.
  5. Prove the gain with a JMH benchmark (with warm-up iterations, since the JIT changes timings) and a regression test that compares old and new output on the same sample.

Follow-up

  • How do you confirm the slowdown is in the string code and not in reading or writing the records?
  • If the output must keep input order, how do you parallelize safely?
  • What changes if the records contain multi-byte Unicode characters?

Solve this specific math/number puzzle programmatically.

Medium · Coding & Algorithms

Approach

  1. Restate the puzzle in precise terms and work two or three small inputs by hand; the hand-worked cases become your first tests.
  2. Write the brute force first with an explicit bound and state its complexity, then look for structure that shrinks the search: a mathematical invariant, a closed form, modular arithmetic, or reuse of earlier results (memoization). For prime-related puzzles a Sieve of Eratosthenes runs in O(n log log n).
  3. Use the standard digit and number tools: n % 10 and n / 10 to peel digits, gcd by Euclid's algorithm, and Math.floorMod when a negative value is possible, because Java's % takes the sign of the dividend (-7 % 3 is -1).
  4. Watch overflow: Java int tops out at 2^31 - 1 (about 2.1 billion), so switch to long or BigInteger for factorials, large powers and running products, and say so out loud before it bites.
  5. Check the optimized version against the brute force on every small input before claiming it is correct.

Follow-up

  • How does your solution behave if n grows to a billion?
  • Can you show why the shortcut is correct, not just that it matches on the examples?
  • Where could this overflow, and how would you detect it at runtime?

Walk me through the steps you take to optimize a sluggish Java application.

Medium · Backend & Database Optimization

Approach

  1. Define "sluggish" first: high latency at p99, low throughput, slow startup, or slowness that grows over hours. Each points to a different cause, and a baseline number lets you prove any fix.
  2. Gather evidence before changing code: application metrics and request traces to find the slow endpoint; several thread dumps (jstack or jcmd Thread.print) a few seconds apart to spot threads blocked on locks, connection pools or outbound calls; GC logs (-Xlog:gc* on JDK 9+) and jstat for pause time and heap growth.
  3. Profile CPU and allocation with Java Flight Recorder or async-profiler under realistic load. If the heap only grows, take a heap dump (jcmd GC.heap_dump) and inspect retained sizes in Eclipse MAT to find the leak.
  4. Name the common culprits in a Spring Boot service and how to confirm each: N+1 queries from lazy JPA associations (turn on SQL logging), an exhausted connection pool (HikariCP pending-thread metrics), outbound HTTP calls without timeouts, chatty logging, and oversized objects in caches with no eviction.
  5. Change one thing at a time and re-measure under the same load, so you know which change helped and nothing else regressed.

Follow-up

  • CPU is low but requests are slow: what does that suggest, and where do you look next?
  • Memory climbs until OutOfMemoryError after a few days: how do you find what is holding it?
  • When would you change the garbage collector or heap settings, and what would you measure first?

Explain how you would optimize the data transfer between a frontend application and your backend services.

Medium · Backend & Database Optimization

Approach

  1. Measure first with the browser network panel: payload size, number of requests per screen, and whether the time goes to waiting on the server or to downloading.
  2. Shrink each response: return purpose-built DTOs with only the fields the screen uses instead of serialized entities, paginate large lists (cursor or keyset pagination stays fast deep into a list, while large OFFSET values get slower and skip or repeat rows when data changes), and enable gzip or Brotli compression for JSON.
  3. Cut round trips: replace several calls per screen with one aggregated endpoint or a backend-for-frontend, batch writes, and rely on HTTP/2 multiplexing for parallel requests.
  4. Avoid resending unchanged data: Cache-Control for static and slow-changing data, ETag and 304 Not Modified for revalidation, a CDN for static assets, and client-side caching of reference data.
  5. Pick the update model by need: polling for rare changes, server-sent events for one-way pushes, WebSockets for two-way traffic. Name the trade-offs: compression costs CPU, and caching risks stale data.

Follow-up

  • A list screen loads thousands of rows: how do you page it, and why not OFFSET?
  • How would you decide between a dedicated aggregation endpoint and GraphQL?
  • How do you prove which change improved load time for real users?

Look at this block of code: explain exactly what it is doing and how you would improve it.

Medium · Architecture & Practical Application

Approach

  1. Explain before you critique: read the signature, inputs and return value, trace one small concrete input line by line out loud, then sum up what the code does in one sentence.
  2. List problems by severity. Correctness first: off-by-one bounds, null or empty input, swallowed exceptions, resources not closed (use try-with-resources), and mutable state shared across threads without synchronization.
  3. Then performance: nested loops that a HashMap lookup turns from O(n^2) into O(n), a database or HTTP call inside a loop (N+1), string concatenation in a loop, and repeated work that can be hoisted out of the loop.
  4. Then readability: unclear names, long methods worth extracting, magic numbers. Before refactoring, write characterization tests that pin the current behaviour, so the improvement provably changes nothing it should not.

Follow-up

  • If you could make only one change, which would it be and why?
  • What happens if two threads call this method at the same time?
  • How would you test this code before changing it?

How do you identify and resolve a bottleneck in a complex SQL query?

Medium · Backend & Database Optimization

Approach

  1. Get the actual plan, not a guess: EXPLAIN ANALYZE in PostgreSQL or MySQL 8.0.18+, the actual execution plan in SQL Server. Find the node where most of the time goes and compare estimated rows to actual rows.
  2. Read the plan for known patterns: a full scan of a large table under a selective filter (missing or unusable index), a nested loop over a large outer input, a sort or hash spilling to disk, and estimates far off from actuals (stale statistics: run ANALYZE or UPDATE STATISTICS).
  3. Fix the cause: a composite index with equality columns first and the range column last, or a covering index (INCLUDE) to skip table lookups; make predicates sargable (WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01' instead of wrapping the column in YEAR()); remove implicit type conversions; rewrite a correlated subquery as a join or EXISTS; select only the columns needed.
  4. State the trade-off: every index costs write time and storage, so check the table's write volume before adding one, and drop indexes the plan never uses.
  5. Verify with the same plan tool and representative parameter values; in SQL Server a cached plan built for one parameter value can be slow for another (parameter sniffing).

Follow-up

  • The query is fast in development but slow in production: what differs, and how do you check?
  • You added the index and the plan still does not use it: what are the likely reasons?
  • How would you speed up a filter like LIKE '%term%' that a normal B-tree index cannot serve?

Keep soft-deleted accounts from blocking re-registration

Easy · soft delete · unique constraints · engine differences

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

Approach

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

Follow-up

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

What are the core principles of REST, and how do you ensure your APIs adhere to them?

Medium · Backend & Database Optimization

Approach

  1. Name the constraints as defined by Fielding: client-server, stateless (every request carries what the server needs, with no session state kept between calls), cacheable responses, a uniform interface, a layered system, and optional code on demand.
  2. Explain the uniform interface in practice: resources named with nouns (/customers/42/orders), standard methods with their real semantics (GET is safe and idempotent; PUT and DELETE are idempotent; POST is not; PATCH is not guaranteed to be), and accurate status codes (201 with a Location header, 204, 400, 401 versus 403, 404, 409).
  3. Cover caching and concurrency: Cache-Control headers, ETag with If-None-Match returning 304, and If-Match for optimistic locking on updates. For POST retries, accept an idempotency key so a retry cannot create a duplicate.
  4. Say how you enforce it rather than only describe it: an OpenAPI specification as the contract, a linter such as Spectral in CI, contract tests between consumer and provider, and a versioning and deprecation policy for breaking changes.
  5. Be honest about HATEOAS: most production APIs stop short of hypermedia (level 2 of the Richardson Maturity Model), and you should say what you would gain or lose by adding it.

Follow-up

  • When would you use PUT rather than PATCH, and what does idempotency mean for each?
  • How do you version an API without breaking existing clients?
  • Is a stateless API compatible with user sessions and authentication? How?

How do you handle and secure PII (Personally Identifiable Information) within a microservices architecture?

Medium · Architecture & Practical Application

Approach

  1. Start with an inventory: classify which fields are PII, which services store or process them, and cut that set down so only the services that need raw PII ever see it.
  2. Isolate PII: a dedicated service or vault holds the raw values and hands other services opaque tokens. Name the cost: an extra network hop and a dependency every PII read must go through.
  3. Encrypt everywhere: TLS from clients and mutual TLS between services (a service mesh can enforce mTLS), encryption at rest with KMS-managed keys and envelope encryption, and field-level encryption for the most sensitive columns. Note that deterministic encryption or a blind index allows equality lookups but leaks which records share a value.
  4. Control and record access: least-privilege service identities, authorization on every PII endpoint, and audit logs of who read what. Keep PII out of application logs, traces, error messages and event payloads by masking at the logging layer.
  5. Handle retention and deletion: define retention per field, and support erasure across services, topics and backups. Per-user encryption keys allow crypto-shredding, where deleting the key makes every copy unreadable.

Follow-up

  • A customer asks to be deleted: how do you remove their data from every service and event stream?
  • A developer needs production-like data to debug an issue: what do you give them?
  • How do you look up a customer by email if the email column is encrypted?

Describe a time you had to migrate a legacy application to a cloud-native microservices architecture.

Medium · Architecture & Practical Application

Approach

  1. Frame the story with numbers you can defend: what the legacy system did, why it had to move (deployment pain, scaling limits, coupling), and your own role in the migration as distinct from the team's.
  2. Describe the technique: a strangler-fig migration behind a gateway or facade, carving out one bounded context at a time and starting with a seam that has low coupling and clear value, rather than a big-bang rewrite.
  3. Explain the data split, since that is the hardest part: a database per service, how you broke up a shared schema, and how you kept data in sync (change data capture, or the transactional outbox pattern instead of dual writes). Cross-service workflows use sagas with compensating actions in place of distributed transactions.
  4. Cover the safe rollout: tracing and correlation IDs in place before cutover, shadow traffic or canary releases, feature flags and a tested rollback path.
  5. Close with measured results and one thing that went wrong. If you have not led a full migration, say so and walk through a smaller extraction you did own.

Follow-up

  • How did you split the database, and what did you do about queries that joined across the new boundaries?
  • What did you deliberately leave in the monolith, and why?
  • How did you handle a business operation that had to update two services consistently?

Walk me through the architecture of the most complex project on your resume.

Medium · Architecture & Practical Application

Approach

  1. Pick a project where you can explain every box. Open with context and scale: users, request rates, data volume and the business constraint, using numbers you can back up.
  2. Walk the architecture in the order a request travels: client, entry point (gateway or load balancer), services, queues, caches, datastores, external integrations. Be ready to sketch it as a component diagram.
  3. For two or three key decisions, name the alternative you rejected and why (for example, a relational database over a document store for transactional integrity, or async messaging over synchronous calls to absorb spikes).
  4. Describe a failure or bottleneck the system hit in production, how you diagnosed it, and what changed as a result.
  5. Say plainly which parts you built yourself and which the team owned.

Follow-up

  • What would you redesign if you started this project today?
  • Which component breaks first at ten times the load, and what would you do about it?
  • How did you monitor this system, and what alert woke someone up most often?

One log partition stops advancing while the others drain

Easy · poison message · head-of-line blocking · consumer lag

Search results for a subset of tenants are hours stale; the rest are current. The projection consumer reports lag of zero on 15 of 16 partitions and 400,000 on one. Its error rate is flat and its CPU is idle. outbox_event has no pending rows older than a second, so the relay has published everything it holds. Identify the mechanism, give the ordered checks, and state what you do in the first ten minutes versus what you change permanently.

Approach

  1. Read the lag distribution first. A slow consumer lags everywhere; zero on fifteen partitions and 400,000 on one is not throughput. Idle CPU on the stuck partition means the consumer is not advancing its offset at all, which points at one message it cannot get past rather than at a rate problem.
  2. Exonerate the producer before touching the consumer. No pending outbox rows older than a second means the relay published, so the event exists in the log. This separates never sent from sent and never applied, which are different code paths and usually different owners.
  3. Read the message at the stuck offset and the handler's log lines for its event_id. A flat error rate with no progress has two explanations and you must distinguish them: the handler is throwing and the retry loop is swallowing it, or the handler is blocking on something and never returning. Idle CPU with no error lines favours the second.
  4. Mitigate before diagnosing further. Move the offending event to a dead-letter store and commit the offset past it. Adding consumers does nothing here, because a partition is consumed by exactly one member of the group, and the blast radius is every aggregate hashed to that partition, not only the aggregate that produced the bad event.

Follow-up

  • The dead-lettered event carried aggregate_version 7 and the projection had applied 6. What must the replay do differently if 8 and 9 landed in the meantime?
  • How do you show staleness to the user while the partition is behind, given the API already returns the projection's watermark?

Suggested practice checklist

The plan follows the reported rounds: written answers first, then string-heavy live coding, then optimization, API and PII design, code reading, and finally the panel and behavioral stories. Each day ends with something you can reread before the loop.

Day 1 — Map the loop and set up your editor

  • Write down the four reported rounds and, for each, the question types it covers; mark the one you are weakest at.
  • Pick your coding language (Java, C# or JavaScript) and write a skeleton with a main method and a few assertion-style tests in a plain online editor, with no autocomplete.
  • List which of Java with Spring Boot, C# on .NET, SQL and REST you can discuss from real project experience.

Deliverable: A one-page loop map with your weakest round marked, plus a saved coding template with a test harness.

Day 2 — String translators: Pig Latin and the rule dictionary

  • Write the Pig Latin translator, handling vowels, consonant clusters, capitals and punctuation, and list the variants you would confirm with an interviewer.
  • Write the translator driven by a dictionary of rules, deciding how to tokenize, how to apply rules, and what happens when two rules overlap.
  • Add a test list for each: empty string, one character, mixed case, punctuation, repeated words.

Deliverable: Two working translators with a written list of clarifying questions and at least eight test cases each.

Day 3 — Scaling string work and the number puzzle

  • Take one of your translators and rewrite it for millions of records: avoid repeated string concatenation, reuse compiled patterns or lookup tables, and process in a stream or batches.
  • Write down the time and memory cost of each change and how you would measure it.
  • Solve two number puzzles in code, starting with brute force, then reducing the search with math or memoization.

Deliverable: An optimized string function with a written before-and-after reasoning, and two puzzles solved with complexity noted.

Day 4 — Java and SQL performance routines

  • Write a step-by-step routine for a slow Java service: reproduce, profile, check threads, GC and memory, then I/O and queries, then fix and re-measure.
  • Take one slow query and write the investigation: read the execution plan, find the scan or join that dominates, test an index or rewrite, and check the result.

Deliverable: A reusable performance-diagnosis checklist for Java and one written SQL tuning case.

Day 5 — REST, payload size and PII across services

  • Write a short answer on REST principles with an example endpoint for each, and the checks you use to keep an API consistent.
  • List ways to reduce frontend-to-backend transfer: pagination, field selection, compression, caching headers, batching calls, and avoiding over-fetching.
  • Draw a PII flow across three services and mark encryption, access control, logging and deletion on it.

Deliverable: A REST principles answer, a payload-reduction list, and an annotated PII data-flow diagram.

Day 6 — Code reading and your own projects

  • Find three short unfamiliar functions, explain each aloud in one sentence, trace them with a small input, and list bugs and improvements.
  • Draw your most complex project's architecture and write the three decisions you would defend, with the rejected alternatives.
  • Outline a legacy-to-microservices migration story: what was split first, how data ownership moved, how you rolled out, and what you would change.

Deliverable: Three code explanations, one architecture page, and a migration story outline.

Day 7 — Behavioral stories and panel rehearsal

  • Write short answers for the five-year career question, the disagreement with an architect or director, and the speed-versus-maintainability question.
  • Run a full mock with someone asking questions in quick succession; practise looking at whoever asked.
  • Prepare three questions to ask the panel about the team's stack and the move toward microservices.

Deliverable: Three rehearsed behavioral answers and a list of questions for the panel.

Career, disagreement and delivery stories

Candidates report that the panel includes questions about career direction, disagreement with senior technical people, and balancing speed with clean code. Prepare stories with a clear decision, a measured result and an honest trade-off, told in a few sentences each.

  1. Describe a time you had to migrate a legacy application to a cloud-native microservices architecture.
  2. Walk me through the architecture of the most complex project on your resume.

Where do you see your career in 5 years?

Medium · Behavioral & Leadership

Approach

  1. Anchor the answer in engineering direction, not a title: for example owning the design of a service or a platform area, then growing into setting technical direction across several teams. Say which path you lean to (deeper technical ownership or leading people) and give one reason from your own experience.
  2. Tie the next five years to the work this role is reported to involve: backend services in Java or C#, SQL performance, microservices and secure handling of PII. Name one or two skills you want to build, such as distributed-systems design, cloud-native deployment or mentoring.
  3. Break it into a near-term and a later step: in the first year, learn the domain and ship; later, lead a larger design or migration. A short, ordered path sounds more credible than a long list of ambitions.
  4. Candidates report technology management and long-term career trajectory as panel topics, so be ready to say how you would work with architects and directors as your scope grows. The mistake that sinks this answer is a vague or purely title-driven one, or plans that obviously do not involve this job.

Follow-up

  • Would you rather stay hands-on or move into managing engineers, and why?
  • Which skill do you most need to build to reach that point, and what have you done about it so far?
  • How would this role help you get there?

Describe a situation where you disagreed with an architect or director about a technical implementation. How d

Medium · Behavioral & Leadership

Describe a situation where you disagreed with an architect or director about a technical implementation. How did you resolve it?

Approach

  1. Choose a real disagreement about a technical implementation with someone more senior, such as an architect or director, where you cared about a concrete outcome: latency, data integrity, operability, delivery risk. State the situation in two sentences, then each side's position in neutral words.
  2. Show how you built your case with evidence rather than opinion: a prototype, a benchmark, a query plan, an incident, or a written comparison of options with costs. Show that you first asked what constraint they were optimizing for (deadline, standardization, security review), because that is often the real issue.
  3. Describe the resolution honestly. Either your evidence changed the decision, you found a middle path such as a spike or a limited rollout, or you accepted their call, committed fully and recorded the risk you saw. Then give the result and what you measured afterwards.
  4. The failure mode is a story in which the senior person is simply wrong and you win, or one with no resolution. Close with what you would do differently, such as raising the concern earlier or bringing the comparison sooner.

Follow-up

  • What if they had still said no after seeing your evidence?
  • How did you find out what constraint they were weighing?
  • What would you do differently if you faced the same disagreement now?

How do you balance the need to deliver code quickly with the need to write clean, maintainable software?

Medium · Behavioral & Leadership

Approach

  1. Open with the principle: speed and maintainability are traded off per change, based on how costly it is to change later and how large the blast radius is. Code that touches PII, a public API contract or a database migration is hard to undo, so it gets tests and review even under pressure.
  2. Give the tactics you actually use: ship a thin vertical slice first, keep tests on behaviour at the boundaries, defer internal polish, and record the shortcut as a tracked ticket with an owner rather than a comment nobody reads.
  3. Describe how you pay the cost back: refactor in small commits alongside feature work, add characterization tests before touching legacy code, and agree on a short list of non-negotiables with your team, such as naming, tests for new logic and no copy-pasted SQL.
  4. Anchor it in one concrete story with a result you can state, such as a deadline met with a deliberate shortcut that you cleaned up the next sprint. The mistake is claiming you never trade off, which sounds untrue, or describing shortcuts that were never repaid.

Follow-up

  • How do you handle a deadline when the area you must change already has heavy debt?
  • How would you persuade a product manager to fund a refactor?
  • What does clean code mean to you in practice, and what is a rule you would break?