Articles · Salesforce
Salesforce AMTS Interview Guide 2026: HackerRank, DSA, LLD, and Techno-Managerial Rounds
Prepare for Salesforce AMTS interviews with a tested ticket-service design, stale-update races, DSA drills and an annotated project deep dive.
Prepare for a Salesforce AMTS interview by making your reasoning testable: implement a coding solution, defend a small object design and explain a project you actually worked on. Timed DSA matters, but a manager can also ask why your API permits a transition, how a stale update is handled or which part of a project was yours.
AMTS means Associate Member of Technical Staff. This guide focuses on early-career software engineering preparation, rather than combining every Salesforce level into one supposed interview loop.
The ticket-service exercise and project answer below are original teaching examples. They are not reported Salesforce questions, private scoring criteria or accounts of a real candidate's employment.
What is officially supported, and what varies?
Salesforce's Tech Core AMTS guidance describes resume review, a HackerRank assessment, engineering-team matching, a hiring-manager conversation and technical team interviews. It names computer-science fundamentals, databases, data structures and algorithms. The page is a published baseline, not a promise that every current requisition uses identical steps.
Its Trailhead programming-test material emphasizes working code, object-oriented organization, appropriate algorithms, testing and readability. The onsite material discusses technical and behavioral questions together. That supports preparing both implementation and project explanations without assuming separately named “LLD” and “techno-managerial” rounds.
Keep reported formats scoped. A Salesforce-published India graduate account dated March 5, 2024 described an on-campus path with three coding questions in about 90 minutes and a mixed technical/behavioral final. The same account mentions a revised round count. It is useful context for variation, not a 2026 timer or question-count guarantee for another country or team.
| Evidence | Useful preparation decision | What it cannot establish |
|---|---|---|
| Official AMTS page | Prepare coding and CS/database fundamentals. | Every applicant's exact calendar. |
| Trailhead guidance | Test and explain organized working code. | Current private scoring weights. |
| Dated regional account | Rehearse mixed technical/project discussion. | A universal named round sequence. |
| Your invitation | Use its timer, tools, language and rules. | Other applicants' formats. |
How should you prepare for HackerRank and live DSA?
HackerRank's employer documentation supports customized tests and configurable assessment settings. Inspect the actual invitation for duration, deadline, languages, sections and permitted resources. If proctoring applies, use the announced setup instructions. Platform capability does not prove which settings Salesforce enabled for your test.
Practice with a correct baseline, then check boundary cases before optimizing. For a task-dependency problem, define whether edges mean “must precede” or “depends on.” Use an indegree map and a queue for a topological order, and identify a cycle when fewer than all tasks can be processed. Include isolated tasks, repeated edges if allowed, an empty graph and a cycle. Explain O(V+E) work and storage for the adjacency structure.
For dynamic programming, state what a table entry means before writing the recurrence. With maximal square, define whether it stores area or side length, then test a single row, a single column and an all-zero grid. For longest increasing subsequence, clarify whether equal values count as increasing. An unexplained recurrence is difficult to repair under a follow-up.
In live work, describe what you know, where you are uncertain and which example would distinguish two approaches. Asking a focused question is more useful than going silent. Keep an error log from practice: wrong assumptions, missing tests, complexity mistakes and code you could not explain.
Complete LLD exercise: a tenant-scoped ticket service
Original brief: build a small service that creates, assigns, closes and reopens support tickets. Start with an in-memory implementation. Do not add billing, email, search or a full CRM.
Agree on these rules:
- A ticket is identified by tenant and ticket ID together.
- New tickets are OPEN at version 1.
- Only OPEN tickets can be assigned or closed.
- Closing requires a nonblank resolution. An assignee is optional in this mock.
- Reopening a CLOSED ticket clears its resolution and keeps the assignee.
- Every accepted command increments the version, including reassigning the same name.
- A stale expected version is rejected; an invalid operation changes nothing.
- Returned tickets are immutable snapshots.
The toy service receives a tenant argument for convenience. In a real API, derive permitted tenant context from authenticated identity and authorization; do not trust a client-supplied tenant name as proof of access. Looking up a composite key provides scoping, not complete security.
Responsibilities and public interface
| Component | Responsibility | Boundary |
|---|---|---|
| Ticket | Immutable identity, state and version. | No network or persistence logic. |
| TicketService | Create, read and validate state transitions. | Owns mutation and synchronization. |
| Conflict | Duplicate identity or stale-version signal. | An API adapter maps it to a suitable response. |
create(tenant, id) creates an initial snapshot. get(tenant, id) returns one snapshot. change(tenant, id, expected, action, value) performs one command. Assignment and closure use a string value; reopening has no value. The action vocabulary is intentionally small and validated. Separate typed command methods would be a reasonable extension when the interface grows.
Reference implementation
This Python implementation protects each lookup-and-update with one process-local lock. It is a runnable interview model, not a Salesforce API or a production storage layer.
from dataclasses import dataclass, replace
from threading import Lock
@dataclass(frozen=True)
class Ticket:
id: str
tenant: str
status: str = 'OPEN'
assignee: str | None = None
resolution: str | None = None
version: int = 1
class Conflict(Exception):
pass
class TicketService:
def __init__(self):
self._rows = {}
self._lock = Lock()
def create(self, tenant, ticket_id):
if not isinstance(tenant, str) or not tenant.strip() or not isinstance(ticket_id, str) or not ticket_id.strip():
raise ValueError('missing identity')
with self._lock:
key = (tenant, ticket_id)
if key in self._rows:
raise Conflict('already exists')
self._rows[key] = Ticket(ticket_id, tenant)
return self._rows[key]
def get(self, tenant, ticket_id):
with self._lock:
return self._rows[(tenant, ticket_id)]
def change(self, tenant, ticket_id, expected, action, value=None):
if type(expected) is not int or expected < 1:
raise ValueError('invalid version')
with self._lock:
key = (tenant, ticket_id)
old = self._rows[key]
if old.version != expected:
raise Conflict('stale version')
if action == 'assign' and old.status == 'OPEN' and isinstance(value, str) and value.strip():
new = replace(old, assignee=value.strip())
elif action == 'close' and old.status == 'OPEN' and isinstance(value, str) and value.strip():
new = replace(old, status='CLOSED', resolution=value.strip())
elif action == 'reopen' and old.status == 'CLOSED':
new = replace(old, status='OPEN', resolution=None)
else:
raise ValueError('invalid transition')
new = replace(new, version=old.version + 1)
self._rows[key] = new
return new
The lock covers reading the current version, validating the transition and storing the replacement. Reading before taking the lock would reintroduce a check-then-write race. Frozen snapshots keep a caller from mutating the stored object behind the service's back; the fields here are immutable strings and integers.
Dictionary lookup is O(1) on average. Validating and trimming a supplied string takes O(L) for its length. Storage grows with the number of tickets. The global lock serializes unrelated tickets too, which is a deliberate simplicity trade-off for this first model.
Walk through a ticket and its rejected changes
| Command for tenant Alpha, ticket 42 | Expected version | Result |
|---|---|---|
| Create | Not applicable | OPEN, unassigned, version 1. |
| Assign to agent-a | 1 | OPEN, assigned, version 2. |
| Close with “fixed” | 1 | Stale-version conflict; still version 2. |
| Close with “fixed” | 2 | CLOSED, resolution stored, version 3. |
| Assign while closed | 3 | Invalid transition; no change. |
| Reopen | 3 | OPEN, resolution cleared, agent-a retained, version 4. |
Tenant Beta can have its own ticket 42. Changing Alpha's ticket must leave Beta's snapshot unchanged. A request under an unrelated tenant gets no ticket through this lookup. The API still needs authorization, safe error messages and permission checks for the assignee.
Concurrency follow-up: two agents assign version 1
Have two worker threads read the same expected version and submit different assignments together. One enters the protected update first and creates version 2. The other sees version 2 and receives a conflict. The winner depends on scheduling; the invariant is one accepted update, one conflict and exactly one version increment.
Local validation ran that race ten times using two threads and a barrier. Every run produced one success and one conflict, ending at version 2. Additional checks covered duplicate creation, tenant scoping, immutable snapshots, blank resolution, invalid versions and values, stale updates and invalid transitions. The code shown above matches the tested implementation.
These results apply to one in-memory service instance. A process-local lock does not coordinate separate server processes or survive a restart. For database-backed storage, use an atomic conditional update keyed by tenant, ticket ID and expected version, with a transaction for any coupled state. Interpret a zero-row update carefully: authorization and missing-record handling must not reveal another tenant's data.
If notification delivery becomes a requirement, avoid updating a ticket and then independently sending an email with no recovery record. Commit a notification job or outbox record with the state change; make its delivery retryable and deduplicated. If clients need safe request retries, introduce a scoped request ID and define same-payload replay versus changed-payload reuse. Version checking alone does not return a previous successful result after an acknowledgment is lost.
A project answer for a mixed technical and manager discussion
“Techno-managerial” is a candidate-used label for blended discussion, rather than a guaranteed company-wide stage. Prepare to explain both the technical choice and the behavior around it. A project title and framework list will not answer a follow-up about correctness or collaboration.
Weak fictional answer: “I built a ticket app using Python and a database. We improved reliability and used OOP.”
Stronger fictional answer: “Our prototype let two agents overwrite each other's assignments. I owned the ticket-state service and proposed an expected-version field so the second stale update would fail visibly. I considered a silent last-write-wins approach, but it could hide a lost assignment. I implemented immutable snapshots and the transition checks. A teammate built the UI conflict message. I tested two simultaneous assignments; one succeeded and the other received a conflict. I also added tests that the same ticket ID in another tenant stayed unchanged. The result was a tested prototype with visible stale-update handling, not a measured production reliability improvement. If I extended it to multiple servers, I would replace the local lock with database enforcement and test retries separately.”
This answer gives the interviewer something to probe. Use your own real project and results when interviewing. A class project, internship or personal tool can be useful evidence; inventing production scale makes the answer harder to defend.
| Part of the answer | Evidence it exposes | Follow-up to rehearse |
|---|---|---|
| “I owned the state service” | Personal responsibility. | What did your teammate own? |
| Rejected last-write-wins | A consequence behind the trade-off. | When could that choice be acceptable? |
| Expected-version conflict | Correctness mechanism. | Where is the check atomic? |
| Two-thread result | Bounded test evidence. | What does it fail to prove? |
| Prototype limitation | Honest outcome and reflection. | What is required before deployment? |
Prepare another story about feedback or disagreement. Explain how you listened, which evidence changed the decision and whether you changed your own view. Avoid making every project sound like one person's rescue of an otherwise ineffective team.
A focused 14-day preparation plan
| Days | Work product |
|---|---|
| 1–3 | Timed coding baseline; arrays, hashing, trees and graph invariants; missed-case log. |
| 4–6 | DP and implementation drills; reproduce one corrected solution without notes. |
| 7–8 | Ticket-service LLD and a second small design; tests and one concurrency follow-up. |
| 9–10 | Real project and behavioral stories with personal actions, outcomes and reflection. |
| 11–12 | Assessment-style simulation and live coding mock under announced constraints. |
| 13 | Review your actual job posting, products, team questions and open assumptions. |
| 14 | Confirm logistics and permitted tools; repair one weak explanation. |
Retained practice topics include two OA coding problems, maximal square and longest increasing subsequence, task execution order with dependencies, a synchronized watch-party LLD and ownership beyond assigned responsibilities. They widen preparation; they do not predict your Salesforce question set.
If time is short, finish one timed simulation, one scoped design and three real stories. Repeated reading without implementation can hide basic gaps until the interview.
Frequently asked questions
Does every applicant receive the same HackerRank test?
No public source establishes a universal test for every role and pipeline. Use the actual invitation for your timer, sections, languages and integrity rules.
Is a separately named LLD round guaranteed?
No. Object design is useful preparation even when it appears inside coding or a project discussion. Explain responsibilities, APIs, invariants and a failure case.
What should I prepare for a techno-managerial discussion?
Have real project details ready: architecture, your contribution, a trade-off, a test or incident, collaboration and reflection. Be able to follow a behavioral answer into technical depth.
Should I memorize a reported regional round sequence?
Use dated reports to identify skills to rehearse. Your recruiter brief determines your current schedule. A 2024 campus account cannot establish another team's 2026 process.
How should I judge whether the LLD answer is complete?
Demonstrate accepted and rejected transitions, state the invariant, test a boundary and explain the concurrency limit. Add extensions only after the core behavior works.
Sources and further reading
Checked October 8, 2026.
- Salesforce Tech Core: AMTS interview process — official role-specific baseline.
- Salesforce Trailhead: Remote Programming Test — implementation, design and testing guidance.
- Salesforce Trailhead: Own Your Onsite Interview — technical and behavioral preparation.
- Salesforce: India graduate accounts, March 2024 — explicitly dated regional experience.
- HackerRank: Onboarding Candidates — employer-customized assessment context.
- HackerRank: Proctor Mode — configurable assessment monitoring.