As a Software Engineer at Bhi, you are building the digital backbone that powers critical physical infrastructure. Whether it is supporting large-scale electrical projects, optimizing solar field operations, or streamlining aggregates and paving workflows, your code directly impacts real-world engineering and construction outcomes. You are not just building web applications; you are creating robust systems that bridge the gap between software and complex field operations. Your work empowers Electrical Project Engineers and Solar Field Engineers to make data-driven decisions, track project milestones, and monitor physical assets in real time. The impact of this position is immense because it scales operational efficiency across multiple industrial and energy sectors. You will be tasked with solving unique challenges, such as handling intermittent connectivity from remote solar fields in Utah or integrating complex data streams from paving equipment. Expect a role that is highly collaborative and deeply tied to physical engineering. You will need to understand the nuances of the business, translating the rugged, dynamic needs of field operations into clean, scalable software solutions. At, successful engineers blend strong computer science fundamentals with a genuine curiosity about how the physical world is built and powered. Bhi
Recruiter Screen
reportedInitial discussion to align on your background, location preferences, and basic technical fit.
What to demonstrate
- Initial discussion to align on your background, location preferences, and basic technical fit
- Depth in Project Engineering
How to prepare
- Be able to walk your CV end to end in two minutes, and say why this company specifically.
- Have your salary expectations, notice period and location constraints ready, and ask for the rest of the loop in writing.
Technical Assessment
reportedInvolves a live coding interview or a practical take-home assignment to assess coding competency.
What to demonstrate
- Involves a live coding interview or a practical take-home assignment to assess coding competency
- Depth in Project Engineering
How to prepare
- Answer aloud and timed: Implement a rate limiter for an API that receives telemetry data from field sensors.
- Answer aloud and timed: Design a class to manage an in-memory cache with an LRU (Least Recently Used) eviction policy.
Virtual or Onsite Loop
reportedSeveral focused sessions covering system design, deep-dive coding, and behavioral interviews.
What to demonstrate
- Several focused sessions covering system design, deep-dive coding, and behavioral interviews
- Depth in Project Engineering
How to prepare
- Answer aloud and timed: Write a script to parse a large CSV file of solar energy output and return the top three highest-producing days.
- Answer aloud and timed: Design a notification system that alerts project engineers when a piece of paving equipment requires maintenance.
PracHub editorial advice for the preparation topics above.
Going into the loop without having done this.
Understand the Physical Counterpart: Always remember that your software supports physical operations. When answering system design questions, explicitly mention how you would handle edge cases like hardware failure, sensor latency, or offline field workers.
Going into the loop without having done this.
Communicate Trade-Offs Clearly: Interviewers want to know why you chose a specific database or algorithm. Be prepared to discuss the pros and cons of your decisions regarding speed, memory, and maintainability.
Going into the loop without having done this.
Ask Clarifying Questions: Do not jump straight into coding. Take a few minutes to ask about the scale of the data, the expected user behavior, and any operational constraints. This shows maturity and a product-focused mindset.
Going into the loop without having done this.
Structure Your Behavioral Answers: Use the STAR method (Situation, Task, Action, Result) to keep your stories concise and impactful. Focus heavily on the "Action" and "Result" parts to highlight your specific contributions.
Going into the loop without having done this.
Show Genuine Interest: Ask your interviewers about the current challenges they face in the field. Asking insightful questions about how software is transforming their solar or paving operations demonstrates your engagement with the company's mission.
Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.
Write a function to merge overlapping time intervals representing equipment usage logs.
Write a function to merge overlapping time intervals representing equipment usage logs.
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- 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?
Given a list of project dependencies, write an algorithm to determine the critical path for an electrical inst
Given a list of project dependencies, write an algorithm to determine the critical path for an electrical installation.
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- 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?
Write a script to parse a large CSV file of solar energy output and return the top three highest-producing day
Write a script to parse a large CSV file of solar energy output and return the top three highest-producing days.
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- 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?
Explain why the owner filter ignores the listing index
The only index on resource is (tenant_id, status, updated_at DESC, resource_id DESC). A new endpoint returns one user's resources across all statuses, newest created first: WHERE tenant_id = $1 AND owner_user_id = $2 ORDER BY created_at DESC LIMIT 20. On a tenant with 2M rows it takes 900 ms and EXPLAIN shows a sort above a large scan. Explain precisely why the existing index cannot serve it, give the index that can, and state which of these the new index still will not help: owner_user_id alone across tenants; the same query ordered by updated_at. PostgreSQL 16.
Approach
- Separate the two jobs an index does. For filtering, a composite btree is seekable only on a left prefix, so with no predicate on status the scan can at best range over tenant_id and test owner_user_id per row; PostgreSQL 16 has no btree skip scan to jump the unconstrained column.
- For ordering, the index is sorted by (status, updated_at) within a tenant and not by created_at, so the LIMIT cannot stop early: every matching row is read and then sorted. That is the 'Sort Method: top-N heapsort' line, and it is why the plan reads 2M rows to answer with 20.
- Derive the replacement from the access path — equality, equality, then the ordering column: CREATE INDEX CONCURRENTLY ON resource (tenant_id, owner_user_id, created_at DESC). The scan seeks to the (tenant, owner) range and walks 20 entries in order, so the Sort node disappears along with the row-read.
- Treat INCLUDE (title, status) as conditional, not free. An index-only scan still visits the heap for any row whose page is not marked all-visible, so on a table taking 1.2k writes/second the win depends on autovacuum keeping the visibility map current, and the wider index costs more on every insert.
Follow-up
- 90% of rows are status='active'. Would a partial index WHERE status = 'active' change your answer, and for which of the three queries?
- A dashboard runs this for 40 owners in one page load. What changes about the design?
Hold a per-tenant active cap against concurrent creates
A tenant on the standard plan may hold at most 50 resources with status='active'. The create handler runs SELECT count(*) FROM resource WHERE tenant_id = $1 AND status = 'active', compares to 50, then inserts. Two creates arrive 3 ms apart on different instances and the tenant lands at 51. Name the anomaly, say whether PostgreSQL 16 READ COMMITTED or REPEATABLE READ prevents it and why, then give an implementation that holds the cap at READ COMMITTED with the exact statements. Finally, say what changes when the cap is 'at most one running export per tenant' on job_run.
Approach
- Name it: write skew. The two transactions read an overlapping set and write disjoint rows, so there is no row-level conflict for the engine to detect and each commit is individually legal.
- Rule out the levels precisely. READ COMMITTED takes a fresh snapshot per statement and takes no lock on the counted rows, so both see 49. PostgreSQL's REPEATABLE READ is snapshot isolation: it removes non-repeatable reads and phantoms within the snapshot but still admits write skew, because the anomaly is not a re-read of a changed row, it is a read of a set that a concurrent transaction invalidates. Only SERIALIZABLE closes it, by tracking the read dependency and aborting one transaction with SQLSTATE 40001 — a guarantee that exists only if the application re-runs the whole transaction from the read.
- Convert the set predicate into a single-row conflict: keep tenant.active_resource_count and run UPDATE tenant SET active_resource_count = active_resource_count + 1 WHERE tenant_id = $1 AND active_resource_count < 50 in the same transaction as the INSERT. Zero affected rows is the cap, returned as 409. The row lock serialises the decision at any isolation level, and contention is bounded to one tenant's row — which is also the fair-scheduling unit, unlike a global counter that would convoy every tenant behind one row.
- State the cost you just took on: a counter is a second source of truth that can drift, so every path that changes status must adjust it inside the same transaction, and a periodic reconciliation has to exist, with resource_revision as the authority for what the count should have been.
Follow-up
- A resource moves from archived back to active. Which statements change, and what breaks if the counter update and the status change land in different transactions?
- The cap becomes plan-dependent and a plan can change mid-month. Where does the number 50 live, and who reads it?
Implement a rate limiter for an API that receives telemetry data from field sensors.
Implement a rate limiter for an API that receives telemetry data from field sensors.
Approach
- Say who the caller is and what they do when the call fails halfway.
- Define the identity of a request so a retry cannot double-apply it.
- Separate accepted, pending, failed and confirmed; they are different facts.
- Design the error taxonomy before the success shape; callers branch on it.
Follow-up
- What happens if the caller retries after a timeout?
- How does a client discover it is on an old version of this contract?
Design a class to manage an in-memory cache with an LRU (Least Recently Used) eviction policy.
Design a class to manage an in-memory cache with an LRU (Least Recently Used) eviction policy.
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Design a notification system that alerts project engineers when a piece of paving equipment requires maintenan
Design a notification system that alerts project engineers when a piece of paving equipment requires maintenance.
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
How would you design a distributed logging system for hundreds of remote solar field monitors?
How would you design a distributed logging system for hundreds of remote solar field monitors?
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Architect a dashboard backend that aggregates real-time metrics from multiple active construction sites.
Architect a dashboard backend that aggregates real-time metrics from multiple active construction sites.
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Design a system to handle file uploads (like site photos and inspection reports) from areas with poor mobile c
Design a system to handle file uploads (like site photos and inspection reports) from areas with poor mobile connectivity.
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Explain how you would migrate an on-premise legacy project management database to a cloud-native architecture.
Explain how you would migrate an on-premise legacy project management database to a cloud-native architecture.
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
One log partition stops advancing while the others drain
Search results for a subset of tenants are hours stale; the rest are current. The projection consumer reports lag of zero on 15 of 16 partitions and 400,000 on one. Its error rate is flat and its CPU is idle. outbox_event has no pending rows older than a second, so the relay has published everything it holds. Identify the mechanism, give the ordered checks, and state what you do in the first ten minutes versus what you change permanently.
Approach
- Read the lag distribution first. A slow consumer lags everywhere; zero on fifteen partitions and 400,000 on one is not throughput. Idle CPU on the stuck partition means the consumer is not advancing its offset at all, which points at one message it cannot get past rather than at a rate problem.
- Exonerate the producer before touching the consumer. No pending outbox rows older than a second means the relay published, so the event exists in the log. This separates never sent from sent and never applied, which are different code paths and usually different owners.
- Read the message at the stuck offset and the handler's log lines for its event_id. A flat error rate with no progress has two explanations and you must distinguish them: the handler is throwing and the retry loop is swallowing it, or the handler is blocking on something and never returning. Idle CPU with no error lines favours the second.
- Mitigate before diagnosing further. Move the offending event to a dead-letter store and commit the offset past it. Adding consumers does nothing here, because a partition is consumed by exactly one member of the group, and the blast radius is every aggregate hashed to that partition, not only the aggregate that produced the bad event.
Follow-up
- The dead-lettered event carried aggregate_version 7 and the projection had applied 6. What must the replay do differently if 8 and 9 landed in the meantime?
- How do you show staleness to the user while the partition is behind, given the API already returns the projection's watermark?
Built from the rounds and topics Bhi candidates report.
Prepare, practise & reflect
One practical outcome each day. Spend longer where you need it.
0 / 7 done01Map the Bhi loop
- Write out the reported sequence: Recruiter Screen, Technical Assessment, Virtual or Onsite Loop.
- 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 3 reported rounds, with the weakest marked.
02Work Project Engineering
- Spend the session on Project Engineering, which Bhi candidates report being tested on.
- Write one worked example in Project Engineering and time yourself on it.
Deliverable: One timed worked example in Project Engineering.
03Work Construction Engineering
- Spend the session on Construction Engineering, which Bhi candidates report being tested on.
- Write one worked example in Construction Engineering and time yourself on it.
Deliverable: One timed worked example in Construction Engineering.
04Work Solar Field Engineering
- Spend the session on Solar Field Engineering, which Bhi candidates report being tested on.
- Write one worked example in Solar Field Engineering and time yourself on it.
Deliverable: One timed worked example in Solar Field Engineering.
05Answer out loud: Coding and Algorithms
- Answer aloud, timed: Write a function to merge overlapping time intervals representing equipment usage logs.
- Answer aloud, timed: Given a list of project dependencies, write an algorithm to determine the critical path for an electrical installation.
Deliverable: Spoken answers to 2 reported Coding and Algorithms question(s), under time.
06Answer out loud: System Design
- Answer aloud, timed: Design a notification system that alerts project engineers when a piece of paving equipment requires maintenance.
- Answer aloud, timed: How would you design a distributed logging system for hundreds of remote solar field monitors?
Deliverable: Spoken answers to 2 reported System Design question(s), under time.
07Answer out loud: Behavioral and Leadership
- Answer aloud, timed: Tell me about a time you had to pivot your technical approach because of a change in business requirements.
- Answer aloud, timed: Describe a project where you had to collaborate closely with someone outside of the software engineering team.
Deliverable: Spoken answers to 2 reported Behavioral and Leadership question(s), under time.
Expand any day for tasks and deliverables. Your progress is saved on this device.
Behavioural rounds judge the decision you made and what it cost.
Tell me about a time you had to pivot your technical approach because of a change in business requirements.
Tell me about a time you had to pivot your technical approach because of a change in business requirements.
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- 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 project where you had to collaborate closely with someone outside of the software engineering team.
Describe a project where you had to collaborate closely with someone outside of the software engineering team.
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- 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?
How do you prioritize technical debt versus building new features requested by project managers?
How do you prioritize technical debt versus building new features requested by project managers?
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- 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?
Tell me about a time you identified a process bottleneck and built a tool to fix it.
Tell me about a time you identified a process bottleneck and built a tool to fix it.
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- 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 situation where you disagreed with a senior engineer's architectural decision. How did you handle i
Describe a situation where you disagreed with a senior engineer's architectural decision. How did you handle it?
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- 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?
- 01
Tell me about a time you had to pivot your technical approach because of a change in business requirements.
- 02
Describe a project where you had to collaborate closely with someone outside of the software engineering team.
- 03
How do you prioritize technical debt versus building new features requested by project managers?
- 04
Tell me about a time you identified a process bottleneck and built a tool to fix it.
How difficult are the technical interviews at Bhi compared to big tech companies?
The technical interviews focus heavily on practical application rather than obscure competitive programming puzzles. While the coding standard is high, the scenarios are usually grounded in real-world engineering problems, making them feel more intuitive if you focus on clean, logical problem-solving.
Bhi Software Engineer candidate reports ↗Do I need a background in electrical engineering, solar energy, or construction?
No, a specialized background is not required. However, demonstrating a strong curiosity and willingness to learn about these domains will significantly set you apart. You just need to show that you can understand the context of the users you are building for.
Bhi Software Engineer candidate reports ↗What is the typical timeline from the initial screen to an offer?
The process usually takes between three to five weeks. This includes the recruiter screen, a technical assessment or initial technical interview, and a final onsite or virtual loop, followed by a few days for the hiring committee to make a decision.
Bhi Software Engineer candidate reports ↗Are these roles remote, hybrid, or onsite?
Many of the engineering and project roles are based in Utah (such as Salt Lake City and Cedar City). Depending on the specific team, there may be hybrid flexibility, but a willingness to collaborate closely with local field and project teams is highly valued.
Bhi Software Engineer candidate reports ↗How hard is the Bhi interview?
Candidates most commonly rate Bhi interviews as easy, based on 3 reported interviews.
Bhi Software Engineer candidate reports ↗What topics does Bhi test in interviews?
Bhi interviews most often cover Project Planning, Risk Management, Structural Engineering, Project Engineering, and Concrete Construction (Mix, Curing, Testing). The exact emphasis depends on the specific role you apply for.
Bhi Software Engineer candidate reports ↗Where is Bhi headquartered?
Bhi is headquartered in Vernal, US.
Bhi Software Engineer candidate reports ↗Sources & methodology 3 sources ↗
Official role evidence, timestamped platform data and clearly labeled preparation advice.
- 01Bhi Software Engineer candidate reports ↗
Company-reported rounds, questions and FAQ.
candidate · Accessed 2026-09-22 - 02PracHub Software Engineer practice ↗
PracHub practice material, not company-reported.
platform · Accessed 2026-09-22 - 03PracHub preparation framework ↗
PracHub preparation guidance.
platform · Accessed 2026-09-22