cswork / libraryOpen practice workspace

Interview guides · Blue Rose Consulting Group

Blue Rose Consulting Group Software Engineer Interview Guide

Blue Rose Consulting Group Software Engineer interview guide: reported rounds, Java, Appian security and web services questions, plus a 7-day plan.

The 60-second brief

Blue Rose Consulting Group is a consulting firm, and candidates describe its engineers as working on client projects for government and private-sector organisations. The stack candidates mention is Java application development, Appian with a security angle, web services and application support. The requirements candidates describe name Java, web services and software security principles as the core. Postings differ by team: Application Support, Java Development, Appian Security and Security Developer variants of the Software Engineer role are all mentioned. The work is described as covering the whole lifecycle, from gathering requirements through deployment and support, with testing, security controls and documentation as part of the job and regular updates to project leads and non-technical staff.

This guide is for candidates interviewing for a Software Engineer position at Blue Rose Consulting Group, whether the posting leans toward Java development, Appian security or application support. It covers the three reported rounds, answer structures for all seven reported questions, a seven-day plan, behavioral prompts and the process questions candidates ask. It says nothing about pay and makes no claim about how any single interviewer will run a session.

Candidates report three rounds over roughly 3-5 weeks: a Screening Call, Technical Discussions and a Final Technical Evaluation. Reports describe the first as a conversation about your background and interests, the second as deeper technical discussion with engineering leads or project managers, and the third as an assessment on technical accuracy and real-world scenarios.

Focus areas

  • Secure Coding Practices
  • Security Development
  • Appian

Overview

The reported questions fall into two groups. One group is stack knowledge: Java frameworks and performance in high-traffic systems, securing Appian processes and keeping data intact across workflows, and what to weigh when running web services for large enterprise systems. The other group is method: troubleshooting a production bug, diagnosing a failure with little documentation, trading technical debt against fast delivery, and explaining a complex solution to a non-technical stakeholder. Both groups are open-ended discussion questions, so the preparation is stories and structured reasoning rather than memorised snippets.

The topics candidates associate with this loop are Secure Coding Practices, Security Development, Appian, Authentication and Authorization, and Web Services. Reports also list architecture patterns, performance tuning, CI/CD pipelines, automated testing and containerization as areas to be ready to discuss. For each one, prepare a concrete example from your own work: what you built, which alternative you rejected and why, and what you measured afterwards. Be ready to separate authentication (who is calling) from authorization (what that caller may do) without hesitating, because most security answers in this stack depend on that split.

Consulting changes the shape of good answers. Reported scenarios include a client request that would hurt system stability and a technical delay that has to be explained to a client, so your stories should show requirement gathering before coding, a business-level explanation of a technical problem, and documentation you left behind. Candidates also report that requirements may be unclear at the start, so rehearse the clarifying questions you would ask before committing to a design.

Which role variant you apply for decides where to go deepest. For an Appian Security posting, spend the most time on object permissions, process security and sensitive-data handling. For Java Development, concentrate on framework internals, query and service performance, and testing. For Application Support, concentrate on production incidents, logs, runbooks and communication during outages. The plan below covers all three, so shift hours toward your posting.

The Blue Rose Consulting Group interview process

Candidates describe three stages. The reports say little about format, so use the stage names and descriptions as a guide to the kind of conversation, not as a script.

Screening Call

Candidates describe the Screening Call as a first conversation to align on your background and interests. It is where your stack history is matched against the posting, so it is the cheapest round to lose by being vague about which variant of the role you want and what you have actually built in Java, Appian or web services.

What to demonstrate

  • How your background lines up with the posting you applied for (Application Support, Java Development, Appian Security or a similar variant)
  • Whether you can describe your own projects clearly and say what you personally did
  • Your interest in consulting and client-facing work

How to prepare

  • Write a short summary of each project you would discuss: the system, your part, the stack, one measurable outcome
  • Read the posting and list the technologies it names, then match each to a project you can talk about in depth
  • Prepare a plain-language answer to why consulting and client-facing delivery suits you, with one example of working with a non-engineer
  • Prepare questions about the remaining stages and which team's work the role supports

Technical Discussions

Candidates describe Technical Discussions as deeper conversations with engineering leads or project managers. The reported questions on Java performance, securing Appian processes, web services for large enterprise systems, production troubleshooting and technical debt are the material to rehearse for this kind of stage. With project managers in the audience, expect to explain both the technical choice and why it mattered to the project.

What to demonstrate

  • Depth in your core stack: Java, Appian or web services
  • Structured reasoning about security, performance and production incidents
  • Ability to explain technical choices in terms of project impact

How to prepare

  • Answer aloud the questions on securing Appian processes and managing web services at enterprise scale, each with a concrete example
  • Rehearse the production-troubleshooting sequence: contain, reproduce, isolate, fix, verify, write up
  • Prepare one technical-debt decision where you chose to ship and one where you chose to refactor, with the reasoning for each
  • Practise giving the same answer twice, once to an engineer and once to a project manager

Final Technical Evaluation

Candidates describe the Final Technical Evaluation as an assessment centred on technical accuracy and real-world scenarios. Scenarios reported for this loop include securing a sensitive data field in an Appian application, optimizing a slow query or service, and handling a feature request that would harm system stability. Precision matters: a correct, specific answer beats a broad one.

What to demonstrate

  • Technical accuracy in your core stack
  • Handling of realistic scenarios such as a slow query or a risky feature request
  • Command of security fundamentals, authentication and authorization included
  • Familiarity with CI/CD, automated testing and containerization, which candidates report as topics

How to prepare

  • Write a checklist for protecting a sensitive field end to end: who can see it, where it is stored, how it is logged, how access is audited
  • Prepare a slow-query story with your diagnosis steps and the before and after measurements
  • Prepare an answer for a request that would hurt stability: what you would measure, what you would offer instead, how you would put it to the requester
  • Be able to describe a CI/CD pipeline you worked in and the automated tests that guarded it

Where candidates lose points

Listing Java frameworks without any decision, measurement or outcome

For the performance question, tell one story with a measured symptom, a diagnosis method, a specific fix and a before and after result. Naming Spring or Hibernate adds nothing without the decision you made with it.

Answering Appian or web-service security with 'use HTTPS and roles'

Keep authentication (who is calling) and authorization (what they may do) separate. Cover least privilege, input validation, protecting and auditing sensitive fields, and secrets handling. Only describe Appian features you have actually used.

Jumping straight to a fix in the production-bug and limited-documentation questions

Use a fixed order: contain the impact, establish what changed, reproduce, isolate, fix, verify, then record what you learned. Say the order out loud so the method is visible.

Picking a side on technical debt versus fast delivery instead of showing a decision rule

Describe how you weigh the risk, the cost of delay and the cost of carrying the debt, and give one example where you shipped with debt and logged it, and one where you stopped to refactor.

Telling client-facing stories without the client's point of view

In the stability-risk, expectation-management and non-technical-stakeholder stories, state the client's goal, how you translated the technical issue into business impact, what options you offered and what the outcome was.

Questions & practice

Collapse a redelivered event batch into per-aggregate high-water marks

Easy · hashing · at-least-once · aggregation

You drain a batch of up to 5,000,000 events, each (aggregate_id BIGINT, aggregate_version INT, event_type, payload). The log guarantees order within one aggregate only; the batch merges 64 partitions, and a relay failover has redelivered a range, so an older version for an aggregate can appear after a newer one. Given a map of last_applied_version per aggregate, produce the events worth applying, at most one per (aggregate_id, version), plus the count discarded. Target O(n) time. State the memory for 2,000,000 distinct aggregates and what you do when it does not fit.

Approach

  1. One pass, one hash map from aggregate_id to the highest version kept, and a discard counter. An event whose version is at or below last_applied_version for its aggregate is dropped without further work, which is the whole reason the event carries its version rather than a delta. O(n) expected time, O(d) space in distinct aggregates.
  2. Keep the maximum, never the last occurrence. The redelivered range means the final appearance of an aggregate in the batch can be an older version than one seen earlier in the same batch, so last-wins applies stale state over newer state and the projection regresses with no error anywhere.
  3. Cost the memory instead of calling it large: an 8-byte key plus a 4-byte version is 12 bytes of payload, and an open-addressed table held at a 0.7 load factor costs roughly 17 bytes per entry before per-slot metadata, so 2,000,000 aggregates is tens of megabytes in a native layout and several times that in a runtime that boxes both key and value.
  4. If the distinct set exceeds memory, partition on hash(aggregate_id) mod P and reduce each partition independently. Every event for one aggregate hashes to the same partition, so the per-partition result is exact and the merge is concatenation rather than a second reduction.

Follow-up

  • The payload is a patch rather than a snapshot, so applying only the highest version loses the intermediate changes. What changes in your reduction?
  • How do you detect that version 7 arrived while version 6 was never delivered, and what should the consumer do about the gap?

Track a rolling failure rate per destination for circuit decisions

Easy · sliding window · ring buffer · circuit breaker

The egress service delivers about 1,500 webhooks per second across roughly 40,000 destinations, each call bounded by a 10 second timeout. Maintain, per destination, the failure rate over the trailing 60 seconds so a caller can ask before dispatch whether the circuit should open. Attempts arrive as (destination_id, finished_at_ms, outcome). Requirement: amortised O(1) per attempt, with total memory bounded by the destination count rather than by traffic. Give the structure, its exact memory, and the rule that stops a destination with three attempts from opening a circuit.

Approach

  1. Name the exact-deque version and then reject it as the default. Holding timestamps and advancing a tail pointer past anything older than now minus 60 seconds is a correct two-pointer window at amortised O(1) per attempt, but its memory tracks in-window traffic, so one destination in a retry storm holds hundreds of thousands of entries while thousands of quiet destinations hold none.
  2. Use a ring of 60 one-second buckets per destination, each bucket a pair of counters for attempts and failures. On an attempt, advance the ring by the elapsed whole seconds, zeroing at most min(elapsed, 60) buckets, then increment the head. That is amortised O(1) with a fixed footprint per destination.
  3. State the footprint: 60 buckets times two 4-byte counters is 480 bytes of payload per destination, so 40,000 destinations is roughly 20 to 25 MB with per-entry overhead, bounded by the catalogue rather than by the rate. The cost is granularity, since the oldest bucket ages out in whole seconds, which is far tighter than the decision needs.
  4. Require a minimum sample before the circuit may open. A destination with three attempts and three failures reads as 100 percent and is not evidence; a floor of roughly 20 attempts in the window makes the ratio meaningful, and below that floor use a run of consecutive failures as the trigger instead.

Follow-up

  • The fleet is 30 instances and each sees roughly a thirtieth of a destination's traffic. Where does the rate actually live, and what does a per-instance answer get wrong?
  • A destination answers in 9.5 seconds and succeeds. It is not failing but it is consuming your per-destination concurrency. What signal should open the circuit here?

Archive a resource graph without breaking live references or recursing

Medium · graph traversal · topological order · tenant isolation

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

Approach

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

Follow-up

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

Find version gaps and relay lag with window functions

Medium · window functions · event tables · frame semantics

outbox_event holds event_id, aggregate_type, aggregate_id, aggregate_version, event_type, payload, status ('pending','published','dead'), attempts, created_at, published_at. A projection is missing rows and you must decide whether the relay skipped events or the consumer dropped them. Write three queries over the last seven days: one listing every aggregate_id whose published aggregate_version sequence has a hole, one giving per-day counts with a running total, and one returning the newest published event per aggregate. For each, say where the window function is evaluated relative to WHERE and LIMIT. PostgreSQL 16.

Approach

  1. Gaps: compute lead(aggregate_version) OVER (PARTITION BY aggregate_id ORDER BY aggregate_version) in a subquery, then filter next_version <> aggregate_version + 1 in the outer query. Window functions are evaluated after WHERE, GROUP BY and HAVING and before the outer ORDER BY and LIMIT, so the predicate cannot sit in the same WHERE clause and PostgreSQL 16 has no QUALIFY.
  2. Say what the seven-day filter does to the answer: it truncates every partition, so the first row per aggregate has no predecessor inside the window and a hole spanning the boundary is invisible. Widen the window, or join to resource.version as the authority for the true maximum.
  3. Running total: SELECT date_trunc('day', created_at) AS d, count() AS n, sum(count()) OVER (ORDER BY date_trunc('day', created_at) ROWS UNBOUNDED PRECEDING). An aggregate inside a window call is legal because grouping runs before windowing. The grouping key is unique per row here so ROWS and RANGE agree, but write the frame anyway — over ungrouped rows with tied timestamps the default RANGE frame pulls in every peer row and the total jumps.
  4. Newest per aggregate: DISTINCT ON (aggregate_id) ... ORDER BY aggregate_id, aggregate_version DESC is the cheap PostgreSQL-only form when an index matches that order; row_number() OVER (PARTITION BY aggregate_id ORDER BY aggregate_version DESC) = 1 is the portable form and needs a subquery for the same evaluation-order reason as the gap query.

Follow-up

  • Relay failover redelivers events. Does a duplicate break the gap query, and how would you detect one from this table alone?
  • Turn the gap check into a continuous monitor rather than a query someone runs after an incident. What does it watch?

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?

How do you approach securing Appian processes and ensuring data integrity across complex workflows?

Medium · Technical Competency and Domain Knowledg

Approach

  1. Separate the two halves of the question: access control (who can start, see and change what) and data integrity (what gets written is valid, complete and not lost or doubled), and answer each in turn.
  2. Access: grant object-level security to groups rather than named users, give each design object (process model, record type, interface, connected system) the least role it needs, and add record-level security on record types so a query returns only the rows a user is entitled to.
  3. Integrity: validate on the interface for usability, then re-check rules and permissions in the process before the write step, since the same process can be started from more than one form, a related action or an integration.
  4. Concurrency and partial failure: name what happens when two users edit the same record or a write fails halfway through a multi-step workflow, and describe a version or last-modified check plus an exception path that alerts someone instead of leaving half-written data.
  5. Close with auditability: process history, who changed what and when, sensitive fields kept out of logs and process variables shown to broad audiences, and a test that logs in as a low-privilege user to confirm the controls hold.

Follow-up

  • How would you secure a single sensitive field, such as an identifier, inside a record that many users can otherwise read?
  • A process runs with elevated rights to reach an external system. How do you keep that from becoming a way around user permissions?
  • How would you test that record-level security still holds after a new group is added?

What are the key considerations when managing web services for large-scale enterprise systems?

Medium · Technical Competency and Domain Knowledg

Approach

  1. Contract first: a published interface (OpenAPI for REST, WSDL for SOAP), explicit versioning, additive-only changes within a version, and a deprecation window for consumers before anything breaks.
  2. Security at the boundary: authenticate callers (OAuth 2.0 client credentials or mutual TLS between services), authorise per operation with least-privilege scopes, validate and size-limit every input, and keep secrets in a vault rather than in config files.
  3. Resilience: set a timeout on every outbound call, retry only idempotent operations with exponential backoff and jitter, use idempotency keys for writes, and add circuit breakers so one slow dependency does not exhaust the caller's thread pool.
  4. Scale and load: stateless instances behind a load balancer, pagination on list endpoints, rate limits per consumer, and caching with Cache-Control or ETags where the data allows it.
  5. Operations: correlation IDs across hops, p95/p99 latency and error-rate dashboards per endpoint, health checks, and contract tests in CI so a change cannot ship that breaks a known consumer.

Follow-up

  • You must make a breaking change to an endpoint that dozens of client systems call. How do you roll it out?
  • A downstream outage causes a retry storm against it. What stops that, and where do you configure it?
  • When would you choose SOAP over REST for an enterprise integration, or the reverse?

How do you prioritize technical debt against the need for rapid feature deployment?

Medium · Problem-Solving and Methodology

Approach

  1. Make the debt concrete: list each item with its cost in terms a stakeholder recognises, such as incidents caused, hours added to every change in that area, or a security exposure, rather than calling code ugly.
  2. Rank by risk and by overlap with upcoming work: debt in modules the next features will touch pays back immediately, while debt in stable code nobody changes can wait.
  3. Treat some debt as non-negotiable: known vulnerable dependencies, missing access checks and unsupported runtimes go on the schedule regardless of feature pressure.
  4. Fold paydown into delivery: refactor the area a feature touches as part of that feature's estimate, reserve a fixed share of each iteration for the ranked list, and record any debt taken on deliberately along with when it will be repaid.
  5. Show the outcome with a measure, such as deploy frequency, change failure rate or time to deliver a change in the area, so the next prioritisation conversation starts from data.

Follow-up

  • The client wants only features this quarter. How do you get a security upgrade scheduled?
  • Give an example of debt you took on deliberately. What did it cost, and when did you repay it?
  • How would you show that a refactor actually paid off?

Describe a situation where you had to communicate a complex technical solution to a non-technical stakeholder.

Medium · Problem-Solving and Methodology

Approach

  1. Choose a real case where a decision depended on the stakeholder understanding you, such as approving a delay, choosing between two designs or accepting a security control, and state that decision up front.
  2. Show the translation: lead with the outcome and the risk in their terms (cost, schedule, compliance, user impact), then give only as much mechanism as the decision needs, using one accurate analogy or diagram.
  3. Present options as trade-offs, for example 'I laid out two paths: ship on the date with a manual workaround, or slip two weeks and remove the risk', with your recommendation and why.
  4. Confirm understanding by having them restate the choice, then follow up in writing with the decision, its owner and the next steps.
  5. End with the result and what you would change; the answer falls flat if it is full of jargon, talks down to the listener, or never says what was decided.

Follow-up

  • What did you deliberately leave out of the explanation, and why?
  • The stakeholder disagreed with your recommendation. What happened next?
  • How did you know they had actually understood rather than just agreed?

Describe your process for troubleshooting and resolving critical bugs in a production environment.

Medium · Technical Competency and Domain Knowledg

Approach

  1. Start with impact and mitigation: confirm severity and scope (which users, which feature, since when), then restore service first through rollback, a feature flag or a config revert before hunting the root cause.
  2. Establish what changed: deploys, config, dependency or certificate updates, data volume or an upstream service, lined up against when the error rate moved on the dashboard.
  3. Gather evidence before theorising: logs joined by a correlation or request ID, error-rate and latency metrics, and for a Java service a thread dump for hangs, a heap dump or GC log for memory growth, and the full exception chain including the cause.
  4. Reproduce it in a lower environment with data shaped like production, narrow it down by bisecting commits or toggling inputs, and state the root cause separately from the trigger.
  5. Fix with a regression test, release through the normal pipeline, watch the same metric that showed the fault, and write a short blameless postmortem with the actions that stop it recurring.

Follow-up

  • The bug only appears in production and you cannot reproduce it locally. What do you do next?
  • Rollback is not possible because the release included a schema migration. How do you mitigate?
  • How do you add diagnostic logging in production without flooding logs or exposing sensitive data?

Suggested practice checklist

A seven-day plan built from the three reported rounds, the seven reported questions and the stack candidates mention. Days 2 to 5 take the questions by theme and day 6 covers coding fundamentals and delivery topics before a full mock.

Day 1 — Map the posting to the three rounds

  • Read your posting and list every technology and responsibility it names, noting whether it leans toward Java Development, Appian Security or Application Support.
  • Write an inventory of your own projects in Java, Appian, web services and production support, each with the system, your part and one result.
  • Write what each reported round (Screening Call, Technical Discussions, Final Technical Evaluation) will need from that inventory and mark your thinnest area.

Deliverable: A one-page stack inventory and a three-round map with the weakest area marked.

Day 2 — Java performance and slow-query stories

  • Write the structured answer for the Java frameworks and high-traffic performance question: symptom, measurement, fix, result, trade-off.
  • Write a second story for the slow query or service scenario, with the diagnosis steps and before and after numbers.

Deliverable: Two written performance stories with measured results and one solved window-function practice question.

Day 3 — Security, Appian and web services

  • Write an answer to securing Appian processes and keeping data intact across workflows: who may start and see each step, how sensitive fields are protected, how changes are audited.
  • Write a checklist of what to weigh when managing web services for large enterprise systems: authentication, authorization, versioning, error handling, rate limits, monitoring, rollback.

Deliverable: A written Appian security answer, a web-services checklist and a solved concurrent-edit practice question.

Day 4 — Production incidents and limited documentation

  • Write the production troubleshooting sequence as a numbered runbook with the first check at each step and what it rules out.
  • Write a STAR story about diagnosing a failure with little documentation, ending with the documentation you left behind.

Deliverable: A numbered troubleshooting runbook, one STAR story and a solved rolling-failure-rate practice question.

Day 5 — Judgment and client communication

  • Write your decision rule for technical debt versus rapid feature deployment, with one example of each outcome.
  • Write the story of explaining a complex technical solution to a non-technical stakeholder, including the analogy or visual you used and what they decided.
  • Prepare answers to the reported scenarios on a feature that would hurt stability and on managing a client's expectations during a technical delay.

Deliverable: Two written stories, a technical-debt decision rule and a defended estimate range.

Day 6 — Coding fundamentals and delivery practice

  • Write a short explanation of a CI/CD pipeline you have used, the automated tests in it and where containerization fit.

Deliverable: Two solved coding practice questions and a one-page CI/CD and testing explanation.

Day 7 — Full mock across the three rounds

  • Run a mock of the Screening Call: summary of your background, why this role, why consulting.
  • Answer one question each from the stack, troubleshooting and judgment groups aloud, for an engineer and then for a project manager.
  • Write the questions you want to ask about the team, the work and the remaining stages.

Deliverable: A completed mock, a list of answers to tighten, and your questions to ask.

Stories and scenarios for the consulting loop

Reported behavioral and scenario questions for this loop cover performance work, diagnosing failures without documentation, prioritising technical debt, and communicating with non-technical stakeholders and clients. Build each story around a decision you made, the evidence you used and the outcome, and use STAR to keep the structure clear.

  1. Describe a situation where you had to communicate a complex technical solution to a non-technical stakeholder.
  2. How do you handle a request for a feature that you know will negatively impact system stability?
  3. Describe a time you had to manage a client’s expectations during a technical delay.
  4. Describe an instance where you had to optimize a slow-running query or service.

Explain your experience with Java frameworks and how you optimize performance in high-traffic environments.

Medium · Technical Competency and Domain Knowledg

Approach

  1. Choose one real service under load and name the framework layer involved (for example Spring MVC or Boot, Hibernate/JPA, or the servlet container) and your own role. Describe the symptom as a number, such as p95 latency, error rate or throughput at peak, not as 'it was slow'.
  2. Show the diagnosis sequence: reproduce under a load test, take thread dumps or a Java Flight Recorder or profiler capture, read the GC logs, check the slow-query log. Use these to say whether the limit was CPU, I/O, lock contention, connection waits or GC pressure.
  3. Name the fixes you actually made and why they fit the cause: N+1 selects fixed with fetch joins or batch fetching, a missing index, a connection pool sized against the database's connection limit, caching with explicit invalidation, pagination, or moving slow calls off the request thread.
  4. Report the result as before and after under the same load, then the cost: cache staleness, memory, extra complexity, and what you monitored after release.
  5. If your traffic was modest, say so, describe the real case, then explain how you would approach a high-traffic version. Never claim scale you have not run.

Follow-up

  • How did you know the bottleneck was in the application and not the database or the network?
  • What did the fix cost you in staleness, memory or complexity, and how did you watch for regressions?
  • How would you load-test this change before release, and what would make you roll it back?

Walk me through a time you had to diagnose a system failure with limited documentation.

Medium · Problem-Solving and Methodology

Approach

  1. Open with the situation in two sentences: what failed, who was affected, and what was missing, such as no runbook, a departed owner or an undocumented integration. Then spend most of the answer on the reasoning.
  2. Say what you did to contain it first: rollback, failover, disabling a feature or a manual workaround, and how you updated the affected stakeholders while you worked.
  3. Explain how you rebuilt the picture from evidence: logs, metrics, deploy and configuration history, tracing one request through its dependencies, reading the code and asking whoever had touched the system. Keep a timeline as you go and test the cheapest, read-only hypothesis first.
  4. Separate the root cause from the trigger, state the fix, and describe what you left behind: a runbook, an architecture sketch, an alert, a regression test.
  5. The mistake that sinks this story is a lone-hero account with no method, or one that ends at 'I fixed it' with nothing about what the next person inherits.

Follow-up

  • What was the first thing you checked and what did it rule out?
  • How did you confirm the root cause rather than a coincidence with the deploy or another change?
  • What would you document now so the next person does not start from zero?

Estimate work you have never done and defend the range

Hard · estimation · backfills · expand-contract

You are asked to estimate a change you have never attempted: add a column to a 100-million-row table, populate it, move reads across, and drop the old shape. Give a range with the assumptions that generate it, including batch size, the signal your backfill throttles on, and wall-clock hours, and name the three unknowns that would move the number most. Then describe a real estimate you gave under comparable ignorance: how you expressed its uncertainty, what you committed to, and how wrong you turned out to be.

Approach

  1. Decompose into independently deployable steps before estimating anything: add the column nullable, write both shapes, backfill in batches, verify, move reads, stop writing the old shape, drop it. That is four deploys spread over days, and the calendar estimate is dominated by them rather than by the loop's runtime.
  2. Do the arithmetic aloud for the part that has arithmetic in it: batch size times number of batches times per-batch duration, at a write rate the primary can absorb alongside roughly 1.2k writes per second of production traffic. The loop is throttled by replication lag and lock waits, not by how fast it can issue statements.
  3. Price the schema step by its lock rather than its statement duration. In PostgreSQL an ALTER TABLE taking ACCESS EXCLUSIVE waits for every open transaction on that table while later queries queue behind it, so a millisecond change issued during a thirty-second analytics query stalls that table for thirty seconds. Adding a nullable column with a non-volatile default avoids a rewrite from version 11; a new index wants CREATE INDEX CONCURRENTLY, which cannot run inside a transaction block and leaves an invalid index behind if it fails.
  4. Express the answer as a range whose endpoints each trace to a stated assumption, then name the cheapest experiment that collapses it, which is almost always running one real batch against the real table and multiplying.

Follow-up

  • How do you verify the backfill genuinely finished, given rows written by production traffic while it ran?
  • Where does the backfill resume from after a worker is killed mid-batch, and what makes that resume point trustworthy?