Bank Neo Commerce · Software Engineer
Updated · 2026-10-02

Bank Neo Commerce Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Candidates describe Bank Neo Commerce as a neobank serving customers in Indonesia. Software engineers build, scale and maintain the backend systems behind its digital banking features, so the work is services that move and record money: optimising existing backend services, designing the architecture for new features, and turning product requirements into technical solutions alongside cross-functional teams. The requirements candidates describe list Java, data structures, microservices and relational databases as must-haves, with AWS or GCP, Docker or Kubernetes and event-driven architecture as extras.

This guide is for candidates interviewing for the Software Engineer role at Bank Neo Commerce. It covers the reported topics (Java live coding, concurrency, database optimisation, payment system design and a production-incident story), explains how to prepare each one, and ends with a seven-day plan and a behavioral set. No fixed round-by-round order is reported, so the guide is organised by topic rather than by stage.

Candidates report an HR screen first, then technical conversations with senior engineers and engineering leadership, including a Java live coding assessment and system design. Some stages are remote.

Live Coding InterviewJavaSystem Design

29 min read

Browse Software Engineer questions

See the practice prompts

12Practice promptsAcross five skill areas

The reported work is backend engineering for a bank, where a half-finished operation means money in the wrong place. Responsibilities candidates describe include building features end to end, taking part in code reviews, working with product managers on technical feasibility and with QA on test coverage, and monitoring services in production to track down performance bottlenecks. That is why the reported questions pair classic coding material with concurrency, data consistency and an incident story.

The technical areas candidates name are data structures and algorithms with attention to efficiency and memory, concurrency and threading, database optimisation (indexing, query performance, ACID), microservices communication (synchronous versus asynchronous calls), caching strategies including Redis, and protecting sensitive user data. Transaction atomicity and data security are the banking-domain themes candidates are told to study. Treat these as one connected story: a payment is a database transaction, a concurrency problem, a distributed-systems problem and a security problem at the same time.

The most concrete warning in the reports is about language. The live coding assessment is reported to require Java, and a candidate who is not proficient in the requested language may be moved to system design instead, which changes how the session is judged. So the first preparation step is administrative: confirm the language with your recruiter, then practise in it until collections, generics, streams and the java.util.concurrent package need no looking up.

Preparation depth matters more than breadth here. Pick a small set of artefacts you can reproduce from memory: an LRU cache, a thread-safe account transfer, a ledger schema with the right indexes and constraints, and a payment-processing design with idempotency and a clear consistency story. Then rehearse explaining the why behind each choice, because candidates are repeatedly told to justify technology and architecture decisions and to ask clarifying questions before designing.

01

Preparation focus

editorial

Candidates describe a process that often opens with an HR screen covering your background, salary expectations and general fit, followed by sessions with senior engineers and engineering leadership. Topic labels attached to the reports are Live Coding Interview, Java, System Design, Technical Interview (Senior Engineer) and Technical Interview (Engineering Leader). Some stages are remote, and the live coding is reported to require Java. Because the sequence and the length of each stage are not reported, treat this as a preparation map: confirm the format and the coding language with your recruiter, then cover Java coding, concurrency, relational database behaviour, microservices and caching, and a payment-style design. Reported advice also includes asking clarifying questions before you design and being ready to explain why you chose a technology or pattern.

What to demonstrate

  • Working Java code written live, with complexity stated and defended
  • Concurrency and threading reasoning for high-transaction banking systems
  • Database fundamentals: indexing, query performance and ACID guarantees
  • System design choices across databases, caching layers, load balancers, API design and service communication

How to prepare

  • Message your recruiter to confirm the coding language, whether the session is live and which stages are remote
  • Re-implement an LRU cache, a bounded blocking queue and a thread-safe account transfer in Java without an IDE hint, stating the complexity of each
  • Write a payment design on one page: components, the idempotency key, the ledger table, what is cached in Redis and what is not, and which calls are asynchronous
  • Prepare a spoken account of one production bug and a one-minute answer to your background and salary expectations for the HR screen
PracHub preparation framework ↗

PracHub editorial advice for the preparation topics above.

01

Arriving at the live coding session without having confirmed or practised the requested language

Ask the recruiter which language the session uses before anything else. Candidates report Java, and being weak in the required language can move you into a system design conversation instead. Practise collections, generics, streams and java.util.concurrent in plain Java without autocomplete.

02

Stating a complexity without saying which data structure operation it comes from

When asked how a solution could be optimised, name the dominant operation, the structure behind it (HashMap lookup, heap push, sorted traversal) and its amortised or worst-case cost, plus the space trade-off. Practise this on an LRU cache and a top-k problem until it takes two sentences.

03

Answering the concurrency question with "I would use synchronized" and nothing else

Name the shared state, the invariant that is briefly false, and the smallest tool that protects it: an atomic, a ConcurrentHashMap compute, a lock with consistent ordering for two accounts, or a database row lock. Mention visibility, check-then-act races and deadlock, and say how you would test it with many threads.

04

Designing a payment system with no answer for retries, partial failure or duplicate requests

Put an idempotency key, a ledger written inside one database transaction, and an outbox or saga for downstream calls on the page before you draw caches and load balancers. Say explicitly which data must be strongly consistent and where staleness is acceptable.

05

Telling the production-bug story as a vague tale of long hours rather than a sequence of decisions

Structure it as symptom, hypothesis, evidence you gathered, fix, and what you changed so it could not recur. Keep your own actions and the tools you used (logs, metrics, a reproduction, a rollback) in the foreground.

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

9 technical prompts0 include a worked solution

Can you explain the complexity of your solution and how it could be further optimized?

medium
Technical and Coding Proficiency

Can you explain the complexity of your solution and how it could be further optimized?

Approach
  1. State time and space separately in named variables (n items, k distinct keys, m queries), and count auxiliary space honestly: a HashMap of n entries is O(n) extra, and a recursive DFS adds O(depth) stack, which is O(n) on a degenerate tree.
  2. Separate worst, expected and amortized cases: ArrayList.add is amortized O(1) because the backing array grows by about 1.5x; HashMap.get is expected O(1), and since Java 8 heavily colliding buckets are converted to trees, which bounds lookups in them at O(log n) when keys are Comparable.
  3. Find the dominant term and attack only that: a nested-loop pair search at O(n^2) becomes O(n) time with a HashSet (paying O(n) memory), or O(n log n) with sort plus two pointers if the input may be reordered; repeated range sums drop to O(1) per query after an O(n) prefix-sum pass.
  4. Argue the lower bound before promising more: if every element must be read the answer is at least Omega(n), and comparison-based sorting cannot beat Omega(n log n), so past that point the remaining wins are constant factors.
  5. Name Java constant-factor costs: boxing int into Integer in a HashMap<Integer,Integer> allocates objects and adds GC pressure where an int[] indexed by value would not; concatenating a String with + inside a loop copies it every iteration (O(n^2) total) where a StringBuilder is amortized O(n).
Follow-up
  • What changes if the input arrives as a stream and you cannot hold all of it in memory?
  • Your solution is O(n log n); for what input sizes would the simpler O(n^2) version actually run faster, and why?
  • Which input drives your worst case, and how likely is real data to hit it?

Implement a solution for [X] data structure problem using your preferred language.

medium
Technical and Coding Proficiency

Implement a solution for [X] data structure problem using your preferred language.

Approach
  1. Clarify the operations and how often each runs before choosing: HashMap for keyed lookup, ArrayDeque as a stack or queue (preferred over the synchronized legacy Stack and over LinkedList), PriorityQueue for repeated min or max, TreeMap when floorKey, ceilingKey or ordered iteration are needed at O(log n).
  2. Know the standard compositions: top-k of n items with a min-heap capped at size k runs in O(n log k); an LRU cache is a HashMap from key to node plus a doubly linked list with sentinel head and tail, giving O(1) get and put. LinkedHashMap with accessOrder=true and removeEldestEntry is the library shortcut, so ask whether a hand-rolled version is wanted.
  3. Avoid Java traps that break otherwise-correct code: comparing Integer objects with == (only -128 to 127 are cached by default), mid = (lo + hi) / 2 overflowing (use lo + (hi - lo) / 2), a comparator written as a - b overflowing (use Integer.compare), and removing inside a for-each loop, which throws ConcurrentModificationException (use Iterator.remove or removeIf).
  4. State the class invariants before writing methods, then trace small cases by hand: empty input, one element, duplicates, capacity of 1, and the call sequence that triggers eviction or resizing.
  5. Close with per-operation time and memory, and with thread safety: the standard collections are not thread-safe, so a shared instance needs ConcurrentHashMap, a lock around compound operations, or confinement to a single thread.
Follow-up
  • How would you make this structure safe to share across request threads, and what does one global lock cost under load?
  • Why ArrayDeque rather than Stack or LinkedList here?
  • What changes if the data no longer fits in one JVM's heap?

How do you handle concurrency and multi-threading issues in a high-traffic banking application?

medium
Technical and Coding Proficiency

How do you handle concurrency and multi-threading issues in a high-traffic banking application?

Approach
  1. Name the shared mutable state and the exact race: two debits both read a balance of 100, both pass the check amount <= 100, both write 100 - amount, and one update is lost. Check-then-act and read-modify-write sequences are the patterns to look for.
  2. Inside one JVM: synchronized or ReentrantLock around the compound operation, AtomicLong or LongAdder for counters, ConcurrentHashMap.compute for atomic per-key updates, and volatile only for visibility, since it makes no compound operation atomic. Then point out that with several application instances behind a load balancer, in-JVM locks protect nothing across instances.
  3. Move the invariant into the database: one conditional statement such as UPDATE account SET balance = balance - ? WHERE id = ? AND balance >= ? with an affected-row check, SELECT ... FOR UPDATE for pessimistic locking, or a version column for optimistic locking with retry. Under READ COMMITTED a plain read-then-write in application code can still lose updates.
  4. Prevent deadlock on transfers by locking both accounts in a fixed order (lower account id first), keep transactions short, never hold a row lock or pooled connection across a call to an external service, and set lock and statement timeouts.
  5. Make retries safe and overload bounded: a client-supplied idempotency key stored under a unique constraint means a retried request returns the first result instead of debiting twice; size thread pools and connection pools together, with bounded queues so excess load is rejected rather than queued indefinitely.
Follow-up
  • Transfers from A to B and from B to A start at the same moment: walk through what each one locks and whether they can deadlock.
  • One merchant account receives most of the traffic; how do optimistic and pessimistic locking each behave under that contention?
  • How would you write a test that reliably exposes this race?

Describe a challenging bug you encountered in production and your step-by-step resolution process.

medium
Technical and Coding Proficiency

Describe a challenging bug you encountered in production and your step-by-step resolution process.

Approach
  1. Choose a bug with a real mechanism and real stakes, and open with the symptom, what was affected (failed or duplicated transactions, latency, error rate) and how it was detected, in two or three sentences.
  2. Show containment before root cause: what I did first to stop the damage (rollback, feature flag, pausing a consumer, scaling out) and why that step was safe to take.
  3. Walk the narrowing sequence with evidence at each step: line up the start time with deploys and config changes, follow one failing request through logs by trace or correlation id, then use the matching tool (jstack thread dumps for hangs or pool exhaustion, a heap dump for growing memory, GC logs for pauses) and reproduce with the same data shape outside production.
  4. State the root cause as a mechanism, for example a transaction held a pooled connection while calling a slow external API, so the pool drained and unrelated requests timed out; then the fix, the regression test, and the production metric that confirmed it worked.
  5. End with prevention (alert, dashboard, runbook, postmortem action item) and keep my own actions distinct from the team's. The weak version to avoid is a story with no mechanism, or a fix claimed without evidence that it worked.
Follow-up
  • How did you know the fix addressed the cause rather than coinciding with traffic dropping?
  • What would have caught this before it reached production?
  • What would you have done if you could not reproduce it?

The plan follows the reported topics: confirm the format, build Java fluency, then concurrency, database behaviour, payment design, the incident story and a full mock. PracHub practice-set questions are used on the days that match their subject.

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 set up Java
  • Message your recruiter to confirm the coding language, which stages are live and remote, and who you will meet
  • Set up a plain Java project with JUnit and no autocomplete helpers, and run one test
  • Write a one-minute answer to the HR screen: your background, what you want next and how you will handle the salary expectations question

Deliverable: A sent recruiter message, a Java project with one passing test, and a written one-minute HR screen answer.

02Data structures in Java with complexity
  • Implement an LRU cache two ways: with LinkedHashMap, and by hand with a HashMap plus a doubly linked list
  • Solve a top-k problem with a PriorityQueue and a sorted-array alternative, and write each solution's time and space complexity in comments
  • Record yourself explaining how each solution could be improved further: dominant operation, structure, cost, trade-off

Deliverable: Two LRU cache implementations and a top-k solution, each with a complexity note, plus one recorded optimisation explanation.

Practice prompt ↗Practice prompt ↗
03Concurrency for a banking workload
  • Write an Account and Transfer class that moves money between two accounts with lock ordering to avoid deadlock
  • Write a test that runs thousands of concurrent transfers and asserts total balance is conserved
  • Rewrite one counter three ways (synchronized, AtomicLong, LongAdder) and note when each fits and what a check-then-act race looks like
  • Write a short note on volatile, happens-before and what the JVM does with memory under load

Deliverable: A tested transfer class, a three-way counter comparison and a one-page note on visibility and JVM memory.

Practice prompt ↗
04Relational database behaviour and ACID
  • Design a ledger and transfers schema, with the unique constraint that makes a retried request safe, and list the indexes you would add
  • Work the PracHub practice questions on why a filter ignores an index and on join fan-out, then write the EXPLAIN reasoning in your own words
  • Explain isolation levels and when you would use SELECT FOR UPDATE versus an optimistic version column

Deliverable: A ledger schema with indexes and constraints, plus written explanations for both SQL practice questions and a lock-versus-version comparison.

Practice prompt ↗Practice prompt ↗
05Payment processing system design
  • Design a high-concurrency payment processing system on one page: API, idempotency, ledger, queue, cache, and the consistency each part needs
  • Decide where synchronous calls stop and asynchronous events start, and describe an outbox or saga for the downstream step
  • Add a security pass: which sensitive data is stored, encrypted or masked, and what you log
  • Work the PracHub practice question on evolving an API contract without breaking integrations

Deliverable: A one-page payment design with a consistency statement and security notes, plus a written answer to the contract-evolution practice question.

Practice prompt ↗Practice prompt ↗
06The production bug story and debugging
  • Write your challenging-production-bug story as symptom, hypothesis, evidence, fix and prevention, then say it aloud twice
  • Work the PracHub latency-spike debugging practice question and write the sequence of checks you ran
  • Rehearse the PracHub code-review disagreement and deadline-debt practice prompts using your own examples

Deliverable: A written bug-story outline, a debugging sequence for the latency spikes, and spoken answers to two behavioral practice prompts.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Full mock and questions to ask
  • Run a full mock: one Java problem coded live with complexity explained, then the payment design, then the bug story
  • Rehearse the PracHub practice prompt on arguing against a design and committing anyway
  • Write the questions you will ask senior engineers and engineering leadership about the stack, services and on-call

Deliverable: A completed mock with notes on weak spots, and a list of questions for both technical conversations.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗

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

Candidates report that the process starts with an HR screen about your background, salary expectations and fit, and that the work involves explaining technical decisions to engineers and to non-technical stakeholders. Prepare stories where you made a technical decision, communicated it, and handled a production problem, and be ready to say why you chose what you chose.

Turn a code review disagreement into a decision

easy
code reviewoptimistic concurrencycommunication

A colleague's change updates a row with UPDATE resource SET version = version + 1 WHERE resource_id = $1 AND version = $2 and treats an affected-row count of zero as a successful no-op. You read that as a silently lost update; they think returning 200 is friendlier to clients than returning a conflict. Describe how you have handled a review disagreement of this shape: what goes in the comment, when you leave the thread, and who decides. Then write the comment you would leave here, in under 80 words.

Approach
  1. Sort the disagreement before writing anything. A silently discarded write is a correctness claim about data; the choice between 409 and 412 is taste. Only the first justifies blocking a merge, and saying which one you are doing is most of the value of the comment.
  2. Make the claim reproducible in the comment itself with an interleaving rather than a principle: A reads version 7, B reads version 7, B commits version 8, A's predicate matches zero rows, A is told it succeeded and A's edit is gone.
  3. Offer the alternative with its cost attached: return 409 carrying the current version and the revision that won, so the client can re-read and re-apply. Note that automatic retry is not the fix, because a retry re-reads the winner's state and reapplies an intent formed against data that no longer exists.
  4. Apply an escalation rule you can state: two round trips on the thread, then a call, and the service's owner decides rather than the reviewer. A reviewer who cannot be overruled is a bottleneck with extra steps.
Follow-up
  • Where would you put the test that fails if someone reintroduces the swallowed zero rowcount?
  • The author says clients cannot handle a 409. How do you check whether that is true?

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?

Argue against a design, lose, and commit anyway

medium
disagreementservice boundariesdecision records

Describe a design you argued against and lost. State the failure you predicted as a named mechanism, not a feeling about complexity: two services that would need one transaction, a projection with no rebuild path, a write path with no idempotency key. Say what evidence you brought, what the decision maker weighed instead, and what you did after the decision was made: what you instrumented, what you wrote down, and whether the prediction came true. Five minutes.

Approach
  1. State the prediction in falsifiable form up front: the mechanism, the condition that triggers it, and the observable outcome. A prediction that cannot be checked also cannot be credited to you later.
  2. Show the evidence you had at the time and label each piece honestly as measured, analogous, or intuition. Keeping the intuition is fine; disguising it as data is the thing that erodes your standing in the next argument.
  3. Represent the opposing case at full strength, including the constraint you did not control: a fixed date, a team boundary, or the fact that the decision was cheap to reverse and yours was not.
  4. Make disagree-and-commit concrete. Name the artefact you left behind so the prediction could be settled without you: the alert and its threshold, the counter on the dashboard, the decision note that recorded the trade-off and the condition that would revisit it.
Follow-up
  • What threshold on that alert would have proved you right, and did anyone ever look at it?
  • If the same proposal arrived tomorrow with the same deadline, would you argue it the same way?
  • 01

    Describe a challenging bug you encountered in production and your step-by-step resolution process.

  • 02

    Tell me about a time you explained a technical decision to a product manager or another non-technical stakeholder. What did you change in how you explained it?

  • 03

    Describe an architecture or technology choice you made and the alternative you rejected. Why did you choose it?

  • 04

    Tell me about a time you monitored a service in production and found a performance bottleneck. How did you find it and what did you change?

  • 05

    Describe a disagreement in a code review and how it was resolved.

  • 06

    Walk me through your background and what you are looking for in your next role.

PracHub preparation framework ↗
What topics come up in the Bank Neo Commerce Software Engineer interview?

Candidates name Live Coding Interview, Java, System Design, Technical Interview (Senior Engineer) and Technical Interview (Engineering Leader). Within those, reported areas are data structures and algorithms, concurrency and threading, database optimisation (indexing, query performance, ACID), microservices communication, caching with Redis, and handling sensitive user data.

Bank Neo Commerce Software Engineer candidate reports ↗
Can I request a language change for the coding round?

Ask your recruiter as early as possible. Candidates report that flexibility may vary by team, and that being unprepared in the requested language can go badly or lead to being moved to system design instead. The safe plan is to prepare in Java, which is the language reported for live coding.

Bank Neo Commerce Software Engineer candidate reports ↗
What happens if I am not strong in Java?

Recent feedback from candidates says that someone who cannot code in the required language may be pivoted to a system design conversation, which changes how the session is judged. Do not rely on that: spend your first practice days on Java collections, generics, streams and java.util.concurrent so the live coding stage is a strength.

PracHub Software Engineer practice ↗
How long does the hiring process typically take?

Candidates describe it as spanning a few weeks from the initial HR screen to the final offer, with a quick pace. Because the number and length of stages are not reported, ask your recruiter for the sequence and which sessions are remote, then pace your study around that.

Bank Neo Commerce Software Engineer candidate reports ↗
How should I prepare for the banking side of the interview?

Candidates are told to study fintech challenges such as transaction atomicity and data security. In practice that means being able to explain ACID, idempotent retries, double-entry style ledgers, isolation levels and what sensitive data you would encrypt, mask or keep out of logs, and to connect each of them to a concrete design choice.

PracHub Software Engineer practice ↗
What should I ask the interviewers?

Prepare questions about the Java services and frameworks the team runs, how services communicate (synchronous calls versus events), how production monitoring and on-call work, and how code review is handled. The role is reported to include monitoring services in production and reviewing code, so these questions fit the work.

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.