CoffeeBeans · Software Engineer
Updated · 2026-10-02

CoffeeBeans Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Candidate reports do not name a specific CoffeeBeans product, customer or team, so this guide sticks to what the role itself is reported to involve. The Software Engineer position is described as covering backend work (services, API design, infrastructure other code depends on) and frontend work (responsive interfaces), with engineers connecting the two through APIs. The languages listed for the role are Java, Go, JavaScript with React, and Python. Cloud platforms (AWS or GCP) and containers (Docker, Kubernetes) are listed as helpful extras rather than requirements. Engineers are described as owning features from requirements through production, reviewing each other's code, working with product managers on technical requirements, and joining knowledge-sharing sessions, hackathons and design reviews. For preparation, this means questions can range from browser behaviour to cloud networking, so you need one language you can code in fluently plus working knowledge of the web stack around it.

This guide is for candidates interviewing for a Software Engineer role at CoffeeBeans, whether the team leans toward backend (Java or Go), frontend (JavaScript and React) or a mix. It covers the seven questions candidates report, the topic areas reported for the loop (JavaScript, React, data structures and algorithms, system design, API security and cloud infrastructure) and a seven-day plan. It does not cover pay or any particular team, because neither is reported in enough detail to prepare against.

Candidates report a mix of automated assessments and live sessions on design and architecture, plus a Management/CTO conversation. No fixed round order is reported, and timelines range from a single day to one to three weeks.

JavaScript (JS)System DesignReact.js

33 min read

Browse Software Engineer questions

See the practice prompts

15Practice promptsAcross five skill areas

The role is described as end-to-end ownership of features: writing production code, reviewing colleagues' code, agreeing technical requirements with product managers, and taking part in design reviews and hackathons. Work is said to span backend services and frontend interfaces. That breadth is why the reported question set jumps between a Go language-internals question, two browser and React questions, two API questions and two system design questions. Treat it as a full-stack screen where you are expected to have a primary language and a credible second layer.

The seven reported questions fall into three clusters. The first is language and frontend mechanics: how a Go array differs from a slice, how the Intersection Observer API works and what it is used for, and how class and functional components differ in React. The second is web API practice: what REST usability standards are for, and how to paginate in a web application. The third is architecture: online/offline synchronization in a mobile application, and how AWS load balancers and a VPC fit into a cloud design. Each cluster rewards a different kind of answer: precise definitions with a small example, a contract with trade-offs, or a diagram you can talk through.

Candidates also report evaluation areas beyond those seven: closures, promises, async/await and the event loop, DOM manipulation and event delegation, state management in larger applications, microservices communication, authentication and authorization for APIs, and scaling strategies. Data structures and algorithms appear in the reported topic mix and in the must-have skills, so keep at least one timed problem-solving session in every few days of preparation.

Reports stress explaining the reasoning behind a choice and asking clarifying questions before answering or coding. Rehearse that out loud: state what you assume, give the simple option first, then say why you would pick something sturdier and what it costs. Because the process varies from team to team, confirm early which stages you face and which language you will code in.

01

Preparation focus

editorial

No ordered list of rounds is reported for CoffeeBeans. What candidates do mention: automated assessments for foundational knowledge, live sessions on design and architecture, online coding assessments where your compiler or IDE setup matters, and a Management/CTO conversation about past projects. Some candidates finish in a single day, while others report one to three weeks depending on the team. Approach this block in three passes. First, ask the recruiter which of these stages apply and which language you will use. Second, work the seven reported questions by cluster: Go and frontend mechanics, REST and pagination, then offline sync and AWS networking. Third, prepare a detailed account of every project on your resume, since the management conversation is reported to centre on past work, career goals and trade-offs.

What to demonstrate

  • Foundational knowledge in your primary language (Java, Go, or JavaScript with React), which an automated or online coding assessment tests through working code
  • Design and architectural reasoning, which candidates report being covered in live sessions
  • Ability to discuss past projects, technical choices and trade-offs in the management conversation
  • Whether you clarify the task before you implement or answer, a pitfall that candidate guidance highlights

How to prepare

  • Ask the recruiter which stages apply, whether you will write code live or in an online assessment, and which languages are accepted
  • Run a small program in your chosen language in the exact environment you will use, including reading input and printing output, before any assessment
  • Answer the seven reported questions aloud, grouped as Go and frontend mechanics, REST and pagination, then offline sync and AWS networking
  • Write a one-page summary of each resume project: the requirement, your design choices, the alternative you rejected and what you would change
PracHub preparation framework ↗

PracHub editorial advice for the preparation topics above.

01

Answering the Go array versus slice question with 'slices are dynamic arrays' and nothing more

Say that an array's length is part of its type and that assigning or passing one copies every element, while a slice is a small header holding a pointer, a length and a capacity over an underlying array. Then show append: within capacity it writes into shared memory, past capacity it reallocates, so two slices can silently alias or silently stop aliasing. Run a ten-line example and be ready to predict its output.

02

Describing the Intersection Observer or class versus functional components at the level of a definition, with no mechanics

For the observer, name the callback receiving entries, the isIntersecting flag, root, rootMargin and threshold, one use such as lazy-loading images or infinite scroll, and when to call unobserve or disconnect. For React, map lifecycle methods to effects, explain this-binding in classes against closures in function components, and note that error boundaries still require a class component.

03

Answering the pagination or REST standards question with offset and limit only, or with a list of verbs and status codes

Compare offset pagination (simple, but pages shift when rows are inserted and deep offsets scan and discard rows) with cursor or keyset pagination (stable, index-friendly, but no jumping to page N). Tie both to a deterministic sort with a unique tiebreaker, and say what the response carries: next cursor, total only if affordable. For REST, explain what consistent resource naming, status codes, error bodies and versioning let a client do without reading source code.

04

Drawing boxes for the offline sync or AWS load balancer and VPC questions without fixing scope or stating failure behaviour

Ask what data is synced, how often users edit offline and whether two devices can edit the same record. Then commit to a local store, a queue of pending writes with idempotency keys and a conflict rule. For AWS, trace one request from the internet through a load balancer in public subnets to instances in private subnets, naming security groups and health checks, and say what happens when one availability zone is lost.

05

Coding silently, or starting before the task is understood, in an online assessment or live session

Restate the task, ask about input size and edge cases, state the simple approach and its cost, then the one you will write and its complexity, and narrate as you go. Beforehand, confirm your compiler or IDE configuration so a setup problem does not eat the session.

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

12 technical prompts0 include a worked solution

Explain the difference between Array and Slice in Go.

medium
Technical & Core Domain

Explain the difference between Array and Slice in Go.

Approach
  1. Start with the type: an array's length is part of its type, so [4]int and [5]int are different types. A slice is a small header (pointer to a backing array, len, cap) with a dynamic view over that array.
  2. Contrast the semantics. Assigning an array or passing it to a function copies every element, and arrays are comparable with == when the element type is. Passing a slice copies only the header, so callee and caller share the backing array. Slices compare only to nil.
  3. Explain append. When len < cap it writes into the shared backing array, so another slice over the same array sees the change (the classic aliasing bug). When cap is exhausted it allocates a larger array and copies, which gives amortised O(1) appends. Pre-size with make([]T, 0, n) when n is known.
  4. Cover the edge cases: a nil slice and an empty slice both have len 0 and accept append, but encoding/json marshals nil as null and empty as []. A small reslice of a huge array keeps the whole array alive, so copy() it out. s[lo:hi:max] caps capacity so a later append cannot overwrite neighbours.
  5. Say when an array fits: fixed-size values such as a [32]byte hash used as a map key (slices cannot be map keys). Use slices for almost everything else.
Follow-up
  • A function appends to a slice parameter and the caller does not see the new element, yet an in-place index assignment is visible. Why?
  • How do you remove the element at index i from a slice, and what happens to the backing array?
  • Why can a [16]byte be a map key when a []byte cannot?

Collapse a redelivered event batch into per-aggregate high-water marks

easy
hashingat-least-onceaggregation

You drain a batch of up to 5,000,000 events, each (aggregate_id BIGINT, aggregate_version INT, event_type, payload). The log guarantees order within one aggregate only; the batch merges 64 partitions, and a relay failover has redelivered a range, so an older version for an aggregate can appear after a newer one. Given a map of last_applied_version per aggregate, produce the events worth applying, at most one per (aggregate_id, version), plus the count discarded. Target O(n) time. State the memory for 2,000,000 distinct aggregates and what you do when it does not fit.

Approach
  1. One pass, one hash map from aggregate_id to the highest version kept, and a discard counter. An event whose version is at or below last_applied_version for its aggregate is dropped without further work, which is the whole reason the event carries its version rather than a delta. O(n) expected time, O(d) space in distinct aggregates.
  2. Keep the maximum, never the last occurrence. The redelivered range means the final appearance of an aggregate in the batch can be an older version than one seen earlier in the same batch, so last-wins applies stale state over newer state and the projection regresses with no error anywhere.
  3. Cost the memory instead of calling it large: an 8-byte key plus a 4-byte version is 12 bytes of payload, and an open-addressed table held at a 0.7 load factor costs roughly 17 bytes per entry before per-slot metadata, so 2,000,000 aggregates is tens of megabytes in a native layout and several times that in a runtime that boxes both key and value.
  4. If the distinct set exceeds memory, partition on hash(aggregate_id) mod P and reduce each partition independently. Every event for one aggregate hashes to the same partition, so the per-partition result is exact and the merge is concatenation rather than a second reduction.
Follow-up
  • The payload is a patch rather than a snapshot, so applying only the highest version loses the intermediate changes. What changes in your reduction?
  • How do you detect that version 7 arrived while version 6 was never delivered, and what should the consumer do about the gap?

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

hard
reconciliationrange hashingthrottling

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

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

The plan follows the clusters of reported questions: setup and format on day one, language and frontend mechanics, APIs and pagination, then architecture, algorithms under narration and a full mock. PracHub practice questions are pointed at the days where they reinforce the same skill.

Small steps. Visible outcomes.0 / 7 completed
ONE WEEK · YOUR PACE

Prepare, practise & reflect

One practical outcome each day. Spend longer where you need it.

0 / 7 done
01Confirm the format and set up your environment
  • Ask the recruiter which stages apply (automated assessment, live session, Management/CTO conversation), whether you will write code, and which languages are allowed
  • Run a small program with input and output in your chosen language, in the exact compiler or IDE you will use
  • List every project on your resume with one line each on your role and the hardest technical choice

Deliverable: A recruiter reply on format and language, a program that compiles and runs in your assessment environment, and a project list with one hard choice per project.

02Go slices and core data structures
  • Write a Go program that shows array copy semantics, slice header sharing, and an append that crosses capacity, and annotate the output
  • Explain out loud the difference between an array and a slice, including when you would choose each
  • Solve one hash-map problem in your primary language, stating time and space complexity before you code

Deliverable: An annotated Go program, a recorded spoken answer to the array versus slice question, and one solved hash-map problem with complexity written beside it.

Practice prompt ↗Practice prompt ↗
03Browser, JavaScript and React mechanics
  • Build an infinite-scroll or lazy-image list with an Intersection Observer and clean it up with unobserve
  • Write a snippet mixing setTimeout, a resolved promise and an await, and predict the log order before running it
  • Rewrite a class component with state and lifecycle methods as a function component with hooks, and list what maps to what

Deliverable: A working observer-based list, a predicted-then-verified event loop output, and a class-to-function conversion with a mapping table.

Practice prompt ↗Practice prompt ↗
04REST conventions and pagination
  • Write the contract for a list endpoint: resource naming, status codes, error body, versioning and authentication
  • Implement both offset and cursor pagination for it, and write down what each does when rows are inserted mid-browse
  • Work the PracHub question about a listing query that ignores its index to see why the sort key and index must agree

Deliverable: An endpoint contract, two pagination implementations with a comparison table, and a written explanation of the index problem.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
05Offline sync and AWS networking
  • Sketch an offline-first mobile design: local store, pending-write queue, idempotency keys, conflict rule and retry behaviour
  • Draw a VPC with public and private subnets, a load balancer, security groups and health checks, and trace one request through it
  • Add API security to the sketch: where authentication happens, how authorization is checked, and how services call each other

Deliverable: One offline-sync diagram, one VPC diagram with a request trace, and a half-page note on authentication and authorization placement.

Practice prompt ↗Practice prompt ↗
06Algorithmic problem solving while narrating
  • Solve two timed problems in your primary language, saying the brute-force approach, the target complexity and the edge cases aloud
  • Work the PracHub question on diffing a projection against its source without per-row reads, and note the data structure you chose
  • Review each solution for naming, structure and what you would say in a code review

Deliverable: Two solved problems and one practice solution, each with a complexity line and an edge-case list, plus review notes.

Practice prompt ↗
07Full mock and project conversation
  • Run a mock that mixes a coding problem, one frontend mechanics question and one design question, all spoken aloud
  • Rehearse a five-point account of your two strongest projects: requirement, design, trade-off, result, change
  • Write the questions you would ask about the team, its review practice and how work is split between frontend and backend

Deliverable: A completed mixed mock with a list of weak answers, rehearsed notes for two projects and a written list of 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.

Candidates report a Management/CTO conversation where preparation centres on past projects, career goals, how your work affects the business and the trade-offs behind your technical choices. Reports also advise being ready to discuss every project on your resume in detail. The prompts below are rehearsal material for that conversation, not quoted questions.

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?

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?

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

    Walk me through a project on your resume end to end: the requirement, the design you chose, the alternative you rejected and what you would change now.

  • 02

    Tell me about a time a request was ambiguous. What did you ask before you wrote code, and how did the answers change your design?

  • 03

    Describe a code review where you changed your mind, or where you changed someone else's. What was the technical argument?

  • 04

    Describe how a feature you built affected a business outcome, and how you knew.

  • 05

    Where do you want your career to go, and what in this role moves you toward it?

PracHub preparation framework ↗
How long does the CoffeeBeans interview process take?

Candidates report both extremes: some finish in a single day, others take one to three weeks depending on team availability and the role. No fixed number of rounds or order is reported, so ask your recruiter which stages apply to your team and plan your seven days around the answer.

CoffeeBeans Software Engineer candidate reports ↗
What matters most in the technical rounds?

Reports say that communicating your thought process while you code counts as much as the code. In practice, restate the task, ask about input size and edge cases, say the simple approach and why you would move beyond it, and name the complexity before and after you write. Practise this out loud with a timer.

CoffeeBeans Software Engineer candidate reports ↗
How should I prepare for the Management/CTO round?

Candidates are told to focus on past projects, career goals, how their work affects the business and the trade-offs behind technical choices. Prepare a short account for each resume project covering requirement, design, the option you rejected, the result and what you would change. Expect to defend any technology you list.

CoffeeBeans Software Engineer candidate reports ↗
Which topics does CoffeeBeans test?

The topic mix candidates report is JavaScript, system design, React, data structures and algorithms, and algorithmic problem solving. The reported evaluation areas add the event loop, closures, promises, async/await, DOM manipulation and event delegation, state management, microservices communication, API security and cloud infrastructure such as VPCs and load balancers.

CoffeeBeans Software Engineer candidate reports ↗
Which programming language should I prepare in?

The role lists Java, Go, and JavaScript with React as the primary languages, and Python also appears in the requirements. Choose the one you can write correct code in under pressure and that matches your resume. Still prepare the Go array versus slice question if Go is on your resume, and the React questions if you apply to a frontend-leaning team.

PracHub Software Engineer practice ↗
What should I check before an online coding assessment?

Candidate guidance advises confirming your compiler or IDE configuration beforehand. Run a program in your chosen language that reads input and prints output, confirm the version and any required imports, and have a note of the complexity of each solution ready. Ask what scope is expected if the task statement is unclear.

PracHub Software Engineer practice ↗
What backend and cloud knowledge is reported?

Candidates mention microservices communication patterns, authentication and authorization for APIs, VPCs, load balancers and scaling strategies. Experience with AWS or GCP and with Docker or Kubernetes is listed as a plus rather than a requirement. Prepare to trace a request through a load balancer into private subnets and to say how services authenticate to each other.

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.