Academy Sports + Outdoors · Software Engineer
Updated · 2026-09-24

Academy Sports + Outdoors Software Engineer
Interview Questions & Guide 2026

THE 60-SECOND BRIEF

A Software Engineer at Academy Sports + Outdoors plays a vital role in building the digital infrastructure that powers one of the nation’s leading sporting goods retailers. You are not just writing code; you are directly contributing to the omnichannel ecosystem that connects millions of customers with the gear they need for their active lifestyles. Whether you are working on identity management systems, application operations, or customer-facing platforms, your work ensures that the digital shopping experience is seamless, secure, and highly performant.

The loop does not sample the job evenly, and arguing about that in the room costs you. Daily work is mostly incremental change inside code someone else wrote, while the loop samples narrow slices of it; prepare for the slices and save the realism argument for your questions at the end.

Academy Sports + Outdoors candidates report 3 rounds · ≈ 3-5 weeks. The stages below are what candidates describe, not a published process.

Diff a roster snapshot before applying any deletesValidate a signed launch without trusting the clientSandbox untrusted learner code with hard limits

41 min read

Browse Software Engineer questions

See the practice prompts

13Practice promptsAcross five skill areas
3With worked solutionsIncluded in the practice prompts

A Software Engineer at Academy Sports + Outdoors plays a vital role in building the digital infrastructure that powers one of the nation’s leading sporting goods retailers. You are not just writing code; you are directly contributing to the omnichannel ecosystem that connects millions of customers with the gear they need for their active lifestyles. Whether you are working on identity management systems, application operations, or customer-facing platforms, your work ensures that the digital shopping experience is seamless, secure, and highly performant.

This role requires a blend of technical precision and business-minded problem-solving. You will work within diverse, collaborative teams to solve complex challenges related to high-scale retail operations. Because Academy Sports + Outdoors is continuously innovating its digital footprint, you will be expected to adapt to evolving technologies and contribute to high-impact projects that directly influence the company’s ability to compete in the retail market. It is an environment that values professional growth, technical rigor, and a genuine passion for the brand.

The culture at Academy Sports + Outdoors is described by candidates as genuine and professional, with a strong emphasis on providing respectful and timely feedback throughout the hiring process.

01

Initial Screening

reported

Before anything technical happens, someone has to decide which rung of the ladder your loop is calibrated to, and that decision sets the bar for every round after it. It comes from how you describe scope, not from your title, because titles do not convert cleanly between companies. The weak version of the answer is team size and years. The strong version names the largest change you shipped where nobody reviewed the design, what would have broken if you had been wrong, and what you were paged for. Get the level said out loud on this call, because the range and the loop both follow from it.

What to demonstrate

  • Whether the scope in your own account maps onto a level the team actually has an opening at, so a mismatch ends the process cheaply rather than after four interviewers have spent a day
  • Whether your title needs re-mapping: the same word describes very different amounts of independent decision-making at a twenty-person company and a ten-thousand-person one
  • Whether your compensation expectation can be filled at that level in the structure the role pays in, which is why the number gets asked for before any engineer is scheduled

How to prepare

  • Write down two changes from the last two years: the largest one you designed with nobody reviewing the design, and the largest one where someone more senior did. Lead with the first when scope comes up, and be ready to say which parts of the second were yours
  • Ask which level the loop is calibrated to and what changes at the level above it, then plan your weeks from that answer rather than from the posting
  • Settle a total-compensation range beforehand with the split named, base against bonus against equity and its vesting period, so a question about numbers gets a number instead of the word market
PracHub interview research ↗
02

Hiring Manager Interview

reported

Expect the estimate to be probed harder than the outcome. A manager asking how long something will take is checking whether your number covers the parts that reliably go wrong: migrating the rows that already exist, and the second service that has to change at the same time. A single confident number is the weak answer. The strong one states what the estimate assumes, names the unknown that could double it, and says what you would cut first if the date were fixed. Scope is the variable you control; hours are not.

What to demonstrate

  • Whether an estimate arrives with its assumptions attached, including what it excludes and how much of it is waiting on review, environments or another team
  • Whether you can name work you cut and the person you told, since a cut nobody heard about surfaces later as a surprise rather than a decision
  • How you order two tasks that both look urgent, and whether that order survives being told the deadline moved in by a week
  • Whether you separate what must be done before launch from what must be done before the thing can be left running unattended

How to prepare

  • Take the last three things you shipped and write down, from memory, the estimate you gave and the time it actually took. Bring the largest miss and why it missed; a candidate who has never missed has never committed to a date.
  • Against your current queue, write who is blocked until each item lands. Anything with nobody behind it becomes your worked example of what you would drop and how you would say so.
  • Rehearse the fixed-date answer aloud: which slice ships, which slice is deferred and written down somewhere it will be found, and the one thing you would refuse to cut because removing it makes the release unsafe rather than smaller.
PracHub interview research ↗
03

Multi-Round Technical Assessment

reported

The same problem is scored by two different mechanisms depending on the format, and preparing for one does not cover the other. With a person watching, partial progress is visible and a hint is a correction you can absorb; silence is the expensive failure, because nobody can read a half-written function. With an automated grader there is no partial credit for what you were about to do, nobody to ask, and the worked examples in the prompt are the entire specification. Read them as a contract, down to whether an empty result should be an empty list or no output at all.

What to demonstrate

  • In a live session, whether your commentary tracks what your hands are doing, and whether a hint redirects you or gets defended against
  • In an automated one, whether you cover the cases the examples do not show, since the hidden cases are where the score moves
  • Whether you manage the clock on purpose: abandoning an approach that is not converging while there is still time to write something simpler that finishes

How to prepare

  • Have someone hand you a problem and feed you one deliberately wrong hint. Practise testing it against a concrete case instead of accepting or rejecting it on authority.
  • Do one timed run a week in a plain browser editor with autocomplete, linting and your own snippets switched off, which is closer to what these environments give you
  • For the automated format, write the harness before the solution: a main that feeds the worked examples plus an empty and a single-element case and prints expected against actual, so a wrong submission is caught by you first
PracHub interview research ↗

PracHub editorial advice for the preparation topics above.

01

The launch works locally and breaks inside the embedding page, because the session cookie is a third-party cookie.

A standards-based launch finishes with a cross-site form POST back to the tool, so the state and session cookies must carry SameSite=None; Secure or the browser will not send them at all: the common Lax default is only released on top-level GET navigations, never on a cross-site POST. Correct attribution is not sufficient either, and the two browser behaviours fail differently. An engine that blocks third-party cookies outright never stores the cookie, so the state check fails on every launch; an engine that partitions them instead keeps the launch working but scopes that session to the one embedding site, so the session established inside the frame is not the session the same user has when they open the tool directly. Local development is same-site, so all of this passes and the failure surfaces only in the embedded context as a generic 'invalid state' error. The fix is a designed fallback rather than a retry: request storage access, or break out to a first-party window for the first launch and bind the session there.

02

Treating the launch subject identifier as a global user id, or merging identities on email.

The subject claim is stable only within its issuer, so the same human arriving from a second platform is a different subject and must be a second external identity bound to the same person. Email is worse than useless as a merge key here: privacy settings frequently suppress it from the launch entirely, districts recycle addresses between graduating and incoming students, and younger learners often have none. A merge on email eventually joins two children's work into one account, which is both a grade bug and a privacy incident.

03

Retrying a write that is not safe to repeat

A timeout tells you nothing about whether the server applied the write, so a blind retry of a create or a charge can duplicate it. Either make the operation idempotent, with a caller-supplied key the server deduplicates on or a conditional update, or do not retry it; and use exponential backoff with jitter so the retries of many clients do not synchronise into a second outage.

04

Naming no test cases at all

State what you would test before being asked: empty input, a single element, all elements equal, the maximum permitted size, and the input that exercises the branch you just wrote. It costs thirty seconds and is much of what separates someone who has shipped code from someone who has only solved puzzles.

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

9 technical prompts3 include a worked solution

Find peak concurrent attempts to size a pre-warm

medium
intervalsdifference arraycapacity planning

You have one district's attempt rows for a single school day: started_at, and an end instant taken as submitted_at when present and server_deadline_at otherwise. There are up to 50,000,000 rows, all inside one local calendar day, and the district's org.time_zone is known. Compute the maximum number of simultaneously in-progress attempts and the second at which it occurs, so capacity can be pre-warmed against the bell schedule. A sort-based sweep is acceptable but is not the best answer here. State your bounds and what happens on a day with a daylight-saving transition.

Approach
  1. Note the structural fact that decides the algorithm: the output domain is one day at one-second resolution, so there are on the order of 86,400 distinct answer positions while there are 50,000,000 inputs. That inverts the usual sweep, because the coordinate space is far smaller than the data.
  2. Allocate a difference array over seconds from local midnight, with one sentinel slot past the end so the decrement for an attempt ending in the final bucket has somewhere to land. For each attempt add 1 at the bucket containing started_at and subtract 1 at the bucket after the one containing the end instant, then prefix-sum once and take the argmax. That is O(N + T) time and O(T) space, which is 86,401 int32 values, about 346 KB — small enough to stay in L2 and to run per section if you want.
  3. Say why this beats the sweep-line answer here. Sorting 2N endpoints is O(N log N) with 100,000,000 entries to materialise; the difference array touches each input twice and never sorts. The sweep only wins when the coordinate space is large or unbounded, which is exactly the condition this problem does not have.
  4. State the bias the bucketing introduces rather than hiding it. Every attempt is counted in full in every second it touches at all, so the bucketed maximum is greater than or equal to the true instantaneous maximum, never less, which is the safe direction for pre-warming. The overcount is not confined to sub-second attempts: two hour-long attempts that merely share a boundary second without ever overlapping, one ending at 10:00:05.2 and the next starting at 10:00:05.8, already put 2 in that bucket against a true instantaneous maximum of 1. The bound that does hold is per bucket. The attempts touching second s split into those that span it entirely, which by definition coexist at every instant of s, and those with an endpoint inside it, so the overcount at s is at most the number of attempts that begin or end within that second. Equality with an exact sweep is guaranteed when no attempt begins or ends inside the peak second — which holds, for instance, on a fixture whose every endpoint lands exactly on a second boundary.
  5. Handle the calendar honestly, and fix the indexing convention before sizing anything. Index buckets by elapsed seconds from the UTC instant of local midnight and size the array from the real UTC span between successive local midnights: in a zone that shifts by an hour that span is 82,800 seconds on the spring-forward day and 90,000 on the fall-back day, not 86,400. A hardcoded 86,400 therefore overruns on the fall-back day, whose last hour indexes up to 89,999, and merely leaves 3,600 dead slots at the tail on the spring-forward day, which is harmless. The opposite convention fails the opposite way: bucketing by local wall-clock seconds-since-midnight always stays in range, but maps the fall-back day's repeated hour onto buckets that already hold the first pass through it, folding two real hours of load into one and understating the peak.
  6. For per-section peaks, do not allocate T buckets per section — 10,000 sections is 3.5 GB. Partition the input by section_id and reuse one array, or keep only sections whose total attempt count clears a threshold, since the rest cannot produce a peak worth pre-warming for.
Follow-up
  • Now compute the peak across three districts in different time zones on one shared cluster. What is the coordinate space and does your answer survive?
  • Some attempts have neither submitted_at nor server_deadline_at because they were abandoned. What end do you pick, and how does the choice bias the number you hand to capacity planning?
  • You need the top ten peak minutes rather than the single peak. What changes, and what does not?

Stream a quoted roster CSV without loading the file

easyWorked solution
parsingstate machinestreaming

You are handed a 2 GB roster export as a byte stream. It follows RFC 4180: any field may be quoted, a quoted field may contain commas and CRLF, a literal quote inside a quoted field is written as two quotes, and the file may open with a UTF-8 byte order mark. There are up to 10,000,000 records and a single field may reach 64 KB. Write a reader that yields one record at a time without buffering the whole file and that fails loudly on a malformed file rather than emitting a short record. State your bounds.

Approach
  1. Refuse the shape that fails first: splitting the stream on newlines and then splitting each line on commas. A quoted field may contain a CRLF, so line splitting cuts records in half, and the damage is silent because both halves parse into plausible short records.
  2. Write a byte-level state machine with four states — field start, unquoted field, quoted field, and quote-seen-inside-quoted. In the last state a second quote emits one literal quote and returns to quoted; a comma or newline ends the field; anything else is a malformed file. That table is the whole parser and it is the part to get right on paper before typing.
  3. Strip the BOM only at offset zero, comparing the first three bytes against EF BB BF. Left in place it becomes part of the first header name, so the header lookup for that column misses and the column reads as absent for every record in the file.
  4. Cap field length at the stated 64 KB and record length at a sane multiple of it. Without a cap, one unbalanced quote makes the parser treat the remaining 2 GB as a single field and the process dies of memory exhaustion rather than telling you the file is broken at byte 12,004.
  5. Treat end of stream inside a quoted field as a hard error, not an implicit close. A truncated upload is the most common malformed input here and it is byte-for-byte indistinguishable from a complete file if you close the field silently — the missing rows then present downstream as a mass withdrawal.
  6. Complexity: O(n) time in bytes with one pass and no backtracking, and O(longest field + longest record) space, which is bounded by the caps rather than by the file. Read in fixed blocks and keep the partial field across block boundaries instead of reading line-wise.
Worked solution 20 min
  1. Draw the four-state transition table on paper, including what each state does on comma, quote, CR, LF, EOF and any other byte, before writing a line of code.
  2. Implement it over fixed 1 MB blocks, carrying the in-progress field and the in-progress record across block boundaries.
  3. Build a fixture file containing a field with an embedded comma, a field with an embedded CRLF, a field containing a doubled quote, a leading BOM, and a final record cut off mid-quote.
  4. Assert the parser yields exactly the four good records and then raises on the fifth, naming the byte offset.
  5. Re-run with the block size set to 7 bytes to prove no record depends on a field fitting inside one read.
EXPECTED RESULTFour records with the embedded comma, embedded CRLF and single literal quote preserved exactly, the first header name free of the BOM, and a raised error identifying the unterminated quoted field with its offset rather than a fifth partial record.
Follow-up
  • The file arrives gzipped and you must report progress as a percentage. What can you actually report, and what does that do to your memory bound?
  • Two exporters disagree on line endings and one emits a bare LF inside a quoted field. Does your state machine care, and should it?
  • How do you distinguish a truncated file from a complete one when the byte stream itself gives you no signal?

Backfill frozen lateness without converting a hundred million times

hard
cardinality reductiontime zonesbatched backfill

A backfill must set due_at_utc on 1,000,000 assignment rows where it is NULL, from due_at_local plus policy_time_zone, and then set is_late on the 100,000,000 attempt rows beneath them whose is_late is NULL, by comparing submitted_at to that instant. Converting one local time per attempt row is correct and far too slow. Give a plan that is both faster and reproducible when re-run months later, state the speed-up you expect, and define the result for a local due time that is ambiguous or nonexistent across a daylight-saving transition.

Approach
  1. Name why the naive plan is slow rather than asserting it. A local-to-UTC conversion is a binary search over that zone's transition table plus an object construction, on the order of one to three microseconds in a managed runtime; 100,000,000 of them is a few minutes of pure conversion and, once per-row fetch and allocation are included, hours. Nothing about it is wrong — it is the row count multiplied by a cost that did not have to be paid per row.
  2. Collapse the cardinality. The conversion depends only on (policy_time_zone, due_at_local), and due dates cluster hard on end-of-day instants for school days, so the distinct pair count is on the order of 10,000 against 100,000,000 attempts. Convert the distinct pairs once into a small mapping, then resolve each attempt with a hash probe. That is roughly a 10,000-fold reduction in conversions, and the per-row cost drops from a conversion to a lookup.
  3. Do it in two stages so the second one is a join, not a computation: materialise due_at_utc on the 1,000,000 assignment rows from the mapping, then set is_late on attempts by joining on assignment_id. The attempt stage then performs no time-zone work at all, which is also what makes it re-runnable without the tz database on the path.
  4. Pin reproducibility explicitly. The local-to-UTC mapping is a function of the zone, the local time, and the time-zone database version, because releases correct historical transitions. Record the tzdata version on the backfill run, or a re-run months later can produce a different instant for the same row and a grade will move with no grade event behind it.
  5. Define the two degenerate cases instead of letting a library default decide. An ambiguous local time in a repeated hour maps to two instants; a nonexistent one in a skipped hour maps to none. Pick the rule — the later instant when ambiguous, the first instant after the gap when nonexistent — encode it as an explicit flag rather than relying on a fold default, and assert both in tests. An 11:59 PM due time is outside the affected hour for most zones, so this is rare, which is exactly why it will not be noticed when it is wrong.
  6. Respect the freeze. Update only rows where is_late IS NULL; a row that already carries the flag was decided at submit and must not be recomputed, or the backfill becomes a retroactive regrade. Then chunk the update by primary-key range with a bounded transaction size, because one 100,000,000-row statement holds locks and generates dead tuples for the whole run and cannot be resumed after a failure.
Follow-up
  • A district is moved to a different school with a different time zone mid-term. Which rows, if any, change, and what does the freeze rule say?
  • The tzdata version on the backfill host differs from the one in the application image. How would you have found that out before the run rather than after?
  • late_policy is block for some assignments, so a late submission should not exist. What do you write for an attempt that submitted after the due instant under that policy?

Four days sample coding, design, fundamentals and the practical rounds at deliberately shallow depth, which is enough to surface the topics you did not know were in scope. That map, rather than a guess made on day one, decides where the last three days go.

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
01Coding, one pass at shallow depth
  • Solve one problem from each of six families, an array with two pointers, hash counting, binary search, a tree traversal, a graph traversal and one dynamic program, under a hard twenty-minute cap with no extensions, marking each finished, late, or stalled.
  • For every stall, write the exact move you could not make rather than the subject, so the note reads could not turn the recurrence into a loop rather than bad at dynamic programming.
  • Fix nothing today. The value of the pass is the unfixed record.

Deliverable: Six timed attempts marked finished, late or stalled, each stall carrying a named blocking move.

Practice prompt ↗Practice prompt ↗Worked solution ↗
02Design, one pass at shallow depth
  • Spend twenty minutes each on three different shapes, a read-heavy feed, a write-heavy ingest path, and something needing a transaction across two entities, stopping each at requirements, interface and data model.
  • After each, write the first question you could not answer, which is usually a number you could not estimate or a failure mode you had no vocabulary for.
  • Mark which of the three you would be most relieved not to be asked, and treat that as data rather than as a preference.

Deliverable: Three shallow designs, each with the first unanswerable question written at the bottom.

Practice prompt ↗Practice prompt ↗
03Fundamentals and the practical rounds
  • Answer eight short questions in writing at four minutes each, covering the material that fills the gaps between the big rounds: what happens between a URL and a rendered page, what an index costs on write, when a process is preferable to a thread, and what conditions a deadlock requires.
  • Do one thirty-minute practical task of the kind a take-home compresses: read an unfamiliar two-hundred-line file and write what it does, what you would change, and the one thing you remain unsure of.
  • Score every answer fluent, correct but slow, or absent, and keep the absent ones visible.

Deliverable: Eight scored short answers and one written reading of unfamiliar code.

Practice prompt ↗Practice prompt ↗
04The rounds that are about you, and the map
  • Deliver three behavioural answers aloud against a timer, a conflict, a failure you owned, and a decision made without enough information, marking any that ran past three minutes or contained no number.
  • Assemble the map: every marked item from days one to three on a single page, sorted by how likely it is to appear in your loop rather than by how uncomfortable it felt.
  • Choose exactly two areas for the remaining three days and write down what you are deliberately abandoning.

Deliverable: A one-page scored map of the whole surface area with two areas chosen and the rest explicitly abandoned.

Practice prompt ↗Practice prompt ↗Worked solution ↗
05First chosen area, to the depth you skipped
  • Work the higher-ranked area in four focused blocks, choosing items one level above where you stalled rather than repeating what already works.
  • After each block write the rule you extracted in one sentence with its precondition attached, since a rule carrying no precondition is exactly what fails under a variation.
  • Re-attempt the day-one or day-two item that exposed this area and compare against the original timing.

Deliverable: Four worked blocks, a timed re-attempt against the original, and three one-sentence rules with preconditions.

Practice prompt ↗Practice prompt ↗
06Second chosen area, where the gap is coverage rather than speed
  • Treat the second area differently from the first. Day five drilled something you could already half-do; this one is usually a topic you had simply never met, so build one worked reference example end to end and keep it, rather than attempting six problems badly.
  • Write down the vocabulary you were missing on day two or three, five terms at most, each with the one sentence that makes it usable in an answer rather than the textbook definition.
  • Redo the shallow attempt that exposed this area and note whether you now fail later in the problem, because moving the failure point is the realistic gain from a single day and is worth more than a score that did not change.

Deliverable: One worked reference example for the newly covered area, a five-term vocabulary list, and a note on where the failure point moved.

Practice prompt ↗Practice prompt ↗
07Reassemble the loop
  • Sit two rounds back to back with no gap, ordering them so the area you chose second comes last, because the map was built from rested, isolated attempts and the loop will reach your weaker area when you are already spent.
  • Write where the second round suffered from the first, which is normally the point at which structure collapses into narration.
  • Reduce the week to one page holding only the rules you can state without reading them.

Deliverable: Mock notes on cross-round carryover plus a one-page card of rules you can recite from memory.

Practice prompt ↗Worked solution ↗

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

A migration is a cost you chose to pay, not an achievement. The story is what the old system made expensive, what you measured before committing, what kept serving traffic during the cutover, and what you would have done if the numbers had come back flat. Without those, a rewrite reads as taste.

How do you handle feedback or constructive criticism during a code rev…

medium
behavioural and engineering judgement

How do you handle feedback or constructive criticism during a code review?

Approach
  1. State the situation in two sentences and spend the rest on the reasoning.
  2. Name the disagreement and how you resolved it with evidence.
  3. Give the blast radius: what could have broken, and what you measured.
Follow-up
  • What would you do differently if you ran that again?
  • How did you know your change caused the improvement?

How do you handle production issues or performance bottlenecks in your…

medium
behavioural and engineering judgement

How do you handle production issues or performance bottlenecks in your current stack?

Approach
  1. Give the blast radius: what could have broken, and what you measured.
  2. State the situation in two sentences and spend the rest on the reasoning.
  3. Pick a story where you made the decision, not one where you watched it.
Follow-up
  • How did you know your change caused the improvement?
  • What did you decide not to do, and why?

What do you know about Academy Sports + Outdoors and our market positi…

medium
behavioural and engineering judgement

What do you know about Academy Sports + Outdoors and our market position?

Approach
  1. State the situation in two sentences and spend the rest on the reasoning.
  2. Pick a story where you made the decision, not one where you watched it.
  3. Name the disagreement and how you resolved it with evidence.
Follow-up
  • How did you know your change caused the improvement?
  • What would you do differently if you ran that again?

How does your past experience specifically relate to the requirements …

medium
behavioural and engineering judgement

How does your past experience specifically relate to the requirements of this role?

Approach
  1. Name the disagreement and how you resolved it with evidence.
  2. Close with what you would do differently, concretely.
  3. Pick a story where you made the decision, not one where you watched it.
Follow-up
  • What would you do differently if you ran that again?
  • What did you decide not to do, and why?
  • 01

    How do you handle feedback or constructive criticism during a code review?

  • 02

    How do you handle production issues or performance bottlenecks in your current stack?

  • 03

    What do you know about Academy Sports + Outdoors and our market position?

  • 04

    How does your past experience specifically relate to the requirements of this role?

PracHub interview preparation framework ↗
Is this an official Academy Sports + Outdoors interview guide?

No. It is PracHub's own research and practice material for the Software Engineer role at Academy Sports + Outdoors. Rounds and questions reflect what candidates have reported, not a process Academy Sports + Outdoors has published, and they change over time. Confirm the current format and scope with your recruiter.

PracHub interview research ↗
How long does the entire interview process typically take?

The process can vary, but given the multi-stage nature of the technical rounds, candidates should be prepared for a thorough evaluation that may span several weeks. Keep in regular contact with your HR contact to stay updated on your status.

PracHub interview research ↗
What is the best way to prepare for the technical rounds?

Focus on your past projects. Be prepared to explain the technical decisions you made, the challenges you encountered, and the ultimate impact of your work. Practice explaining your logic clearly, as interviewers value your thought process as much as the final answer.

PracHub interview research ↗
Is the culture at Academy Sports + Outdoors collaborative?

Yes, the engineering team is known for being supportive and professional. You will be expected to contribute to a culture of knowledge sharing and team success.

PracHub interview research ↗
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.