CARD91 · Software Engineer
Updated · 2026-10-02

CARD91 Software Engineer
Interview Guide

THE 60-SECOND BRIEF

CARD91 builds payment infrastructure: candidates describe a payment gateway and related financial services, with backend systems that process transactions and connect to banking partners. The Software Engineer role is a backend position. Reported day-to-day work is writing services in Java or a similar object-oriented language, turning product requirements into technical specifications with product managers, tuning database queries and schemas for peak transaction volume, reviewing teammates' code, and tracing production problems to a root cause with a lasting fix. Reported challenges include many requests arriving at once, keeping financial data correct, and integrating with several banks.

This guide is for candidates interviewing for the Software Engineer role at CARD91. It covers the 4 questions candidates report (interfaces versus abstract classes, OOP concepts, exception handling, and == versus .equals in Java), the DSA, complexity and SQL topics reported alongside them, the project discussion candidates describe, and a plan that adds PracHub practice questions on concurrency, retries and review disagreements.

No named rounds are reported for CARD91. Candidates describe a move from a conversation about your background to technical deep-dives, over a process that often spans a week or two depending on scheduling.

JavaData Structures & Algorithms (DSA)Object-Oriented Programming (OOP)

29 min read

Browse Software Engineer questions

See the practice prompts

11Practice promptsAcross five skill areas

The reported work is backend engineering for a payment gateway: Java or a similar object-oriented language, relational databases that must stay fast at peak transaction volume, and production issues that need a root cause rather than a patch. The challenges candidates list are concurrency, data integrity and integration with banking partners. That shapes how to practise: when you explain a Java concept, attach it to a money-moving example, such as a payment method interface with card and bank-transfer implementations, or a refund that must not run twice.

The 4 questions candidates report are all language and design fundamentals: the difference between interfaces and abstract classes, the OOP concepts and how you apply them day to day, handling exceptions in a production application, and == versus .equals in Java. None needs a clever trick. Each is answered well by a precise rule, a short code example, and a case where choosing wrongly causes a real bug. For == versus .equals, that means string literals versus new String, the cache behind boxed Integer values, and the equals and hashCode contract in hash-based collections.

Beyond those questions, candidates report time and space complexity analysis, sorting and searching, code optimization and implementing a data structure from scratch. They also report SQL, with a specific warning that candidates who cope with coding questions can stumble on complex query optimization. Project experience is described as a major discussion point, so prepare the architecture of two or three past projects and the reasons behind your decisions. No round names or order are reported, so confirm the format with your recruiter and prepare for both spoken fundamentals and written code.

01

Preparation focus

editorial

Candidates report no round names or order for CARD91. What they do describe is a process that starts with an assessment of your background and moves into detailed technical conversations, often finishing within a week or two depending on scheduling. The topics reported are Java and OOP fundamentals, DSA problem solving with time and space complexity, sorting and searching, building a data structure from scratch, SQL and query optimization, and a close look at your own projects. Because the format is unconfirmed, ask your recruiter which stages exist, whether you will write code live, and in which language, then prepare for spoken explanations and written code alike.

What to demonstrate

  • Core Java and object-oriented fundamentals, as in the reported questions on interfaces, abstract classes, OOP concepts, exceptions and == versus .equals
  • Time and space complexity analysis of the solutions you write, plus sorting, searching and optimization
  • SQL and relational design, including how you would speed up a slow query
  • How you describe the architecture of your past projects and the reasoning behind your choices

How to prepare

  • Write a short Java example for each reported fundamentals question and rehearse the spoken version, ending each with a bug caused by the wrong choice
  • Implement a hash map with chaining and a binary heap from scratch in Java, and state the complexity of every operation aloud
  • Practise reading an EXPLAIN plan for a transactions-by-account-and-date query and fix it with an index in the right column order
  • Write a one-page architecture note for two past projects covering the decisions, the alternatives you rejected, and one production failure you diagnosed
PracHub preparation framework ↗

PracHub editorial advice for the preparation topics above.

01

Answering the interface, abstract class and OOP questions as vocabulary lists

Lead with a decision rule: an interface defines a contract that unrelated classes can implement and a class can implement many; an abstract class holds shared state, constructors and partial implementation for a family of types. Then show one example, such as a payment method interface with card and bank-transfer classes. For OOP, give one line of your own code for each of encapsulation, inheritance, polymorphism and abstraction.

02

Treating == and .equals as interchangeable, or explaining == only with strings

State that == compares references for objects and values for primitives, while .equals compares logical equality when the class overrides it. Show why two string literals can compare equal with == through the string pool while new String objects do not, and why boxed Integers compare equal only inside the small cached range. Mention that overriding equals requires a consistent hashCode for HashMap and HashSet, and that Objects.equals handles null.

03

Describing exception handling as try-catch plus logging

Prepare the full answer: catch where you can act, wrap with the cause, close resources with try-with-resources, separate retryable from non-retryable failures, protect retried writes with idempotency, roll back transactions, and log once with a correlation id and no sensitive data. Back it with one incident from your own work.

04

Preparing coding and DSA but neglecting SQL query optimization

Candidates report that SQL tuning is where otherwise strong coders struggle. Practise reading an EXPLAIN plan, choosing composite index column order for a filter-plus-sort query, spotting a function call that blocks index use, and explaining why a query slows down only at peak volume. Use the PracHub SQL and debugging practice questions on days 5 and 6.

05

Walking through what a past project does without explaining why it was built that way

Candidates report that project architecture and the reasons behind decisions are a main discussion point. For each project, prepare the alternatives you rejected, the trade-off you accepted, one production failure you diagnosed and its root cause, and one number you can defend. Open with the problem, not the tech list.

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

8 technical prompts0 include a worked solution

Can you explain the primary differences between interfaces and abstract classes in Java?

medium
Technical Fundamentals and Language Prof

Can you explain the primary differences between interfaces and abstract classes in Java?

Approach
  1. Start with the structural differences. An abstract class can hold instance fields, constructors and members at any access level, and a class can extend only one of them. An interface has no instance state (its fields are implicitly public static final constants) and no constructors, and a class can implement any number of interfaces.
  2. Bring the comparison up to modern Java. Since Java 8 interfaces can carry default and static methods, and since Java 9 private helper methods. So 'interfaces have no method bodies' is out of date. The real dividing line is state and constructors, plus single versus multiple inheritance.
  3. Give the design rule with one example each. Use an interface for a capability that unrelated types share (Comparable, Runnable, any functional interface used with lambdas). Use an abstract class when closely related types share state and a fixed skeleton, as in the template method pattern, where the base class owns the algorithm and subclasses fill in the abstract steps.
  4. Cover API evolution. Adding an abstract method to a published interface breaks every implementor at compile time. A default method avoids that. Adding a concrete method to an abstract class leaves existing subclasses compiling.
  5. Name the resolution rules for conflicts. A method inherited from a class wins over an interface default. If two interfaces supply the same default method, the implementing class must override it and can call a chosen one with InterfaceName.super.method().
Follow-up
  • A class implements two interfaces that both define the same default method. What does the compiler do, and how do you resolve it?
  • Why can an abstract class have a constructor when it can never be instantiated directly?
  • When would you combine the two, with an interface as the contract and an abstract base class as a partial implementation, and what does that buy you?

What are the OOPS concepts, and how do you implement them in your daily coding?

medium
Technical Fundamentals and Language Prof

What are the OOPS concepts, and how do you implement them in your daily coding?

Approach
  1. Name the four pillars and give each a concrete Java mechanism, not just a definition. Encapsulation is private fields behind methods that enforce invariants. Abstraction is depending on an interface rather than a concrete class. Inheritance is extends and implements. Polymorphism is a call that dispatches on the runtime type.
  2. Make encapsulation real with an example from your own code: a class whose constructor validates input and whose fields are final, with defensive copies of mutable collections going in and out, so no caller can put the object into an invalid state.
  3. Separate the two kinds of polymorphism. Overloading is resolved at compile time from the static argument types. Overriding is resolved at runtime by dynamic dispatch. Static methods are hidden, not overridden, so they never dispatch on the runtime type.
  4. Show judgment on inheritance. Prefer composition when the relationship is 'has-a' or the behaviour varies independently. Respect Liskov substitution: a subclass must not tighten preconditions or throw where the parent would not. Replace long instanceof or switch chains with a strategy interface and one implementation per case.
  5. Tie the pillars to daily practice: constructor-injected interfaces so a class can be unit tested with a fake, small classes with one reason to change, and records or immutable value classes for data that should not change after creation.
Follow-up
  • Given overloaded methods m(Object) and m(String), which one runs for m(x) when x is declared as Object but holds a String, and why?
  • Show a case where inheritance broke something and how composition would have avoided it.
  • How do the SOLID principles relate to these four concepts, and which one do you apply most often?

Can you describe the difference between `==` and `.equals` in Java?

medium
Technical Fundamentals and Language Prof

Can you describe the difference between == and .equals in Java?

Approach
  1. State the core rule. On primitives, == compares values. On references, it compares identity: whether both variables point to the same object. equals() is a method inherited from Object whose default implementation is also identity, and classes such as String, Integer, BigDecimal, List and records override it to compare values.
  2. Give the classic traps. String literals are interned, so "abc" == "abc" is true, but new String("abc") == "abc" is false, and so is a string built at runtime by concatenation. Autoboxing through Integer.valueOf caches -128 to 127 by default, so two boxed 127s are == while two boxed 128s usually are not. Comparing a null Integer with == against an int unboxes it and throws NullPointerException.
  3. Cover null safety. a.equals(b) throws when a is null. Write "literal".equals(x) or Objects.equals(a, b) instead. For enums, == is correct and null-safe, because each constant is a singleton.
  4. Explain the equals contract and its hashCode partner. equals must be reflexive, symmetric, transitive and consistent, and x.equals(null) must return false. Equal objects must return the same hashCode, or HashMap and HashSet lookups silently miss.
  5. Raise the money-related edge case. BigDecimal.equals compares scale as well as value, so 1.0 and 1.00 are not equal, while compareTo returns 0. Compare amounts with compareTo, or normalise the scale first. Never use double for currency.
Follow-up
  • What breaks if a class overrides equals but not hashCode and you put its instances in a HashSet?
  • In an equals implementation, would you use getClass() or instanceof, and how does that choice affect symmetry when subclasses exist?
  • Why does new BigDecimal("2.50").equals(new BigDecimal("2.5")) return false, and how would you compare two amounts correctly?

The plan starts by confirming the unknown format, then works through the 4 reported Java fundamentals questions, DSA and complexity, SQL and concurrency practice from PracHub's practice set, and a final full mock. Practice-set questions are PracHub exercises, not CARD91 material.

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 pick your project stories
  • Write the questions to send your recruiter: which stages exist, whether you will write code live, which language, and whether SQL is tested.
  • Choose two past projects and write a one-page architecture note for each: the problem, the components, three decisions and the alternative you rejected for each.

Deliverable: A written list of recruiter questions and two one-page project architecture notes.

02Interfaces, abstract classes and == versus .equals
  • Write a Java example with a payment method interface, an abstract base class holding shared state, and two concrete classes, then explain when you would pick each.
  • Write a small program that shows string literal versus new String comparison, boxed Integer comparison inside and outside the cache range, and a class whose equals is overridden without hashCode failing in a HashSet.
  • Answer both questions aloud without notes, ending each answer with a bug caused by the wrong choice.

Deliverable: One runnable Java file with both demonstrations and a spoken answer to each of the two questions.

Practice prompt ↗Practice prompt ↗
03OOP concepts and exception handling
  • Take the day 2 payment classes and annotate where encapsulation, inheritance, polymorphism and abstraction each appear, so your OOP answer uses your own code.
  • Write a custom exception hierarchy for a payment flow with one checked and one unchecked type, wrap a lower-level exception with its cause, and add try-with-resources around a database connection.
  • Write a STAR story about a real production error you handled, naming the decision you made and the measured result.

Deliverable: An annotated class file, an exception-handling example, and a written STAR story.

Practice prompt ↗Practice prompt ↗
04DSA and complexity from scratch
  • Implement a hash map with chaining and resizing, and a binary min-heap, in Java, and write the time and space complexity of every operation.
  • Write a comparison of merge sort, quicksort and heap sort covering worst case, memory, stability and behaviour on nearly sorted input, then explain how you would search a very large sorted dataset.
  • Take one of your working solutions and refactor it for readability, then say what you changed for performance and why.

Deliverable: Two working data structures, a sorting comparison table, and a before-and-after refactor with the complexity stated.

05SQL, concurrency and slow queries
  • Work the PracHub practice question on holding a per-tenant active cap against concurrent creates and state which lock or constraint makes it safe.
  • Work the practice question on writing an update path that detects a concurrent edit, and say what the caller should receive when the version check fails.
  • Design an index for a transactions-by-account-and-date query, read its EXPLAIN plan before and after, and explain the column order.

Deliverable: Two solved SQL practice questions and an index design with before-and-after plans.

Practice prompt ↗Practice prompt ↗
06Retries, production debugging and review disagreements
  • Work the PracHub practice question on making a write endpoint safe for retrying clients, and tie it to your day 3 answer on retryable failures.
  • Work the practice question on a latency jump that affects only the 99th percentile on one listing filter, writing down your debugging sequence.
  • Work the practice question on turning a code review disagreement into a decision, and rehearse it as a STAR story.

Deliverable: A retry-safe write design, a written debugging sequence, and a rehearsed review-disagreement story.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Full mock
  • Answer all 4 reported fundamentals questions aloud in one sitting, then explain one of your project notes from day 1.
  • Work the practice question on reversing your own decision, and compare its story shape with your project notes.
  • Write 2 or 3 questions to ask the team about its current technical challenges and its stack.

Deliverable: A completed spoken mock covering the 4 reported questions, one rehearsed reversal story, and a written list of 2 or 3 questions to ask.

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

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

No separate behavioral round is reported for CARD91. Candidates do report that project experience is a major discussion point, with attention to architecture and the reasoning behind technical choices, and the reported exception-handling question invites a story as well as a rule. For a backend payments role, prepare stories about production failures, correctness under load, and working with colleagues through code review. Structure each with Situation, Task, Action and Result.

How do you handle exceptions effectively in a production-grade application?

medium
Technical Fundamentals and Language Prof

How do you handle exceptions effectively in a production-grade application?

Approach
  1. Open with a rule, then a case. Rule: catch an exception only where you can do something useful (retry, compensate, translate, or return a meaningful error); otherwise let it propagate. Never leave an empty catch block, and avoid catching Exception or Throwable broadly, because that hides programming errors and out-of-memory conditions alongside the failure you meant to handle.
  2. Cover Java mechanics concretely. Use try-with-resources for connections, statements and streams so they close even on failure. Choose checked exceptions for recoverable conditions the caller must handle and unchecked ones for programming errors. When you wrap an exception at a layer boundary, pass the original as the cause so the stack trace survives. Do not use exceptions for ordinary control flow.
  3. Make it production-specific. Separate retryable failures (a timeout or a 503 from a bank connection) from non-retryable ones (validation errors, a declined payment). Retry only operations that are idempotent, or protect them with an idempotency key, using exponential backoff with jitter and a retry cap. Roll back the database transaction on failure so no half-finished money movement is left behind.
  4. Cover visibility. Log once, at the boundary that handles the error, with a correlation or request id and no card numbers or personal data in the message. Map internal exceptions to stable error codes at the API edge, and emit a metric so alerting fires on rates, not on a single log line.
  5. Because this question sits among the behavioral ones, finish with a short STAR story from your own work: a real incident where an error was swallowed or mishandled, what you changed, and the measured result. The mistake that sinks it is a textbook list with no real case. Use "I" throughout, name your own decision, and say what you would do differently.
Follow-up
  • What is the difference between a checked and an unchecked exception, and which would you use for a declined payment?
  • A downstream bank call times out after you have sent the request. How do you avoid charging twice when you retry?
  • How do you decide what to log when an exception is caught, and how do you stop the same error being logged at every layer?

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?

Reverse your own decision and price the reversal

medium
reversibilitymeasurementmigrations

Describe a technical decision you made and later reversed. Pick one that cost something: a service you split and merged back, a cache you added and removed, an index you created that pushed the planner onto a worse plan, a projection you rebuilt from scratch. State what you believed when you decided, the measurement that changed your mind, how long the wrong version ran in production, and what the reversal cost in migrations, dual writes, and a deprecation window for callers you did not own.

Approach
  1. State the original rationale without irony, in the version you would still defend given what was known then. If it is not defensible, the story is about carelessness rather than judgement, and a different example serves you better.
  2. Give the measurement that moved with a before and after: the p99 that did not improve, the cache hit rate that sat at 40%, the plan that flipped to a sequential scan once the table passed a size you can name.
  3. Cost the reversal in steps, not adjectives: expand-and-contract deploys, the dual-write window, the callers who had to be notified, the rows already written in the wrong shape that had to be backfilled or abandoned.
  4. Distinguish reversal from rewrite by naming what you kept. Most good reversals preserve the schema or the interface and undo one decision inside it, which is also why they were affordable.
Follow-up
  • What in that decision was irreversible, and did you know it was irreversible when you made it?
  • How did you tell the people who had already built on top of the original decision?
  • 01

    How do you handle exceptions effectively in a production-grade application?

  • 02

    Walk me through the architecture of a project you built and the reasons behind its main technical decisions.

  • 03

    Tell me about a production issue you traced to a root cause: how you found it and what long-term fix you made.

  • 04

    Describe a code review where you disagreed with a colleague and how the disagreement was resolved.

  • 05

    Tell me about a time you explained a technical concept or a design decision to someone who is not an engineer.

PracHub preparation framework ↗
How long does the CARD91 process take?

Candidates report that the process often spans a week or two, depending on scheduling. The stages and their order are not reported in detail, so ask your recruiter which interviews are planned, whether you will write code, and in which language, before you finalise your preparation.

CARD91 Software Engineer candidate reports ↗
What should I focus on first?

Candidates point to Java, SQL and DSA fundamentals. Start with the 4 reported questions: interfaces versus abstract classes, OOP concepts, exception handling, and == versus .equals. Then cover complexity analysis, sorting and searching, a data structure written from scratch, and SQL query optimization. Practise explaining why you chose an approach, not just what it does.

CARD91 Software Engineer candidate reports ↗
What topics does CARD91 test in interviews?

Reported topics are Java, object-oriented programming, data structures and algorithms with time and space complexity, sorting and searching, code optimization and SQL. Candidates also describe detailed discussion of past projects. Nice-to-have areas the role lists are cloud platforms, microservices, payment processing exposure and unit and integration tests, so be ready to mention any experience you have.

CARD91 Software Engineer candidate reports ↗
Is there a take-home or live coding round?

Candidates do not report a take-home. Example scenarios they mention include optimizing a search algorithm for a very large dataset and implementing a data structure from scratch, so prepare to write and explain code, and ask your recruiter whether that happens live and in which language.

PracHub Software Engineer practice ↗
How should I prepare for the project discussion?

Pick two or three projects and write the architecture, the alternatives you rejected and the reasons for each choice. Add one production failure you diagnosed with its root cause and fix. Use STAR for the stories, and give a number you can defend. Rehearse tying them to the reported concerns for this role: concurrency, data integrity and reliability.

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

Prepare 2 or 3 questions about the team's current technical challenges, its Java and database stack, and how production issues are investigated and followed up. Candidates are advised to use the end of the interview for this. Avoid questions you can answer from the job description.

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.