BNSF Railway · Software Engineer
Updated · 2026-10-02

BNSF Railway Software Engineer
Interview Guide

THE 60-SECOND BRIEF

BNSF Railway is a freight railroad network in North America. Candidates report that its software engineers build the systems behind train dispatching, asset tracking, inventory processing and supply chain logistics. The reported backend stack is Java and Spring Boot with asynchronous messaging, while front-end and full-stack engineers build live dashboards in Angular. Reported work includes event ingestion pipelines for asset health metrics, REST APIs for shipment routing and database transaction tuning. In this role you write and test services that handle telemetry and operational updates from physical equipment, so correctness and fault tolerance are part of the day job.

This guide is for candidates interviewing for a Software Engineer role at BNSF Railway, on either a backend (Java, Spring Boot) or a front-end and full-stack (Angular) track. It covers the three reported stages, which are the online assessment, the technical interviews and the behavioral interviews. It also covers the five groups of reported questions: Java and Spring Boot mechanics, low-level object-oriented design, system design for telemetry and APIs, coding and algorithms, and behavioral and safety questions. The requirements candidates describe include Spring MVC, Spring Data JPA and Spring Security, SQL on Oracle, PostgreSQL or SQL Server, and JUnit, Mockito or pytest. Angular, Kafka, RabbitMQ, ActiveMQ, Docker, Kubernetes, AWS and Azure are described as extras.

Candidates report three stages over roughly 3-5 weeks: an online assessment, one or more technical interviews, and behavioral interviews. A recruiter call and a loop of several rounds, by video or onsite in Fort Worth, TX, are also reported.

SQL (coding/queries)System DesignMachine Learning / ML System Design

51 min read

Browse Software Engineer questions

See the practice prompts

27Practice promptsAcross five skill areas

This guide lists 23 reported questions in five groups: five on Java and Spring Boot internals, five on low-level design, five on system design, four on coding and four on behavioral and safety topics. The spread tells you where to spend time. Framework recall and runnable object-oriented code get as much weight as architecture, and pure algorithm practice is a smaller share than on many other loops. Candidates describe the process as built around practical engineering rather than puzzles alone.

The Java and Spring Boot group rewards precise recall. Be able to explain REQUIRED against REQUIRES_NEW, which exceptions roll a transaction back by default, and why a call from one method to another in the same bean skips the transaction proxy. Know how an @Aspect with @Around advice wraps controller methods, how a REST controller maps paths, validates payloads and hands errors to a global handler, why a mutable object makes a dangerous HashMap key, and when a stream pipeline holds data in memory. Candidates say the online assessment is typed into a plain editor with limited reference material, so practise this from an empty file with autocomplete switched off.

The low-level design questions ask for working code, not only a diagram. The in-memory key/value store with begin, commit and rollback, the visit-count service built on thread-safe structures, and the unit tests that mock an external dependency all end in something you can run. The train and asset-health models are about entities, relationships and REST endpoints. Reports mention a main method or a test suite as the proof that the design works, so plan to finish each design with executable checks and explicit handling of nulls, missing payload keys and database timeouts.

The system design group centres on telemetry from thousands of moving trains, queues such as Kafka or RabbitMQ, caches in front of a relational store, rate limiting, and a migration from a monolithic dispatching tool. Behavioral rounds are reported to give safety real weight, so every story should show a safeguard: a test, a staged release, a rollback path or a check before acting. Rehearse the outage and the design-disagreement stories with the STAR structure, and prepare a concrete answer on how safety shapes your daily engineering and deployment habits.

01

Online Assessment

reported

Candidates describe a timed online assessment, reported as delivered through Codility, that mixes algorithms and data structures with Java. Other reports say the tasks look like framework work: building a Spring Boot controller, configuring database transactions or writing an Angular component. Code is reported to go straight into the platform editor with few reference materials. Prepare it as a closed-book build test and practise producing working framework code from an empty file.

What to demonstrate

  • Producing compiling, working Java code inside a plain platform editor
  • Recall of Spring Boot mechanics such as controllers, validation and @Transactional settings without documentation
  • Core algorithm and data-structure work, which the round description lists next to Java
  • For front-end and full-stack tracks, writing a basic Angular component

How to prepare

  • Write a CRUD controller from an empty file: path parameters, request validation, a filter through query parameters and a global exception handler that returns one consistent error body.
  • Rehearse an inventory-update service with @Transactional: REQUIRED joins the caller's transaction, REQUIRES_NEW suspends it and commits on its own, and unchecked exceptions roll back by default while checked ones do not.
  • Solve two-pointer and sliding-window problems in a plain text editor, with no autocomplete, and run them against edge cases like an empty array and a window larger than the input.
  • Test your setup before you open the invitation. Candidates say invitations can mention a 7-day window while recruiters encourage finishing within 3 days.
BNSF Railway Software Engineer candidate reports ↗
02

Technical Interviews

reported

Candidates describe one or more interviews built on scenario-based questions. The loop is reported to cover live coding, low-level class design, high-level architecture and framework depth in Java and Spring Boot, and to run by video or onsite at Fort Worth, TX. Candidates also report being allowed to share their screen and use a local IDE such as IntelliJ IDEA, PyCharm or VS Code. Work through the reported Java, design and coding questions aloud, and finish designs with code or tests that run.

What to demonstrate

  • Working code with explicit error handling for nulls, missing payload keys and database timeouts
  • Object-oriented design that turns an operational domain such as trains, engines and maintenance status into clear classes, plus unit tests
  • Architecture for high-volume telemetry using queues, caches and relational storage
  • Depth in Java and Spring Boot, including transactions, AOP, equals and hashCode, and streams

How to prepare

  • Build the in-memory key/value store with get, set, count, begin, commit and rollback, including nested transactions, and add a main method or JUnit tests that prove each case.
  • Write a visit-count service two ways, with ConcurrentHashMap and merge, and with an atomic counter or LongAdder per key, and explain why a plain HashMap with get-then-put loses updates.
  • Write JUnit and Mockito tests, or pytest with a mock, for an ingestion service whose queue client and database repository are replaced by test doubles.
  • Talk through a pipeline that ingests health metrics from 5,000 trains and alerts dispatchers: partition key, consumer groups, duplicate and out-of-order events, a cache in front of the database, and the alert path.
BNSF Railway Software Engineer candidate reports ↗
03

Behavioral Interviews

reported

Candidates describe interviews on past experience, teamwork and alignment with company values, and report that safety is discussed explicitly. The reported prompts cover a production outage, a design disagreement, daily safety and risk practices, and owning an ambiguous requirement. Candidates also report STAR as the way to keep answers concise, with a clear statement of your own contribution. Prepare four first-person stories and a short answer on safety habits.

What to demonstrate

  • Past experience told through a clear structure that shows your own contribution
  • Working through disagreement with colleagues or stakeholders over a design
  • Handling production incidents and operational stress methodically
  • How you connect testing, reliability and risk management to safe delivery

How to prepare

  • Write STAR outlines for the outage story and the design-disagreement story. Each needs a decision you made, how you checked it, and a result you can measure.
  • Prepare a safety answer built from real habits: tests before release, staged rollouts, a rollback plan, defensive checks on input and review of risky changes.
  • Choose a story where you took charge of a vague requirement: the questions you asked, the assumptions you wrote down, and how you got it delivered.
  • Add one story where you pushed back on a deadline because quality or data security was at risk, and what you offered in its place.
BNSF Railway Software Engineer candidate reports ↗

PracHub editorial advice for the preparation topics above.

01

Saying @Transactional "rolls back on exception" and stopping there

State the details: unchecked exceptions roll back by default and checked ones do not unless configured, REQUIRES_NEW commits independently of the outer transaction, and a call within the same bean bypasses the proxy so no transaction starts. Rehearse them on an inventory update example.

02

Handing in a class diagram for the key/value store or the train model with no code that runs

Reports describe executable solutions with a main method or tests. Write the store with get, set, count, begin, commit and rollback, then test rollback with no open transaction, nested transactions and count after a rollback.

03

Calling the visit-count service thread-safe because it uses a concurrent collection, while the update is a separate read and write

Make the increment atomic with ConcurrentHashMap.merge or compute, or an atomic counter or LongAdder per key. Say which race the choice removes and how you would test it with many threads.

04

Drawing a Kafka box for the train telemetry design and moving on without partitioning, duplicates, ordering or the alert path

Name the partition key (train or asset id), what a consumer does with a duplicate or late event, where the cache sits, how the database handles writes against reporting reads, and what happens when a consumer falls behind.

05

Telling outage or disagreement stories in "we" language with no safeguard or result

Say what you decided, how you checked it and what changed afterward. Include one safety element in each story, such as a rollback path, a staged release or a test you added, because candidates report safety is discussed explicitly.

Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.

24 technical prompts0 include a worked solution

What is the difference between `.equals` and `==` in Java, and how does object immutability affect key hashing

medium
Java & Spring Boot Development

What is the difference between .equals and == in Java, and how does object immutability affect key hashing in collection types?

Approach
  1. == compares primitive values, and for objects compares references (same instance); equals() is logical equality, and Object's default equals() is itself an identity check, so a class only gets value equality by overriding it.
  2. Point out the traps: string literals are interned, so == can appear to work for strings until one is built at runtime; Integer.valueOf caches -128 to 127, so == between boxed Integers works for small values and fails above; BigDecimal.equals compares scale (1.0 and 1.00 are unequal) while compareTo returns 0.
  3. State the contract: if a.equals(b) then a.hashCode() == b.hashCode(), so override both together from the same fields. Overriding only equals lets a HashSet hold two equal elements, because their different hash codes mean equals is usually never consulted.
  4. Explain why mutability breaks hashing: HashMap picks the bucket from hashCode at insertion; if a field used in hashCode changes afterwards, get() and containsKey() search the wrong bucket and miss an entry that still occupies memory. Immutable keys (String, records with immutable components, final fields) avoid this and can cache their hash, as String does.
  5. Mention sorted collections: TreeMap and TreeSet use compareTo or a Comparator instead of equals, so a comparator inconsistent with equals makes the set treat distinct objects as duplicates.
Follow-up
  • What happens to a HashMap entry if you mutate its key after put()?
  • Is a Java record a safe map key if one of its components is a List?
  • How would you write equals() for a class whose subclass adds a field?

How do Java Streams filter and map operations execute under the hood, and how would you optimize stream pipeli

medium
Java & Spring Boot Development

How do Java Streams filter and map operations execute under the hood, and how would you optimize stream pipelines for memory consumption?

Approach
  1. Streams are lazy: filter and map only add stages to a pipeline, and nothing runs until a terminal operation (collect, forEach, reduce, findFirst). The terminal operation pulls each element through all the fused stages in turn, so filter followed by map is a single pass with no intermediate collection.
  2. Separate stateless from stateful operations: filter, map and flatMap handle one element at a time, while sorted() buffers the whole stream and distinct() keeps a set of everything seen, so memory grows there. Short-circuiting operations (findFirst, anyMatch, limit) stop pulling from the source early.
  3. Memory optimisations: filter before map so fewer objects are created, use IntStream, LongStream or mapToDouble to avoid boxing, read files with Files.lines inside try-with-resources instead of readAllLines, and aggregate with downstream collectors such as groupingBy(key, counting()) rather than grouping into lists first.
  4. Be precise about parallel streams: they run on the common ForkJoinPool, pay off only for large CPU-bound work on easily split sources such as arrays or ArrayList, do not reduce memory, and order-dependent operations like limit and forEachOrdered can make them slower.
  5. Note that a stream can be consumed once (reuse throws IllegalStateException), and measure with JMH or a profiler before replacing a stream with a plain loop on a hot path.
Follow-up
  • In what order do the side effects print for a stream with peek, filter and findFirst?
  • Why can sorted() on a very large stream exhaust the heap, and what would you do instead?
  • When is a parallel stream slower than a sequential one?

Build a user activity service in Java or Python that tracks page visits and increments visit counts concurrent

medium
Low-Level & Object-Oriented Design (LLD)

Build a user activity service in Java or Python that tracks page visits and increments visit counts concurrently with thread-safe data structures.

Approach
  1. Explain the bug first: map.put(page, map.get(page) + 1) on a HashMap is a read-modify-write race, so concurrent increments are lost, and concurrent writes to a plain HashMap can also corrupt its internal structure.
  2. In Java use ConcurrentHashMap<String, LongAdder> with counts.computeIfAbsent(page, k -> new LongAdder()).increment(): computeIfAbsent creates the adder atomically, and LongAdder spreads contention across cells, so it scales better than AtomicLong under heavy writes; merge(page, 1L, Long::sum) is a simpler atomic alternative.
  3. For per-user counts, key on a composite (userId, page) record or nest maps; note that LongAdder.sum() is not an atomic snapshot while increments continue, which is acceptable for visit counts.
  4. In Python, d[k] += 1 is a separate load, add and store, so it is not atomic even with the GIL; guard a dict or collections.Counter with a threading.Lock, or shard locks by key hash to reduce contention.
  5. Prove it with a test: an ExecutorService runs N threads that each record M visits, a CountDownLatch releases them together, and the assertion is that the total equals N times M; repeat the run, since a race can pass once by luck.
Follow-up
  • The service now runs on several instances. Where do the counts live, and how do you increment them atomically?
  • How would you return the ten most visited pages without blocking writers?
  • How would you bound memory if the number of distinct pages is unbounded?

Write executable unit tests using pytest or JUnit to mock external dependencies for a backend data ingestion s

medium
Low-Level & Object-Oriented Design (LLD)

Write executable unit tests using pytest or JUnit to mock external dependencies for a backend data ingestion service.

Approach
  1. Make the service testable first: inject its dependencies (source client, parser, repository, publisher, Clock) through the constructor so tests can swap in mocks without patching statics or touching a network.
  2. JUnit 5 with Mockito: @ExtendWith(MockitoExtension.class), @Mock for each dependency and @InjectMocks for the service; stub with when(client.fetch()).thenReturn(batch) or thenThrow(...) for a timeout (Mockito rejects a checked exception the method does not declare), and inspect what was saved with verify(repository).saveAll(captor.capture()) and an ArgumentCaptor.
  3. pytest: patch the name where the service looks it up, for example patch("ingest.service.fetch_batch") when the service did from client import fetch_batch; use MagicMock with side_effect for a sequence of results or a raised exception, fixtures for shared setup and pytest.mark.parametrize for malformed-record variants.
  4. Cover the cases that matter for ingestion: happy path, empty batch, a malformed record that is skipped and counted while the rest are saved, a downstream timeout that is retried and then sent to a dead-letter path, and a duplicate record that is not saved twice.
  5. Keep mocks honest: assert outcomes and key interactions rather than every call, inject a fake clock or retry policy instead of sleeping, and add one integration test against real infrastructure (for example Testcontainers), since mocks cannot catch a wrong SQL statement or serializer.
Follow-up
  • How do you test the retry logic without the test waiting through the backoff?
  • When would you use a spy instead of a mock?
  • What does a mock-heavy suite miss, and how do you cover it?

Given an array of event logs, write an efficient algorithm using a two-pointer technique to find the shortest

medium
Coding & Algorithms

Given an array of event logs, write an efficient algorithm using a two-pointer technique to find the shortest sub-array containing a specific sequence of status codes.

Approach
  1. Clarify what containing the sequence means before coding: all target codes in any order (with multiplicity), or the codes in the given order as a subsequence; the two need different algorithms. Also agree what to return when no window exists.
  2. Any order: the minimum-window technique. Keep a map of required counts and a count of satisfied codes; advance the right pointer to add events, and while every code is satisfied, record the window and advance the left pointer to shrink it. Each pointer moves at most n times, so time is O(n + m) and space is O(k) for k distinct target codes.
  3. In order: scan forward with one pointer over the logs and one over the pattern until the pattern is fully matched, then scan backward from that end to find the latest start that still matches, record the window and restart just after that start. A DP over (log index, pattern index) solves the same problem in O(n·m) time and O(m) space.
  4. Edge cases: an empty pattern, a code that never appears, repeated codes in the pattern (counts matter), several minimal windows of equal length (say which you return, usually the earliest) and a log shorter than the pattern.
Follow-up
  • The logs arrive as a stream that does not fit in memory. Which version still works, and what state do you keep?
  • How would you return every minimal window rather than the first?
  • What changes if the codes must be adjacent with nothing between them?

Parse a raw server execution log to extract error frequencies, count unique word patterns, and identify system

medium
Coding & Algorithms

Parse a raw server execution log to extract error frequencies, count unique word patterns, and identify system performance anomalies.

Approach
  1. Stream the file line by line (BufferedReader, or iterating the file object in Python) instead of loading it whole, and parse each line with one precompiled regex with named groups for timestamp, level, component, latency and message; count malformed lines instead of crashing, and attach multi-line stack traces to the entry that started them.
  2. Error frequencies: a hash map keyed by error code or exception class, incremented for each ERROR line; for the top k use a size-k min-heap in O(n log k), or sort the distinct keys once if there are few.
  3. Word patterns: normalise each message into a template by replacing variable parts (numbers, ids, UUIDs, IP addresses, paths) with fixed tokens, then count templates in a hash map, so timeouts that differ only in milliseconds count as one pattern; for plain word counts, lowercase and split on non-word characters.
  4. Anomalies: bucket events by minute and flag buckets where error count or p99 latency exceeds the trailing mean plus three standard deviations, or use a rolling median and median absolute deviation, which a single spike distorts less.
  5. Complexity: parsing is linear in input size, and memory grows with the number of distinct keys and templates rather than lines; handle time zones and clock skew when logs come from several servers.
Follow-up
  • The logs total 50 GB across 200 servers. How does the design change?
  • Traffic doubles every morning. How do you stop the detector flagging that as an anomaly?
  • How would you test the template normaliser?

Implement a sliding window algorithm to calculate rolling average delays across train movement time-series dat

medium
Coding & Algorithms

Implement a sliding window algorithm to calculate rolling average delays across train movement time-series data.

Approach
  1. Clarify the window: the last k readings (count-based) or the last W units of time (time-based), per train or across all trains, and what to emit before the window fills.
  2. Count-based: keep a running sum, add the entering value, subtract values[i - k] as it leaves, and emit sum / k; this is O(n) time and O(1) extra space instead of the O(n·k) cost of re-summing every window.
  3. Time-based: keep a deque of (timestamp, delay) plus a running sum and count; append each reading, pop from the front while its timestamp falls outside the window, and emit sum / count. Each reading enters and leaves the deque once, so the total is O(n) amortised.
  4. For many trains, keep a map from train id to its deque and sums; sort each train's readings by timestamp first if order is not guaranteed (O(n log n)), and skip or count readings with missing delays instead of treating them as zero.
  5. Watch the numerics: use floating-point division (integer division truncates in Java), and on long streams store delays in integer units such as seconds or recompute the sum periodically to avoid floating-point drift from repeated add and subtract.
Follow-up
  • How would you compute a rolling median instead of a mean?
  • Readings arrive a few minutes out of order. How do you keep the averages correct?
  • How much memory does this need for every train at once, and how would you cap it?

Walk through your approach to optimizing an $O(N^2)$ brute-force array search down to $O(N)$ runtime complexit

medium
Coding & Algorithms

Walk through your approach to optimizing an $O(N^2)$ brute-force array search down to $O(N)$ runtime complexity.

Approach
  1. Anchor it in a concrete example such as finding a pair that sums to a target: brute force checks all n(n-1)/2 pairs, O(n^2); one pass with a hash map from value to index checks whether target minus x has been seen before inserting x, giving O(n) expected time and O(n) space.
  2. Name the general levers: a hash set or map replaces an inner lookup loop; prefix sums with a map of prefix counts find subarrays summing to k in O(n); two pointers work on sorted input; a sliding window handles contiguous ranges when the condition is monotonic; a monotonic stack answers next-greater-element in O(n).
  3. State the trade-offs: hash lookups are O(1) expected, not worst case, and cost O(n) memory; with tight memory, sort and use two pointers for O(n log n) time and O(1) extra space if in-place sorting is allowed, carrying original indices along if they are needed.
  4. Check the edge cases that break the optimisation: duplicates and reusing the same element in pair problems, negative numbers (they break the sliding-window shrink condition, so use prefix sums instead) and empty or single-element arrays.
  5. Justify the bound aloud (each element is inserted and looked up once, or each pointer only moves forward), then test the optimised version against the brute force on random inputs.
Follow-up
  • Why does a sliding window fail for subarray sum equals k when values can be negative?
  • How would you solve it with O(1) extra space?
  • What changes if you must return every matching pair rather than one?

Describe a project where you demonstrated leadership by taking ownership of an ambiguous technical requirement

medium
Behavioral & Safety Culture

Describe a project where you demonstrated leadership by taking ownership of an ambiguous technical requirement and guiding it to delivery.

Approach
  1. Pick a project where the requirement was genuinely unclear and you closed the gap yourself; open with the situation in two or three sentences and what made it ambiguous (conflicting stakeholders, unknown data, no agreed success criteria).
  2. Show how you reduced the ambiguity: listed the open questions, interviewed the users, wrote a short design document stating your assumptions and asked stakeholders to confirm or correct it, and built a small prototype to test the riskiest assumption.
  3. Show the leadership: how you split the work, who you brought in, the scope trade-off you made (what you left out of the first release and why) and how you kept stakeholders informed when the plan changed.
  4. Close with a measurable result and a lesson: what shipped, the metric or user outcome that moved, and what you would clarify earlier next time; narrate your own actions in the first person singular.
  5. The mistake that sinks it: a story that is really about executing a clear specification, or one where the ambiguity resolved itself; the story has to contain decisions you made while the requirement was still uncertain.
Follow-up
  • Which assumption turned out to be wrong, and how did you find out?
  • How did you handle a stakeholder who disagreed with your reading of the requirement?
  • What would you have done if the deadline could not move?

Each day targets one reported stage or question group, starting with Spring Boot recall in a plain editor and ending with the behavioral stories. Tasks use the reported questions, and a few PracHub practice drills are linked for SQL, debugging and decision-reversal practice.

Small steps. Visible outcomes.0 / 7 completed
ONE WEEK · YOUR PACE

Prepare, practise & reflect

One practical outcome each day. Spend longer where you need it.

0 / 7 done
01Map the loop and set up a no-autocomplete environment
  • Write out the reported sequence (Online Assessment, Technical Interviews, Behavioral Interviews) and mark which question groups sit under each: Spring Boot and coding, class design and architecture, behavioral.
  • Set up a plain-text or minimal editor with autocomplete disabled, matching the conditions candidates report for the assessment.
  • From memory, write a one-page sheet of what @Transactional, @Aspect, @RestController and @Autowired do, then answer the transaction propagation question aloud and check the sheet against the Spring reference.

Deliverable: A one-page loop map, a working no-autocomplete setup, and a written annotation sheet with propagation and rollback rules checked against the Spring reference.

Practice prompt ↗
02Spring Boot from an empty file
  • Build a CRUD controller with path parameters, bean validation, a filter by query parameter and a global exception handler, then call it with curl.
  • Write an @Aspect with @Around advice that logs method name and elapsed time for every controller method, and note why a self-invoked method skips the aspect.
  • Add a transactional inventory update that throws a runtime exception and test that the change rolls back, then change the propagation to REQUIRES_NEW on an inner call and observe the difference.

Deliverable: A runnable Spring Boot project with a controller, a timing aspect and two passing tests, one for rollback and one for the REQUIRES_NEW case.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
03Java internals and SQL
  • Write a small program that uses a mutable object as a HashMap key, mutates it and loses the entry, then fix it with an immutable key and a consistent equals and hashCode.
  • Write a stream pipeline with filter and map, add peek calls to show element-by-element lazy execution, and explain where a collect or sorted step buffers data.
  • Solve the PracHub SQL practice question on join fan-out in the SQL console, since the role lists SQL on Oracle, PostgreSQL or SQL Server.

Deliverable: A Java file showing the lost-key bug and its fix, an annotated stream pipeline, and one solved SQL practice question.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
04Executable low-level design
  • Build the in-memory key/value store with get, set, count, begin, commit and rollback, supporting nested transactions, and write tests for rollback with no transaction, nested commits and count after rollback.
  • Write the page-visit service with thread-safe counters and a test that runs many threads against one key.
  • Write unit tests for an ingestion service with its queue client and repository mocked, using JUnit with Mockito or pytest.

Deliverable: A key/value store with a passing test suite, a concurrent visit counter with a multi-thread test, and a mocked-dependency test class for an ingestion service.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
05Domain models and log-window coding
  • Model the train tracking and scheduling module in code, with trains, engine units, routes and maintenance status, and write a main class that exercises it.
  • Model asset health snapshots with entity classes and the REST endpoints that create and read them.
  • Solve the shortest-sub-array two-pointer problem and the rolling-average sliding-window problem, then take the log-parsing problem to error counts and word-pattern counts with hash maps.
  • Reduce a quadratic array search to linear time using a hash set or hash map, and state the space cost.

Deliverable: Runnable train and asset-health models with a driver class, plus working solutions to the two-pointer, sliding-window, log-parsing and quadratic-to-linear problems with edge-case tests.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
06Telemetry and API architecture
  • Whiteboard the train telemetry ingestion design for thousands of trains, covering the partition key, consumer groups, duplicate and out-of-order events, a cache, relational storage and the dispatcher alert path.
  • Design the API routing service with rate limiting and fault tolerance, then the layered data store with caching, a queue and relational persistence.
  • Design the decoupling of long-running asset health calculations from front-end polling, then write a migration plan for moving a monolithic dispatching tool to services without downtime.
  • Work the PracHub debugging practice question on memory growth in long-running instances, since ingestion consumers fail in similar ways.

Deliverable: Four labelled architecture diagrams with written failure modes (ingestion, API routing, layered store, async calculation), a staged migration plan, and a solved memory-growth debugging exercise.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Behavioral stories and a full mock
  • Write STAR outlines for the production outage, the design disagreement, the ambiguous-requirement ownership story and the deadline pushback story.
  • Write a safety and risk answer from real habits, covering tests, staged release, rollback and review, and say it aloud.
  • Practise the PracHub question on reversing your own decision, then run a mock of one design question, one coding question and two behavioral stories back to back.

Deliverable: Four STAR outlines, a rehearsed safety answer, and a recorded or written mock run with a list of gaps to fix.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗

Expand any day for tasks and deliverables. Your progress is saved on this device.

Candidates report behavioral interviews that explore past experience, teamwork and alignment with company values, and say safety is discussed explicitly. For a Software Engineer working on dispatching and telemetry software, the reported prompts cover production outages, design disagreements, daily safety and risk habits, and ownership of unclear requirements. Each story should show a decision you made, how you checked it and a safeguard you used or added.

Tell me about a time you experienced significant operational stress or a critical outage in a production syste

medium
Behavioral & Safety Culture

Tell me about a time you experienced significant operational stress or a critical outage in a production system. How did you resolve it?

Approach
  1. Choose an incident where you owned a concrete part of the response, such as the diagnosis, the rollback decision or the stakeholder updates. A story where you only watched or relayed messages shows nothing about your judgment.
  2. Give two sentences of context (system, symptom, who was affected), then walk the sequence: how it was detected, how you sized the impact, what you did first to stop the damage (rollback, feature flag, failover, shedding traffic) before hunting the root cause, and how you confirmed recovery.
  3. Cover communication explicitly: who you told, how often, and what you said while the cause was still unknown. In a loop where safety comes up, say how you avoided a rushed change that would widen the problem, for example by testing the fix first or applying it to a small slice.
  4. Close with the follow-through: root cause, the written review and the permanent change, such as an alert, a regression test, a runbook step or a circuit breaker. Give one measurable result, like time to recover or a failure class that can no longer happen.
  5. Spend one or two sentences on the stress itself: you kept a timeline, split the investigation among people and tested one hypothesis at a time. Do not blame a teammate and do not credit luck for the fix.
Follow-up
  • Why did you choose to roll back instead of fixing forward, or the reverse?
  • What did you change in the system or the process so this class of outage cannot recur?
  • How did you keep non-engineering stakeholders informed while you were still diagnosing?

Describe a situation where you had to work through a disagreement with a team member or stakeholder regarding

medium
Behavioral & Safety Culture

Describe a situation where you had to work through a disagreement with a team member or stakeholder regarding a software design decision.

Approach
  1. Pick a genuine technical disagreement over a design choice, such as synchronous calls against a message queue, a shared database against a split service, or whether to add a cache. State both positions fairly, including the best argument for the other side.
  2. Say what was at stake in terms the other person cared about, such as delivery date, operational risk or maintenance cost, rather than only your preference.
  3. Show the move from opinion to evidence: a small prototype, a load test, a failure scenario, a written comparison of trade-offs, or a conversation with the owner of the affected system. Name the data point or the person who settled it.
  4. Give the outcome and the working relationship afterward. If your option lost, show that you committed to the chosen design and helped deliver it. If it won, show what you took from the other side. Winning with no change in your own thinking is the weak version of this story.
  5. Keep the story in first person singular, with your argument, your action and your result, and avoid presenting the other person as obstinate.
Follow-up
  • What evidence would have changed your mind?
  • What would you have done if the decision-maker had overruled both of you?
  • How did you work with that person on the next project?

Reverse your own decision and price the reversal

medium
reversibilitymeasurementmigrations

Describe a technical decision you made and later reversed. Pick one that cost something: a service you split and merged back, a cache you added and removed, an index you created that pushed the planner onto a worse plan, a projection you rebuilt from scratch. State what you believed when you decided, the measurement that changed your mind, how long the wrong version ran in production, and what the reversal cost in migrations, dual writes, and a deprecation window for callers you did not own.

Approach
  1. State the original rationale without irony, in the version you would still defend given what was known then. If it is not defensible, the story is about carelessness rather than judgement, and a different example serves you better.
  2. Give the measurement that moved with a before and after: the p99 that did not improve, the cache hit rate that sat at 40%, the plan that flipped to a sequential scan once the table passed a size you can name.
  3. Cost the reversal in steps, not adjectives: expand-and-contract deploys, the dual-write window, the callers who had to be notified, the rows already written in the wrong shape that had to be backfilled or abandoned.
  4. Distinguish reversal from rewrite by naming what you kept. Most good reversals preserve the schema or the interface and undo one decision inside it, which is also why they were affordable.
Follow-up
  • What in that decision was irreversible, and did you know it was irreversible when you made it?
  • How did you tell the people who had already built on top of the original decision?
  • 01

    Tell me about a time you experienced significant operational stress or a critical outage in a production system. How did you resolve it?

  • 02

    Describe a situation where you had to work through a disagreement with a team member or stakeholder regarding a software design decision.

  • 03

    How do you integrate safety principles and risk mitigation into your day-to-day software engineering and deployment practices?

  • 04

    Describe a project where you demonstrated leadership by taking ownership of an ambiguous technical requirement and guiding it to delivery.

  • 05

    Tell the story of a time you pushed back on a delivery date because software quality or data security was at risk, and what you offered instead.

PracHub preparation framework ↗
What stages do candidates report for the BNSF Railway Software Engineer process?

Candidates describe an application review, a timed online technical assessment, a recruiter call about qualifications and working arrangements, and then a loop of three to five rounds by video or onsite in Fort Worth, TX. The loop is reported to cover live coding, low-level class design, high-level architecture and behavioral conversations. The whole process is reported at roughly 3-5 weeks, though some candidates describe it running longer.

PracHub Software Engineer practice ↗
What does the Codility online assessment cover?

Candidates report tasks built around concrete implementation, such as a Spring Boot controller, database transaction configuration or an Angular component, alongside algorithm and data-structure problems in Java. Code is written in the platform's own editor with limited reference material. Prepare by building a controller with validation and exception handling from an empty file and by solving array problems with autocomplete turned off.

BNSF Railway Software Engineer candidate reports ↗
Can I use my own IDE in the interviews?

Candidates report that the online assessment is typed into the platform editor. In live technical rounds they say screen sharing with a local IDE such as IntelliJ IDEA, PyCharm or VS Code is frequently allowed. Confirm the setup with your recruiter, and practise without autocomplete anyway, because annotation and API recall is a reported theme.

BNSF Railway Software Engineer candidate reports ↗
Which languages and tools should I know?

The requirements candidates describe are Java with Spring MVC, Spring Data JPA and Spring Security, REST and JSON, SQL on Oracle, PostgreSQL or SQL Server, and JUnit, Mockito or pytest. Reported extras are Angular with TypeScript and RxJS, messaging with Kafka, RabbitMQ or ActiveMQ, Docker, Kubernetes, AWS or Azure, and some familiarity with IoT or logistics data. The design questions allow Java or Python for the visit-count service and either JUnit or pytest for the tests.

PracHub Software Engineer practice ↗
Where are the engineering roles based?

Candidates mention Fort Worth, TX as the headquarters, where the onsite loop is reported to take place, and remote options for some senior and staff roles. Ask your recruiter early about location, hybrid expectations and onboarding travel for the specific team.

BNSF Railway Software Engineer candidate reports ↗
How should I handle safety in the behavioral rounds?

Candidates report that safety is discussed explicitly. Prepare real examples rather than slogans: tests that caught a defect before release, a staged rollout, a rollback you rehearsed, defensive handling of bad input, and a time you slowed a release because of risk. Tie each example to how reliable the software was afterward.

BNSF Railway Software Engineer candidate reports ↗
How long does feedback take after the final loop?

Candidates report that response times vary by department. Some hear back within one to two weeks, and others wait several weeks. Candidates suggest polite, regular check-ins with the recruiter, and a short thank-you note after the loop keeps the thread open.

BNSF Railway Software Engineer candidate reports ↗
Sources & methodology 3 sources ↗

No official company page is cited. Rounds and questions come from candidate reports and PracHub editorial material; each source shows the date it was read.