ARRISE · Software Engineer
Updated · 2026-10-02

ARRISE Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Candidate accounts describe ARRISE engineering as work on transaction-heavy digital platforms. The stack they mention spans distributed back-end services, real-time data pipelines and interactive front-end screens. The Software Engineer role is described as building features across back-end services, APIs or front-end interfaces, tuning database queries, caches and memory use in production, taking part in design discussions, reviewing code, writing unit, integration and performance tests, and coordinating releases with product managers, QA engineers and DevOps teams.

This guide is for candidates with a few years of professional development experience (candidates describe the role as asking for 2+ years) who are preparing for the ARRISE Software Engineer loop. It covers the five reported rounds, every reported coding, Java concurrency, system design and frontend question, and the manager and HR conversations at the end. Backend candidates should weight the Java and design sections; frontend and full-stack candidates should add the React and browser rendering questions.

Candidates report five rounds over roughly 4-6 weeks: an HR screening call, an online assessment, three to four technical interviews, an Engineering Manager conversation and a behavioral HR discussion.

Data Structures & Algorithms (DSA)JavaHigh-Level Design (HLD)

44 min read

Browse Software Engineer questions

See the practice prompts

23Practice promptsAcross five skill areas

The reported questions fall into four groups. The coding group is classic algorithm work: longest common subsequence, Three Sum with a two-pointer pass, a next-element problem on a circular array, recursive deletion of empty folders, and a medium-to-hard array and string problem under a 30-minute window. The Java group is about concurrency: a deadlock you write and then fix, the differences between synchronized blocks, ReentrantLock and Semaphore, thread pools and ExecutorService configuration for I/O-heavy work, race conditions on shared state, and what Java 8 streams, lambdas and Optional change. The design group covers a JIRA-style collaboration tool, a dish recommendation system for food delivery, a notification system that calls SMS and email gateways, distributed locking or rate limiting across microservices, and partitioning, replication and consistency under heavy writes. A fourth group, for frontend and full-stack roles, covers a custom React component or hook, rendering performance with requestAnimationFrame and CSS keyframes, client-side state and caching, and interactive elements such as gradient animations or simple game mechanics.

Candidates also report practical details that shape how you practise. Code is written in a shared IDE or on a whiteboard, Java multithreading code is expected to compile and run, and live coding without auto-complete is common advice. Candidates describe brute force first, then optimisation, as the way to present coding answers, and clarifying requirements before drawing components as the way to start a design. Topic lists attached to the reported rounds name arrays and strings, dynamic programming, trees and graphs, monitors and wait/notify, ConcurrentHashMap, CopyOnWriteArrayList, blocking queues, volatile and thread-local storage, service discovery, API gateways, SQL versus NoSQL, Redis or Memcached caching, sharding, and Kafka or RabbitMQ.

The requirements candidates describe name Java, C++ or modern JavaScript/TypeScript, relational databases and SQL, data structures, OOP and multithreading as must-haves, with Kafka, Redis, Docker, Kubernetes, AWS or GCP and CI/CD as extras. Because the role is described as one that tunes queries and caches in production, expect the design answers to be judged on concrete choices: which store, which cache, which queue, what happens on failure. Spend your first days on the coding set, move to Java concurrency where you must produce running code, then to design where you must justify every component, and keep the last days for the frontend set and the stories you will tell the manager and HR.

01

HR Screening Call

reported

Candidates describe a first call with HR about your background and fit for the role. No technical questions are reported for this stage, so the work is a clear account of your experience that lines up with the stack the role lists: Java, C++ or JavaScript/TypeScript, SQL and multithreading. It is also the moment to learn how the rest of the loop will run, since candidates report scheduling delays in the later stages.

What to demonstrate

  • How your experience maps to the Software Engineer role and its listed languages
  • Fit for the role as discussed on the call
  • Clarity when you summarise your own projects

How to prepare

  • Write a two-minute walk through your CV that foregrounds the projects using Java, SQL, concurrency or distributed services, and say what you personally built in each.
  • Prepare questions for the call: how many technical interviews to expect, whether you can choose your language for coding, and whether the online assessment is timed.
  • Note the notice period and location constraints you will need to state, and ask for the timeline in writing, because candidates report delays after the technical rounds.
ARRISE Software Engineer candidate reports ↗
02

Online Assessment

reported

Candidates complete an online assessment meant to measure coding proficiency. The reports do not say which of the reported coding questions appear here, so treat the whole coding set as fair material: longest common subsequence, Three Sum, the circular-array next-element problem, recursive removal of empty folders, and a medium-to-hard array and string problem under a 30-minute window. Assume working code that handles edge cases matters more than a clever idea you cannot finish.

What to demonstrate

  • Coding proficiency, which an online assessment tests through working code
  • Correct handling of edge cases such as empty input, a single element and duplicates
  • Choice of an efficient approach over a brute-force one

How to prepare

  • Solve the longest common subsequence and Three Sum problems cold in a plain editor without auto-complete, then compare against a brute-force version you can state in one sentence.
  • For the array and string problem, set a 30-minute timer and practise reading the problem, naming the brute force, choosing two pointers, a sliding window or a hash map, and coding it in one pass.
  • After every solution, write your own tests: empty input, one element, all-equal values, duplicates and the largest size you can imagine.
ARRISE Software Engineer candidate reports ↗
03

Technical Rounds

reported

Candidates report three to four intensive technical interviews covering coding, language fundamentals and system architecture. Code is written on a shared IDE or a whiteboard, and Java multithreading code is expected to compile and run. Reported topics include arrays and strings, dynamic programming, trees and graphs, monitors and locks, concurrent collections, the Java memory model, and microservice, data and messaging design. Frontend or full-stack candidates also report React and browser rendering questions. The reports do not say which question belongs to which interview, so prepare all four groups.

What to demonstrate

  • Working, compilable code written live for algorithm and concurrency problems
  • Java language and concurrency fundamentals, including locks, thread pools and the memory model
  • Reasoning about distributed system design, with trade-offs justified
  • For frontend roles, component structure and browser rendering performance

How to prepare

  • Write the deadlock program and its fix from memory in Java: two threads, two locks taken in opposite order, then a consistent lock order or tryLock with a timeout. Compile and run it.
  • Prepare one-minute comparisons of synchronized, ReentrantLock and Semaphore, and a sizing argument for an ExecutorService on I/O-heavy work.
  • Practise two full designs out loud, such as the JIRA-style tool and the notification system, starting with requirements and ending with failure handling.
  • If your role is frontend or full-stack, build a small React hook and an animation loop with requestAnimationFrame without looking anything up.
ARRISE Software Engineer candidate reports ↗
04

Engineering Manager Conversation

reported

Candidates describe a discussion with an Engineering Manager to assess technical and team fit. The reports give no question list, so expect a conversation about work you have done, how you make design decisions and how you work with others. Candidate advice for the technical side is to defend any departure from standard architecture with evidence, and to ask about the team's stack and engineering challenges.

What to demonstrate

  • Technical fit, shown through how you discuss systems you have built
  • Team fit and collaboration with product, QA and DevOps colleagues
  • How you justify design choices and respond to new constraints

How to prepare

  • Pick one project and prepare its story: the problem, the architecture, one decision where you weighed two options, and the measured result.
  • Be ready to explain an architectural choice you made with data, such as why you added a cache or a queue, and what you would change if the load grew.
  • Write three questions about the team's stack and release process, drawn from the Kafka, Redis, Docker, Kubernetes and CI/CD tools the role lists.
ARRISE Software Engineer candidate reports ↗
05

Behavioral HR Discussion

reported

Candidates describe a final conversation with HR about behavioral aspects and cultural alignment. No questions are listed, so prepare stories that show ownership, collaboration across teams and handling of ambiguous requirements, which are themes of the role as candidates describe it. Candidates also report slow scheduling near the end, so stay in contact with your recruiter.

What to demonstrate

  • Behavioral examples of ownership and collaboration
  • Alignment with the working style described for the team
  • Communication when discussing conflict, ambiguity and change

How to prepare

  • Prepare three stories in situation, action and result form: a production performance problem you fixed, a disagreement over a design, and a change in requirements late in a release.
  • Quantify each result, such as latency before and after or error rate, and be clear about what you did versus what the team did.
  • Prepare a short account of how you work with QA, product managers and DevOps colleagues, since the role is described as cross-functional.
ARRISE Software Engineer candidate reports ↗

PracHub editorial advice for the preparation topics above.

01

The deadlock example does not compile, or never actually deadlocks when run.

Write it in a plain editor and run it. Use two locks acquired in opposite order by two threads, with a short sleep or latch between the acquisitions to force the interleaving. Then show the fix: one global lock order, or tryLock with a timeout, and explain which you would choose.

02

Jumping to the optimal Three Sum or longest common subsequence solution without a baseline, or missing duplicates.

State the brute force first: Three Sum is O(n^3) over all triples, while sorting plus two pointers is O(n^2). For duplicates, skip equal values after each move. For longest common subsequence, give the O(m*n) table, then the rolling-row space reduction, and say what you lose when you must rebuild the sequence itself.

03

Reciting definitions of synchronized, ReentrantLock and Semaphore without saying when to use each.

Tie each tool to a scenario: synchronized for simple mutual exclusion, ReentrantLock when you need tryLock, timed or interruptible acquisition, or fairness, and Semaphore to limit concurrent access to a resource such as a connection pool.

04

System design answers that list Kafka, Redis and a database but never say what fails.

For each design, say what happens when a dependency is down. For the notification system, cover retries, idempotency keys and a dead-letter path for a failing gateway. For the JIRA-style tool, say how updates reach active users and what happens when two people edit the same task.

05

Relying on auto-complete and an IDE, then stalling when you have to write and run code without them.

Practise Java, SQL or your chosen language in a bare editor. Candidates advise against leaning on auto-complete, so rehearse imports, collections APIs and your own tests until you can write them without hints.

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

20 technical prompts0 include a worked solution

Write a program to find the Longest Common Subsequence (LCS) between two given strings and explain its time co

medium
Data Structures & Algorithms (DSA)

Write a program to find the Longest Common Subsequence (LCS) between two given strings and explain its time complexity.

Approach
  1. Define dp[i][j] as the LCS length of the first i characters of a and the first j of b. If a[i-1] == b[j-1], dp[i][j] = dp[i-1][j-1] + 1; otherwise dp[i][j] = max(dp[i-1][j], dp[i][j-1]). Row 0 and column 0 are 0.
  2. Start from plain recursion: without memoisation it is exponential because the same (i, j) pairs repeat. The table runs in O(mn) time and O(mn) space.
  3. To return the subsequence and not only its length, backtrack from dp[m][n]: step diagonally on a match and record the character, otherwise step toward the larger neighbour. Reverse the result at the end.
  4. If only the length is needed, keep two rows sized for the shorter string, which cuts space to O(min(m, n)). Say plainly that backtracking needs the full table, or Hirschberg's divide-and-conquer if you want linear space.
  5. Edge cases: an empty string gives 0, identical strings give the whole string, no shared characters give an empty result. Several different LCSs can have the same length, and any one of them is a valid answer.
Follow-up
  • How would you reconstruct the subsequence itself while using only linear space?
  • What changes for the longest common substring, where the characters must be contiguous?
  • How does this recurrence relate to edit distance or to a line-based diff tool?

Find all distinct triplets in an array that sum up to a specific target value (Three Sum problem) using an opt

medium
Data Structures & Algorithms (DSA)

Find all distinct triplets in an array that sum up to a specific target value (Three Sum problem) using an optimized two-pointer approach.

Approach
  1. Sort the array in O(n log n). Fix index i, then run two pointers lo = i + 1 and hi = n - 1: if the sum is below the target, move lo up; if above, move hi down; on a match, record the triplet and move both.
  2. Handle duplicates without a set of triplets: skip i when nums[i] == nums[i-1], and after each match advance lo past equal values and hi past equal values. This is how the answer contains only distinct triplets.
  3. Complexity is O(n^2) time with O(1) extra space beyond the output and the sort's own stack. Compare it with brute force (O(n^3)) and with a hash set per i (also O(n^2), but O(n) space and dedup is harder).
  4. Prune on the sorted array: break once nums[i] + nums[i+1] + nums[i+2] > target, and skip i when nums[i] + nums[n-2] + nums[n-1] < target.
  5. Edge cases: fewer than three elements, all zeros (exactly one triplet [0,0,0]), and int overflow when summing large values in Java. Sum into a long.
Follow-up
  • How does this extend to 4Sum or k-Sum, and what is the complexity?
  • How would you count the triplets with sum below the target, without listing them?
  • What would you do if the input could not be sorted or modified?

Populate the next right element in a circular array and discuss the edge cases of your solution.

medium
Data Structures & Algorithms (DSA)

Populate the next right element in a circular array and discuss the edge cases of your solution.

Approach
  1. Clarify the wording first. The usual reading is next greater element in a circular array: for each index, the first larger value to its right, wrapping past the end, or -1 if there is none. Confirm that, and whether the answer should be values or indices.
  2. Brute force: for each i, scan (i + k) % n for k = 1..n-1. That is O(n^2) time and O(1) extra space.
  3. Optimal: a monotonic stack over a virtual doubled array. Loop i from 2n-1 down to 0 with idx = i % n, pop while the top is <= nums[idx], and when i < n set the answer to the top (or -1 if the stack is empty). Then push nums[idx].
  4. There are at most 2n pushes and each element is popped at most once, so the run is O(n) time and O(n) space. Do not physically copy the array; use the modulo index.
  5. Edge cases: an empty array, a single element (-1), all-equal values (all -1 because the pop uses <=), and the maximum value, which always gets -1. If the interviewer only means the next neighbour with wrap-around, the answer is nums[(i + 1) % n], and n == 1 points to itself.
Follow-up
  • How would you return the distance to the next greater element instead of its value?
  • What changes to find the next smaller element?
  • Why is the doubled pass still O(n) and not O(n^2)?

Write an algorithm to delete empty folders recursively from a directory structure while preserving folders tha

medium
Data Structures & Algorithms (DSA)

Write an algorithm to delete empty folders recursively from a directory structure while preserving folders that contain files.

Approach
  1. Use post-order DFS: clean up every child folder before deciding about its parent. Have the recursion return a boolean that is true when the folder holds no files and all of its subfolders were deleted.
  2. Model it as a tree (Node with name, isFile, children) and remove the child from its parent's list. That visits each node once, so it is O(N) time with O(depth) recursion stack.
  3. On a real filesystem in Java, use Files.walkFileTree and delete in postVisitDirectory, or sort Files.walk output in reverse order. Files.delete on a non-empty directory throws DirectoryNotEmptyException, which makes a wrong decision fail safely.
  4. Ask whether the root itself should be deleted when it ends up empty, and whether hidden files such as .DS_Store count as files.
  5. Edge cases: don't follow symlinks (they can create cycles or delete outside the tree), handle permission errors per folder without aborting the whole run, and switch to an explicit stack for very deep trees to avoid StackOverflowError.
Follow-up
  • What happens if another process writes a file into a folder after you decided it was empty?
  • How would you add a dry-run mode that reports what would be deleted?
  • How would you parallelise this over millions of directories?

Solve a medium-to-hard LeetCode challenge involving array manipulation and string optimization within a 30-min

medium
Data Structures & Algorithms (DSA)

Solve a medium-to-hard LeetCode challenge involving array manipulation and string optimization within a 30-minute window.

Approach
  1. Map the problem to a known pattern before coding. Two pointers for sorted or palindromic input. A sliding window with a count array or HashMap for substring constraints (for example, the longest substring without repeating characters in O(n)). Prefix sums plus a HashMap for subarray-sum-equals-k in O(n). Sort plus a sweep for intervals.
  2. State the brute force and its complexity in one sentence, then use the input size to set the target. For n around 10^5, O(n^2) is too slow, so aim for O(n) or O(n log n).
  3. Write Java string code that is efficient: use StringBuilder rather than += in a loop, which copies the string each time and goes quadratic. Use an int[26] or int[128] count array instead of a HashMap when the alphabet is fixed.
  4. Before declaring it done, trace it by hand on an empty input, a single element, all-identical characters and negative numbers. A sum-based sliding window breaks on negatives; prefix sums still work.
  5. Once it is correct, say the final time and space complexity out loud, and name the one optimisation you skipped and why.
Follow-up
  • Why does a sliding window fail for subarray sums when the array has negative numbers, and what would you use instead?
  • How would the solution change if the input arrived as a stream?
  • What invariant does your window or pointer maintain, and how do you know it holds after each step?

Explain the key differences between various synchronization mechanisms in Java, such as `synchronized` blocks,

medium
Java, Multithreading & Concurrency

Explain the key differences between various synchronization mechanisms in Java, such as synchronized blocks, ReentrantLock, and Semaphore.

Approach
  1. synchronized uses the object's intrinsic monitor. It is block-structured, reentrant, released automatically on exception, and coordinates threads with wait/notify on a single wait set. A thread blocked waiting to enter cannot be interrupted, and there is no fairness option.
  2. ReentrantLock gives the same mutual exclusion and memory-visibility guarantees, plus tryLock (with or without a timeout), lockInterruptibly, an optional fair mode and several Condition objects via newCondition(). The cost: unlock() must be in a finally block.
  3. Semaphore counts permits and has no owner. Any thread can call release, it is not reentrant, and its job is to cap concurrency (for example, at most N calls in flight to a slow dependency). A one-permit semaphore is not the same thing as a mutex.
  4. Choosing: synchronized for simple short critical sections, ReentrantLock when you need timeouts, interruption or separate conditions, Semaphore to bound access to a resource, and ReadWriteLock or StampedLock for read-heavy shared data.
  5. Mention virtual threads if Java 21 comes up: blocking inside synchronized pinned the carrier thread until JDK 24 (JEP 491). That is a reason older code used ReentrantLock there.
Follow-up
  • What does a fair ReentrantLock cost compared with the default non-fair one?
  • How would you build a bounded blocking buffer with one lock and two Conditions, notFull and notEmpty?
  • What happens if an exception skips unlock() on a ReentrantLock?

How do Java 8 features like Streams, Lambdas, and Optional classes improve code readability and memory managem

medium
Java, Multithreading & Concurrency

How do Java 8 features like Streams, Lambdas, and Optional classes improve code readability and memory management?

Approach
  1. Readability: lambdas and method references replace anonymous inner classes. Stream pipelines (filter, map, collect, Collectors.groupingBy) state what is computed instead of how the loop runs.
  2. Be precise about memory, because the gains are limited. Streams are lazy: intermediate operations fuse into one pass and only run at the terminal operation, short-circuiting ops (findFirst, anyMatch, limit) stop early, and no intermediate lists are built.
  3. Name the costs too. Stream boxes every element, so use IntStream or mapToInt in numeric code. Each pipeline allocates stage objects, and in a hot loop a plain for loop can be faster. Parallel streams run on the common ForkJoinPool, so blocking I/O inside them starves other users of that pool.
  4. Optional makes absence explicit in a return type and replaces null checks with map, flatMap and orElseGet. orElse evaluates its argument eagerly while orElseGet is lazy. Don't use Optional for fields or parameters: it is an extra allocation and not Serializable.
  5. Conclude honestly: these features mostly help readability and correctness, and their memory effect depends on how they are used.
Follow-up
  • When would you avoid a stream: checked exceptions, mutating local state, a hot loop?
  • What happens with Collectors.toMap when two elements produce the same key?
  • Can you run a second terminal operation on the same stream?

Describe how thread pools work in Java and how you would configure an ExecutorService for an I/O-heavy applica

medium
Java, Multithreading & Concurrency

Describe how thread pools work in Java and how you would configure an ExecutorService for an I/O-heavy application.

Approach
  1. Explain ThreadPoolExecutor's parameters: core size, max size, keepAliveTime, work queue, ThreadFactory and RejectedExecutionHandler. A new task starts a thread while fewer than core threads exist; otherwise it is queued. Only when the queue is full does the pool grow toward max, and past that the task is rejected.
  2. Name the factory-method traps. newFixedThreadPool uses an unbounded LinkedBlockingQueue, so a backlog grows memory without limit. newCachedThreadPool can create a practically unbounded number of threads.
  3. Sizing for I/O-heavy work: threads ≈ cores × (1 + wait time / compute time), so blocking work justifies far more threads than cores. Use a bounded queue, CallerRunsPolicy or explicit rejection for backpressure, and a timeout on every remote call.
  4. Give each downstream dependency its own pool (a bulkhead) so one slow service cannot take every thread. Name threads in the ThreadFactory so thread dumps are readable, and monitor queue depth and active count.
  5. On Java 21, Executors.newVirtualThreadPerTaskExecutor() suits blocking I/O. Limit concurrency toward a dependency with a Semaphore rather than through pool size. Shut down with shutdown() and awaitTermination, falling back to shutdownNow.
Follow-up
  • Why does a pool with core 10, max 50 and an unbounded queue never run more than 10 threads?
  • What happens to an exception thrown by a task passed to submit() compared with execute()?
  • How would you notice that the pool is saturated in production?

Walk through the execution flow of a concurrent application and explain how to prevent race conditions when up

medium
Java, Multithreading & Concurrency

Walk through the execution flow of a concurrent application and explain how to prevent race conditions when updating shared state.

Approach
  1. Trace the interleaving step by step. count++ is read, add, write, so two threads can both read 5 and both write 6, losing an update. Check-then-act code (if !map.containsKey(k) then put) has the same gap between the check and the act.
  2. Bring in the Java Memory Model. Without a happens-before edge, one thread may never see another's write. volatile gives visibility and ordering but does not make compound operations atomic.
  3. Match the tool to the shared state: AtomicInteger or AtomicLong (incrementAndGet, compareAndSet) for single values, LongAdder for heavily contended counters, ConcurrentHashMap.compute, merge or putIfAbsent for atomic per-key updates, and synchronized or a lock when one invariant spans several fields.
  4. Prefer designs that share less: immutable objects, thread confinement, or handing data over through a BlockingQueue. Keep each invariant within one critical section and do no I/O while holding a lock.
  5. Test it: start many threads together with a CountDownLatch, run many iterations, and assert the final state. For memory-model behaviour, mention jcstress.
Follow-up
  • Is calling get and then put on a ConcurrentHashMap thread-safe?
  • Why does double-checked locking for a singleton need a volatile field?
  • What is the ABA problem with compare-and-set, and how does AtomicStampedReference handle it?

The plan follows the reported loop: coding first, then Java concurrency where you must write running code, then system design, then the frontend set and the stories for the manager and HR conversations.

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
01Map the loop and set a coding baseline
  • Write the five reported rounds on one page and mark what each needs: coding, language depth, design, or conversation.
  • List your gaps against the listed stack: Java, SQL, OOP, multithreading, and the distributed tools Kafka, Redis and Docker.
  • Set a 30-minute timer and solve one medium-to-hard array and string problem cold, then write the brute force, the optimised approach and the complexity.

Deliverable: A one-page loop map, a gap list against the stack, and one timed solution with its brute force and complexity.

Practice prompt ↗
02Dynamic programming and two pointers
  • Write the longest common subsequence in code with a full table, then reduce space with a rolling row and say what changes if you must return the sequence.
  • Write Three Sum with sorting and two pointers, skipping duplicates, and state the complexity against the brute force.
  • Run both on empty, single-element and all-equal inputs and fix every failure.

Deliverable: Two working solutions with complexity notes and a list of the edge cases each one failed first.

Practice prompt ↗Practice prompt ↗
03Circular arrays and recursive folder cleanup
  • Restate the circular-array next-element question aloud, list the clarifying questions you would ask, then solve it with modulo indexing and cover wrap-around, empty and single-element cases.
  • Write the empty-folder deletion with a post-order traversal so a parent is judged after its children, preserving any folder that holds files.
  • Add a test tree for nested empty folders, a folder with only an empty child, and a folder with one file.

Deliverable: Two solutions plus a test tree and an edge-case list for the circular array and the folder cleanup.

Practice prompt ↗Practice prompt ↗
04Java synchronisation and race conditions
  • Write and run a program where two threads deadlock, then fix it by lock ordering and again with tryLock and a timeout.
  • Write a one-page comparison of synchronized, ReentrantLock and Semaphore with one use case each.
  • Write a counter that loses updates, then fix it with synchronized, AtomicInteger and a lock, and note the difference.
  • Work the PracHub drill on detecting a concurrent edit in an update path, which is the database-side version of the same race.

Deliverable: A running deadlock program and fix, a comparison table, a race-condition demo with three fixes, and the finished SQL drill.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
05Thread pools, Java 8 and rate limiting
  • Explain ThreadPoolExecutor parameters (core and maximum pool size, queue type, rejection policy) and write a sizing argument for an ExecutorService doing I/O-heavy work.
  • Rewrite a loop-based method with streams, lambdas and Optional, and note where the stream version allocates more or hides a cost.
  • Write a thread-safe rate limiter class, then outline how the same limit works across several service instances with a shared store like Redis.

Deliverable: A thread-pool sizing note, a before-and-after Java 8 rewrite with trade-offs, and a working rate limiter plus a distributed outline.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
06System design practice
  • Design the JIRA-style tool aloud: requirements, data model for tasks and assignments, how updates reach active users, and conflict handling for concurrent edits.
  • Design the notification system with SMS and email gateways: queue, workers, retries, idempotency and a dead-letter path.
  • Outline the dish recommendation system: data models, what you cache and how you invalidate it.
  • Write one page on partitioning, replication and consistency for a write-heavy system, naming the partition key and what query it makes expensive.

Deliverable: Spoken designs for the first three systems with a diagram each, and a one-page note on write-heavy data scaling.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Frontend set and behavioral stories
  • Backend-only candidates may skip the first two tasks. Build a small React hook or component from scratch and an animation driven by requestAnimationFrame, then compare it with a CSS keyframes version.
  • Write your answer to the client-side state and caching question as a story with a measured before and after.
  • Prepare three situation, action, result stories for the manager and HR conversations.
  • Rehearse the PracHub drill on arguing against a design, losing, and committing anyway.

Deliverable: A working hook and animation, a written client-state answer with numbers, and three rehearsed stories.

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

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

The last two stages are an Engineering Manager conversation about technical and team fit and an HR discussion of behavioral aspects and cultural alignment. The role is described as cross-functional, with product managers, QA and DevOps, and as including production monitoring, so prepare stories where you owned a decision, measured the result and worked through a disagreement or changing requirement.

How do you handle complex state synchronization and caching on the client side without degrading application r

medium
Frontend & UI Engineering

How do you handle complex state synchronization and caching on the client side without degrading application responsiveness?

Approach
  1. Treat it as a design-plus-story question: name a real project, say what the UI state was (lists, filters, drafts, live updates), and say what was slow or inconsistent before you changed anything. Lead with the symptom you measured, such as dropped frames, input lag or stale rows, not with a library name.
  2. Separate server state from local UI state. Keep one cache keyed by request, with stale-while-revalidate behaviour, and keep form or selection state local. Store normalised entities by id and derive views with memoised selectors instead of storing copies that can drift.
  3. Describe the synchronisation rules: optimistic updates with rollback when the server rejects, invalidation of only the affected keys after a mutation, and merging live pushes by id and version so an older event never overwrites newer data. Say how you handled two tabs or devices editing the same item.
  4. Protect responsiveness: virtualise long lists, batch or debounce updates, move heavy parsing to a Web Worker, and bound the cache with expiry or eviction. Persist only what survives a reload, and clear it on logout or schema change.
  5. Close with a result: the profiler or timing numbers before and after, what you tried that did not help, and one thing you would change. The mistake that sinks this answer is a list of tools with no measurement and no account of what you personally decided.
Follow-up
  • Two tabs edit the same record while the user is offline; how do you reconcile them when connectivity returns?
  • How would you prove the optimistic update never showed wrong data after a server rejection?
  • When would you refuse to cache something on the client?

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?

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?
  • 01

    How do you handle complex state synchronization and caching on the client side without degrading application responsiveness?

  • 02

    Tell me about a time you found a performance bottleneck in a production system and how you confirmed your fix worked.

  • 03

    Describe a design decision you disagreed with, what evidence you brought, and what you did after the decision was made.

  • 04

    Tell me about a time requirements were ambiguous or changed late in a release, and how you adapted.

  • 05

    Describe a code review where you pushed back on a teammate's approach, or accepted pushback on yours.

  • 06

    Tell me about a time you worked with QA, product or DevOps colleagues to resolve a release problem.

PracHub preparation framework ↗
How technical are the interview rounds at ARRISE?

Candidates describe them as code-heavy. They report writing code in almost every technical round, spanning algorithm problems, Java concurrency programs and system design diagrams. Practise the full reported set: coding, Java concurrency and design, plus the frontend questions if your role is frontend or full-stack.

ARRISE Software Engineer candidate reports ↗
How long does the process take?

Candidates report five rounds over roughly 4-6 weeks, and some accounts say three to six weeks. Delays are reported most often in the later stages because panel availability is hard to coordinate, so keep in regular contact with your recruiter and plan your preparation to stay sharp across a long gap.

ARRISE Software Engineer candidate reports ↗
Which programming language should I use?

Candidates report that you can generally choose your language for the algorithm questions. For backend roles, Java depth including concurrency and multithreading is reported as required. The role requirements candidates describe list Java, C++ or modern JavaScript/TypeScript, so choose the language in which you can write correct code with no auto-complete.

ARRISE Software Engineer candidate reports ↗
How should I prepare for the system design rounds?

Practise the reported designs aloud: a JIRA-style collaboration tool, a dish recommendation system, a notification system with SMS and email gateways, distributed locking or rate limiting, and partitioning and replication under heavy writes. Start each with requirements, then data model, then components, and finish with failure handling. Reported topic lists include caching with Redis or Memcached, message queues such as Kafka or RabbitMQ, sharding and consistent hashing.

ARRISE Software Engineer candidate reports ↗
What Java topics should I know for the concurrency questions?

Know synchronized blocks, wait and notify, ReentrantLock and Semaphore, ConcurrentHashMap, CopyOnWriteArrayList and blocking queues, volatile and thread-local storage, and how ExecutorService thread pools are configured. Candidates also report that you must write compilable, runnable Java on a shared IDE, so write the deadlock program and a race-condition fix by hand before the interview.

PracHub Software Engineer practice ↗
Do I need frontend preparation?

Only if the role is frontend or full-stack. For those roles candidates report a custom React component or hook, rendering performance with requestAnimationFrame and CSS keyframes, client-side state and caching, and interactive elements such as gradient animations or simple game mechanics. Backend candidates can spend that time on Java and design.

ARRISE Software Engineer candidate reports ↗
What do candidates say about the coding setup?

Candidates describe live coding on a shared IDE or whiteboard, writing, debugging and running code, and advise practising without auto-complete. Present each coding answer as brute force first, then the optimised version with its time and space complexity, and talk through your trade-offs as you go.

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.