As a Software Engineer at US Mobile, you are at the heart of a company dedicated to disrupting the telecommunications industry through seamless digital experiences. This role is not just about writing code; it is about building the infrastructure that connects users to high-speed networks with unprecedented simplicity and transparency. You will be contributing to a platform that manages complex backend integrations while delivering an intuitive, consumer-facing application. The impact of your work is direct and measurable. You will tackle challenges ranging from high-concurrency billing systems to the optimization of user-facing mobile interfaces. Because US Mobile operates in a fast-paced environment, Software Engineers are expected to be agile, taking ownership of features from conception to deployment. This is a role for engineers who thrive on solving real-world connectivity problems and who are eager to influence the product roadmap in a high-growth environment. 02 · Compensation
Initial Screening
reportedGauge your background and alignment with the company’s mission.
What to demonstrate
- Gauge your background and alignment with the company’s mission
- Depth in Software Engineering (Role Fundamentals)
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 Rounds
reportedIncludes coding exercises and architectural discussions.
What to demonstrate
- Includes coding exercises and architectural discussions
- Depth in Software Engineering (Role Fundamentals)
How to prepare
- Answer aloud and timed: Explain your process for debugging a production issue in a distributed system.
- Answer aloud and timed: What trade-offs do you consider when choosing between different data structures for a new feature?
Team-Based Interviews
reportedAssess cultural fit and collaboration with potential team members.
What to demonstrate
- Assess cultural fit and collaboration with potential team members
- Depth in Software Engineering (Role Fundamentals)
How to prepare
- Answer aloud and timed: Describe a situation where you had to refactor legacy code to improve performance.
- Answer aloud and timed: Tell me about a time you had a technical disagreement with a teammate; how did you resolve it?
PracHub editorial advice for the preparation topics above.
Prioritize the user
When discussing your past projects, always highlight the benefit to the end user.
Be ready to talk about trade-offs
Every technical decision has a cost; be prepared to explain why you chose one approach over another.
Ask thoughtful questions
Use the time at the end of your interviews to ask about the team’s current technical challenges or the company’s long-term vision.
Never assume that a positive interview experience guarantees an offer
Stay engaged and responsive throughout the entire process until you have a final decision.
Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.
Can you walk me through your approach to solving an algorithmic problem on the fly?
Can you walk me through your approach to solving an algorithmic problem on the fly?
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?
What trade-offs do you consider when choosing between different data structures for a new feature?
What trade-offs do you consider when choosing between different data structures for a new feature?
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?
Describe a situation where you had to refactor legacy code to improve performance.
Describe a situation where you had to refactor legacy code to improve performance.
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?
Denormalise tenant onto revisions and backfill it live
resource_revision (revision_id, resource_id, version, actor_user_id, change_kind, patch, request_id, created_at) has 400M rows and no tenant column; tenant_id lives only on resource. Two reads need it: a tenant-scoped audit feed ordered by created_at DESC, and an offboarding purge. Both join back to resource today. Justify adding tenant_id to resource_revision against those two reads, name the anomaly the copy introduces and the constraint that prevents it, then give the ordered migration for a live table taking 1.2k writes/second — the lock each step takes, how the backfill is batched, and where each step stops being reversible. PostgreSQL 16.
Approach
- Justify from the access path rather than from taste. Without the column, the audit feed either scans resource_revision by created_at and discards other tenants' rows, or resolves the tenant's resource_ids first and probes with them — both proportional to the tenant's whole history rather than to one page. With (tenant_id, created_at DESC, revision_id DESC) it is a seek that stops at 50 rows, and the purge becomes a ranged delete instead of a join.
- Name the cost exactly: a second copy of a fact can disagree with the first. Make the disagreement unwritable rather than documented — add UNIQUE (resource_id, tenant_id) on resource so it can serve as a foreign-key target, then FOREIGN KEY (resource_id, tenant_id) REFERENCES resource (resource_id, tenant_id) on the revision table. A revision can then only ever carry its parent's tenant.
- Step one, expand: ALTER TABLE resource_revision ADD COLUMN tenant_id BIGINT NULL, with no default, so it is a catalogue change and no rewrite. It still needs ACCESS EXCLUSIVE for an instant, and that instant queues behind the longest open transaction on the table while every later query queues behind it — set lock_timeout to 2s and retry rather than wait.
- Step two, dual-write: deploy the writer that populates tenant_id on every new revision while reads still use the join. Reversible by redeploying the previous build, because nothing reads the column yet.
Follow-up
- The backfill is half finished and a rollback is required. What state is the table in, and what does the previous build do with a half-populated column?
- How do you verify the backfill actually finished, given rows are still being inserted while it runs?
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?
How do you ensure your code remains scalable as user demand increases?
How do you ensure your code remains scalable as user demand increases?
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?
Shard by tenant when one tenant outgrows a single shard
One primary holds resource, resource_revision, outbox_event and idempotency_key for every tenant and is at its write ceiling at 1.2k writes/second. tenant_id leads every index. Shard across eight primaries. One tenant holds 22% of all rows and by itself exceeds a single shard's write capacity. Design the routing, the split of that tenant, and the online move of a tenant between shards with writes continuing. State what breaks for queries that are tenant-scoped today, and exactly what a write must do when it arrives at the old shard after the cutover.
Approach
- Route on a unit smaller than a tenant from the start. Make the routing key (tenant_id, bucket) with a fixed bucket count - 64 over eight shards - and keep a directory mapping each (tenant_id, bucket) to a shard, carrying a version and cached in every service. An ordinary tenant has all 64 buckets pointing at one shard and behaves exactly as it does today; only the hot tenant has its buckets spread. Hashing tenant_id alone spreads tenants evenly, gives you no way to move one, and has no answer at all for a tenant larger than a node. The bucket count is the part you cannot change later without rehashing rows, so pick it well above the shard count and rebalance by moving buckets, not by re-bucketing.
- For the tenant that exceeds one node, its buckets must land on different shards - that is the whole point of bucketing it, and buckets confined to its own shard would rename the rows while leaving every write on the node whose ceiling it already exceeds. Size it from measured numbers rather than from its row share: 22% of rows says nothing about write rate. The current primary tops out near 1.2k writes/second on this hardware and workload, so a tenant peaking at W writes/second needs its buckets spread over at least ceil(W / headroom-per-shard) shards, where the divisor is the share of each shard's ceiling you are willing to give it while that shard still serves other tenants - not the full 1.2k. Size on its peak, not its mean.
- Fix the co-location invariant at the right grain. What must commit in one transaction is a resource, its resource_revision row and its outbox_event row, so the bucket is a property of the resource: derive it once at creation and stamp it into resource_id, and every later revision and event routes with its parent for free. Per-tenant co-location was never the requirement, and mistaking it for one is what makes a tenant look unsplittable. What genuinely breaks is an invariant spanning two resources of one tenant - a per-tenant counter, uniqueness across its resources - which now needs either a home-shard table or two-phase commit, and 2PC at this write rate is not a serious option.
- Keep the idempotency constraint arbitrating, because it is now enforced per shard. PRIMARY KEY (tenant_id, idempotency_key) only continues to reject a retry if the same key always lands on the same shard, so derive the create-path bucket from hash(tenant_id, idempotency_key) and mint the new resource_id inside that bucket, which also puts the key row and the resource it guards in one transaction. A bucket chosen from anything that differs between a request and its retry - a timestamp, the worker id, a client-supplied resource id - splits one key across two shards, both inserts succeed, and the write endpoint's retry safety is silently gone.
Follow-up
- The fence lasts 90 seconds instead of 4 because the final delta keeps growing. What is happening, and what do you do while the tenant is fenced?
- Two tenants must merge into one account. What does that cost under this scheme, and which step is not reversible?
Explain your process for debugging a production issue in a distributed system.
Explain your process for debugging a production issue in a distributed system.
Approach
- Establish what changed and when, before forming any theory.
- Pick a bisection that eliminates candidates whichever way it turns out.
- Check the instrumentation before believing the symptom.
- 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?
Built from the rounds and topics US Mobile candidates report.
Prepare, practise & reflect
One practical outcome each day. Spend longer where you need it.
0 / 7 done01Map the US Mobile loop
- Write out the reported sequence: Initial Screening, Technical Rounds, Team-Based Interviews.
- 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 Software Engineering (Role Fundamentals)
- Spend the session on Software Engineering (Role Fundamentals), which US Mobile candidates report being tested on.
- Write one worked example in Software Engineering (Role Fundamentals) and time yourself on it.
Deliverable: One timed worked example in Software Engineering (Role Fundamentals).
03Work Interview Coding Exercises
- Spend the session on Interview Coding Exercises, which US Mobile candidates report being tested on.
- Write one worked example in Interview Coding Exercises and time yourself on it.
Deliverable: One timed worked example in Interview Coding Exercises.
04Work Algorithmic Problem Solving
- Spend the session on Algorithmic Problem Solving, which US Mobile candidates report being tested on.
- Write one worked example in Algorithmic Problem Solving and time yourself on it.
Deliverable: One timed worked example in Algorithmic Problem Solving.
05Answer out loud: Technical and Coding Proficiency
- Answer aloud, timed: Can you walk me through your approach to solving an algorithmic problem on the fly?
- Answer aloud, timed: How do you ensure your code remains scalable as user demand increases?
Deliverable: Spoken answers to 2 reported Technical and Coding Proficiency question(s), under time.
06Answer out loud: Behavioral and Role Alignment
- Answer aloud, timed: Tell me about a time you had a technical disagreement with a teammate; how did you resolve it?
- Answer aloud, timed: Why are you interested in the telecommunications space and US Mobile specifically?
Deliverable: Spoken answers to 2 reported Behavioral and Role Alignment question(s), under time.
07Dry run for US Mobile
- 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.
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 a technical disagreement with a teammate; how did you resolve it?
Tell me about a time you had a technical disagreement with a teammate; how did you resolve 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?
Why are you interested in the telecommunications space and US Mobile specifically?
Why are you interested in the telecommunications space and US Mobile specifically?
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 pivot quickly due to changing business requirements.
Describe a project where you had to pivot quickly due to changing 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?
How do you balance the need for speed with the need for high-quality, bug-free code?
How do you balance the need for speed with the need for high-quality, bug-free code?
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?
What is the most challenging technical project you have led or contributed to, and what was your specific impa
What is the most challenging technical project you have led or contributed to, and what was your specific impact?
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 a technical disagreement with a teammate; how did you resolve it?
- 02
Why are you interested in the telecommunications space and US Mobile specifically?
- 03
Describe a project where you had to pivot quickly due to changing business requirements.
- 04
How do you balance the need for speed with the need for high-quality, bug-free code?
How difficult are the technical interviews at US Mobile?
The difficulty is generally considered reasonable for experienced engineers. The focus is on practical, real-world coding rather than obscure academic puzzles.
US Mobile Software Engineer candidate reports ↗How long does the process usually take?
While it can vary, the process is designed to be efficient. Many candidates find the timeline to be faster than that of larger, more bureaucratic organizations.
US Mobile Software Engineer candidate reports ↗What is the best way to stand out?
Demonstrate a genuine interest in the product and an ability to think about the user experience, not just the code. Showing that you understand the business impact of your technical decisions is a major differentiator.
US Mobile Software Engineer candidate reports ↗What topics does US Mobile test in interviews?
US Mobile interviews most often cover React, Software Engineering (Role Fundamentals), Product Management (Execution & Roadmapping), Devices & Marketplace Product Ownership, and TypeScript. The exact emphasis depends on the specific role you apply for.
US Mobile 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.
- 01US Mobile Software Engineer candidate reports ↗
Company-reported rounds, questions and FAQ.
Candidate reports · Accessed 2026-09-22 - 02PracHub Software Engineer practice ↗
PracHub practice material, not company-reported.
PracHub page · Accessed 2026-09-22 - 03PracHub preparation framework ↗
PracHub preparation guidance.
PracHub page · Accessed 2026-09-22