Alkami Technology · Software Engineer
Updated · 2026-10-02

Alkami Technology Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Alkami Technology builds a cloud-based digital banking platform that financial institutions offer to their own customers. Candidate reports also mention modules associated with MANTL, alongside work on core banking infrastructure. A Software Engineer there turns business requirements into services and features, and works with product managers, other engineering teams and DevOps so the code reaches production in a form that stays fast, reliable and secure. Because the product moves money and account data, questions about availability, consistency and security are the natural lens for this loop.

This guide is for candidates interviewing for a Software Engineer position at Alkami Technology. It covers the reported topic areas (distributed systems and consistency, performance tuning, security by design, testing and refactoring, client-side state), the stack signals candidates mention (cloud platforms and microservices), and the behavioral material that goes with them. Candidates report no fixed round sequence, so the guide prepares you by topic and tells you what to confirm with your recruiter.

Candidates report a screening call about your background, followed by technical deep-dives and behavioral assessments. No round names, order or durations are reported, so prepare by topic and confirm the format with your recruiter.

Technical and Domain ProficiencyArchitecture and ScalabilityCode Quality and Maintainability

43 min read

Browse Software Engineer questions

See the practice prompts

26Practice promptsAcross five skill areas

The reported question set is broad rather than puzzle-shaped. It opens with five direct questions: high availability and fault tolerance in a distributed system, the trade-offs between database consistency models, testing in a microservices architecture, optimizing a slow API endpoint, and managing state in complex client-side applications. The remaining reported items are topic areas: CAP and consistency, performance tuning, security by design, refactoring, testing paradigms and giving peers useful feedback. Treat each as a prompt for a two-to-three minute spoken answer that names a mechanism, a trade-off and a failure case.

The product is digital banking delivered through a cloud platform, so the strongest answers tie general principles to banking-shaped examples. A funds transfer and an account activity feed need different consistency choices. A retry after a timeout must not move money twice. A security answer has to cover who can call an endpoint, what is logged and where secrets live. Prepare one or two such examples and reuse them across the availability, consistency and security answers.

Candidates describe the day-to-day work as sprint planning, design sessions, code reviews and close work with product managers and DevOps, often on ambiguous problems where you research, prototype and present a recommendation. That points to two kinds of preparation: stories from your own work (a production incident, a stretch of technical debt, a slow endpoint you fixed, a review where you gave feedback), and practice explaining technical trade-offs to someone who is not an engineer.

Reports suggest applied engineering matters more than theoretical algorithm work, and they do not describe a live coding stage. Confirm with your recruiter whether you will write code, and keep one language and one framework you can discuss in depth, since candidates describe questions that go into the reasons behind a technical decision in your own stack.

01

Preparation focus

editorial

No round names or sequence are reported for this loop. Candidates describe a screening call about your background and interest in the company, followed by technical deep-dives and behavioral assessments, with engineers and managers involved. Use the reported questions as your curriculum: availability and fault tolerance, consistency models and CAP, microservice testing, performance tuning, security by design, refactoring and client-side state, plus stories about incidents, technical debt and peer feedback. Ask your recruiter for the stage list, who you will meet and whether you will write code or draw a design, then tailor the last days of preparation to the answer.

What to demonstrate

  • Depth in distributed-systems topics: availability, fault tolerance, consistency models and CAP
  • Ability to reason about performance, security and testing as parts of one system
  • Experience handling production incidents and technical debt, told through your own examples
  • Clarity when explaining technical decisions and giving or taking feedback

How to prepare

  • Write a spoken answer for each of the five direct questions, each with one banking-flavored example such as a funds transfer or a balance read
  • Prepare two stories, one production incident and one piece of technical debt, each with your decision, the trade-off and the result
  • Choose one language and framework from your own experience and be ready to explain why you made the choices you did in it
  • Send your recruiter a short list of format questions: stages, interviewers, live coding or not, and design discussion style
PracHub preparation framework ↗

PracHub editorial advice for the preparation topics above.

01

Reciting CAP as "pick two of three" without tying it to a real operation

Anchor the theorem in a concrete case. For a funds transfer, say you prefer rejecting or delaying requests during a partition over accepting conflicting writes. For an activity feed or notification list, say stale reads are acceptable. Then name the consistency level you would configure and what the user sees during the failure.

02

Answering the slow-endpoint question with fixes before measurement

Tell the story in order: the symptom and its percentile (p95 or p99, not the average), how you profiled or traced it, the single bottleneck you found (N+1 queries, a missing index, a slow downstream call, oversized payload), the one change you made, and the before and after numbers.

03

Describing microservice testing as a generic test pyramid

Name what is specific to services: consumer-driven contract tests between services, test doubles or sandboxes for dependencies, a small number of end-to-end paths through the real deployment, and fault-injection checks for timeouts and retries. Say what you deliberately leave out of end-to-end tests and why.

04

Treating security by design as a review step at the end

Walk through the lifecycle: threat modelling at design time, authentication and authorization on every endpoint, input validation, secrets kept out of code, dependency scanning and tests in CI, audit logging for sensitive actions, and what you check during code review.

05

Telling an incident or technical-debt story where the team made every decision

Pick a story where you made a specific call. State the situation, what you decided and what you rejected, how you handled the risk (a rollback path, a feature flag, a staged rollout), the result, and what you changed afterwards, such as a runbook, alert or follow-up refactor.

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

23 technical prompts0 include a worked solution

Identify the heaviest tenants in a five-minute window under memory pressure

medium
top-kheavy hittersstreaming

The edge service handles about 3,000 requests per second across roughly 50,000 tenants, peaking near 9,000. Expose the 50 heaviest tenants by request count over the trailing five minutes so limits can be tightened before one tenant's backfill starves the fleet. You may not retain five minutes of raw records. Give the exact solution and its memory, then the bounded-memory approximation with its error stated as a formula, and say which you would ship and at what tenant cardinality that choice changes.

Approach
  1. Do the exact version first, because it is affordable at this cardinality: a ring of 300 one-second counters per tenant, advanced lazily, is 1,200 bytes of counters per tenant and roughly 60 to 90 MB for 50,000 tenants with overhead. Carry a running total and subtract the bucket you overwrite so a window read is O(1) rather than 300 adds.
  2. Extract the top 50 with a size-k min-heap over the tenant sums: O(d log k) for d tenants, against O(d log d) to sort them all. Maintaining the heap continuously instead of on query requires a tenant-to-heap-index map, because incrementing a count already inside the heap means sifting from a known position, and without that map you rebuild the heap on every request.
  3. State the approximation precisely rather than gesturing at sketches. Misra-Gries with m counters retains every item whose true count exceeds N/(m+1), and each retained count underestimates the truth by at most N/(m+1). With m = 1,000 and N = 900,000 requests in the window the error is roughly 900 requests, which is fine for spotting a tenant sending 50,000 and useless for ranking two tenants 200 apart.
  4. Say what breaks when the window slides: Misra-Gries and Space-Saving are insert-only and cannot be decremented as records age out. The workable construction is one summary per sub-window, say ten seconds, with 30 summaries merged at query time, and the merged error is the sum of the per-summary errors, so the bound degrades linearly in the number of sub-windows.
Follow-up
  • The heaviest tenant is heavy because of one export job rather than user traffic. Should the limiter treat those as the same tenant?
  • Two tenants sit tied at the boundary of the top 50. Does your answer flap, and does the flapping matter?

Diff a projection against the primary without per-row point reads

hard
reconciliationrange hashingthrottling

The listing projection has drifted and some rows show a stale version. The primary holds 40,000,000 resource rows across 12,000 tenants while serving 1,200 writes and 14,000 reads per second. The obvious repair, reading each resource row and comparing its version against the projection, is correct and would eventually finish. Explain precisely why it is unacceptable here, then give a diff that finds the differing rows, state its complexity, and make it safe to run against a live primary. Replication lag is usually under 100 ms and is not bounded.

Approach
  1. Quantify the naive cost rather than calling it slow: 40,000,000 point reads at even 0.5 ms each is over five hours serialised, and the only lever is concurrency, which is exactly what you cannot spend. The primary's pool is sized for the write path, and 40,000,000 random reads evict the buffer cache that sustains the 85 percent cache hit rate, so the audit degrades the system it is auditing.
  2. Replace random access with one ordered pass per side. Both sides can be read in (tenant_id, resource_id) order, which is a sequential scan on each and a merge join in O(n) time and O(1) memory. For a dense diff that is the whole answer, and it reads the primary once instead of 40,000,000 times.
  3. For the expected sparse case, compare range hashes instead of rows: partition the key space, compute per range an order-independent aggregate over hash(resource_id, version), compare aggregates, and descend only into ranges that differ. With d differing rows and branching factor B, at most d ranges mismatch per level, so the drill-down examines O(d log_B(n/d)) ranges and reads full rows only in mismatching leaves.
  4. Aggregate with a sum modulo 2^64 or a multiset hash, never XOR. XOR is order-independent but self-cancelling, so two rows wrong in the same way, or a row duplicated on one side, leave the range aggregate matching and the range is declared clean.
Follow-up
  • The diff reports 900 stale rows. How do you decide between patching those rows and rebuilding the projection from resource_revision?
  • Same job, but the projection lives in a search index that cannot be scanned in key order. What changes?

Archive a resource graph without breaking live references or recursing

medium
graph traversaltopological ordertenant isolation

Resources reference other resources within a tenant; for the largest tenant the reference table holds up to 2,000,000 nodes and 8,000,000 edges. Archiving a resource must archive everything reachable from it that nothing outside the set still references, refuse when a live external referrer exists, and terminate when references form cycles, which they legitimately do. Produce the archive order and the refusal list, targeting O(V+E). Say what stops the traversal crossing a tenant boundary, and why recursion is the wrong control structure at this size.

Approach
  1. Load the subgraph with the tenant predicate on both endpoints of the edge, not only on the side you started from. Scoping the left table alone is the classic cross-tenant leak: one mis-entered edge then pulls another tenant's resources into the traversal and, worse, into the archive.
  2. Traverse iteratively with an explicit stack. A 2,000,000-node graph can hold a chain deep enough to exhaust a native stack in the low tens of thousands of frames, and that failure is a process crash rather than an error you can return.
  3. Treat cycles as data rather than corruption: compute strongly connected components with Tarjan in O(V+E) using its own explicit stack, then condense. The condensation is a DAG, so a topological order over it gives the archive order, and every member of a component archives in one transaction because no order within a cycle is valid.
  4. Decide refusals with reverse edges. A candidate is archivable only if every in-edge originates inside the candidate set, so build the transpose or count in-degrees restricted to the visited set, and emit each blocked resource with the id of the external referrer, which is the only part of the answer an operator can act on.
Follow-up
  • The graph is read in one query and the archive writes a minute later. What can change in between, and how do you make the write safe?
  • The candidate set is 400,000 resources. Is that one transaction, and if not, what does a half-finished archive look like to a reader?

The plan follows the reported topics in order of how much explanation each needs: format first, then availability and consistency, performance, testing and refactoring, security and client-side state, behavioral stories, and a final spoken run-through. PracHub practice-set questions are attached where they exercise the same skill.

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
01Confirm the format and map the reported topics
  • Email your recruiter asking for the stage list, who you will meet, whether you will write code live, and whether a system design discussion is included.
  • Sort the reported questions into four groups: distributed systems, performance and security, testing and refactoring, and behavioral. Mark the two you can answer worst.

Deliverable: A sent recruiter email with format questions, and a one-page map of reported topics with your two weakest marked.

02Availability, fault tolerance and consistency
  • Sketch a funds-transfer service and list its failure modes: instance loss, zone loss, a dependency timing out, a database failover. Next to each, write the mitigation, such as redundancy, health checks, timeouts, retries with backoff and jitter, circuit breakers and idempotency keys.
  • Write a short comparison of strong, causal, read-your-writes and eventual consistency, each with one banking example and the cost it adds.
  • Explain CAP aloud in two minutes using the transfer example and an activity feed, covering what each does during a network partition.

Deliverable: A failure-mode table for the transfer service, a consistency comparison with examples, and a recorded two-minute CAP explanation.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
03Performance tuning and latency
  • Write your slow-endpoint story in order: symptom with a percentile, how you measured, the bottleneck, the change, the before and after numbers.
  • List five common causes of a slow API (N+1 queries, missing or unusable index, chatty downstream calls, large payloads, no caching) and how you would confirm each one.
  • Work the SQL practice question on why an owner filter ignores a listing index, then the debugging practice question on one customer endpoint stalling deliveries to every other destination.

Deliverable: A written slow-endpoint story with measurements, a five-cause diagnosis checklist, and notes from both practice questions.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
04Testing strategy and refactoring
  • Write a test plan for a three-service request chain: unit tests per service, consumer-driven contract tests at each boundary, dependency doubles, and a short list of end-to-end paths.
  • Outline how you would refactor a large module without changing behavior: add characterization tests first, make small reversible steps, keep the old path behind a flag until the new one is proven.
  • Work the practice coding question on archiving a resource graph without breaking live references, and note which tests you would write before touching the code.

Deliverable: A microservice test plan, a refactoring outline with its safety net, and a written test list for the resource-graph exercise.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
05Security by design and client-side state
  • Write a security checklist per lifecycle stage: threat model at design, authentication and authorization, input validation, secrets handling, dependency scanning in CI, audit logging, review checklist items.
  • Pick the front-end framework you know best and write a one-page answer on managing state: local component state, shared stores, server-state caching, derived state, and when each becomes a problem.
  • Explain both answers aloud once, and cut anything you cannot justify in one sentence.

Deliverable: A lifecycle security checklist, a one-page client-state answer, and one recorded spoken run of each.

Practice prompt ↗Practice prompt ↗
06Behavioral stories: incidents, debt and feedback
  • Write the incident story and the technical-debt story in situation, task, action, result form, each stating your own decision, the alternative you rejected and a measurable result.
  • Write a story about giving constructive code-review feedback, including what you said, how it was received and what changed.
  • Rehearse the three PracHub behavioral practice questions on deprecation, shipping under a deadline and estimating unfamiliar work, then compare their structure with your own stories.

Deliverable: Three written stories (incident, technical debt, feedback) in STAR form, plus notes from the behavioral practice questions.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Spoken run-through and questions to ask
  • Give one full answer aloud to a design-style prompt (high availability for a banking service), narrating your reasoning as you go, then record and review it.
  • Write four questions to ask the team about its current technical challenges, how it handles incidents and technical debt, and how remote collaboration works.
  • Do a timed pass over the five direct reported questions with no notes, and mark any answer that lacked a mechanism, a trade-off or a failure case.

Deliverable: A recorded design answer, four written questions for the interviewers, and a list of answers that still need work.

Practice prompt ↗Practice prompt ↗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 assessments alongside the technical deep-dives, and one reported tip is to bring specific examples of production incidents and technical debt. Reports also describe ambiguous problems, work with product managers and DevOps, remote collaboration and peer code review, so keep a story ready for each. Use situation, task, action, result, and make your own decision and its measurable outcome the center of every story.

Tell callers you do not own that their integration breaks

medium
deprecationcompatibilitystakeholders

A field in a write endpoint's response must change shape. You own the endpoint; you do not own the four internal callers or the outbound webhook consumers who read it. Describe a deprecation you were responsible for: what you shipped first, how you established who was actually reading the field, the window you gave and what set its length, what you did about the consumer who never moved, and how you decided removal was safe. Name the signal you used, not the announcement you sent.

Approach
  1. Establish the reader set empirically rather than from a wiki of owners: per-field usage counters keyed by principal, or access logs attributed to a consumer. State the blind spot of whichever you pick, since a consumer that reads the field only on a monthly job will not appear in a week of logs.
  2. Ship additive first. Populate the new field alongside the old one so no reader is forced to move, which is also what keeps a rolling deploy safe, because old and new instances answer the same requests at the same time and a rollback must still find the old shape present.
  3. Set the window from the slowest legitimate consumer's release cadence, not from your calendar, and decide separately what to do for a consumer with no release process at all, such as an external webhook endpoint you can only email.
  4. Convert silence into evidence before you rely on it: a short, low-traffic removal window that makes a still-dependent consumer fail visibly and loudly while you are watching, rather than at three in the morning after you have moved on.
Follow-up
  • How would you detect a consumer that reads the field only during a monthly export?
  • One caller refuses to move and has a commercial relationship behind it. What changes in your plan and what does not?

Ship under a deadline and bound the debt you chose

medium
paginationtechnical debttradeoffs

You have four days to ship a tenant-facing listing endpoint. The version you would defend uses keyset pagination over (tenant_id, status, updated_at DESC, resource_id DESC); the version you can finish uses LIMIT/OFFSET with no matching index. Describe a deadline call you actually made of this shape: what you shipped, what you knowingly deferred, how you bounded the damage with a mechanism rather than an intention, and the specific numeric condition that would force the follow-up. Name who you told and where you wrote it down.

Approach
  1. Name the deferred failure precisely instead of calling it slow. OFFSET n makes the database produce and discard n rows, so cost grows with page depth; without an index matching the sort, every matching row is read and sorted before the limit applies; and rows inserted between two page fetches shift across the boundary so items are skipped or repeated with nothing in the response to signal it.
  2. Bound the blast radius with something mechanical rather than a promise: cap maximum page depth, cap page size, restrict the endpoint to one internal caller, or keep it behind a flag. State which failure each cap removes and which it leaves standing.
  3. Attach a number to the trigger and wire it to an alarm: the first tenant crossing N resources, or the endpoint's p99 crossing its share of the 400 ms budget, so the debt announces itself instead of waiting to be remembered.
  4. Write it where the next engineer looks, which is the code and the ticket, not a chat message: what was deferred, why, the cap, and the trigger.
Follow-up
  • At what page depth does the offset version breach your latency budget, given your page size and row counts?
  • What breaks first when you switch to keyset pagination later, and what does a client holding an old page token see?

Estimate work you have never done and defend the range

hard
estimationbackfillsexpand-contract

You are asked to estimate a change you have never attempted: add a column to a 100-million-row table, populate it, move reads across, and drop the old shape. Give a range with the assumptions that generate it, including batch size, the signal your backfill throttles on, and wall-clock hours, and name the three unknowns that would move the number most. Then describe a real estimate you gave under comparable ignorance: how you expressed its uncertainty, what you committed to, and how wrong you turned out to be.

Approach
  1. Decompose into independently deployable steps before estimating anything: add the column nullable, write both shapes, backfill in batches, verify, move reads, stop writing the old shape, drop it. That is four deploys spread over days, and the calendar estimate is dominated by them rather than by the loop's runtime.
  2. Do the arithmetic aloud for the part that has arithmetic in it: batch size times number of batches times per-batch duration, at a write rate the primary can absorb alongside roughly 1.2k writes per second of production traffic. The loop is throttled by replication lag and lock waits, not by how fast it can issue statements.
  3. Price the schema step by its lock rather than its statement duration. In PostgreSQL an ALTER TABLE taking ACCESS EXCLUSIVE waits for every open transaction on that table while later queries queue behind it, so a millisecond change issued during a thirty-second analytics query stalls that table for thirty seconds. Adding a nullable column with a non-volatile default avoids a rewrite from version 11; a new index wants CREATE INDEX CONCURRENTLY, which cannot run inside a transaction block and leaves an invalid index behind if it fails.
  4. Express the answer as a range whose endpoints each trace to a stated assumption, then name the cheapest experiment that collapses it, which is almost always running one real batch against the real table and multiplying.
Follow-up
  • How do you verify the backfill genuinely finished, given rows written by production traffic while it ran?
  • Where does the backfill resume from after a worker is killed mid-batch, and what makes that resume point trustworthy?
  • 01

    Describe a time you had to optimize a slow-performing API endpoint.

  • 02

    Walk through a production incident you handled: how you detected it, what you did first, how you communicated, what the root cause was and what you changed afterwards.

  • 03

    Describe technical debt you inherited or created. What did you decide to fix or leave, how did you justify it, and what was the result?

  • 04

    Tell me about a time you gave a peer constructive feedback in a code review that they initially disagreed with.

  • 05

    Describe a technical problem with no clear right answer. How did you research it, prototype options and present a recommendation to your team?

  • 06

    Explain a complex technical trade-off you once had to describe to a non-technical stakeholder, and how you checked they understood it.

PracHub preparation framework ↗
What does the Alkami Technology interview process look like?

Candidates describe a screening call about your background and interest, followed by technical deep-dives and behavioral assessments. No round names, order or durations are reported for this loop, and candidates mention that timelines vary by team and usually run a few weeks. Ask your recruiter for the stage list and who you will meet.

Alkami Technology Software Engineer candidate reports ↗
Is the Software Engineer role remote?

Candidates report that many Alkami Technology roles are remote and mention a remote-first working style. Location rules differ by role, so confirm the requirement for your specific position in the recruiter screen. Be ready for questions about working asynchronously with product managers and DevOps.

Alkami Technology Software Engineer candidate reports ↗
What topics should I prepare first?

Start with the five direct questions: high availability and fault tolerance, database consistency trade-offs, microservice testing, optimizing a slow API endpoint, and client-side state management. Then cover the reported topic areas: CAP and consistency, performance tuning, security by design, refactoring and testing paradigms. For each, prepare a mechanism, a trade-off and a failure case, and attach one banking-style example.

Alkami Technology Software Engineer candidate reports ↗
Will I be asked to write code or solve algorithm problems?

No coding stage is described in candidate reports, and one reported tip advises against heavy study of theoretical algorithms unrelated to day-to-day work. Do not assume that rules coding out: ask your recruiter whether you will write code, and keep one language and framework fluent enough to discuss in depth, including why you chose its patterns.

PracHub Software Engineer practice ↗
How should I prepare for the behavioral side?

Prepare at least four stories from your own work: a production incident, a piece of technical debt, a slow endpoint you improved, and a time you gave or received code-review feedback. Candidates also describe ambiguous problems and communication with non-technical stakeholders, so add a story where you prototyped options and presented a recommendation. Write each in situation, task, action, result form with a number attached to the result.

PracHub Software Engineer practice ↗
What should I ask at the end of the interviews?

Ask about the team's current technical challenges, how it handles production incidents and technical debt, how code review and design sessions work, and how a remote engineer collaborates with product managers and DevOps. These questions come from the work candidates describe, so they show you have thought about the actual job.

PracHub Software Engineer practice ↗
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.