cswork / libraryOpen practice workspace

Interview guides · Cardinal Health

Cardinal Health Software Engineer Interview Guide

Cardinal Health Software Engineer interview guide: five reported rounds, Java and Spring Boot, cloud debugging, behavioral stories, and a 7-day plan.

The 60-second brief

Cardinal Health runs a healthcare supply chain that moves medical products to hospitals, pharmacies and clinics. Candidates describe Software Engineer projects that range from cloud infrastructure and data platforms to manufacturing execution systems, built with product managers, manufacturing engineers and quality assurance specialists. The listed stack is Java, JavaScript and Spring Boot, Git for version control, software design patterns, and, as a plus, AWS or Azure, CI/CD pipelines and experience in regulated industries. Day to day, candidates describe writing and reviewing code, troubleshooting production issues, and taking work from requirements through design, deployment and post-release support.

This guide is for engineers interviewing for a Software Engineer position at Cardinal Health. It covers the five reported rounds, the technical and behavioral questions candidates report, and how to prepare for each: how to tell a Java or Spring Boot production story, how to talk through debugging in a cloud environment, how to reason about database trade-offs, and how to build conflict, pivot, code-review and motivation stories. It does not describe any one team, because candidates report that the questions vary by department.

Candidates report five rounds across roughly four to six weeks: Recruiter Contact, Remote Screening, Behavioral Interview, Technical Evaluation and Final Panel Interviews. Some candidates describe a much shorter or much longer process, and gaps between rounds.

Focus areas

  • Behavioral interview skills
  • Java
  • Communication skills (verbal)

Overview

The work is general-purpose software engineering inside a healthcare logistics and manufacturing business. The reported project types (cloud infrastructure, data platforms, manufacturing execution systems) and the reported collaborators (product managers, manufacturing engineers, quality assurance specialists) tell you what your examples should show: you built or fixed something that other teams depended on, and you could talk to those teams in terms they cared about.

The reported topics lean toward behavioral skills, verbal communication, team collaboration, Java and Spring Boot. The reported technical questions are open-ended rather than puzzle-style: the most challenging project you worked on, your production experience with Java, Spring Boot or JavaScript, how you debug a complex issue in a deployed cloud stack, how you write clean and maintainable code, and the trade-offs between database architectures for high-availability systems. Reported scenario prompts include walking through the lifecycle of a request in your last major project and designing for a high volume of concurrent data updates. Each of these is answered best with a real project you can describe down to the class, query and deployment step.

Candidates also report that some teams use a conversational technical screen while others use a take-home assignment or a live whiteboard session, so prepare for all three formats. Spend your first days on the technical material you can be questioned on in depth, then move to behavioral stories, because the later rounds are described as discussions with managerial and director-level staff.

Because the reported environment is regulated and the work reaches quality and compliance stakeholders, build examples around correctness: tests you wrote, how a bad release was caught or rolled back, how you documented a change. Those examples serve both the technical and the behavioral rounds.

The Cardinal Health interview process

These are the five stages candidates describe, in the order they describe them. Formats differ by department, so confirm with your recruiter which stages and which assessment style apply to your team.

Recruiter Contact

Candidates describe this first stage as a conversation with a recruiter about the position and your background. Treat it as a short, structured pitch: the recruiter is matching your history to the posting, and it is also the moment to learn how the rest of the loop is organized for your team. Candidates are advised to ask for a salary range early if none is offered.

What to demonstrate

  • How clearly you summarize your background against the Software Engineer position
  • Whether your stack lines up with the listed languages and tools (Java, JavaScript, Spring Boot, Git, cloud)
  • Whether logistics such as location and compensation expectations fit

How to prepare

  • Write a short career summary that leads with the project where you used Java, Spring Boot or JavaScript in production.
  • Prepare a sentence on why healthcare logistics and manufacturing software interests you, since the final question on that topic is a reported one.
  • Ask which division the role sits in, which assessment formats apply, and ask for the salary range if it has not been shared.

Remote Screening

Candidates describe a remote screening that mixes behavioral and technical evaluation. Expect to speak about your own experience rather than solve a puzzle: your production stack, how you debug a deployed system, how you keep code maintainable. Because it is remote, practise giving a structured spoken answer without a whiteboard in front of you.

What to demonstrate

  • Ability to describe hands-on experience with Java, Spring Boot or JavaScript in a production setting
  • Structured reasoning when asked how you would debug a problem in a cloud deployment
  • Verbal communication over a remote call

How to prepare

  • Prepare a request-lifecycle walkthrough of your last major project, from the client call to the database and back, naming each layer.
  • Rehearse the debugging question as a sequence: what changed, what the logs and metrics show, how you narrow it, how you confirm the fix.
  • Prepare a clean-code answer with concrete habits: small methods, tests, naming, review, a linter in CI.

Behavioral Interview

This stage is described as a behavioral interview about fit within the team. The reported questions are about conflict with a stakeholder or teammate, explaining technical ideas to non-technical partners, pivoting when requirements change, handling code-review feedback, and why healthcare. Answer each with a single real story told in first person and structured with Situation, Task, Action, Result.

What to demonstrate

  • Examples of resolving disagreement with a stakeholder or teammate
  • Ability to communicate with non-technical colleagues such as operations or manufacturing managers
  • Adaptability when scope or deadlines shift
  • Collaboration habits, including how you take and give code-review feedback

How to prepare

  • Write four stories (conflict, explaining a limitation to a business partner, a mid-project pivot, a code-review disagreement) and give each a measurable result.
  • Write the healthcare motivation answer so it points at something specific in your own background.
  • Practise each story aloud until the Action part is in first person singular and the Result is stated plainly.

Technical Evaluation

Candidates describe hands-on coding and design assessments, and report that depending on the team this can be a conversation, a take-home assignment or a live whiteboard session. Prepare for working Java code, clear design reasoning about databases and high-volume updates, and the ability to talk through your thinking as you go.

What to demonstrate

  • Working code and clean structure in the language you choose
  • Design reasoning, including database trade-offs for high-availability systems
  • Clarifying requirements and constraints before writing code

How to prepare

  • Practise writing Java by hand and in an editor, including unit tests, with a short list of constraints you ask about first.
  • Practise design prompts like the reported ones: the lifecycle of a request, and a system that absorbs many concurrent data updates. Name the write path, the consistency you need and the failure behaviour.
  • If a take-home is assigned, plan time for tests, a README that states assumptions, and a clean Git history.

Final Panel Interviews

The last stage is described as in-depth discussions with managerial and director-level staff. Candidates are advised to hold back their most refined behavioral stories for these conversations. Expect questions about your decisions, how you work across teams, and why this role; have questions of your own about roadmap, technical debt and how the team balances quality with speed.

What to demonstrate

  • Judgment and ownership in the decisions you describe
  • Cross-functional teamwork and communication at a more senior audience
  • Motivation for the role and interest in the division

How to prepare

  • Pick two stories where the outcome depended on your decision and be ready to explain what you would change.
  • Research the specific business unit and prepare three questions about its roadmap, its technical debt and its quality practices.
  • Rehearse the healthcare motivation answer and the code-review answer so they sound like your own experience.

Where candidates lose points

Claiming Java, Spring Boot and JavaScript experience across the board, then being unable to go deeper than the framework name.

Choose the technology you truly used in production and prepare a layered walkthrough: request path, transaction handling, configuration, tests, deployment and one problem you fixed. Say honestly which of the three you know less.

Answering the cloud debugging question by naming a tool or jumping to a fix before establishing what happened.

Speak in sequence: confirm the symptom and its start time, check what changed in code, config and infrastructure, read logs, metrics and traces, narrow by bisection, reproduce, fix, add a regression test and write up the cause.

Treating the database architecture question as a list of products instead of a trade-off between consistency, availability, latency and operational cost.

Compare patterns, such as a single primary with replicas, multi-primary and partitioned data. For each, say what happens on failover, which reads may be stale, and what write conflicts you must handle.

Telling behavioral stories in the plural, or from the sidelines, so the interviewer cannot tell what you personally did.

Use first-person singular in the Action section, name your decision and the alternatives you rejected, and end with a result you can describe plainly. Rehearse each story aloud.

Explaining a technical limitation to operations or quality colleagues in engineering vocabulary and never stating the business impact.

Prepare one example where you restated a constraint in terms of delays, risk and options, and be ready to describe how you confirmed the other person understood.

Questions & practice

Explain the most challenging technical project you have worked on and how you overcame specific obstacles.

Medium · Technical and Coding Proficiency

Approach

  1. Pick a project where you owned a technical decision, and open with one sentence on what the system did and its scale, in numbers you can defend (requests per second, rows, users), plus the stack you actually used, such as Java and Spring Boot.
  2. Name the hardest obstacle precisely (a race condition under concurrent updates, a query that degraded under load, a migration with no downtime allowed) and say how you diagnosed it: the profiler output, slow-query log, metric or trace that pointed at the cause.
  3. Lay out the two or three options you weighed and why you chose one: what it cost in complexity, latency or delivery time, and what you gave up.
  4. Close with a measured result (p99 latency before and after, error rate, incidents per month) and one thing you would do differently now.
  5. Only name technologies you can explain in depth. Be ready to sketch the request path end to end and defend each component in it.

Follow-up

  • Walk me through the lifecycle of a request in that system.
  • What would break first if the load grew ten times, and how would you find out before users did?
  • How did you confirm that your fix caused the improvement rather than a traffic change?

Can you walk me through your process for writing clean, maintainable code?

Medium · Technical and Coding Proficiency

Approach

  1. Start from the requirements and the interface. I write the method signatures and a few test cases first, edge cases included (null, empty, duplicates, boundary values), and only then the body.
  2. Keep units small, with one responsibility each, names that state intent and no hidden side effects. In Spring Boot, use constructor injection with final fields so a class can be unit-tested with plain JUnit and Mockito, without starting the application context.
  3. Test in layers: many fast unit tests, fewer integration tests at the boundaries (slice tests such as @WebMvcTest or @DataJpaTest, or @SpringBootTest when the whole context is needed). Run them in CI on every push alongside static analysis such as Checkstyle or SpotBugs for Java, or ESLint for JavaScript.
  4. Name the trade-off with abstraction. Premature interfaces and patterns make code harder to follow, so I tolerate a second copy and extract on the third (the rule of three), prefer composition to inheritance, and use a design pattern only when it isolates a real axis of change.
  5. Make changes easy to review: small pull requests, refactors in separate commits from behaviour changes, commit messages that explain why, and comments only for decisions the code cannot show.

Follow-up

  • How would you add a feature to a legacy class that has no tests?
  • Tell me about a time you chose to leave duplication in place. Why?
  • How do you keep a shared codebase consistent when several developers have different styles?

Identify the heaviest tenants in a five-minute window under memory pressure

Medium · top-k · heavy hitters · streaming

The edge service handles about 3,000 requests per second across roughly 50,000 tenants, peaking near 9,000. Expose the 50 heaviest tenants by request count over the trailing five minutes so limits can be tightened before one tenant's backfill starves the fleet. You may not retain five minutes of raw records. Give the exact solution and its memory, then the bounded-memory approximation with its error stated as a formula, and say which you would ship and at what tenant cardinality that choice changes.

Approach

  1. Do the exact version first, because it is affordable at this cardinality: a ring of 300 one-second counters per tenant, advanced lazily, is 1,200 bytes of counters per tenant and roughly 60 to 90 MB for 50,000 tenants with overhead. Carry a running total and subtract the bucket you overwrite so a window read is O(1) rather than 300 adds.
  2. Extract the top 50 with a size-k min-heap over the tenant sums: O(d log k) for d tenants, against O(d log d) to sort them all. Maintaining the heap continuously instead of on query requires a tenant-to-heap-index map, because incrementing a count already inside the heap means sifting from a known position, and without that map you rebuild the heap on every request.
  3. State the approximation precisely rather than gesturing at sketches. Misra-Gries with m counters retains every item whose true count exceeds N/(m+1), and each retained count underestimates the truth by at most N/(m+1). With m = 1,000 and N = 900,000 requests in the window the error is roughly 900 requests, which is fine for spotting a tenant sending 50,000 and useless for ranking two tenants 200 apart.
  4. Say what breaks when the window slides: Misra-Gries and Space-Saving are insert-only and cannot be decremented as records age out. The workable construction is one summary per sub-window, say ten seconds, with 30 summaries merged at query time, and the merged error is the sum of the per-summary errors, so the bound degrades linearly in the number of sub-windows.

Follow-up

  • The heaviest tenant is heavy because of one export job rather than user traffic. Should the limiter treat those as the same tenant?
  • Two tenants sit tied at the boundary of the top 50. Does your answer flap, and does the flapping matter?

Stop tag and share joins from fanning out a page

Medium · join fan-out · semi-joins · many-to-many

resource_tag is (resource_id, tag_id) with PK (resource_id, tag_id); resource_share is (resource_id, shared_with_user_id, permission). The tagged-and-shared listing inner-joins resource to both, filters tenant_id, tag_id = ANY($2) and shared_with_user_id = $3, orders by updated_at DESC and takes 50. Pages come back with fewer than 50 distinct resources and the total in the header is far too high. Explain the row multiplication, rewrite both the page query and the count query so each is correct, and name the index each one needs. PostgreSQL 16.

Approach

  1. Do the arithmetic against the predicates that are actually there. An inner join emits one row per matching child row, and both joins are filtered: tag_id = ANY($2) admits only the requested tags, shared_with_user_id = $3 admits one user's share rows. So a resource holding three of the requested tags and shared with $3 once yields three rows, not one — the multiplier is its count of matching tags times its share rows for that single user, and that second factor is 1 unless the table admits duplicate (resource_id, shared_with_user_id) pairs. LIMIT 50 then limits rows rather than resources, and COUNT(*) counts pairs — the header is the product, not the population.
  2. Reject DISTINCT as the fix. It deduplicates after the product has been built, so the planner must materialise and sort the fanned-out set before the LIMIT can apply, and it leaves any SUM or AVG in the same select list wrong.
  3. Rewrite both filters as semi-joins, keeping resource as the only row source: AND EXISTS (SELECT 1 FROM resource_tag rt WHERE rt.resource_id = r.resource_id AND rt.tag_id = ANY($2)) and the same shape against resource_share. A semi-join stops at the first match per resource and preserves the driving index order, so ORDER BY updated_at DESC, resource_id DESC LIMIT 50 still stops after 50 rows.
  4. Count with the same predicates and no join at all: SELECT count(*) FROM resource r WHERE r.tenant_id = $1 AND r.status = 'active' AND EXISTS (...) AND EXISTS (...). Nothing multiplies a resource, so the number is the population.

Follow-up

  • The filter changes from 'any of these tags' to 'all of these tags'. Rewrite it and state what it costs relative to the ANY form.
  • A resource can be shared with the same user twice under different permissions. Does your count change, and should it?

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 your thoughts on the trade-offs between different database architectures for high-availability system

Medium · Technical and Coding Proficiency

What are your thoughts on the trade-offs between different database architectures for high-availability systems?

Approach

  1. Start from requirements, not products: RPO (how much acknowledged data you can afford to lose), RTO (how fast service must come back), the read/write ratio, and which data can tolerate stale reads.
  2. Single primary with replicas. Asynchronous replication keeps writes fast, but a failover can lose the last acknowledged writes and replicas serve stale reads. Synchronous replication to a standby gives an RPO of zero at the cost of commit latency, and commits block if the only synchronous standby is down, so configure a quorum of standbys. Automatic failover needs fencing to prevent split-brain.
  3. Consensus-replicated stores (Raft or Paxos, as in distributed SQL databases): 2f+1 replicas tolerate f failures with strong consistency, but every write waits for a majority. Spreading replicas across regions adds round-trip time to each commit, and the minority side of a partition cannot accept writes.
  4. Leaderless quorum or multi-leader designs stay writable through node or region loss. With strict quorums, R + W > N makes every read overlap the latest acknowledged write, but concurrent writes need conflict resolution. Last-write-wins silently drops updates, which is a poor fit for invariants like a stock count that must never go negative.
  5. Close with a mapped choice: a strongly consistent store for orders and counters, replicas or caches for read-heavy reference data, and read-your-writes routing to the primary just after a user's own write. Keep backups and point-in-time restore too, because replication copies a bad DELETE as faithfully as a good write.

Follow-up

  • How do you prevent split-brain during an automatic failover?
  • A read replica lags by thirty seconds. How do you stop a user from seeing their own update disappear?
  • How would you test that a failover actually meets the RTO you committed to?

Design the async export contract a client can resume safely

Hard · async operations · idempotency · leases

A tenant asks for a CSV of every resource. The work runs for minutes on the worker fleet through a job_run row carrying a lease, an attempt count and a dedupe_key, far past the edge's 400 ms budget. Callers are a browser that polls and a script that walks away and checks later. Specify what the submit call returns, the operation resource and its states, how a duplicate submit is handled, how a client learns about completion, what cancellation means given that a lease can expire mid-run, and how the result is fetched and when it expires.

Approach

  1. Split the API in two. Submit returns 202 with an operation id and a location to poll, and never blocks on the work. The operation is a real resource with its own lifecycle - queued, running, succeeded, failed, cancelled - plus attempt, a monotonic progress figure, and a terminal error drawn from the same code taxonomy the synchronous endpoints use, so a client needs one error vocabulary rather than two.
  2. Deduplicate at submit using job_run.dedupe_key, unique over (job_type, dedupe_key) while status is 'queued' or 'running': a repeat submit of the same logical export returns 200 with the existing operation instead of 202 with a new one, and the partial index deliberately permits a legitimate re-run once the first has finished. Pair it with the request's idempotency key so an HTTP-level retry of the submit is exact rather than merely similar.
  3. Tell the poller how to poll: Retry-After on the polling response, a minimum interval enforced at the edge, and a documented maximum lifetime after which an operation is reaped. Polling is the contract of record; the webhook is the fast path, and both must lead to the same terminal state, so a client that receives the completion event and then polls anyway sees no contradiction.
  4. Be exact about cancellation. A cancel request records intent; it cannot stop work already executing. The handler reads the flag at checkpoints, and because a lease expires on a clock that cannot distinguish a dead worker from a slow one, a second copy may start after the cancel was recorded - so the handler re-reads the flag immediately after claiming the lease. 'cancelled' becomes terminal only when no lease is outstanding; reporting it earlier shows a client a stopped job while a worker is still writing output.

Follow-up

  • An operation has said 'running' for 40 minutes and the worker is gone. What does the client see, and which columns in job_run decide that?
  • Two tenants each submit 50 exports at once. What in this contract stops one of them delaying the other?

How do you approach debugging a complex issue in a deployed cloud stack?

Medium · Technical and Coding Proficiency

Approach

  1. Scope it before forming theories: which endpoints, users, regions or versions are affected, since when, and what changed in that window (deploy, config, feature flag, dependency upgrade, traffic spike).
  2. If users are being hurt, mitigate first by rolling back or switching off the flag, and keep the evidence (logs, heap and thread dumps) so you can debug calmly instead of during a live outage.
  3. Follow one failing request across services by its correlation or trace ID. Compare latency, traffic, errors and saturation per service to separate where the failure starts from where it surfaces.
  4. Test one hypothesis at a time with the cheapest check that rules options out: compare a healthy and an unhealthy instance, reproduce in staging with production-like config, or bisect the recent deploys. On JVM services, check GC pauses and thread-pool or connection-pool exhaustion (HikariCP is Spring Boot's default pool).
  5. Watch for the usual traps: retries without backoff that amplify a partial outage, clock skew that misorders logs across hosts, and trace sampling that misses a rare failure. Finish with the fix, a regression test and an alert that would have caught it sooner.

Follow-up

  • The issue only happens in production and you cannot reproduce it. What do you do next?
  • How would you tell whether the deploy caused the problem or just happened at the same time as a traffic change?
  • What instrumentation would you add so the next incident like this is found faster?

Suggested practice checklist

The plan starts with the five reported rounds and your own stack, then works through the reported technical questions (production experience, debugging, clean code, database trade-offs) before spending three days on behavioral stories and a full mock.

Day 1 — Map the loop and inventory your stack

  • List the five reported rounds and note which assessment formats you could face (conversational screen, take-home, whiteboard).
  • List your projects that used Java, Spring Boot, JavaScript, Git, a cloud platform or CI/CD, and rank them by how deeply you can discuss them.
  • Find the business unit you are interviewing for and write three questions about its work.

Deliverable: A one-page loop map, a ranked project inventory and three questions for the team.

Day 2 — Production experience and your hardest project

  • Outline your best Java, Spring Boot or JavaScript production story: layers, config, tests, deployment, one incident.
  • Draw the lifecycle of a request in that project, naming each component it touches.
  • Answer aloud the most challenging technical project and the production experience prompts, and note where you ran dry.

Deliverable: A one-page story outline, a request-lifecycle diagram and two recorded spoken answers.

Day 3 — Debugging and clean code

  • Write a debugging checklist for a deployed cloud service: what changed, logs, metrics, traces, bisection, reproduction, fix, regression test.
  • Refactor a small Java class you wrote and describe each change as a clean-code habit.

Deliverable: A checklist, a before-and-after refactor with notes, and one solved timed problem.

Day 4 — Database trade-offs and high-volume updates

  • Build a table comparing a single primary with replicas, multi-primary, and partitioned data on consistency, failover and operational cost.
  • Outline a design for many concurrent updates: queueing, idempotent writes, optimistic locking and what a retry does.

Deliverable: A comparison table, a one-page concurrent-update design and two completed practice exercises.

Day 5 — Conflict and pivot stories

  • Write a conflict story in Situation, Task, Action, Result form with a measurable result.
  • Write a pivot story that names what you cut and how you protected quality.
  • Practise both aloud and write down the follow-up questions you struggled with.

Deliverable: Two rehearsed stories with answers to three follow-ups each.

Day 6 — Communication, code review and motivation

  • Prepare an explanation of a technical limitation for an operations or manufacturing manager, with options and a recommendation.
  • Write your code-review answer from both the author's and the reviewer's side, with one real example.
  • Write and rehearse the healthcare motivation answer.

Deliverable: One partner-facing explanation, one code-review example and a rehearsed motivation answer.

Day 7 — Full mock and final-panel questions

  • Run a mock with a friend or recorded session that mixes the production experience, debugging and conflict questions.
  • Revise the weakest answer and prepare three questions about roadmap, technical debt and quality versus speed.
  • Prepare follow-up wording for a recruiter or panel in case waits between rounds run long.

Deliverable: A completed mock, a revised weakest answer and a final list of questions for the panel.

Stories for stakeholders, pivots and code review

Candidates report that the behavioral stage is about how you work with other people in a regulated healthcare business: disagreement with stakeholders, explaining engineering to operations and manufacturing colleagues, changing course when requirements move, and taking code-review feedback. Prepare one real story per prompt, each in first person with a concrete result.

  1. Tell me about a time you had to explain a technical limitation to a business partner.

Describe your experience with Java, Spring Boot, or JavaScript in a production environment.

Medium · Technical and Coding Proficiency

Approach

  1. Pick the one of Java, Spring Boot or JavaScript you can defend in depth and say so plainly. Describe one production service end to end: controller, service and repository layers, configuration per environment, how it was deployed, how it was tested.
  2. Show production judgment with specifics: transaction boundaries on the service layer, connection pool sizing, a lazy-loading query that caused N+1 selects and how you fixed it with a fetch join or batch fetching, or a health endpoint and metrics you added.
  3. Name one incident or performance problem you owned: the symptom, how you found the cause, the fix and the regression test you added. Lead with your decision, not the team's.
  4. Tie the story to maintainability: tests at unit and integration level, code review, Git workflow, and how the change reached production through CI/CD if you used it.

Follow-up

  • How did you decide where a transaction should begin and end?
  • What did you monitor after the release, and what would have told you it was wrong?
  • What would you change in that service if you built it again?

Tell me about a time you had to work with a difficult stakeholder or team member. How did you resolve the conf

Medium · Behavioral and Soft Skills

Tell me about a time you had to work with a difficult stakeholder or team member. How did you resolve the conflict?

Approach

  1. Choose a conflict where you were a participant with a real stake, not an observer. Use Situation and Task in two sentences, then spend most of the answer on what you did.
  2. Show that you started by understanding the other person's goal and constraint (a deadline, a compliance requirement, a workload) before arguing your position, and that you gathered facts such as defect counts, a measurement or a short prototype.
  3. Describe the options you put on the table and how you reached agreement, including what each side gave up. State the result in concrete terms and what the relationship looked like afterwards.
  4. The mistake that sinks this answer is a story where the other person is the villain, or where the conflict ended only because a manager decided. If you did escalate, explain why and how you kept the person informed.

Follow-up

  • What if they had still disagreed after you shared the data?
  • What did you learn about how to approach that person next time?
  • Was there a point where you realized you were wrong, and what did you do?

How do you explain technical concepts to non-technical partners, such as manufacturing or operations managers?

Medium · Behavioral and Soft Skills

Approach

  1. Open with the listener's goal. A manufacturing or operations manager cares about line downtime, delayed orders, error rates and risk, so state the impact in those terms first and the mechanism second.
  2. Use one analogy drawn from their world, such as a batch job being like a shift change versus a live feed being like a conveyor, and drop acronyms or define them once.
  3. Give choices rather than a verdict: option A ships sooner with a manual workaround, option B waits for testing and removes the risk. State cost, risk and your recommendation.
  4. Check understanding by asking them to restate the plan in their own words, then follow up in writing with a short summary and the decision made.
  5. Bring a real example, such as explaining why a release needed a regression pass or why a data feed could not be real-time, and say how the conversation changed the decision.

Follow-up

  • How do you handle a partner who does not accept the limitation you described?
  • How do you know they actually understood?
  • How would you explain the same issue to a senior engineer instead?

Describe a situation where you had to pivot quickly due to changing project requirements.

Medium · Behavioral and Soft Skills

Approach

  1. Describe what changed (a requirement, a regulation-driven rule, a stakeholder decision), when and how you learned of it, and what was already built.
  2. Show the triage: what you kept, what you cut or deferred, and how you checked that the remaining plan still met quality and compliance expectations. Mention tests you protected or added.
  3. Explain how you communicated the change: who you told, what trade-off you named, how the schedule or scope was adjusted.
  4. State the result honestly, including something you lost. A pivot story where nothing was lost and you simply worked harder tends to sound weak; a strong one shows prioritization.

Follow-up

  • How did you decide what to drop?
  • How did you keep quality up while the plan changed?
  • What early signal could have warned you that the requirement would shift?

How do you handle feedback during code reviews?

Medium · Behavioral and Soft Skills

Approach

  1. Cover both sides. As an author: read each comment for intent, separate style points (which a formatter or linter in CI should settle) from correctness and design points, reply to every comment, and keep pull requests small enough to review.
  2. Give a real example where feedback changed your design, such as a reviewer spotting a missing null case, a transaction problem or a naming issue, and what you changed and learned.
  3. Show how you push back: with evidence such as a test, a benchmark or a link to the requirement, and by asking a question before disagreeing. Say how you settle it when you still disagree, for instance by pairing or asking a third reviewer.
  4. As a reviewer: comment on the code, not the person, explain the reason and offer a suggestion.

Follow-up

  • Tell me about a time a reviewer was wrong and what you did.
  • How do you handle feedback from someone more senior than you when you disagree?
  • How do you give feedback on a teammate's pull request that has a serious design problem?

Why are you interested in applying your engineering skills to the healthcare industry?

Medium · Behavioral and Soft Skills

Approach

  1. Give a personal, specific reason, such as a family experience, an earlier project in logistics or health data, or interest in systems where a defect has real consequences. A generic wish to make a difference reads as rehearsed.
  2. Link it to the work candidates describe: software behind a supply chain that reaches hospitals, pharmacies and clinics, and manufacturing and quality teams you would work with. Do not claim knowledge of the company's internal systems that you do not have.
  3. Show what the interest means for how you engineer: care with correctness, tests, traceability of changes, and willingness to work with quality and compliance reviewers.
  4. Mention the division you researched and one thing about its problem space that you would like to work on, then stop. Keep the answer short and honest.

Follow-up

  • What engineering practices matter more when software supports a regulated business?
  • What would you do if a quality gate delayed a release you were proud of?
  • Which part of this division's work interests you most and why?