Protect the information. A text transformation can damage a document by removing spacing. An endpoint can return the right file to the wrong person. Show how you turn those risks into explicit requirements and tests.
Clio’s engineering page lists programming, system design, technical leadership for individual contributors and Culture Add. Its product pages describe document, matter and billing workflows. The exercises turn that context into precise engineering practice.
Make requirements executable. Begin a text transformation by specifying which characters may change and which must remain untouched. Preserve those tests as you introduce new requirements. Apply the same discipline to data access and version selection.
Understand a matter before designing a service. In this guide’s examples, a matter is a case or project a law firm manages. Documents, time entries and invoices refer to it. Keep three boundaries visible:
- Firm: Which organization owns the data?
- Matter: Which case or project does the record belong to?
- Permission: Is this user allowed to perform this action now?
These exercise assumptions make the design concrete; they do not describe Clio’s database.
Talent Acquisition screen
officialThe official process starts with a Talent Acquisition conversation.
- Interviewer
- Talent Acquisition Specialist
What to demonstrate
- Motivation: Connect your interest to a user problem in legal software.
- Clarity: Describe a project without assuming the listener knows your system.
How to prepare
- Rehearse a short introduction with one concrete result.
- Prepare questions about the team and the role’s scope.
Hiring manager interview
officialThis conversation depends on the role and team.
- Duration
- 30–60 minutes
- Interviewer
- Hiring manager or another Clio manager
What to demonstrate
- Depth: Explain a technical decision and what you learned from operating it.
- Ownership: Separate your work from the broader project outcome.
How to prepare
- Choose a project with a meaningful tradeoff.
- Prepare a short system sketch you can explain without confidential details.
Technical and collaboration interviews
officialThe published engineering process includes programming, system design, technical leadership for individual contributors and Culture Add; role and level can change the order.
- Format
- Programming and design: 60 minutes each; technical leadership: 60 minutes; Culture Add: 30–45 minutes
What to demonstrate
- Range: Move between implementation details and the user impact.
- Collaboration: Ask clear questions and respond to changing constraints.
How to prepare
- Practise coding and design in separate timed sessions.
- Prepare an example of influencing a technical decision without authority.
Hiring manager conversation
officialA further conversation covers feedback, role and level before an offer.
- Duration
- 30–60 minutes
- Interviewer
- Hiring manager
What to demonstrate
- Reflection: Explain what you learned from the interviews.
- Fit: Connect the responsibilities to the work you want to do next.
How to prepare
- Write down unresolved questions after each interview.
- Ask how success is defined for the role you are discussing.
PracHub editorial advice for the preparation topics above.
What happens when two people edit the same note?
Choose a scenario to trace what changes.
You open a shared note and edit its text. Nobody else changes the saved note before you press Save.
- 01You edit a shared noteThe app remembers which saved revision you opened, along with your unsaved changes.
- 02The saved note is unchangedThe server atomically checks that nobody has saved a newer revision since you opened it.
- 03Your changes are savedThe server stores the edited note as the next revision and returns confirmation to the app.
Save only if the note still matches the revision you opened. Confirm success after the server accepts the change.
PracHub practice model: two colleagues edit an internal matter note. Revisions describe saved copies. Both users must already have permission; the diagram explores concurrency after authorization.
Discarding spacing while transforming text
Preserve the untouched spans. Splitting and rejoining can change tabs, repeated spaces and punctuation. Write a test containing all three before coding.
Treating a document ID as permission
Authorize the action. A hard-to-guess ID is not an access-control rule. Check both firm membership and matter permission on every read and download.
Giving only a happy-path design
Explain a failed upload. Separate object storage from metadata and define how incomplete or orphaned files are recovered.
Describing leadership only as authority
Show influence through evidence. Explain how you clarified a tradeoff, changed your view or helped others reach a decision.
Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.
Mask a token without changing document spacing
Task: Replace every ASCII letter in a whole ASCII word matching a target with an asterisk. Matching ignores case. Preserve every other character, including tabs, newlines and repeated spaces.
Approach
- Scan spans: Find words without splitting and rebuilding the document.
- Replace locally: Preserve unmatched spans and the length of each matched word.
Worked solution 35 min
- Keep spans intact: The regex locates ASCII words; substitution leaves separators untouched. The callback changes only exact case-insensitive matches.
- Define the limit: This is a text-processing exercise, not a complete privacy-redaction tool. Unicode, aliases and embedded identifiers require a different policy.
- Cost: Scanning and constructing the result take O(n) time and output space for n input characters.
import re
WORD = re.compile(r"[A-Za-z]+")
def mask_word(text, target):
if not isinstance(text, str) or not isinstance(target, str):
raise ValueError("text and target must be strings")
if re.fullmatch(r"[A-Za-z]+", target) is None:
raise ValueError("target must be one ASCII word")
wanted = target.lower()
return WORD.sub(lambda m: "*" * len(m[0])
if m[0].lower() == wanted else m[0], text)
assert mask_word("Ada, ADA!\nAdams", "ada") == "***, ***!\nAdams"
assert mask_word("A\tB", "a") == "*\tB"
Scroll sideways to view long lines.
Follow-up
- How would you define word boundaries for multilingual text?
Merge overlapping work sessions
Task: Merge overlapping minute intervals for one worker on one matter. Count total unique working time; touching sessions may merge without changing the total.
Approach
- Validate: Reject an end before its start.
- Sort and merge: Track the current interval and add its length when it closes.
Follow-up
- Why must sessions from different workers remain separate?
Order dependent document tasks
Task: Given document-processing tasks and their prerequisites, return a valid execution order or report a cycle. Include isolated tasks and reject references to unknown tasks.
Approach
- Count dependencies: Build indegrees and an adjacency list.
- Drain ready tasks: If fewer than all tasks complete, a cycle remains.
Follow-up
- How would deterministic ordering help reproduce a failed run?
Count recent document save acknowledgements
Given nondecreasing integer timestamps, count events in (now − 10, now]. Each event counts once. The clock can advance without a new event; an event at the lower boundary has expired.
Which events still count?
The left boundary is excluded; the right boundary is included. Drag past an event to see it enter, then expire 10 seconds later.
See the event values
- At 0s: +1 — expired
- At 5s: +1 — in window
- At 10s: +1 — in window
- At 14s: +1 — not arrived
- At 19s: +1 — not arrived
Synthetic document save acknowledgements at 0, 5, 10, 14 and 19 seconds, each with weight one. Drag the clock: at 10 seconds only 5 and 10 count; at 30 seconds none remain. The lower boundary is excluded.
Approach
- Keep a deque and remove timestamps at or before now − 10 before reporting a count. Equal timestamps represent distinct events unless a separate event ID says otherwise.
- Expose both add(time) and count(now). Reject a backward clock and document the O(k) retained-event memory cost. Each event is inserted and removed once, giving amortized O(1) updates.
Follow-up
- How would late arrivals, multiple producers or a per-customer limit change the contract?
Report unbilled minutes by matter
Task: List every matter in a firm and its approved, unbilled minutes, including zero totals. Matter IDs can repeat in different firms.
Approach
- Scope both tables: Match on firm and matter, not matter alone.
- Aggregate first: Filter eligible entries before joining to the full matter list.
Worked solution 35 min
- Model: The composite key identifies a matter within its firm. Entry minutes are already validated nonnegative integers.
- Aggregate: Only approved, unbilled entries contribute. Group by both identifiers.
- Retain zeroes: Start from the authorized firm’s matter list, then left join the totals.
CREATE TABLE matters (firm TEXT, id TEXT, PRIMARY KEY(firm,id));
CREATE TABLE entries (firm TEXT, matter_id TEXT, minutes INTEGER, approved INTEGER, billed INTEGER);
INSERT INTO matters VALUES ('a','m1'),('a','m2'),('b','m1');
INSERT INTO entries VALUES
('a','m1',30,1,0),('a','m1',15,1,0),
('a','m1',90,1,1),('a','m1',70,0,0),('b','m1',600,1,0);
WITH totals AS (
SELECT firm,matter_id,SUM(minutes) AS minutes
FROM entries WHERE approved=1 AND billed=0
GROUP BY firm,matter_id
)
SELECT m.id,COALESCE(t.minutes,0)
FROM matters m LEFT JOIN totals t
ON t.firm=m.firm AND t.matter_id=m.id
WHERE m.firm='a' ORDER BY m.id;
Scroll sideways to view long lines.
Follow-up
- How would partially billed entries change the data model?
Select the latest accessible document version
Task: Return the latest completed version for each document in one authorized matter. Version numbers can tie; use a stable secondary key.
Approach
- Authorize first: Restrict the candidate documents to the current user’s scope.
- Rank: Partition by document and order by version plus a deterministic ID.
Follow-up
- Should an incomplete newer upload hide the previous completed version?
Design a matter document upload
Task: Support interrupted uploads, multiple versions and authorized downloads. A file should not appear as ready before both its content and metadata are valid.
Approach
- Separate states: Distinguish requested, uploading, validating and ready.
- Enforce boundaries: Check access for upload creation, completion and download.
Worked solution 50 min
- Create: Authenticate the user, authorize the matter and create a version record with a unique upload operation.
- Transfer: Issue narrowly scoped upload credentials. Store size and checksum expectations without marking the document ready.
- Finalize: Verify the object, run required validation and atomically publish the version metadata. Repeated completion requests return the same version.
- Read: Recheck permissions and issue short-lived access. Recover abandoned uploads and orphaned objects through an auditable cleanup process.
Follow-up
- How would permission revocation affect a previously issued download link?
Design reliable deadline reminders
Task: Send reminders for matter deadlines across time zones. A deadline can change while a reminder is queued.
Approach
- Version the schedule: Include the deadline revision in queued work.
- Check before sending: Suppress work for superseded or cancelled revisions.
Follow-up
- What should happen when delivery succeeds but acknowledgement is lost?
Repair a report that crosses firm boundaries
Task: Two firms use matter ID m1. A report joins time entries on matter ID alone and includes another firm’s minutes. Reproduce and fix the leak.
Approach
- Minimize: Use two firms with the same matter ID.
- Repair every boundary: Scope selection, joins, aggregation and authorization consistently.
Worked solution 35 min
- Reproduce: A join on matter ID alone includes both firms’ rows. Filtering only the outer matter table is insufficient.
- Repair: Include firm in the join and constrain the caller’s authorized firm before returning data.
- Prevent recurrence: Keep the colliding-ID fixture in regression tests and check caches for the same omission.
CREATE TABLE matters (firm TEXT, id TEXT, PRIMARY KEY(firm,id));
CREATE TABLE entries (firm TEXT, matter_id TEXT, minutes INTEGER);
INSERT INTO matters VALUES ('a','m1'),('b','m1');
INSERT INTO entries VALUES ('a','m1',30),('b','m1',600);
-- Unsafe: do not use in an application.
SELECT SUM(e.minutes) FROM matters m JOIN entries e ON e.matter_id=m.id
WHERE m.firm='a';
-- Scoped join; authorization must establish the requested firm.
SELECT SUM(e.minutes) FROM matters m JOIN entries e
ON e.matter_id=m.id AND e.firm=m.firm
WHERE m.firm='a';
Scroll sideways to view long lines.
Follow-up
- Which cache key could reintroduce the same leak?
A PracHub practice schedule with one outcome per session. Adjust the pace to your experience and interview date; it is not a company hiring timeline.
Prepare, practise & reflect
One practical outcome each day. Spend longer where you need it.
0 / 7 done01Understand the matter
- Sketch how a matter connects documents, time and billing.
Deliverable: A product workflow map
02Preserve information
- Run the text example and add punctuation and whitespace cases.
Deliverable: A tested text contract
Practice prompt ↗03Check tenant scope
- Run the unbilled-time fixture with colliding firm IDs.
Deliverable: A report with expected totals
Practice prompt ↗04Design a safe upload
- Trace interruption, permission revocation and repeated completion.
Deliverable: A recovery-aware upload design
Practice prompt ↗05Reproduce the access leak
- Run the unsafe join and repair it.
- Check cache keys for the same missing firm scope.
Deliverable: A regression fixture
Practice prompt ↗06Explain collaboration
- Rehearse a late requirement change and an influence story.
Deliverable: Two specific story outlines
Practice prompt ↗Practice prompt ↗07Review failure and time
- Test reminder edits and count recent saves.
- Explain the weakest assumption in one solution.
Deliverable: A final review sheet
Practice prompt ↗Practice prompt ↗Expand any day for tasks and deliverables. Your progress is saved on this device.
Choose a real project. Explain your decision, the evidence behind it and what you learned.
Handle a late requirement change
Task: Describe a project where a customer requirement changed after implementation began. Explain what you preserved and what you redesigned.
Approach
- Clarify: Separate the underlying need from the suggested implementation.
- Adapt: Explain the smallest safe change and its tradeoffs.
Follow-up
- What did you deliberately leave out of the first release?
Influence a technical decision
Task: Tell a story about improving a design without being the final decision-maker. Show how other people’s concerns affected the result.
Approach
- Listen: Name the constraint another person raised.
- Prove: Explain the example, measurement or experiment you used.
Follow-up
- When did you change your own position?
Explain an incident to a nontechnical partner
Task: Describe a reliability or data issue you helped communicate. Show how you explained impact without claiming certainty you did not have.
Approach
- Translate: Describe what users could and could not do.
- Follow up: Provide a verification step and an owner for the next update.
Follow-up
- What did you learn from the customer’s account of the problem?
- 01
Choose examples you can discuss without sharing confidential customer data.
Do individual contributors have a leadership interview?
Clio’s general process includes technical leadership for individual contributors. People leadership is a separate track for management roles.
Clio — Engineering interview process ↗Do I need prior legal-industry experience?
Check your opening’s requirements. Learn the basic workflows; each exercise states the domain assumptions you need.
Which language should I use?
Use your permitted interview language. Python here is a runnable teaching choice, not Clio’s required language or production stack.
How does the shared-note diagram relate to document uploads?
Both need explicit versions and a clear confirmation state. A note edit uses a conditional revision update; a file upload also needs content validation and permission checks before making a new version visible.
Are these verified company interview questions?
These are PracHub practice exercises informed by the supplied guide themes and official product context. They include original constraints and worked solutions; they are not an independently verified list of questions asked by the employer.
Why include SQL alongside coding and design?
SQL is supplemental practice for inspecting system state and checking invariants. Its inclusion does not mean every role has a SQL interview. Prioritize the skills in your exact opening.
How should I use the seven-day checklist?
Attempt each task before opening its solution. Save one artifact per session, such as a tested function, fixture or failure timeline. Repeat weak areas and adjust the pace instead of treating seven days as a readiness guarantee.
Sources & methodology 5 sources ↗
Official role evidence, timestamped platform data and clearly labeled preparation advice.
- 01PracHub — Software Engineer practice ↗
Cross-company practice destination; not evidence of employer questions.
platform · Accessed 2026-09-20 - 02PostgreSQL — Transaction isolation ↗
Technical reference for concurrency discussions; sample SQL fixtures use SQLite.
official · Accessed 2026-09-20 - 03Clio — Engineering interview process ↗
Official general engineering process; role and level can change the sequence.
official · Accessed 2026-09-20 - 04Clio — Product features ↗
Document, case, billing and client-communication workflows.
official · Accessed 2026-09-20 - 05Python — Regular expression operations ↗
Reference for the span-preserving text example.
official · Accessed 2026-09-20