Technical Leadership and Influence Questions
Leading through technical depth and credibility: setting technical direction, making high-stakes architecture and design trade-offs, and driving strategic influence across engineering without necessarily managing people. Covers earning trust through hands-on expertise, leading complex or greenfield initiatives, and elevating a team's technical bar. The staff-plus IC leadership track.
You're asked to run the design review meeting for a proposed technical change that touches several teams. What pre-reads would you require, who would you invite, and how would you handle two attendees who show up with genuinely different opinions on the approach?
Sample Answer
Direct answer
I require a short, focused pre-read before the meeting (the problem, the options, the data behind them, not a pitch for one answer), invite the people who'll actually operate or approve the outcome rather than everyone remotely interested, and when two attendees disagree I redirect the conversation from stated positions to the underlying constraints each of them is protecting, then settle it against evidence rather than whoever argues longer.
Pre-reads I require
A two-page document, sent enough in advance that people arrive having actually read it: the problem and current metrics, the options actually being considered (not one option dressed up as several), rough cost and risk for each, and any prototype or benchmark data available. I explicitly ask people to bring disagreement in writing beforehand if they have it, so the meeting starts from known positions instead of surfacing them live for the first time, which burns the room's limited time on restating context instead of resolving disagreement.
Who I invite
The engineers who will build and the ones who will operate the result, since design-time convenience and runtime cost are often in tension and both need a voice. A reliability-focused reviewer if the change affects availability or incident risk. A security reviewer if the change touches data access or the trust boundary, since security is easy to leave out of an architecture conversation and expensive to add back in later. A product stakeholder if the change affects what's shippable or when. If a technical program manager is involved, they typically own getting the pre-read circulated and the room booked with the right people, not the technical recommendation itself, and keeping that distinction clear avoids the meeting drifting into project-status territory. I keep the list to the people who need to decide or will be materially affected, not everyone who might find it interesting; a design review that tries to include everyone stops being a decision-making meeting.
Handling genuine disagreement in the room
When two people show up with real, substantive disagreement rather than a misunderstanding, I don't try to referee it as a personality conflict. I ask each to state the specific constraint they're protecting in concrete terms (a latency floor, an operational complexity ceiling, a data-consistency guarantee) rather than their preferred solution, because two people arguing for different solutions are often actually protecting the same underlying concern and don't realize it. Then I score the options against those stated constraints using whatever data is on the table, prototype numbers if we have them, rather than letting the debate resolve on seniority or persistence. If the data genuinely doesn't settle it, I say so explicitly and either scope a short follow-up spike to get the missing data or make the call myself as the meeting owner and document why, rather than letting the meeting end without a decision.
Worked example
A notification service was missing its latency target under peak load, and I ran the design review to replace a single-worker batch processor with something that would scale. The pre-read covered current metrics, three real options (a streaming platform with partitioned consumers, a sharded worker pool, a managed publish-subscribe service), and prototype latency numbers I'd gathered beforehand. I invited backend engineers, an SRE, a product manager, and a security reviewer given the service touched user contact data. The SRE favored the managed option for lower operational burden; backend engineers favored the streaming platform for control over partitioning and failure isolation. I asked each to state the constraint they were protecting: the SRE's was on-call load, backend's was avoiding a hard ceiling on horizontal scaling. The prototype data showed the streaming option met the throughput target with acceptable, quantified operational overhead, which resolved it on evidence rather than preference. We agreed the meeting owner (me) would write up the decision and the operational commitments needed to satisfy the SRE's concern, closing the loop instead of leaving it as an unresolved parallel objection.
This same shape scales down and up: a narrower change, like an internal billing application programming interface, might only need a focused hour with the engineers, quality assurance, and one product stakeholder; a platform-wide move needs the fuller group and probably more than one session.
Trade-offs and pitfalls
- Skipping the pre-read and using the meeting itself to build shared context. That turns a decision meeting into a status meeting and wastes the room's actual purpose.
- Inviting too many people "to be safe." A design review with fifteen attendees rarely reaches a decision; it reaches a list of concerns.
- Treating disagreement as something to smooth over instead of resolve. Letting two people leave with different unstated assumptions about what was decided just moves the conflict to implementation time, where it's more expensive.
- Ending the meeting without an owner for follow-up. A design review that produces a direction but no named owner for the write-up and next steps tends to lose momentum within days.
You want to raise the technical bar on a team by introducing shared standards, for example coding guidelines, CI checks, or architectural guardrails. How do you decide what to standardize versus leave to team judgment, and how do you keep it from being ignored six months later?
Sample Answer
Direct answer
Standardize the things whose inconsistency has a cost outside the team that owns them, and that can be checked by a machine rather than a person's memory. Leave to team judgment anything whose blast radius stays inside the team. A standard survives six months only if it lives in a gate, continuous integration (CI), a template, a linter, instead of a wiki page, because unenforced guidance quietly reverts to whatever each team already does.
Structured elaboration
The decision test, three questions:
- Cross-team blast radius: does inconsistency here break, confuse, or slow down people outside this team (an API contract, an incident-escalation format, a deployment interface)? If yes, it is a candidate for standardization.
- Machine-checkability: can the rule be expressed as a lint, a CI check, a schema, or a template? A rule that can only be enforced by review-time nagging will decay.
- Cost of inconsistency versus cost of enforcement: is the recurring cost of not having this standard (incidents, onboarding confusion, duplicated tooling) bigger than the cost of building and maintaining the gate?
Concrete range, drawing on the kinds of standardization efforts teams actually run:
- Clears the bar (cross-team, high blast radius, checkable): a contract-testing system that fails CI when a backend change breaks a documented frontend expectation; an API versioning and deprecation policy that gives consumers a fixed window before a breaking change ships; model governance requirements, model cards, dataset documentation, and bias-testing gates, that a downstream team or auditor will ask for regardless of who owns the model; shared incident-response conventions across autonomous teams so any on-call engineer can page correctly.
- Left to team judgment (local, low blast radius): a naming convention for one team's own datasets and reports; a small process change, how one team runs its own review meeting, that improved that team's own throughput; code style with no cross-team consumer.
- Ambiguous middle, decided by ownership of the failure, not the code: a lightweight code and model review process is worth standardizing only where reviews cross team lines, on a shared platform, for example. If it is one team reviewing its own code, leave the mechanics to them and standardize only the outcome, "every model change gets a second reviewer," not the process.
Durability mechanism, why it survives six months:
- Enforce in CI or the pipeline, not in a document. A rule a human has to remember to apply degrades the moment the person who cared moves on.
- Name an owner and a review cadence, e.g. quarterly, so the standard is revisited, not just imposed once.
- Build an explicit, cheap exception path, a documented, time-boxed waiver, so teams route around the standard openly instead of quietly ignoring it. Silent noncompliance is the real failure mode, not disagreement.
- Roll out with a warn-before-block period and cut switching cost with a migration tool or codemod. Adoption sticks when the standard is easier to follow than to route around.
Worked example
A platform team owns three backend services consumed by eight frontend teams. Backward-incompatible changes were shipping without warning, breaking frontend builds roughly monthly. This passes both tests: cross-team blast radius (each break costs multiple teams debugging time they did not cause) and machine-checkability (an API's shape is expressible as a schema). The fix was consumer-driven contract tests: every backend pull request (PR) runs the contracts published by consuming teams, and a break fails CI before merge, not after deploy. Deliberately NOT standardized: how each backend team structures its internal service code, that stays local, because a bad internal structure only costs that team.
Illustrative cost check run before committing (arithmetic shown, not a claimed measured result): if a broken-contract incident costs roughly 3 engineers times 2 hours of debugging plus a rollback, that is about 6 engineer-hours per incident. At one incident a month that is 72 engineer-hours a year, against an estimated 40 hours to build and maintain the contract-test harness, so the standard was expected to pay for itself inside the first year.
Trade-offs and pitfalls
- Standardizing too much kills the local judgment that made teams fast and breeds shadow processes where teams comply on paper and route around it in practice. The naming-convention and small-process-change examples above are exactly the kind of thing that should stay local; forcing them org-wide adds coordination cost for no cross-team benefit.
- A standard that lives only in a document decays the moment attention moves elsewhere. If it cannot go in a CI gate or a template, expect erosion within a couple of quarters regardless of how good the guidance was.
- Skipping the grace period and hard-blocking on day one looks decisive but usually generates workaround PRs and resentment. The far more common failure than teams "not caring" is teams not yet having a cheap way to comply.
- No exception path means legitimate edge cases either get silently ignored (the standard rots) or block real work; both outcomes erode trust in future standards.
Describe a strong technical disagreement you had with a senior stakeholder, someone whose seniority or role gave them real leverage, about a model or architecture choice. How did you make your case, and what did you do once the decision was made, whichever way it went?
Sample Answer
Direct answer
Make the case with evidence the stakeholder cares about, not just evidence you find compelling, and treat "what you do afterward" as part of the same decision, not an afterthought. If you win, you own the follow-through and the honesty of reporting how it actually performs, including if it underperforms your pitch. If you lose, you execute the decision as if it were your own idea, because half-hearted execution of a call you disagreed with is worse for the team than either winning the argument or losing it cleanly.
Structured elaboration
- Translate your technical concern into the stakeholder's actual decision criteria first. A senior stakeholder pushing for the higher-accuracy model is usually optimizing for a real business metric (the metric they were pitched on), not blind to trade-offs. Find out what that metric is before building your counter-case, or your evidence will answer a question they were not asking.
- Build the smallest comparison that actually tests the disagreement, not the most impressive one. A focused benchmark on latency, cost, and the metric the stakeholder actually cares about beats an exhaustive study nobody reads before the decision date.
- Offer a staged option, not just a binary. A gated rollout that lets the higher-risk option prove itself on a slice of traffic while the safer option covers the rest gives the stakeholder a way to change course without having to admit they were wrong up front, which matters more than it should.
- After the decision, whichever way it goes, put the reasoning and the actual outcome in writing. If you won the argument, that record is what lets you (or someone else) catch it early if the bet does not pay off. If you lost, the record is what lets the team revisit the call later on evidence instead of on who felt strongest about it in the room.
- Commit visibly to the decision you did not want, if that is how it goes. Undermining a decision after losing the argument, even subtly, is the fastest way to lose the credibility you need for the next disagreement; a senior engineer's job is to make the chosen path succeed, not to be quietly right later.
Worked example
A product lead who owned the roadmap pushed hard for a large model architecture because it had the best offline accuracy in early experiments, and their read was that "best accuracy" would directly translate into the most user value. I was concerned about inference latency, serving cost, and how hard the model would be to debug in production, none of which showed up in an offline accuracy number.
I did not argue accuracy versus my concerns in the abstract. I ran a focused comparison: the large model against a much simpler, interpretable model, measured on the actual serving latency and cost we would face in production, and on the specific business metric (retention lift) rather than offline accuracy alone. The simpler model captured most of the retention lift at meaningfully lower latency and cost. I proposed a staged compromise instead of asking the stakeholder to abandon their preference outright: ship the simpler model broadly since it met the latency and cost bar, and run the large model as a gated experiment on a small traffic slice to see whether its extra accuracy translated into extra retention lift large enough to justify the cost. The stakeholder accepted the staged plan, in part because it did not require conceding the large model was wrong, only that we needed more evidence before betting the whole rollout on it.
What I did afterward mattered as much as the pitch: I set a specific check-in date to look at the gated experiment's real numbers rather than letting it run indefinitely, and I documented both what we expected going in and what we actually saw, including a segment where the large model's extra accuracy did turn out to justify the cost. That honesty is what let the stakeholder trust the next recommendation I brought them without re-litigating this one.
This same dynamic shows up whenever a senior stakeholder's technical or business leverage collides with a technical judgment call: a senior engineer publicly criticizing your team's design at an all-hands and needing the relationship repaired afterward, a skeptical engineering manager resisting a centralized feature store you designed, or two engineers proposing competing approaches where product favors the faster one and the tech leads favor the more robust one. In every case, the deciding factor was translating the disagreement into criteria the other party already cared about, then honoring the outcome, win or lose, instead of treating the argument itself as the finish line.
Trade-offs and pitfalls
- Framing your case entirely around the stakeholder's stated metric can bury a real risk they did not think to ask about; name it explicitly even if it costs you the argument.
- A staged compromise can become a permanent unresolved state if nobody owns closing the loop; put a real date on the follow-up, not "we'll revisit later."
- If you lose and comply only outwardly while quietly hoping to be proven right, you have not actually committed, and the team can usually tell; genuine execution of a decision you disagreed with is a distinct skill from making the case for it.
- Winning too many of these arguments in a row without ever being wrong in public is itself a signal you are not taking on the genuinely uncertain calls; staff-level credibility includes being visibly wrong sometimes and handling it well.
Your team is deciding whether to extend an existing monolith with a new capability or extract it into its own service. Walk through the checklist you would use to decide, and how you would handle a standardize-on-one-framework-org-wide versus let-teams-choose question that comes up in the same conversation.
Sample Answer
Direct answer
I'd score the extract-vs-extend question on a small set of concrete criteria (coupling, team ownership boundaries, independent-deploy need, and operational readiness) rather than defaulting to "microservices are more scalable," because most of the real cost of extraction is operational, not architectural. The standardize-vs-let-teams-choose question uses the same underlying test: how expensive is it to reverse or replace later, and is the inconsistency it prevents actually expensive.
Extend vs. extract: the checklist
- Bounded responsibility: does the new capability have a clean seam, or does it need constant, chatty access to the monolith's data?
- Deploy cadence: does it need to ship independently of the rest of the system, or is coupling to the monolith's release cycle fine?
- Operational readiness: does the team have the on-call capacity and tooling to run a new deployable, with its own monitoring, alerting, and incident path?
- Data ownership and migration cost: can the new capability own its data cleanly, or does splitting it out mean a real data migration with its own risk?
- Failure isolation value: does keeping this inside the monolith mean one bug can take down unrelated functionality?
I weight operational readiness and deploy cadence heaviest, because the two failure modes I've seen most often are extracting a service the team isn't staffed to run, and extending the monolith with something that should have shipped on its own schedule and now can't. If bounded responsibility and deploy-cadence needs are both high, I favor extraction, using an incremental cutover (the strangler pattern: route a growing slice of traffic to the new service while the old code path shrinks, rather than a big-bang rewrite) so the migration itself stays reversible. If operational readiness is the gap, I don't block extraction outright, I make closing that gap a precondition (on-call rotation, dashboards, a runbook) before we cut over.
Standardize on one framework vs. let teams choose
This is the same reversibility question aimed at organizational choice instead of a single service boundary. Standardizing has a real cost (teams lose the tool best-suited to their specific problem) and a real benefit (shared tooling, easier cross-team hiring and code review, one thing to patch and upgrade). I ask two questions: how expensive is inconsistency actually, and how expensive is switching later.
If the framework choice affects things multiple teams depend on jointly (a shared processing framework everyone's pipelines run on, a shared metrics layer everyone queries), fragmentation compounds: every new hire has to learn N different stacks, and cross-team debugging gets harder with each addition. That favors standardizing on one, with an documented exception process for a team with a genuinely different workload. If the choice is mostly local to one team's problem, I default to letting teams choose and only intervene if the fragmentation later becomes an actual, not hypothetical, cost.
The same tension shows up in adjacent forms: a single canonical metrics layer versus team-specific derived metrics is the same standardize-vs-federate question wearing a BI hat. The criteria don't change: how much cross-team cost does divergence create, and how reversible is the standardization if it turns out wrong.
Worked example
A team is deciding whether to extract a notification-sending capability from a monolith. Bounded responsibility scores high (it already has a clean interface), deploy cadence scores high (product wants to ship new notification channels weekly, independent of the monolith's release train), but operational readiness scores low (the team has never run a standalone service with its own on-call). I recommended extraction, gated on standing up basic operational readiness first: a minimal runbook, alerting on delivery failure rate, and a two-sprint pilot behind a feature flag before the old code path was removed, so if operational gaps surfaced, we could route back to the monolith path without a second migration.
Trade-offs and pitfalls
- Extracting because "microservices scale better," without checking who runs it. The most common failure is an architecturally clean extraction nobody was staffed to operate.
- Standardizing everything to avoid any inconsistency. Not all inconsistency is expensive; forcing one framework onto a team with a genuinely different workload trades a small fragmentation cost for a real productivity loss.
- Treating the extraction as one-way. Keeping the old code path alive during a phased cutover is what makes the decision cheap to reverse; deleting it early removes that safety net for no benefit.
- Skipping the pilot. A two-or-three-sprint pilot with real traffic surfaces operational gaps a design review can't.
Tell me about the most significant architecture or technical decision you led. Walk me through the problem, the options you actually considered, the trade-off that made you pick one, and how you got the team or organization behind it.
Sample Answer
Direct answer
I led the redesign of an image-processing pipeline that was the main bottleneck for our mobile app under load. I chose a hybrid design (object storage plus a queue plus a pool of containerized workers) over both a pure serverless rebuild and a bigger version of the existing monolith, because it hit the latency target without taking on the operational risk of either extreme, and I got the team behind it with a working prototype and real numbers instead of a design doc alone.
Worked example: the problem and the options on the table
Peak uploads were causing multi-second delays and timeouts, and the team needed thumbnails and metadata back within a couple of seconds for most uploads, including during seasonal traffic spikes many times normal volume. I considered four real options, not two:
- Scale the existing approach harder: more virtual machines behind the monolith, autoscaled.
- A queue plus a fleet of workers pulling tasks, running on virtual machines.
- A fully serverless pipeline: cloud functions triggered directly by the upload, for everything.
- A hybrid: object storage triggers a queue, and a pool of containerized workers (I used AWS Fargate, a serverless container runtime, so the team didn't have to manage the underlying machines) consumes from it.
I chose the hybrid. Cloud functions are billed and constrained per invocation and struggled with the larger images and native image-processing libraries the heavier tasks needed, with inconsistent startup latency on cold instances. A bigger monolith fleet fixed nothing structurally; it just moved the same bottleneck to more machines and kept the cost scaling linearly with peak, not average, load. Containerized workers behind a queue gave native binaries room to run, decoupled the upload path from processing so a slow burst degraded queue depth rather than user-facing latency, and let the team test and version the processing logic like normal application code instead of a pile of small functions.
flowchart LR
U[Upload] --> S3["Object storage (S3)"]
S3 --> Q["Queue (SQS)"]
Q --> W["Worker pool (Fargate containers)"]
W --> R["Processed thumbnail + metadata"]
W -.retry on failure.-> DLQ["Dead-letter queue"]
How I got the team and organization behind it
A design doc alone wasn't going to settle it, because the disagreement was really about risk tolerance, not taste. I built a small prototype: a containerized worker doing the real image processing, wired to a test queue with synthetic burst traffic, and brought latency and cost numbers to the review rather than an opinion. I walked the plan past the people who had to live with the consequences: the product owner for the latency requirement, two backend engineers who would build and operate it, an SRE for on-call and cost implications, and a security reviewer for the data-access footprint of the new storage and queue paths. I rolled it out behind a flag starting with a small slice of traffic and watched tail latency, error rate, and cost against the baseline before expanding, so the decision was reversible if the prototype's numbers didn't hold in production.
Trade-offs I accepted, and where this pattern shows up elsewhere
I accepted more operational surface than a pure serverless design (a queue and a worker fleet to run and monitor) in exchange for predictable cost and headroom on heavy tasks, and I accepted more upfront build cost than "just add more machines" in exchange for a design that actually removed the bottleneck instead of relocating it.
The same reasoning shows up under different names across a lot of architecture decisions: centralized platform team vs. distributed feature-team ownership of infrastructure; microservice isolation vs. a service mesh handling cross-cutting concerns; REST vs. event sourcing (writes recorded as an append-only log) paired with CQRS, command query responsibility segregation, which splits the write model from a separately optimized read model, for an event-driven system; even a tooling pick like choosing one BI dashboard product over another can produce the exact same stakeholder-disagreement shape this story did. What stays constant is the method: name the real options (not two extremes), get numbers before opinions harden, and pick the option whose downside you can live with if you're wrong.
Trade-offs and pitfalls
- Presenting only two options. Real decisions usually have three or four live candidates; framing it as a binary hides the option that might actually be right.
- Skipping the prototype because the design "obviously" works. The prototype is what turns a design review into a data review; without it, disagreement stays at the level of opinion.
- Not planning the rollback path. A hybrid architecture like this is only safe to ship gradually if there's a real flag and a way to watch it fail small before it fails big.
- Letting the stakes change the story, not the reasoning. If the same decision had a customer commitment or a sales opportunity riding on the deadline, the criteria don't change, but the acceptable risk margin does; that's worth naming explicitly rather than quietly cutting corners on validation under pressure.
Unlock Full Question Bank
Get access to all 40 Technical Leadership and Influence interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.