Interview guides · Appriss
Appriss Software Engineer Interview Guide
Appriss Software Engineer interview guide: reported rounds, questions and how candidates describe the process.
The 60-second brief
As a Software Engineer at Appriss, you will play a vital role in building, scaling, and maintaining mission-critical data and software solutions that serve justice, safety, and healthcare sectors worldwide. Your day-to-day work directly impacts products that communities and agencies rely on for real-time information, risk assessment, and compliance management. This position sits at the intersection of technical execution and meaningful problem-solving, requiring you to write robust code while understanding the broader operational impact of the software you deliver. The engineering organization at Appriss values clean architecture, reliable systems, and collaborative teamwork. You will collaborate closely with product managers, QA engineers, and peer developers to design features, optimize backend logic, and ensure high availability across services.
This guide is scoped to a Software Engineer candidate at Appriss.
Focus areas
- C#
- Coding Interviews
- Problem Solving
The Appriss interview process
Appriss candidates report 3 rounds over 3-5 weeks. The stages below are what candidates describe, not a published process.
Application Submission
Submit your application and resume for the Software Engineer position.
What to demonstrate
- Submit your application and resume for the Software Engineer position
- Depth in C#
How to prepare
- Answer aloud and timed: Write a function to reverse a string or linked list in C#.
- Answer aloud and timed: Solve a straightforward algorithmic problem involving arrays or hash maps.
Online Assessment
Complete initial automated assessments to evaluate coding proficiency.
What to demonstrate
- Complete initial automated assessments to evaluate coding proficiency
- Depth in C#
How to prepare
- Answer aloud and timed: Explain how you handle exception management and logging in your applications.
- Answer aloud and timed: Walk through how you would optimize a slow-running SQL query.
Virtual/In-Person Interviews
Engage in collaborative conversations with engineers and leadership.
What to demonstrate
- Engage in collaborative conversations with engineers and leadership
- Depth in C#
How to prepare
- Answer aloud and timed: Discuss your experience with object-oriented programming principles and design patterns.
- Answer aloud and timed: How do you approach debugging an intermittent production issue?
Where candidates lose points
Brush up on C# fundamentals
Because the technical evaluations rely heavily on C#, ensure you are comfortable with LINQ, asynchronous programming patterns, and standard collection classes.
Communicate your thought process
During live coding and problem-solving portions, never code in silence. Talk through your assumptions, trade-offs, and alternative approaches so the interviewer understands your reasoning.
Review your past projects
Be prepared to discuss specific challenges you faced in previous roles, how you resolved them, and what you would do differently today.
Showcase collaboration
Emphasize team achievements over individual heroics. Highlight how you participate in code reviews, support your peers, and communicate across departments.
Questions & practice
Write a function to reverse a string or linked list in C#.
Medium · Technical and Coding Proficiency
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- State the target complexity and say which constraint rules the naive version out.
Follow-up
- How does this change if the input no longer fits in memory?
- What is the worst case, and how likely is it on real data?
Solve a straightforward algorithmic problem involving arrays or hash maps.
Medium · Technical and Coding Proficiency
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- State the target complexity and say which constraint rules the naive version out.
Follow-up
- How does this change if the input no longer fits in memory?
- What is the worst case, and how likely is it on real data?
Explain how you handle exception management and logging in your applications.
Medium · Technical and Coding Proficiency
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- State the target complexity and say which constraint rules the naive version out.
Follow-up
- How does this change if the input no longer fits in memory?
- What is the worst case, and how likely is it on real data?
Walk through how you would optimize a slow-running SQL query.
Medium · Technical and Coding Proficiency
Approach
- Name the grain you start from and join outward from it.
- Check whether any join is one-to-many before aggregating, or the sums inflate.
- Say which index the query would use, and what makes it unusable.
- Handle the rows that do not match: that is usually the actual question.
Follow-up
- How does the query change if that join becomes one-to-many?
- What happens to this when the table is ten times larger?
Write the update path that detects a concurrent edit
Medium · optimistic concurrency · transactional outbox · audit history
resource carries version INT NOT NULL DEFAULT 1. resource_revision holds revision_id, resource_id, version, actor_user_id, change_kind, patch JSONB, request_id, created_at with UNIQUE (resource_id, version). outbox_event holds aggregate_type, aggregate_id, aggregate_version, event_type, payload, status. A PUT carries the version the client read. Write the exact statements for the single transaction that applies the edit, records the revision and enqueues 'resource.updated', and give the handler's branch on zero affected rows. Then say what PostgreSQL 16 does under READ COMMITTED when two of these updates hit one row at once.
Approach
- One transaction, three writes, no network call inside it: UPDATE resource SET title = $3, version = version + 1, updated_at = now() WHERE resource_id = $1 AND tenant_id = $4 AND version = $2; then INSERT the resource_revision row at version $2 + 1; then INSERT the outbox_event row at the same aggregate_version. The event goes to a table rather than a broker because no transaction spans both.
- Branch on the affected-row count before doing anything else. Zero has three causes — stale version, wrong tenant, row gone — so re-read once and map to 409 carrying the current version, or 404 for an id outside the caller's tenant, which also stops the endpoint confirming that another tenant's id exists.
- State the engine behaviour instead of assuming it. Under READ COMMITTED the second UPDATE blocks on the row lock, and when the first commits PostgreSQL re-evaluates the WHERE clause against the newly committed row, so the version predicate now fails and the statement reports zero rows. Under REPEATABLE READ the identical collision raises SQLSTATE 40001 instead, so the handler must fold both shapes into one conflict response.
- Keep UNIQUE (resource_id, version) even though the predicate already serialises writers. It is what makes a lost update unwritable if any other path ever reaches the revision table, and it converts a logic bug into 23505 rather than into a silently missing history row.
Follow-up
- A client sends the version it read ten minutes ago and the resource has moved three versions. What is in your 409 so it can resolve the conflict without a full re-fetch?
- Two editors, two disjoint fields, no overlap. Does your answer still refuse the second write, and should it?
Describe a time when you had to design a component with high scalability requirements.
Medium · Problem-Solving and System Design
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
How do you ensure data integrity across distributed services?
Medium · Problem-Solving and System Design
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Walk through your process for writing unit tests and achieving high code coverage.
Medium · Problem-Solving and System Design
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
How do you approach debugging an intermittent production issue?
Medium · Problem-Solving and System Design
Approach
- Establish what changed and when, before forming any theory.
- Pick a bisection that eliminates candidates whichever way it turns out.
- Check the instrumentation before believing the symptom.
- Separate the trigger from the cause; the deploy is rarely the bug.
Follow-up
- What would you look at first, and what would it rule out?
- How would you tell a cause from a coincidence here?
Suggested practice checklist
Built from the rounds and topics Appriss candidates report.
Day 1 — Map the Appriss loop
- Write out the reported sequence: Application Submission, Online Assessment, Virtual/In-Person Interviews.
- For each round, write one sentence on what it is judging, from the description above, and mark the one you are least ready for.
Deliverable: A one-page map of the 3 reported rounds, with the weakest marked.
Day 2 — Work C#
- Spend the session on C#, which Appriss candidates report being tested on.
- Write one worked example in C# and time yourself on it.
Deliverable: One timed worked example in C#.
Day 3 — Work Coding Interviews
- Spend the session on Coding Interviews, which Appriss candidates report being tested on.
- Write one worked example in Coding Interviews and time yourself on it.
Deliverable: One timed worked example in Coding Interviews.
Day 4 — Work Problem Solving
- Spend the session on Problem Solving, which Appriss candidates report being tested on.
- Write one worked example in Problem Solving and time yourself on it.
Deliverable: One timed worked example in Problem Solving.
Day 5 — Answer out loud: Technical and Coding Proficiency
- Answer aloud, timed: Write a function to reverse a string or linked list in C#.
- Answer aloud, timed: Solve a straightforward algorithmic problem involving arrays or hash maps.
Deliverable: Spoken answers to 2 reported Technical and Coding Proficiency question(s), under time.
Day 6 — Answer out loud: Problem-Solving and System Design
- Answer aloud, timed: How do you approach debugging an intermittent production issue?
- Answer aloud, timed: Describe a time when you had to design a component with high scalability requirements.
Deliverable: Spoken answers to 2 reported Problem-Solving and System Design question(s), under time.
Day 7 — Answer out loud: Behavioral and Cultural Alignment
- Answer aloud, timed: Tell me about a time you disagreed with a teammate on a technical decision and how you resolved it.
- Answer aloud, timed: Describe a project where you had to learn a new technology stack quickly.
Deliverable: Spoken answers to 2 reported Behavioral and Cultural Alignment question(s), under time.
Behavioural preparation
Behavioural rounds judge the decision you made and what it cost.
Discuss your experience with object-oriented programming principles and design patterns.
Medium · Technical and Coding Proficiency
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
How do you handle conflicting technical requirements from stakeholders?
Medium · Problem-Solving and System Design
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
Tell me about a time you disagreed with a teammate on a technical decision and how you resolved it.
Medium · Behavioral and Cultural Alignment
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
Describe a project where you had to learn a new technology stack quickly.
Medium · Behavioral and Cultural Alignment
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
How do you prioritize your tasks when handling multiple overlapping deadlines?
Medium · Behavioral and Cultural Alignment
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
Tell me about a time a project failed or missed a milestone, and what you learned from it.
Medium · Behavioral and Cultural Alignment
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
Why do you want to work as a Software Engineer at Appriss?
Medium · Behavioral and Cultural Alignment
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?