cswork / libraryOpen practice workspace

Interview guides · ZF Group

ZF Group Software Engineer Interview Guide

ZF Group Software Engineer interview guide: reported rounds, questions and how candidates describe the process.

The 60-second brief

As a Software Engineer at ZF Group, you are at the intersection of high-end mechanical engineering and advanced digital intelligence. You will contribute to the development of next-generation mobility systems, ranging from 1-D Simulation and Model-Based Design (MBD) to critical Hardware-in-the-Loop (HIL) testing. Your work directly impacts the safety, efficiency, and performance of automotive platforms used globally. The role is inherently complex, requiring you to bridge the gap between abstract mathematical models and physical vehicle performance. Whether you are optimizing simulation environments or validating embedded systems, your contributions are essential to the ZF Group mission of "Next Generation Mobility." You will work in high-stakes environments where precision is not just a goal—it is a requirement. This position offers significant strategic influence.

This guide is scoped to a Software Engineer candidate at ZF Group.

Focus areas

  • Software Engineering
  • Hardware-in-the-Loop (HIL)
  • Quality Management Systems (QMS)

The ZF Group interview process

ZF Group candidates report 4 rounds over 3-5 weeks. The stages below are what candidates describe, not a published process.

Technical Portfolio Review

Initial review of your technical portfolio to assess relevant skills.

What to demonstrate

  • Initial review of your technical portfolio to assess relevant skills
  • Depth in Software Engineering

How to prepare

  • Answer aloud and timed: Explain the workflow for developing a 1-D simulation model for vehicle dynamics.
  • Answer aloud and timed: How do you handle discrepancies between simulation results and physical test data?

Domain-Specific Interviews

In-depth discussions with hiring managers and senior technical leads about your domain experience.

What to demonstrate

  • In-depth discussions with hiring managers and senior technical leads about your domain experience
  • Depth in Software Engineering

How to prepare

  • Answer aloud and timed: Describe your experience with Simpack or ADAMS in a professional environment.
  • Answer aloud and timed: What are the critical factors when setting up a Hardware-in-the-Loop (HIL) test bench?

Project Discussion

Detailed discussions about your previous projects and your specific role in their success.

What to demonstrate

  • Detailed discussions about your previous projects and your specific role in their success
  • Depth in Software Engineering

How to prepare

  • Answer aloud and timed: How do you ensure the integrity of data within a Quality Management System (QMS)?
  • Answer aloud and timed: Describe a time you identified a flaw in a simulation model; how did you resolve it?

Final Technical Assessment

Final evaluation of your technical capabilities before a decision is made.

What to demonstrate

  • Final evaluation of your technical capabilities before a decision is made
  • Depth in Software Engineering

How to prepare

  • Answer aloud and timed: How do you prioritize testing requirements when faced with tight development deadlines?
  • Answer aloud and timed: Explain your process for debugging a complex integration issue between hardware and software.

Where candidates lose points

Quantify your impact

When discussing past projects, use data to show your results. Instead of saying you "improved simulation speed," state that you "reduced simulation runtime by 20% by optimizing the solver settings."

Master your resume

You will be asked to walk through your experience. Know every detail of every project you list, especially those involving complex software or simulation work.

Show your work

If you have documentation or examples of your engineering methodology (without violating previous employer NDAs), be ready to discuss the logic you applied.

Questions & practice

How do you prioritize testing requirements when faced with tight development deadlines?

Medium · Problem Solving & Methodology

Approach

  1. Restate the input: its shape, its size, and what is guaranteed about it.
  2. Name the brute-force solution and its complexity before improving on it.
  3. Choose the data structure from the access pattern, not from familiarity.
  4. State the target complexity and say which constraint rules the naive version out.

Follow-up

  • How does this change if the input no longer fits in memory?
  • What is the worst case, and how likely is it on real data?

How do you approach the continuous improvement of existing simulation tools?

Medium · Problem Solving & Methodology

Approach

  1. Restate the input: its shape, its size, and what is guaranteed about it.
  2. Name the brute-force solution and its complexity before improving on it.
  3. Choose the data structure from the access pattern, not from familiarity.
  4. State the target complexity and say which constraint rules the naive version out.

Follow-up

  • How does this change if the input no longer fits in memory?
  • What is the worst case, and how likely is it on real data?

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?

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?

Replace offset paging on the resource feed with keyset

Easy · keyset pagination · composite index · sort order

resource holds resource_id, tenant_id, owner_user_id, title, body_ref, version, status ('draft','active','archived','deleted'), created_at, updated_at, deleted_at, with an index on (tenant_id, status, updated_at DESC, resource_id DESC). The listing endpoint returns active resources for one tenant, newest update first, 50 per page, today with LIMIT 50 OFFSET n. Tenants reach page 400 and rows are created while they read. Write the keyset query, define what the cursor carries and how it is encoded, and say which part of the index each predicate uses. Assume PostgreSQL 16.

Approach

  1. Name the two failures separately. OFFSET 20000 makes the server produce and discard 20,000 rows, so page cost grows with depth rather than with page size. Independently, any write that changes how many rows sort above the offset moves the window between two fetches, and the direction decides which anomaly you get: an insert lands at the head of updated_at DESC and pushes already-returned rows down past the boundary, so they are returned a second time; a delete above the offset, or a row whose updated_at is bumped above the cursor, pulls rows up and one is never returned at all. Nothing in the response reveals either.
  2. Write the seek: WHERE tenant_id = $1 AND status = 'active' AND (updated_at, resource_id) < ($2, $3) ORDER BY updated_at DESC, resource_id DESC LIMIT 50. The row-value comparison is one index range rather than a disjunction, and both columns are NOT NULL, which is what makes that comparison well defined.
  3. Map each predicate onto the index: tenant_id and status are equality on the leading columns, (updated_at, resource_id) is the range, and the ORDER BY matches the index order so no Sort node appears and the scan stops after 50 rows. The DESC in the definition only matters for mixed directions — a plain ascending btree on the same columns is read backwards for this query.
  4. Put both sort columns in the cursor and nothing the client can tamper with into another tenant: base64 of (updated_at, resource_id), validated server-side, with tenant_id taken from the principal.

Follow-up

  • The client asks for 'jump to page 400'. What do you offer instead, and what does the honest version cost?
  • Sort order becomes user-selectable across four columns. How many indexes is that, and which would you refuse to add?

Explain the workflow for developing a 1-D simulation model for vehicle dynamics.

Medium · Technical Domain Expertise

Approach

  1. Clarify what is being asked and what a complete answer contains.
  2. State your assumptions explicitly before working the problem.
  3. Say what you would check first and why it is the highest-information step.
  4. Work from the requirement backwards to the design.

Follow-up

  • What assumption would you test first?
  • How would you know your answer was wrong?

What are the critical factors when setting up a Hardware-in-the-Loop (HIL) test bench?

Medium · Technical Domain Expertise

Approach

  1. Clarify what is being asked and what a complete answer contains.
  2. State your assumptions explicitly before working the problem.
  3. Say what you would check first and why it is the highest-information step.
  4. Work from the requirement backwards to the design.

Follow-up

  • What assumption would you test first?
  • How would you know your answer was wrong?

How do you ensure the integrity of data within a Quality Management System (QMS)?

Medium · Technical Domain Expertise

Approach

  1. Clarify what is being asked and what a complete answer contains.
  2. State your assumptions explicitly before working the problem.
  3. Say what you would check first and why it is the highest-information step.
  4. Work from the requirement backwards to the design.

Follow-up

  • What assumption would you test first?
  • How would you know your answer was wrong?

Explain your process for debugging a complex integration issue between hardware and software.

Medium · Problem Solving & Methodology

Approach

  1. Establish what changed and when, before forming any theory.
  2. Pick a bisection that eliminates candidates whichever way it turns out.
  3. Check the instrumentation before believing the symptom.
  4. Separate the trigger from the cause; the deploy is rarely the bug.

Follow-up

  • What would you look at first, and what would it rule out?
  • How would you tell a cause from a coincidence here?

Suggested practice checklist

Built from the rounds and topics ZF Group candidates report.

Day 1 — Map the ZF Group loop

  • Write out the reported sequence: Technical Portfolio Review, Domain-Specific Interviews, Project Discussion, Final Technical Assessment.
  • For each round, write one sentence on what it is judging, from the description above, and mark the one you are least ready for.

Deliverable: A one-page map of the 4 reported rounds, with the weakest marked.

Day 2 — Work Software Engineering

  • Spend the session on Software Engineering, which ZF Group candidates report being tested on.
  • Write one worked example in Software Engineering and time yourself on it.

Deliverable: One timed worked example in Software Engineering.

Day 3 — Work Hardware-in-the-Loop (HIL)

  • Spend the session on Hardware-in-the-Loop (HIL), which ZF Group candidates report being tested on.
  • Write one worked example in Hardware-in-the-Loop (HIL) and time yourself on it.

Deliverable: One timed worked example in Hardware-in-the-Loop (HIL).

Day 4 — Work Quality Management Systems (QMS)

  • Spend the session on Quality Management Systems (QMS), which ZF Group candidates report being tested on.
  • Write one worked example in Quality Management Systems (QMS) and time yourself on it.

Deliverable: One timed worked example in Quality Management Systems (QMS).

Day 5 — Answer out loud: Technical Domain Expertise

  • Answer aloud, timed: Explain the workflow for developing a 1-D simulation model for vehicle dynamics.
  • Answer aloud, timed: How do you handle discrepancies between simulation results and physical test data?

Deliverable: Spoken answers to 2 reported Technical Domain Expertise question(s), under time.

Day 6 — Answer out loud: Problem Solving & Methodology

  • Answer aloud, timed: Describe a time you identified a flaw in a simulation model; how did you resolve it?
  • Answer aloud, timed: How do you prioritize testing requirements when faced with tight development deadlines?

Deliverable: Spoken answers to 2 reported Problem Solving & Methodology question(s), under time.

Day 7 — Dry run for ZF Group

  • Run one full mock under time, then write down the two questions you most want to ask your interviewers.

Deliverable: A completed timed mock and two questions to ask.

Behavioural preparation

Behavioural rounds judge the decision you made and what it cost.

How do you handle discrepancies between simulation results and physical test data?

Medium · Technical Domain Expertise

Approach

  1. Pick a story where you made the decision, not one where you watched it.
  2. State the situation in two sentences and spend the rest on the reasoning.
  3. Give the blast radius: what could have broken, and what you measured.
  4. Name the disagreement and how you resolved it with evidence.

Follow-up

  • What would you do differently if you ran that again?
  • How did you know your change caused the improvement?

Describe your experience with Simpack or ADAMS in a professional environment.

Medium · Technical Domain Expertise

Approach

  1. Pick a story where you made the decision, not one where you watched it.
  2. State the situation in two sentences and spend the rest on the reasoning.
  3. Give the blast radius: what could have broken, and what you measured.
  4. Name the disagreement and how you resolved it with evidence.

Follow-up

  • What would you do differently if you ran that again?
  • How did you know your change caused the improvement?

Describe a time you identified a flaw in a simulation model; how did you resolve it?

Medium · Problem Solving & Methodology

Approach

  1. Pick a story where you made the decision, not one where you watched it.
  2. State the situation in two sentences and spend the rest on the reasoning.
  3. Give the blast radius: what could have broken, and what you measured.
  4. Name the disagreement and how you resolved it with evidence.

Follow-up

  • What would you do differently if you ran that again?
  • How did you know your change caused the improvement?