Amrut Software · Software Engineer
Updated · 2026-10-02

Amrut Software Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Candidates describe Amrut Software as a software services company. They name three engineering areas: DevSecOps, Forge development, and full-stack applications built on the Frappe framework, with Python on the back end and Vue.js on the front end. Candidates describe the projects as serving both internal operations and client deliveries. They describe the role as turning business needs into technical solutions, with design reviews, code audits and close work alongside project managers and other engineers.

This guide is for software engineers interviewing at Amrut Software, whether your background is Python back-end work, full-stack development or pipeline and security work. The requirements candidates describe list Python (or a similar back-end language), object-oriented programming, full-stack or services experience and the ability to explain your projects clearly as must-haves. Frappe, DevSecOps or automated testing, and Vue.js are listed as nice-to-haves. The guide covers each reported round, how to answer each reported question in depth, the mistakes that cost candidates on these question types, and a seven-day plan.

Candidates report three rounds over roughly three to five weeks: Background Screening, then Technical Assessments (written assessments plus deep dives), then a Team Fit Conversation.

DevSecOpsPythonFrappe Framework

32 min read

Browse Software Engineer questions

See the practice prompts

15Practice promptsAcross five skill areas

The reported questions fall into two groups. The first is technical foundations: OOP principles in your own code, debugging inside the Frappe framework, how front end and back end were integrated in your recent projects, and how you build security into the development lifecycle. The second is project experience and scenarios: a challenge from your last project, optimising an architecture with a latency problem, managing technical debt against delivery dates, and changing course when requirements moved. The reported questions are discussion-style rather than puzzle-style. The common thread is explaining real systems you built and the reasons behind them.

That changes how you should prepare. Candidates report that fundamentals such as OOP matter most in the early rounds, and that project questions go deep: why you picked a library, what constraints you worked under, what your own contribution changed. Candidates also report being asked to draw diagrams or walk through the architecture of their projects. Before the loop, have one or two projects you can sketch from memory, with the request path, the data model and the deployment pipeline, and a reason for every box on the diagram.

The stack candidates name is Python, the Frappe framework, Vue.js, and DevSecOps with a focus on security in CI/CD. If you have not used Frappe, learn its core model before the loop: DocTypes, controller hooks such as validate and on_submit, hooks.py doc_events, whitelisted methods exposed under /api/method/, and the bench CLI. That makes the Frappe debugging question something you can answer concretely. For the DevSecOps side, be able to say where in a pipeline each control runs (secret scanning, dependency audit, static analysis, image scanning) and what makes the build fail.

Candidates describe the tone as conversational and professional, and report that memorised answers lead to follow-up questions that test real understanding. Practise speaking about your own work rather than rehearsing scripts: for each reported question, know your concrete example and the one or two alternatives you rejected.

01

Background Screening

reported

Candidates describe the first stage as a review of your background against what the role needs. Be ready to discuss any technology on your resume in depth, and cut anything you cannot explain. Lead with the parts of your experience that match what candidates list as requirements: Python or another back-end language, OOP, full-stack or services delivery, and any Frappe, Vue.js, DevSecOps or automated-testing work.

What to demonstrate

  • How your background lines up with the role's needs, including the reported must-haves: Python or a similar back-end language, OOP, full-stack or services experience
  • Relevant exposure to the nice-to-haves candidates list: Frappe, Vue.js, DevSecOps or automated testing

How to prepare

  • Go through your resume line by line and, for every technology listed, write one sentence on where you used it and why it was chosen over an alternative.
  • Write a short spoken summary of each of your two main projects: the problem, the stack, your own part, and one measurable result.
  • If you have no Frappe experience, build a small Frappe app with one custom DocType and a validate hook so you can talk about the framework from use, not reading.
Amrut Software Software Engineer candidate reports ↗
02

Technical Assessments

reported

Candidates report a series of technical rounds here, including written assessments and deep dives, held face to face or virtually. The reported technical questions cover OOP, Frappe debugging, front-end and back-end integration, security in the development lifecycle, and scenario questions such as reducing latency in an existing architecture. Candidates also report being asked to sketch or explain the architecture of their own projects. Answer structurally: state the approach, then the reasoning, then the trade-off, and think out loud when given a scenario.

What to demonstrate

  • Core fundamentals in writing and aloud, with OOP the topic candidates name most
  • Depth on the stack candidates report: Python, Frappe, Vue.js and security in CI/CD
  • Ability to explain and diagram the architecture of a past project and defend its design choices
  • Structured reasoning through scenario questions such as a latency problem

How to prepare

  • Write answers on paper to the OOP question using classes from your own code, including one Python-specific point such as the MRO or name mangling.
  • Practise drawing one project's architecture in under a page: client, API layer, background jobs, database, cache and CI/CD pipeline, with a reason for each part.
  • Rehearse the Frappe debugging walk-through and the pipeline security answer aloud until you can name each tool and step without notes.
  • Work the latency scenario end to end: measure, locate, fix, verify, and name what each fix costs.
Amrut Software Software Engineer candidate reports ↗
03

Team Fit Conversation

reported

Candidates describe the last stage as a Team Fit Conversation about how you fit within the team and line up with the company's broader goals. As preparation, bring stories where your own decision is visible, for example on changing requirements, technical debt under a deadline, or a disagreement over technical direction. Ask the recruiter early which area the role covers: Frappe applications, Forge development or DevSecOps. If it is Forge work, ask what that work involves and which technologies it uses, so you can review them before the loop.

What to demonstrate

  • Fit within the team
  • Alignment with the company's broader goals

How to prepare

  • Prepare STAR stories for changing requirements, technical debt under a deadline and a disagreement over technical direction, each with what you decided and what it cost.
  • Write three questions about the team: which of Frappe, Forge or DevSecOps work you would join, what the Forge work involves, and how code reviews and audits run.
Amrut Software Software Engineer candidate reports ↗

PracHub editorial advice for the preparation topics above.

01

Reciting the four OOP pillars as textbook definitions with no code from your own projects

For each principle, prepare one class you actually wrote, such as a Frappe controller overriding validate or a service with an abstract base class. Add one Python-specific detail, such as name mangling, @property or MRO, so the answer shows you know how Python implements these ideas.

02

Answering the latency scenario with 'add a cache' before saying where the time goes

Open with measurement: percentiles, tracing, the slow query log, EXPLAIN. Then go through the likely causes in order (N+1 queries, missing indexes, synchronous slow work, unbounded queries) and name the staleness or consistency cost of every fix you choose.

03

Listing security tools for the DevSecOps question without saying where they run or what they block

Place each control in the pipeline (pre-commit, pull request, build, deploy) and say what fails the build. Add the application side: parameterised frappe.db.sql calls and permission checks inside whitelisted methods. Have an answer ready for a leaked secret: rotate first, then remove it from history.

04

Describing a project you cannot defend when asked why a library or architecture was chosen

Candidates report deep-dive questions on resume projects. For every project you list, know the alternative you rejected and why, the constraint that drove the design, and your own contribution. Practise drawing its architecture from memory.

05

Telling behavioral stories in 'we' so your own decision never appears

For the challenge, technical-debt and changing-requirements stories, write down the one decision you personally made and the trade-off it carried. Say 'I' for your actions, give a measurable result, and have a 'what I would do differently' line ready.

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

Find overlapping job attempts and peak concurrency from lease records

medium
sweep lineintervalsleases

A day of job_run history yields about 50,000,000 attempt records: (job_run_id, job_type, attempt, started_at, finished_at which is NULL when the worker died, lease_expires_at). Leases expire on a clock, so a job that outran its lease ran twice. Produce (a) every job_run_id whose attempts overlapped in wall-clock time and (b) the peak number of simultaneously running attempts per job_type with the minute it occurred. Target O(n log n). State how you treat a NULL finished_at and what clock skew does to your answer.

Approach
  1. Define the interval before sorting anything: an attempt occupies [started_at, COALESCE(finished_at, lease_expires_at)). finished_at is observed and lease_expires_at is only a promise, so every attempt without a finish contributes an estimate and the whole result is a lower bound on overlap rather than an exact count.
  2. For peak concurrency, sweep: emit 2n endpoints, sort by (timestamp, kind) with ends ordered before starts at equal timestamps, then walk the sequence maintaining a counter per job_type and record each type's maximum with its timestamp. O(n log n) dominated by the sort, O(n) space, or O(1) extra if the sort is external and the walk streams.
  3. For overlap detection, do not compare attempts pairwise. A single global sort by (job_run_id, started_at) gives both the grouping and the order; within a group, keep the maximum end seen so far and report an overlap exactly when the next start is less than that running maximum, which is one linear pass after the sort.
  4. Half-open intervals matter and are easy to get wrong: with closed intervals an attempt ending at the same millisecond another begins reads as concurrency two, and across 50,000,000 records that artefact swamps the real signal.
Follow-up
  • A handler is not idempotent and you have found 400 overlapping jobs. Which of them actually caused damage, and what would you query to find out?
  • Peak concurrency for one job_type is 4 against a configured cap of 4. Is the cap working, or is the data hiding attempts that never started?

Archive a resource graph without breaking live references or recursing

medium
graph traversaltopological ordertenant isolation

Resources reference other resources within a tenant; for the largest tenant the reference table holds up to 2,000,000 nodes and 8,000,000 edges. Archiving a resource must archive everything reachable from it that nothing outside the set still references, refuse when a live external referrer exists, and terminate when references form cycles, which they legitimately do. Produce the archive order and the refusal list, targeting O(V+E). Say what stops the traversal crossing a tenant boundary, and why recursion is the wrong control structure at this size.

Approach
  1. Load the subgraph with the tenant predicate on both endpoints of the edge, not only on the side you started from. Scoping the left table alone is the classic cross-tenant leak: one mis-entered edge then pulls another tenant's resources into the traversal and, worse, into the archive.
  2. Traverse iteratively with an explicit stack. A 2,000,000-node graph can hold a chain deep enough to exhaust a native stack in the low tens of thousands of frames, and that failure is a process crash rather than an error you can return.
  3. Treat cycles as data rather than corruption: compute strongly connected components with Tarjan in O(V+E) using its own explicit stack, then condense. The condensation is a DAG, so a topological order over it gives the archive order, and every member of a component archives in one transaction because no order within a cycle is valid.
  4. Decide refusals with reverse edges. A candidate is archivable only if every in-edge originates inside the candidate set, so build the transpose or count in-degrees restricted to the visited set, and emit each blocked resource with the id of the external referrer, which is the only part of the answer an operator can act on.
Follow-up
  • The graph is read in one query and the archive writes a minute later. What can change in between, and how do you make the write safe?
  • The candidate set is 400,000 resources. Is that one transaction, and if not, what does a half-finished archive look like to a reader?

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?

Each day targets one reported round or question group, using the stack candidates name (Python, Frappe, Vue.js, security in CI/CD), and ends with something written or recorded that you can review on the last day.

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
01Resume audit and project inventory for Background Screening
  • Go through your resume line by line and write, for each technology, where you used it and the alternative you rejected.
  • Pick your two strongest projects and write a short summary for each: problem, stack, your part, one measured result.
  • Outline the challenge story for the last-project question in STAR form, marking the decision that was yours.

Deliverable: A resume rationale sheet, two project summaries, and an outlined STAR story for the last-project challenge question.

Practice prompt ↗
02OOP in Python, from your own code
  • Write a small Python example showing encapsulation (@property), abstraction (abc.ABC), inheritance with super() and polymorphism through duck typing.
  • Find one class in your past work for each principle and note it.
  • Answer the OOP question aloud, then answer the diamond-inheritance and composition follow-ups.

Deliverable: A runnable OOP example file, a four-row mapping of principles to your own classes, and a recorded spoken answer.

Practice prompt ↗
03Frappe internals and debugging
  • Set up a local bench, create a custom DocType with a validate hook and a whitelisted method, then break it on purpose.
  • Debug the break using bench console, the Error Log, the bench log files and the browser network tab, writing down each step.
  • Practise the concurrent-edit update path and connect it to Frappe's check that a document was modified after it was opened.

Deliverable: A working Frappe app with an intentional bug, a step-by-step debugging log, and a written concurrent-edit solution.

Practice prompt ↗Practice prompt ↗
04Vue.js and back-end integration
  • Diagram how a recent project's front end talked to its back end: endpoints, auth, error shape, pagination.
  • Write a minimal Vue component that calls a Frappe /api/method/ endpoint and handles loading, error and a 403 response.
  • Review Vue itself: reactivity with ref and reactive, computed versus watch, lifecycle hooks such as onMounted, and props down with events up. Then work one scenario, such as a component that re-renders too often, and explain the cause and the fix.
  • Answer the front-end/back-end integration question aloud, including where validation lives on each side.

Deliverable: An integration diagram, a small Vue component wired to an API, a written diagnosis of the over-rendering scenario, and a recorded spoken answer.

Practice prompt ↗
05Security in the development lifecycle and CI/CD
  • Draw a CI/CD pipeline and place secret scanning, dependency audit, static analysis, image scanning and a staging dynamic scan on it, marking which findings fail the build.
  • Run pip-audit and Bandit (or Semgrep) on one of your own repositories and triage the results.
  • Write the leaked-API-key response in order, then answer the security question aloud.

Deliverable: An annotated pipeline diagram, a triaged scan report from your repository, and a written incident checklist for a leaked secret.

Practice prompt ↗
06Latency scenario and technical debt under deadlines
  • Work the latency scenario on paper: metrics to collect, the ordered list of causes, a fix for each, and the cost of each fix.
  • Practise the deadline-and-debt question and outline your own example: the shortcut, how you bounded it, and the trigger for repaying it.
  • Answer both questions aloud, then the p99-only and stale-cache follow-ups.

Deliverable: A one-page latency playbook, an outlined technical-debt story, and two recorded answers.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Team Fit rehearsal and full mock
  • Outline STAR stories for the changing-requirements question and for a disagreement over technical direction you lost and then committed to.
  • Run a mock: one project architecture walk-through drawn from memory, two technical questions and two behavioral questions, back to back.
  • Write three questions for the team, covering their Frappe, Forge or DevSecOps work and what the Forge work involves.

Deliverable: Two outlined STAR stories, notes from a full mock with your weakest answer marked, and three questions for the team.

Practice prompt ↗Practice prompt ↗Practice prompt ↗

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

The reported behavioral prompts are the pivot after changing requirements, plus the project-challenge and technical-debt questions, with two practice prompts on related themes (technical disagreement and meeting a deadline). Each answer should make your own decision and its trade-off visible, and stand up to follow-up questions about why you chose that path.

Describe a time you had to pivot your approach due to changing project requirements.

medium
Project Experience & Scenario Analysis

Describe a time you had to pivot your approach due to changing project requirements.

Approach
  1. STAR with the change at the centre: what you were building, what changed (client request, new constraint, discovered limitation) and how you learned about it.
  2. Show your decision process: what work could be kept, what had to be discarded, the options you laid out and how you re-estimated. Make your own role explicit.
  3. Show communication: who you told (project manager, client, team), how you reset expectations on scope or dates, and how you recorded the new requirement so it did not drift again.
  4. End with the outcome and the lesson, such as building flexibility into the design earlier or validating requirements with a prototype. Answers that blame the client or show no ownership of the response do not work.
Follow-up
  • Could you have spotted that requirement change earlier? How?
  • How did you keep quality from slipping while you re-planned?
  • How did you decide which already-built work to throw away?

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?

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

    Describe a time you had to pivot your approach due to changing project requirements.

  • 02

    Walk me through a specific challenge you faced in your last project and how you resolved it.

  • 03

    How do you manage technical debt while adhering to strict project delivery timelines?

  • 04

    Tell me about a disagreement over technical direction on a project. What was your position, how was it settled, and what did you do afterwards?

  • 05

    Describe a time you met a deadline without lowering code quality. What did you cut, and how did you keep the risk contained?

PracHub preparation framework ↗
What are the rounds in the Amrut Software Software Engineer loop?

Candidates report three stages over roughly three to five weeks: Background Screening, Technical Assessments, and a Team Fit Conversation. The technical stage is described as a series of rounds that includes written assessments and deep dives, held face to face or virtually.

PracHub Software Engineer practice ↗
How difficult is the interview process?

Reports center on how well you can walk through your own projects and choices. Prepare to defend each design decision on your resume and to draw your projects' architecture.

Amrut Software Software Engineer candidate reports ↗
What is the best way to prepare for the technical rounds?

Start with fundamentals, especially OOP in Python, which candidates name as the main early topic. Then work through the reported technical questions: debugging in Frappe, front-end and back-end integration, security in the development lifecycle, and the latency scenario. Practise drawing one project's architecture and explaining each component.

Amrut Software Software Engineer candidate reports ↗
Do I need Frappe experience?

The requirements candidates describe list Frappe as a nice-to-have, with Python or a similar back-end language and OOP as must-haves. A reported question asks how you debug a complex issue in Frappe, so build a small Frappe app before the loop: a custom DocType, a validate hook, a whitelisted method, and some practice with bench console and the Error Log.

PracHub Software Engineer practice ↗
Which technologies come up?

Candidates name DevSecOps, Python, the Frappe framework, Vue.js, and security in CI/CD. For the security side, know where secret scanning, dependency audits, static analysis and image scanning run in a pipeline and which findings should fail a build.

Amrut Software Software Engineer candidate reports ↗
Does the process vary by team?

Questions can lean toward whatever the hiring team is working on, so find out which area the role covers: Frappe full-stack work, Forge development or DevSecOps. If it is Forge work, ask the recruiter what it involves and which technologies it uses, then weight your preparation toward it.

Amrut Software Software Engineer candidate reports ↗
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.