Cleerly · Software Engineer
Updated · 2026-10-02

Cleerly Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Cleerly works on heart disease diagnosis and treatment, combining medical technology with AI. Candidates describe engineering work that spans computational imaging pipelines and enterprise platforms, with AI services running in production and software that sits inside a Quality Management System. The requirements candidates describe for the Software Engineer role list Python, PyTorch, SQL, Postgres, NoSQL, Redis, RESTful web services, cloud deployment, Docker and Kubernetes. A Software Engineer there is reported to build and maintain the infrastructure that serves AI-derived results, including testing mechanisms and observability tooling, and to work daily with AI researchers, product managers and operations teams.

This guide is for experienced engineers preparing for the Cleerly Software Engineer interviews. It covers the one reported question group (five linked questions on AI deployment, distributed debugging, API design for sensitive data, Postgres and Redis behaviour, and testing under regulation), the stack the role lists, and the behavioral stories candidates are asked to bring. No round order has been reported, so the guide prepares you by topic rather than by stage.

No named rounds or round order have been reported for Cleerly. Candidates describe a series of conversations that move from technical screening toward architecture and behavioral discussion, so prepare by topic and confirm the format with your recruiter.

PythonPyTorchObservability

30 min read

Browse Software Engineer questions

See the practice prompts

11Practice promptsAcross five skill areas

The reported question for this loop is really five questions in one: keeping AI models available and reliable in production, debugging a complex distributed-system issue, designing a REST API that carries sensitive medical data, keeping Postgres or Redis consistent and fast under heavy traffic, and testing software that has to meet medical regulatory standards. Each one rewards a concrete answer built from systems you have run, so the most useful preparation is writing out your own production stories with the trade-offs and numbers attached.

The stack matters because the role lists it. Expect to talk about Python services, PyTorch-based models behind them, SQL and Postgres, Redis, Docker, Kubernetes and a cloud platform. Candidates also report observability as a recurring theme: logs, alerts, dashboards and runbooks, and how you found out something was wrong. Prepare to describe the signal you watched, not just the tool you used.

Candidates report two evaluation areas in the written material: productionizing AI (pipeline orchestration, low-latency inference, monitoring, model versioning and reproducibility) and systems architecture (trade-offs among speed, cost and reliability). A good drill for the first is explaining how a model artifact, its code, its dependencies and its input data are pinned so that a past result can be reproduced. For the second, practise saying what you gave up and why.

The domain adds a layer most commercial backends lack. Medical imaging, HIPAA and HITRUST familiarity and computer vision are listed as nice-to-haves, not requirements. If you have no regulated-software background, prepare the nearest equivalent you have: audit trails, change control, access reviews, or release gates, and be honest about the gap. Behavioral questions are reported to be framed around the company's HEART values, so bring stories that show humility, accountability and teamwork with specifics.

01

Preparation focus

editorial

Candidates do not report named rounds or a fixed order for this loop. They describe conversations that start with technical screening and move toward deeper architecture and behavioral discussion, with people from the Computational Imaging or Enterprise Experience teams and cross-functional partners possible along the way. Treat this stage as your preparation baseline: ask the recruiter which stages you will face, whether any involves writing code live, and which team you are interviewing for, then prepare the reported question by topic. Practise answering each of its five parts in roughly the same shape: the situation, the design or diagnosis, the trade-off you accepted, and how you would know it was working.

What to demonstrate

  • Depth in the listed stack: Python, PyTorch, Postgres or Redis, Docker and Kubernetes
  • Ability to describe production systems you ran, including how you monitored them and handled incidents
  • Reasoning about trade-offs among speed, cost, reliability, security and maintainability
  • Behavioral stories framed around the HEART values and cross-functional work

How to prepare

  • Ask your recruiter for the sequence of stages, whether you will write code, and which team the role sits on
  • Write one story each for AI model deployment, a distributed-system debugging incident, an API you secured, and a Postgres or Redis performance or consistency problem
  • Prepare a short account of how you would test and release software that has to satisfy a regulator, or the closest equivalent you have done
  • Rehearse two or three stories on ambiguity and cross-functional work, each ending with a result you can quantify
PracHub preparation framework ↗

PracHub editorial advice for the preparation topics above.

01

Answering the high-availability question for AI models with only "run more replicas"

Cover the whole serving path: pinned model and dependency versions, readiness checks that load the model before taking traffic, a canary or shadow rollout, a rollback path to the previous model version, capacity for compute-heavy requests (queueing or autoscaling), and what the caller sees when inference is degraded.

02

Telling the distributed-system debugging story as a list of things you tried

Structure it as symptom, scope, hypothesis, evidence, fix, prevention. Name the signal that first showed the problem (an alert, a latency percentile, a trace), how you narrowed it to a service or dependency, how you confirmed the cause, and the alert, test or runbook entry you added afterward.

03

Designing the medical-data REST API as a list of endpoints and skipping the sensitive-data parts

Address authentication and per-record authorization, opaque identifiers instead of personal data in URLs, no sensitive fields in logs or error bodies, encryption in transit and at rest, an audit trail of who read what, input validation, pagination limits and idempotent writes. Say which of these you would build first and why.

04

Saying "I would add a Redis cache" without a consistency story

State what the cache holds, how it is invalidated or expires, what happens on a miss stampede, and how stale a read can be before it matters. On the Postgres side, name the actual tools: indexes matched to the query, transaction isolation level, optimistic version checks or row locks for contended writes, and connection pooling.

05

Reducing regulated-software testing to a unit-test coverage number

Describe tests tied to requirements, integration and regression suites for the model-serving path, validation of model outputs against a fixed reference set, recorded results, and review or approval gates before release. If you have not worked under a regulator, say so and describe the closest controls you have used.

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

Canonicalise a request body into a stable idempotency fingerprint

medium
parsingcanonicalisationhashing

idempotency_key.request_fingerprint is a SHA-256 over the method, path and canonicalised body, and a retry whose fingerprint differs must be rejected with 422 rather than served the stored response. Write the canonicaliser. Bodies are JSON up to 256 KB nested at most 32 levels; clients vary key order, whitespace and unicode escaping, and some send 64-bit ids as JSON numbers. Produce a deterministic byte string such that semantically identical bodies match and any semantic difference does not. State your complexity and name two normalisations you refuse to perform.

Approach
  1. Parse once into a tree, then re-serialise under fixed rules: object keys sorted, array order preserved, one escaping convention, no insignificant whitespace. Parsing is O(n) and sorting keys is O(k log k) per object, so O(n log n) overall with O(depth) stack, and the 32-level cap is enforced during parsing because hostile nesting is how a canonicaliser becomes a stack overflow.
  2. Sort keys by their UTF-8 bytes and say why the obvious implementation is wrong in some runtimes: a default string comparison that orders by UTF-16 code units places surrogate pairs, meaning code points from U+10000 up, below U+E000 to U+FFFF, which is not UTF-8 byte order, so two services written in different languages disagree on the same document.
  3. Do not re-encode numbers through a double. IEEE-754 binary64 represents integers exactly only up to 2^53, so normalising a 19-digit id through a float changes it, and 1 against 1.0 cannot be reconciled without deciding whether they are the same value. Preserve the literal token, and require ids as strings at the API boundary if you want them comparable.
  4. Reject duplicate keys rather than picking one. JSON permits them and parsers disagree, most keeping the last, so any choice you make ties the fingerprint to a parser detail that the code handling the request does not necessarily share.
Follow-up
  • A client sends the same logical request with an extra field your API ignores. Same key, different fingerprint, so you return 422. Is that the right answer?
  • Where does the fingerprint get computed relative to request decompression and the body-size limit?

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?

Track a rolling failure rate per destination for circuit decisions

easy
sliding windowring buffercircuit breaker

The egress service delivers about 1,500 webhooks per second across roughly 40,000 destinations, each call bounded by a 10 second timeout. Maintain, per destination, the failure rate over the trailing 60 seconds so a caller can ask before dispatch whether the circuit should open. Attempts arrive as (destination_id, finished_at_ms, outcome). Requirement: amortised O(1) per attempt, with total memory bounded by the destination count rather than by traffic. Give the structure, its exact memory, and the rule that stops a destination with three attempts from opening a circuit.

Approach
  1. Name the exact-deque version and then reject it as the default. Holding timestamps and advancing a tail pointer past anything older than now minus 60 seconds is a correct two-pointer window at amortised O(1) per attempt, but its memory tracks in-window traffic, so one destination in a retry storm holds hundreds of thousands of entries while thousands of quiet destinations hold none.
  2. Use a ring of 60 one-second buckets per destination, each bucket a pair of counters for attempts and failures. On an attempt, advance the ring by the elapsed whole seconds, zeroing at most min(elapsed, 60) buckets, then increment the head. That is amortised O(1) with a fixed footprint per destination.
  3. State the footprint: 60 buckets times two 4-byte counters is 480 bytes of payload per destination, so 40,000 destinations is roughly 20 to 25 MB with per-entry overhead, bounded by the catalogue rather than by the rate. The cost is granularity, since the oldest bucket ages out in whole seconds, which is far tighter than the decision needs.
  4. Require a minimum sample before the circuit may open. A destination with three attempts and three failures reads as 100 percent and is not evidence; a floor of roughly 20 attempts in the window makes the ratio meaningful, and below that floor use a run of consecutive failures as the trigger instead.
Follow-up
  • The fleet is 30 instances and each sees roughly a thirtieth of a destination's traffic. Where does the rate actually live, and what does a per-instance answer get wrong?
  • A destination answers in 9.5 seconds and succeeds. It is not failing but it is consuming your per-destination concurrency. What signal should open the circuit here?

The plan follows the five parts of the reported question and the stack the role lists: REST design, Postgres and Redis, production AI, observability and debugging, then regulated testing and behavioral stories. PracHub practice questions are used where they exercise the same skills.

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 map the stack
  • Ask your recruiter for the stages, whether you will write code, and which team the role belongs to
  • List the stack from the role requirements (Python, PyTorch, SQL, Postgres, NoSQL, Redis, REST, Docker, Kubernetes, cloud) and rate your recent hands-on depth in each
  • Pick two stack areas where you can tell a production story and two where you need refreshing

Deliverable: A recruiter reply on the format and a one-page stack map showing your strong and weak areas.

02REST API for sensitive medical data
  • Outline an API for patient scan results: resources, authentication, per-record authorization, audit logging, and what never appears in URLs or logs
  • Add pagination, rate limits, versioning and idempotent writes, and say which you would ship first
  • Work the PracHub practice question on canonicalising a request body into an idempotency fingerprint, then answer the REST part of the reported question aloud

Deliverable: A written API outline with a security checklist, a working idempotency-fingerprint solution and a recorded spoken answer.

Practice prompt ↗Practice prompt ↗
03Postgres and Redis consistency and performance
  • Write a cache-aside design for a read-heavy endpoint, covering invalidation, expiry, stampede protection and acceptable staleness
  • Practise a contended-write problem with optimistic version checks and a per-tenant cap using PracHub's SQL practice questions
  • Work through the replication-lag practice question and decide what to degrade first

Deliverable: A cache design note, two practice solutions with the transaction or constraint named, and a stated degradation order.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
04Productionizing AI services
  • Describe how you would version a PyTorch model, its code, dependencies and input data so a past result is reproducible
  • Sketch a Docker and Kubernetes deployment for an inference service: readiness checks, canary rollout, rollback, and scaling for compute-heavy requests
  • Write your answer to the high-availability part of the reported question, including what callers see when inference is degraded

Deliverable: A reproducibility checklist, a deployment sketch and a spoken answer on keeping AI models available.

Practice prompt ↗
05Observability and distributed debugging
  • Write the set of logs, metrics, alerts, dashboards and runbook entries you would put on the inference service from day 4
  • Write up one real distributed-system incident as symptom, scope, hypothesis, evidence, fix and prevention
  • Work the PracHub practice questions on one slow customer endpoint stalling other destinations and on a rolling failure rate per destination

Deliverable: An observability plan, one incident story in six steps and two practice solutions.

Practice prompt ↗Practice prompt ↗
06Regulated testing and behavioral stories
  • Outline a test and release approach for software under medical regulation: requirement-linked tests, regression suites, a fixed reference set for model output, recorded results and approval gates
  • Write three stories that show humility, accountability and teamwork, plus one on handling ambiguity across teams, each ending with a result you can quantify
  • Rehearse the PracHub behavioral practice questions on code review disagreements, callers you do not own and unblocking an engineer

Deliverable: A regulated-testing outline, four written stories with numbers and spoken runs of three behavioral practice questions.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Full dry run
  • Answer all five parts of the reported question back to back, aloud, using your written stories and trade-offs
  • Do the PracHub practice question on diffing a projection against the primary as a final coding warm-up
  • Write two questions for your interviewers about how the team handles releases, monitoring and on-call

Deliverable: A recorded full run, a completed warm-up solution and two questions to ask.

Practice prompt ↗Practice prompt ↗

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

Candidates report behavioral questions framed around the HEART values (Humility, Excellence, Accountability, Remarkable, Teamwork), in a setting that is mostly remote and often cross-functional. Each story should show a decision you made, what it cost, and a result you can put a number on. Avoid stories that only describe a team's success: say what you personally did.

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?

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?

Unblock an engineer without taking the keyboard

easy
mentoringleasesat-least-once

A teammate has spent two days on a job handler that occasionally writes duplicate rows. They are certain the queue is delivering twice by mistake. You suspect a lease expiring under a slow handler, so the job is running concurrently with itself. Describe how you have unblocked someone in this position: what you asked before offering a hypothesis, what you showed them rather than told them, and what you left them owning. Then say what you would do if their theory turned out to be the right one.

Approach
  1. Ask before diagnosing, and ask for things answerable from data they already have: the attempt count on the job rows that produced duplicates, the handler's observed duration against its lease expiry, and whether the duplicate rows share a natural key that a unique constraint could have caught.
  2. Teach the shape rather than the answer. A lease cannot distinguish a dead worker from a slow one, so a handler that outruns its lease is running twice by design, and deploys deliver the other half by killing handlers mid-run on every rollout. Both of their candidate theories produce identical duplicate rows, which is why the evidence has to come from timings rather than from argument.
  3. Hand over a checklist they execute: a natural key on every write the handler performs so the second copy collides rather than appends, the record of intent written before any external effect, a lease heartbeat while running, and the metric that shows it working.
  4. Keep ownership with them deliberately. Pair on the first write, then step back; if you finish it yourself you have closed one ticket and left the same person stuck on the next redelivery.
Follow-up
  • How would you distinguish a genuine double-delivery from a lease expiry using only the data already stored?
  • Their handler calls an external endpoint before recording that it did. What do you tell them to change first?
  • 01

    Describe a time you debugged a complex issue in a distributed system, from the first signal to the fix and what you changed to stop it recurring.

  • 02

    Tell a story about a time you were accountable for a production failure: what you owned, what you told others and what you changed.

  • 03

    Describe a time you worked with AI researchers, product managers or operations teams to turn an ambiguous problem into a shipped solution.

  • 04

    Give an example of a technical trade-off you made among speed, cost, security or reliability, and what you would decide differently now.

  • 05

    Describe a time you showed humility: you were wrong about a technical call and changed course.

  • 06

    Tell a story about raising the bar on quality or release discipline on your team, and the evidence that it worked.

PracHub preparation framework ↗
How should I prepare for the technical conversations?

Prepare from systems you have run, not from textbook algorithms. Write one account each for deploying an AI model, debugging a distributed issue, securing a REST API, and tuning or protecting Postgres or Redis. For every account, note the trade-off you made, how you monitored it and how you would know it broke.

Cleerly Software Engineer candidate reports ↗
Is the work remote?

Candidates report that Cleerly is mostly remote, with occasional in-person collaboration and possible travel for team meetings or cross-functional projects. Ask your recruiter what that means for the specific team.

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

No timeline has been reported. Candidates describe a series of conversations that varies by team and role, so ask your recruiter for the stages and the expected pace when you first speak.

Cleerly Software Engineer candidate reports ↗
How are behavioral questions framed?

Candidates report that behavioral questions are tied to the company's HEART values: Humility, Excellence, Accountability, Remarkable and Teamwork. Prepare specific stories with real decisions and outcomes, not value statements.

Cleerly Software Engineer candidate reports ↗
Which technologies come up most?

Candidates most often report Python, observability, AWS, logging and Kubernetes. The role's requirements also list PyTorch, SQL, Postgres, NoSQL, Redis, Docker and REST web services, so be ready to discuss any of them in the context of a production system.

Cleerly Software Engineer candidate reports ↗
Do I need medical imaging or HIPAA experience?

Medical imaging, regulated-software experience, HIPAA and HITRUST familiarity and computer vision are listed as nice-to-have, not required. If you lack them, prepare the nearest equivalent, such as audit trails, access controls or gated releases, and be direct about what you have not done.

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.