Framing and goals
Start by turning a vague mandate like "make the service faster" into a specific, falsifiable target tied to a real SLO (service-level objective): for example, reduce the checkout API's p99 latency from 850ms to under 400ms within one quarter, without regressing error rate or increasing infrastructure cost beyond an agreed limit. A goal stated only as "faster" invites scope creep and makes it impossible to know when the project is actually done; a percentile-and-deadline target with an explicit non-regression guardrail does not.
Stakeholders
- Engineering owners of every service on the actual critical path, this is rarely one team's problem once you trace where the time really goes.
- Product or business stakeholders who can translate latency into a number they already track, conversion rate, revenue per session, support ticket volume, so the project has a business sponsor, not only an engineering one.
- SRE or platform teams who own the infrastructure being changed (caches, databases, autoscaling policy) and need to sign off on capacity and risk.
- Whoever owns any external customer-facing SLA, since a latency change can shift compliance with an existing commitment.
Measurement and experiment plan
Before changing anything, instrument the full critical path with distributed tracing so the team optimizes the actual bottleneck rather than the one that is easiest to find; it is common for the biggest win to sit inside a dependency nobody suspected. Establish a real baseline from a full week of production p50/p95/p99 (the 50th/95th/99th percentile: the latency value below which that fraction of requests complete), not one quiet day, so later comparisons are against a stable prior baseline rather than week-over-week noise. Ship each proposed fix as an isolated, measurable experiment, a feature-flagged or canary rollout to a small percentage of traffic, compared against a control group on the same traffic mix and time window, so a fix that appears to help is not just riding a quiet period.
Rollout and rollback
Stage the rollout by traffic percentage, for example 1% to 10% to 50% to 100%, holding each stage long enough to see a full peak and off-peak cycle, since a tail-latency fix that looks fine at 1% of traffic can behave very differently once it absorbs real peak load. Every change ships behind a flag or a fast, already-tested revert path, not "revert the commit and redeploy," which can take longer than the incident it is meant to end. The rollback trigger is defined in advance, for example an automatic pause if p99 regresses beyond a set percentage or error rate crosses a set threshold, not decided in the moment under pressure.
Quantifying business impact
Tie the latency improvement to the business metric the sponsor actually cares about with a controlled comparison, for example an A/B test comparing conversion or task-completion rate between the old and new p99, rather than asserting a causal link from a simple before-and-after time series, which can be confounded by seasonality, a marketing campaign, or an unrelated change that shipped the same week. Report the result in the units the sponsor already tracks, revenue, retention, support load, not only milliseconds; milliseconds alone mostly sell the next project to other engineers, not to the business.
Prioritizing competing improvements and risks
Rank candidate fixes by estimated latency impact multiplied by the number of requests affected, divided by implementation risk and effort, so the project spends its first cycles on high-leverage, low-risk wins, for example adding a cache in front of a hot read-heavy call, before attempting a riskier architectural change, for example re-partitioning a database, that has a bigger ceiling but a much longer and riskier path to land. Concretely: the cache fix cuts about 80ms for the roughly 40% of requests hitting that hot read (about 400 of 1,000 requests/sec in this scenario) at a low risk/effort score of 2, giving a priority score of (80 * 400) / 2 = 16,000; the re-partitioning fix cuts a bigger 300ms but only for the 10% of requests it touches (100 req/sec) at a much higher risk/effort score of 8, giving (300 * 100) / 8 = 3,750, so the cache ships first even though its per-request win is smaller. Explicitly flag and defer any change whose latency benefit trades against a property the business also cares about, for example a looser consistency model that saves latency but risks a correctness bug; that trade needs sign-off from whoever owns that risk, not a unilateral call by the performance project. Re-baseline priorities every few weeks against the results measured so far; if the top-ranked item under-delivered, the ranking of everything below it should visibly shift. A plan that never updates based on its own data is not really being led, it is being executed on autopilot.