cswork / libraryOpen practice workspace

Interview guides · Allied Technical Solutions

Allied Technical Solutions Software Engineer Interview Guide

Allied Technical Solutions Software Engineer interview guide: 3 reported rounds, past-project and problem-solving questions, and a 7-day prep plan.

The 60-second brief

Candidates describe this Software Engineer role as sitting between software development and structural engineering in architectural fabrication. The engineer builds and maintains the software tools that turn architectural designs into outputs that can be manufactured. Reported responsibilities cover drawing tools, fabrication algorithms, automation of repetitive drawing work, faster processing of fabrication data and the upkeep of design databases. Candidates describe the work as shared with other engineers and with marketing and operations colleagues, and as involving explaining technical trade-offs to non-technical colleagues.

This guide is for software engineers interviewing for the Software Engineer position at Allied Technical Solutions. It covers the three reported rounds, the two groups of questions candidates report (past experience and projects, and technical problem solving), how to build stories for them, and a coding-assessment refresher. The requirements candidates describe name no specific language or framework, so the guide does not assume one: practise in the language you know best and be ready to show it working.

Candidates report three rounds over roughly 3-5 weeks: Initial Screening, Technical Assessment and Final Discussions. Reports do not say which individual questions belong to which round.

Focus areas

  • Behavioral/Experience-Based Interviewing
  • Technical Problem Solving
  • Communication Skills

Overview

The reported work is software whose output becomes a physical thing. A wrong value in a fabrication file is a wrong part, not a wrong pixel, so the questions about accuracy, edge cases and debugging reward concrete habits: how you validate input, compare output against a known-good result, and write tests that catch a regression before it reaches production. Pick stories where being wrong had a real cost, and say what you changed afterward.

The reported questions fall into two groups. The first is about your history: the projects you have worked on, the most complex feature you built, your part in the development lifecycle, your role in a team project, and the technologies you have used on architectural or fabrication problems. The second is about problem solving: a hard technical challenge, an approach that turned out wrong, debugging a complex system, ensuring code is accurate and reliable, and balancing delivery speed against precision. Candidates also report example scenarios about walking through an architecture you designed, handling edge cases in automated fabrication data, and refactoring a legacy system for performance. Prepare one project that can feed most of these answers.

Candidates report that the technical assessment is either a live coding session or a take-home, depending on the role, and the requirements they describe list a solid grounding in data structures and algorithms. Treat that as a coding refresher, not an afterthought. Candidates also report panel-style conversations in which technical leads and non-technical stakeholders may be present together, so practise giving each answer twice: one plain-language sentence, then the technical detail. If you have no CAD/CAM background, which is listed as a nice-to-have, prepare an example from a domain with similar data problems such as units, tolerances, geometry or large structured files.

The Allied Technical Solutions interview process

Candidates describe three stages spread over about 3-5 weeks. Reports say the format can shift with team needs, so confirm each stage's format with your recruiter.

Initial Screening

Candidates report that the Initial Screening can involve a panel of technical leads and recruiters who review your background, so the room may mix technical and non-technical listeners. Approach it as your first chance to tell the project story: one clear thread through your recent work, the technologies you used and what each one solved, and a reason this fabrication-focused role fits your experience.

What to demonstrate

  • Your background as told to a panel that can include technical leads and recruiters
  • Whether you can describe past projects clearly to both technical and non-technical listeners

How to prepare

  • Write a short walkthrough of your two most relevant projects: the problem, your own part, one technical decision and the outcome. Use the projects-you-have-worked-on and most-complex-feature questions as the outline.
  • Prepare a sentence linking your experience to software that drives physical manufacturing, even if your domain was different.
  • Ask the recruiter who will be on the panel, then prepare one plain-language and one technical version of your headline project.

Technical Assessment

Candidates report that the Technical Assessment tests practical coding under controlled conditions, and that it can be a live session or a take-home depending on the role. Candidates are also advised to talk through assumptions and methodology before writing code. Prepare for both formats: state the input and edge cases first, then write working code while narrating your reasoning.

What to demonstrate

  • Working code produced under controlled conditions
  • Your reasoning, stated while you work, including the assumptions you made
  • Foundations in data structures and algorithms, which the requirements candidates describe list as a must-have

How to prepare

  • Do several timed problems in your strongest language on arrays, hash maps, sorting and graph or tree traversal, and say your assumptions aloud before coding.
  • Rehearse a take-home format: a small program with tests for empty input, duplicates, unit or tolerance mismatches and malformed records, plus a short README on your decisions.
  • Practise explaining why you chose a data structure and what the complexity is, out loud, while you type.

Final Discussions

Candidates report that Final Discussions cover your past experience and your fit within a collaborative environment. Bring concrete accounts of decisions, mistakes and trade-offs, and have your own questions ready.

What to demonstrate

  • Depth of your past experience
  • Your fit within a collaborative, cross-functional team
  • Your problem-solving method in the stories you tell

How to prepare

  • Turn the difficult-challenge and wrong-approach stories into written outlines with a measurable result and a lesson.
  • Prepare an architecture walkthrough of one system you designed and a performance-driven refactor of a legacy system, since candidates report both as example scenarios.
  • Write three questions for the end: development culture, the challenges the team currently faces, and how success is measured in this role, all topics candidates are advised to raise.

Where candidates lose points

Answering the projects question with a list of technologies and job titles

Structure each project the same way: the problem, your own part, one decision you made and why, and the result. Rehearse it with the projects you have worked on and the most complex feature questions so you can zoom in on any piece.

Describing a team project entirely in 'we' so your own contribution is unclear

Name the pieces you owned, one handoff to another person or team, and one disagreement or review comment you handled. Practise the team-based project answer with those three items.

Answering the accuracy and reliability question with 'I test thoroughly'

Name mechanisms: unit tests with tolerance-aware numeric comparisons, comparison of output against known-good files, input validation for units and malformed records, code review, and a regression test added after each bug.

Starting to code in the technical assessment before stating assumptions and edge cases

Candidates are advised to talk through assumptions and methodology first. Restate the input, list edge cases such as empty, duplicate or out-of-range data, give the brute-force idea and its cost, then write the code while narrating.

Giving every answer at one technical level when the audience may include non-technical stakeholders

Prepare a one-sentence plain-language version of each headline project and each trade-off, then offer the detail. Practise with a friend who does not write code.

Questions & practice

What is your process for ensuring the accuracy and reliability of your code?

Medium · Technical Problem Solving

Approach

  1. Describe layered tests: unit tests for pure logic (unit conversion, geometry helpers), integration tests on real sample input files, and golden-file comparisons of outputs using a tolerance-aware diff instead of byte equality.
  2. Add property-based tests for invariants (for example with Hypothesis in Python): converting mm to inches and back stays within tolerance, a rotation preserves lengths and area, offsetting a contour outward never shrinks it.
  3. Be precise about floating point: never compare floats with ==; Python's math.isclose defaults to rel_tol=1e-09 and abs_tol=0.0, so comparisons against zero need an explicit abs_tol. Where exactness matters, store integer base units or use Decimal.
  4. Validate at boundaries and fail loudly: reject inputs with missing units or out-of-range values instead of guessing, use type hints and static analysis, and make CI block merges when tests fail.
  5. Close the loop in production: log enough input identifiers to reproduce any output, and run sanity checks on outputs before they leave the system.

Follow-up

  • How do you choose a tolerance value, and who agrees it with you?
  • What kinds of defect does your test suite still not catch?
  • How do you test code that depends on a desktop CAD application you cannot run in CI?

How do you balance speed of delivery with the need for high-precision outputs?

Medium · Technical Problem Solving

Approach

  1. Classify work by the cost of a wrong output: a mistake in an internal report is cheap to fix, a wrong dimension sent to fabrication wastes material and time. Precision-critical paths get full tests, review and output validation; low-risk paths can ship faster.
  2. Ship in small slices: release behind a flag or to one project first, run the new and old code on the same inputs and diff the outputs before switching everyone over.
  3. Automate the precision checks (CI tests, golden-file comparisons, output validation gates) so they cost almost no time per release instead of being skipped under pressure.
  4. Tell stakeholders the trade-off plainly: what is covered, what is not, and the remaining risk. Give a real example where you cut scope or moved a date rather than skipping validation on a precision-critical path.
  5. Back the story with numbers: defects caught before release, rework avoided, or how much the automated checks shortened releases.

Follow-up

  • Tell me about a time you shipped something that later turned out to be imprecise. What happened?
  • Who decides when a deadline outweighs another round of testing?
  • Under a hard deadline, what would you cut first and what would you never cut?

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

Hard · reconciliation · range hashing · throttling

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?

Keep soft-deleted accounts from blocking re-registration

Easy · soft delete · unique constraints · engine differences

app_user holds user_id, tenant_id, email CITEXT, password_hash (NULL for SSO principals), email_verified_at, auth_version, status ('invited','active','suspended','deactivated'), created_at, updated_at, deleted_at. Two live accounts for one address inside a tenant must be impossible, but an address freed by a soft delete must be reusable, and the same tenant may delete and re-register it repeatedly. Write the uniqueness DDL for PostgreSQL 16, then the equivalent for MySQL 8 where partial indexes do not exist, and say what each permits once three deleted rows already hold that address.

Approach

  1. Start from what is actually unique: not (tenant_id, email), but (tenant_id, email) among live rows. PostgreSQL says that directly — CREATE UNIQUE INDEX app_user_live_email ON app_user (tenant_id, email) WHERE deleted_at IS NULL. A full constraint over the same two columns burns the address permanently the first time someone deletes an account.
  2. Keep case-insensitivity in the type or the index, never in the application: CITEXT as given, or UNIQUE (tenant_id, lower(email)) as an expression index where the extension is unavailable. A case-sensitive unique column is exactly how two accounts for one human appear.
  3. For MySQL 8 the predicate has to move inside the key: add a discriminator column that is a constant 0 while the row is live and is set to user_id on delete, with UNIQUE (tenant_id, email, deleted_marker). Live rows share the constant and still collide; deleted rows differ from each other and stop colliding.
  4. State the NULL variant and its dependency: leaving the marker NULL for deleted rows also works, because a unique index treats NULLs as distinct — true in MySQL, and true in PostgreSQL only under the default NULLS DISTINCT, which PostgreSQL 15 lets you reverse. Check the polarity against the three existing deleted rows: constant-on-live is what preserves the collision you want, and reversing it silently admits duplicate live accounts.

Follow-up

  • A deleted account re-registers with the same address the next day. Do the old resource rows follow the new user_id, and how does the API keep the two principals apart?
  • How do you honour an erasure request while resource_revision.actor_user_id still references this table?

Replace offset paging on the resource feed with keyset

Easy · keyset pagination · composite index · sort order

resource holds resource_id, tenant_id, owner_user_id, title, body_ref, version, status ('draft','active','archived','deleted'), created_at, updated_at, deleted_at, with an index on (tenant_id, status, updated_at DESC, resource_id DESC). The listing endpoint returns active resources for one tenant, newest update first, 50 per page, today with LIMIT 50 OFFSET n. Tenants reach page 400 and rows are created while they read. Write the keyset query, define what the cursor carries and how it is encoded, and say which part of the index each predicate uses. Assume PostgreSQL 16.

Approach

  1. Name the two failures separately. OFFSET 20000 makes the server produce and discard 20,000 rows, so page cost grows with depth rather than with page size. Independently, any write that changes how many rows sort above the offset moves the window between two fetches, and the direction decides which anomaly you get: an insert lands at the head of updated_at DESC and pushes already-returned rows down past the boundary, so they are returned a second time; a delete above the offset, or a row whose updated_at is bumped above the cursor, pulls rows up and one is never returned at all. Nothing in the response reveals either.
  2. Write the seek: WHERE tenant_id = $1 AND status = 'active' AND (updated_at, resource_id) < ($2, $3) ORDER BY updated_at DESC, resource_id DESC LIMIT 50. The row-value comparison is one index range rather than a disjunction, and both columns are NOT NULL, which is what makes that comparison well defined.
  3. Map each predicate onto the index: tenant_id and status are equality on the leading columns, (updated_at, resource_id) is the range, and the ORDER BY matches the index order so no Sort node appears and the scan stops after 50 rows. The DESC in the definition only matters for mixed directions — a plain ascending btree on the same columns is read backwards for this query.
  4. Put both sort columns in the cursor and nothing the client can tamper with into another tenant: base64 of (updated_at, resource_id), validated server-side, with tenant_id taken from the principal.

Follow-up

  • The client asks for 'jump to page 400'. What do you offer instead, and what does the honest version cost?
  • Sort order becomes user-selectable across four columns. How many indexes is that, and which would you refuse to add?

Tell us about the projects you have worked on.

Medium · Past Experience and Projects

Approach

  1. Pick two or three projects and give each the same shape: the problem, the system you built (inputs, main modules, storage, outputs), the part you personally wrote or decided, and one measurable result.
  2. Lead with the project closest to geometry, file processing or automating manual work, since the reported questions lean toward fabrication and architectural tooling; if you have none, lead with one where wrong output had a real cost.
  3. For each project, name one design trade-off and why you chose it, for example batch processing overnight versus per-request processing, or a relational schema versus storing raw files with metadata.
  4. Keep ownership clear: say 'I wrote', 'I chose', 'I debugged' for your work and name the team for theirs, so the listener can tell your contribution apart.
  5. Close each project with what you would change now and why. That shows you evaluated the outcome instead of just shipping it.

Follow-up

  • Which part of that system would you redesign today, and what would the change cost?
  • How did you know the system's output was correct?
  • What was the hardest bug you hit on that project?

What was the most complex feature you implemented in your previous role?

Medium · Past Experience and Projects

Approach

  1. Say concretely why it was complex: many interacting components, shared state or concurrency, numerical precision, or backward compatibility with existing data. Pick one or two reasons, not 'it was big'.
  2. Walk through the core design: the data model, the key algorithm or data structure, and complexity where it mattered (for example replacing an O(n^2) pairwise overlap check with a sort-and-sweep or spatial grid so typical inputs ran far faster).
  3. Explain how you shipped it safely: a feature flag, a data migration with a rollback path, or running the old and new code on the same real inputs and diffing the outputs before switching over.
  4. Name the tests that guarded it (unit tests on the tricky logic, integration tests on real sample inputs) and one defect they caught before release.
  5. Finish with the outcome in numbers (runtime, error rate, manual hours removed) and one thing you would do differently.

Follow-up

  • Which alternative design did you reject, and why?
  • How did you test it before it reached users?
  • What broke after launch, and how did you find out?

How have you contributed to the development lifecycle in past positions?

Medium · Past Experience and Projects

Approach

  1. Walk the lifecycle stages (requirements, design, implementation, code review, testing, CI and release, monitoring and maintenance) and give one concrete thing you owned at each stage you touched, instead of claiming all of them.
  2. Name artefacts: a design document you wrote, a CI step you added (linting, unit tests, an integration test that runs on sample input files), a review checklist, a release or rollback runbook.
  3. Show one feedback loop end to end: a production defect, its root cause, and the test or validation check you added so the same class of bug fails the build next time.
  4. Include requirements work with non-engineers, because the role as candidates describe it involves marketing and operations colleagues: how you turned a vague request into acceptance criteria you could test.
  5. Avoid listing methodology names (Agile, Scrum) without saying what you personally did inside them.

Follow-up

  • How did you handle a requirement that changed halfway through implementation?
  • What has code review caught for you that tests did not?
  • Describe a release you had to roll back. What did you change afterwards?

Can you describe your role in a team-based technical project?

Medium · Past Experience and Projects

Approach

  1. Open with a one-sentence ownership statement: team size, your role, and the components or interfaces you owned.
  2. Explain how the work was split and kept consistent: agreed API contracts or a shared schema, integration points, and how you found out when someone else's change broke yours.
  3. Give one disagreement on that project and how it was settled with evidence (a benchmark, a prototype, a failing test case) rather than seniority.
  4. Show one moment where you explained a technical limit or trade-off to a non-engineer in terms of cost, risk or schedule; candidates report panels that can include non-technical stakeholders.
  5. Keep 'I' and 'the team' separate throughout, and end with what the project delivered and what you learned about working in that team.

Follow-up

  • What would the project have looked like without your part?
  • Tell me about a disagreement with a teammate on that project.
  • How did you explain a technical constraint to someone outside engineering?

What technologies have you utilized to solve architectural or fabrication challenges?

Medium · Past Experience and Projects

Approach

  1. Answer by problem, not by tool list: for each technology, state the problem it solved, the alternative you considered, why you chose it, and the limit you eventually hit.
  2. If you have CAD/CAM experience, name the API or scripting interface you used, what manual step you automated, and how you handled units and tolerances in the geometry you read or wrote.
  3. If you lack direct domain experience, map adjacent work honestly (geometry or graphics libraries, parsing large structured files, batch data pipelines, numerical code) and say how you would get up to speed on a new CAD toolchain.
  4. For large design or fabrication files, describe streaming or chunked parsing instead of loading the whole file, so memory is bounded by chunk size, and parallel processing of parts that are independent of each other.
  5. Mention precision handling explicitly: one internal unit system with conversion only at the edges (1 inch = 25.4 mm exactly), and tolerance-based comparisons instead of exact float equality.

Follow-up

  • Why that library or tool over the alternatives you considered?
  • How did you handle inputs that arrived in mixed metric and imperial units?
  • What did you do when an input file was too large to process in memory?

Can you explain how you debug complex issues within a fabrication or drafting system?

Medium · Technical Problem Solving

Approach

  1. Reproduce first: capture the exact input file, software version, configuration and the wrong output, then shrink the input. Removing half of the geometry and rechecking gives a small failing case, not always a minimal one. If neither half fails alone because the bug needs elements from both, remove smaller chunks (delta debugging, as in ddmin) or keep one half fixed while you shrink the other.
  2. Find the first stage that goes wrong: in an import, transform, export pipeline, dump intermediate results at each boundary and compare them with a known-good run; the first divergence is where to dig.
  3. Check the usual numeric suspects in geometry code: unit mismatches (a factor of 25.4 between mm and inches), exact == comparisons on floats, rounding applied too early, error accumulating across many chained transforms, and transforms applied in the wrong order (rotation and translation do not commute).
  4. If it is a regression, run git bisect between the last good and first bad commit: it needs about log2(n) test runs for n commits, so around 10 for 1,000.
  5. Fix the cause, add the failing input as a regression test, and add an output validation check (dimension ranges, bounding box, closed contours) so a similar defect is stopped before it reaches fabrication.

Follow-up

  • How would you debug a problem that only shows up on one machine or one customer's file?
  • What would you do if the bug is intermittent and you cannot reproduce it on demand?
  • How do you stop this class of bug from reaching fabrication again?

Suggested practice checklist

The plan starts from the project and problem-solving questions candidates report, then covers debugging and accuracy habits for fabrication-style data, design-database integrity, a coding assessment refresher, and a mock panel. Every day ends with a written or recorded deliverable.

Day 1 — Inventory your projects and technologies

  • List three projects you could discuss in depth. For each, write the problem, your role, the stack and the result.
  • Pick the single most complex feature you built and outline how it worked, what was hard and what you would change.
  • Write a table of technologies you have used, each paired with the problem it solved, for the architectural or fabrication technologies question.

Deliverable: Three one-page project summaries, one complex-feature outline and one technology-to-problem table.

Day 2 — Development lifecycle and team role

  • Map one project across requirements, design, implementation, review, testing, release and maintenance, and mark where you contributed.
  • Write your team-project answer with three items: what you owned, one handoff, and one disagreement you resolved.
  • Write a plain-language explanation of that project for a non-technical stakeholder, in two or three sentences.

Deliverable: A lifecycle map with your contributions marked, a written team-role answer and a plain-language project summary.

Day 3 — Problem-solving stories

  • Write the difficult-technical-challenge story: situation, hypotheses, how you narrowed it, the fix and the measured result.
  • Write the wrong-approach story: the signal, the decision to switch and what you changed in your habits.

Deliverable: Two written stories with a measurable result in each, plus a note on the cost of the reversal.

Day 4 — Debugging and code accuracy

  • Write a debugging runbook for a pipeline that emits wrong output: reproduce, compare to a known-good result, bisect inputs or recent changes, then check units, rounding and file-format assumptions.
  • List the concrete checks you use to keep code reliable: unit tests, tolerance-aware numeric comparisons, golden-file tests, input validation and code review.
  • Pick one past bug and walk it through your runbook aloud.

Deliverable: A one-page debugging runbook, a list of accuracy checks and a spoken walk-through of one past bug.

Day 5 — Speed versus precision, edge cases, refactoring, design databases

  • Write your answer on balancing delivery speed with high-precision output: what you ship fast, what gets extra verification, and how you decide.
  • List edge cases for automated fabrication data: empty or truncated files, duplicate records, unit mismatches, values at tolerance limits and very large files.
  • Outline a legacy refactor for performance: baseline measurement, profile, change, then proof that output is unchanged.
  • Write the SQL constraints (a NOT NULL units column, a CHECK on dimension ranges, unique part identifiers) and the transaction boundary that keep a design-database update from leaving half-written part records.

Deliverable: A written speed-versus-precision answer, an edge-case list, a refactor outline with a verification step and a constraint-and-transaction sketch for a design database.

Day 6 — Coding assessment practice

  • Solve several timed problems in your strongest language on arrays, hash maps, sorting and graph or tree traversal, narrating assumptions and complexity.
  • Build a small take-home-style program with tests for malformed input, then write a short README on your decisions.

Deliverable: Solved problems with stated complexities, a tested small program with a README, and a worked practice exercise.

Day 7 — Mock panel and questions to ask

  • Run a mock panel with one technical and one non-technical listener, covering your project walkthrough and one problem-solving story.
  • Prepare your architecture walkthrough of one system you designed, then rehearse it at two levels of detail.
  • Write three questions to ask at the end: development culture, the team's current challenges and how success is measured.

Deliverable: A recorded or notes-based mock panel, a two-level architecture walkthrough and three written questions.

Stories for the project and problem-solving questions

Candidates report experience and problem-solving questions, and panel-style interviews that can mix technical leads with non-technical stakeholders. For this role, your stories should show a decision you made, how you protected accuracy, and how you explained the trade-off to someone outside engineering. Rehearse each as problem, action, result, and lesson.

  1. What was the most complex feature you implemented in your previous role?
  2. Can you describe your role in a team-based technical project?
  3. What is your process for ensuring the accuracy and reliability of your code?

Describe a time you encountered a difficult technical challenge and how you overcame it.

Medium · Technical Problem Solving

Approach

  1. Choose a challenge where being wrong carried a cost, such as incorrect output, corrupted records or a failed batch run, and where you personally made the key decisions. A story where you only watched, or where the hard part was a vendor library, shows less.
  2. Give the situation and task in two sentences, then spend most of the answer on actions: how you reproduced the problem, narrowed it by bisecting inputs or changes, listed hypotheses and tested the cheapest one first.
  3. Name the alternative you rejected and why, and the evidence that settled it: a failing test, a profile, a diff between good and bad output.
  4. Close with a result you can defend, such as a before-and-after measurement, and the change that stops a repeat: a regression test, an input check or an alert. Do not claim the team's result as yours alone, and do not end on 'it worked out'.

Follow-up

  • What did you rule out first, and what made you rule it out?
  • How did you confirm you fixed the root cause and not just the symptom?
  • What would you do differently if the same problem came up tomorrow?

How do you handle situations where your initial technical approach proves to be incorrect?

Medium · Technical Problem Solving

Approach

  1. Pick a real reversal that cost you something: an algorithm that failed on realistic input size, a data model that could not represent a case, or a parsing assumption real files broke. Claiming you are never wrong ends the answer.
  2. Describe the signal that exposed it (a test, a profile, review feedback, production data), how soon you noticed, and what you checked to be sure you had misjudged and not hit a one-off.
  3. Explain the decision to switch rather than patch: the cost of continuing, what you salvaged, and how you told the people waiting on the result about the schedule impact in plain terms.
  4. Finish with the habit you changed, for example testing the risky assumption on realistic data in a small spike before building on it. Own the mistake; do not blame requirements or a teammate.

Follow-up

  • How did you decide to abandon the first approach instead of patching it?
  • How did you tell the stakeholder, and what did they ask you to do?
  • What do you do now to find out sooner that an approach is wrong?

Reverse your own decision and price the reversal

Medium · reversibility · measurement · migrations

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?