Shipping software is half the job. The other half is keeping it running when traffic triples, a dependency slows down, a disk fills or a deploy goes wrong at the worst moment. Site Reliability Engineering is the discipline Google developed for that problem, built on one idea: treat operations as a software engineering problem. This module explains what SRE is, how it relates to the DevOps practices you may already know, and the handful of principles the rest of this track is built on.
- Define SRE and explain the idea of applying software engineering to operations work
- Describe how SRE relates to DevOps and where the two differ in emphasis
- Explain why reliability is a product feature, and why more is not always better
- List the core SRE principles: SLOs, error budgets, toil reduction, monitoring, blameless learning
- Compare the common ways organisations structure SRE teams and share ownership of production
What SRE is
Ben Treynor Sloss, who founded the first SRE team at Google, described it as what happens when you ask a software engineer to design an operations function. Traditional operations scales with headcount: more services and more traffic mean more people performing more manual procedures. SRE refuses that model. Work that a machine can do is automated, and engineers spend their time making the system need less human attention.
In practice an SRE's work falls into two kinds. Operational work is being on call, responding to incidents, handling tickets and doing manual releases. Engineering work is writing software and designing systems that improve reliability or remove future operational work: automation, better monitoring, capacity models, safer rollout tooling. A defining SRE rule is that operational work is capped at about half of a team's time, so that there is always capacity to fix the causes and not only the symptoms. When operations exceed the cap, that is treated as a signal that something is wrong, not as the normal state.
The other defining feature is that reliability is expressed as numbers agreed in advance, not as an aspiration. "The site should be fast and always up" cannot be engineered. "99.9% of checkout requests succeed within 500 ms, measured over 28 days" can, and it tells you when to stop as well as when to act.
SRE and DevOps
The two grew up separately around the same time and address the same root problem: the wall between the people who change systems and the people who keep them stable. Developers are rewarded for shipping, operators for stability, and because most outages are caused by change, the two incentives collide.
DevOps is a broad cultural and professional movement. It describes outcomes and values: break down silos, accept failure as normal, change gradually, automate, and measure everything. It is deliberately not prescriptive about how. SRE is one specific, opinionated way of doing it. Google's own summary is that SRE implements DevOps, in the way a class implements an interface.
| DevOps principle | How SRE implements it |
|---|---|
| Reduce organisational silos | Shared ownership of production; developers and SREs use the same tools and share on-call |
| Accept failure as normal | Error budgets make an acceptable amount of failure explicit; postmortems are blameless |
| Implement gradual change | Small, frequent releases; canaries; automated rollback |
| Leverage tooling and automation | Toil is measured and capped; repetitive work is engineered away |
| Measure everything | SLIs and SLOs define reliability; toil and on-call load are measured too |
If you have worked through the DevOps track, you have the delivery side: pipelines, infrastructure as code, Kubernetes, GitOps. SRE picks up where that ends, with the questions of how reliable the running system should be, how you know, and what you do when it is not.
Job titles are not a reliable guide. Many "DevOps engineer" roles are platform or operations roles, and many "SRE" roles are renamed operations teams. What matters is whether the practices are present: measured reliability targets, a cap on operational work, and engineering time spent removing causes.
Reliability is a feature, and it has a price
Reliability is arguably the most important feature of any product, because no other feature works when the system is down. Users do not distinguish between "the payment feature has a bug" and "the payment service is unavailable"; both mean they could not pay.
But reliability is not free, and it is not unlimited. Each additional "nine" of availability costs far more than the last: redundancy across zones, then regions, slower and more careful releases, more testing, more people on call. At some point the extra reliability is invisible to users, because their own phone, Wi-Fi and network are less reliable than your service. Money and engineering time spent beyond that point would have produced more value as features.
| Availability | Allowed downtime per 30 days | Allowed downtime per year |
|---|---|---|
| 99% (two nines) | 7.2 hours | 3.65 days |
| 99.9% (three nines) | 43.2 minutes | 8.76 hours |
| 99.95% | 21.6 minutes | 4.38 hours |
| 99.99% (four nines) | 4.32 minutes | 52.6 minutes |
| 99.999% (five nines) | 26 seconds | 5.26 minutes |
Look at what the table implies for how you operate. At three nines a human can be paged, wake up, and fix a problem within the monthly allowance. At four nines, four minutes a month leaves no time for a human at all: detection and recovery must be automatic. The target you choose determines the architecture, the process and the cost, which is why choosing it is a business decision and not a purely technical one.
def allowed_downtime_minutes(slo_percent: float, days: int = 30) -> float:
"""Minutes of full outage permitted by an availability target."""
total_minutes = days * 24 * 60
return total_minutes * (1 - slo_percent / 100)
for slo in (99.0, 99.9, 99.95, 99.99):
print(f"{slo}% -> {allowed_downtime_minutes(slo):.1f} minutes per 30 days")
# 99.0% -> 432.0, 99.9% -> 43.2, 99.95% -> 21.6, 99.99% -> 4.3The core principles
The rest of this track expands each of these. Together they form a system: each one makes the others work.
- Service level objectives. Define reliability as a measurable target for what users experience. Everything else hangs from this.
- Error budgets. The gap between the target and 100% is a budget that may be spent on releases, experiments and risk. While budget remains, ship. When it is gone, the priority shifts to reliability. This replaces arguments between development and operations with a shared number.
- Eliminating toil. Manual, repetitive, automatable work is measured and engineered away, so that operational load does not grow with the service.
- Monitoring and alerting on symptoms. Page a human only when users are affected and a human needs to act. Everything else is a ticket or a dashboard.
- Release engineering. Most outages are caused by changes, so changes are made small, gradual, observable and reversible.
- Blameless postmortems. Incidents are studied for systemic causes, without blaming individuals, so that people report problems honestly and the organisation learns.
- Simplicity. Every line of code and every component is a liability as well as an asset. Boring, well-understood systems are easier to keep reliable.
If you adopt only one practice from SRE, make it SLOs with error budgets. It is the one that changes conversations: reliability work gets prioritised by data, and teams stop arguing about whether the system is "reliable enough".