Software Development Lifecycle (SDLC)
The software development lifecycle (SDLC) is the structured set of activities that transform stakeholder needs into running, maintained software. Whether your calendar says Waterfall or Scrum, the same kinds of work must occur: understand the problem, design a solution, build it, verify it, release it, and keep it healthy.
This page explains each phase in depth — why it exists, what artifacts it produces, what gates protect quality, and how feedback loops connect phases. Process model pages (Waterfall, Agile, Kanban, DevOps) show how teams sequence and overlap this work.
info
Informal "just build it" works until complexity, compliance, or team size make invisible work dangerous. An explicit lifecycle:
- Makes risk visible early (security, performance, integration) instead of at go-live.
- Creates shared artifacts so knowledge is not trapped in one developer's head.
- Defines gates — points where you decide proceed, iterate, or stop.
- Enables auditability when regulation demands traceability from requirement to release.
- Aligns architecture decisions with moments when evidence is available.
| Without lifecycle discipline | With lifecycle discipline |
|---|---|
| Scope discovered in production | Scope negotiated with acceptance criteria |
| Architecture by accident | Architecture with ADRs and review |
| Testing as leftover time | Testing planned with risk-based coverage |
| Deploy as heroics | Deploy as automated, reversible routine |
| Maintenance as firefighting | Maintenance as product work with SLOs |
Purpose: decide what problem to solve, for whom, and what "done" means — before committing expensive design and code.
Activities include elicitation (interviews, observation, analytics), analysis (conflict resolution, MoSCoW), specification (user stories, use cases, FRD/PRD), and validation (walkthroughs, prototypes, acceptance criteria review).
| Artifact | Contents | Consumer |
|---|---|---|
| Problem statement | Who hurts, why now, success metric | Product + eng leadership |
| FR list / backlog | Behaviors the system must support | Design + implementation |
| NFR table | Measurable quality attributes | Architecture + ops |
| Acceptance criteria | Testable conditions per item | QA + developers |
| Trace matrix (regulated) | Req → design → test → release | Compliance |
Gate: requirements ready
Stakeholders agree priorities; NFRs are measurable; open questions listed; out-of-scope is explicit.
Why this phase exists
Building the wrong thing perfectly is still failure. Cheap clarification beats expensive rework.
best practice
Purpose: translate requirements into a structure that can be built, tested, operated, and evolved.
Design spans product UX, API contracts, data models, threat models, and software architecture. Architecture work here selects styles (monolith, hexagonal, services…), consistency models, and integration patterns — recorded in ADRs.
- High-level design: C4 Context/Container, major data stores, trust boundaries.
- Detailed design: module APIs, sequence flows for critical paths, schema drafts.
- Spikes: time-boxed experiments for unknown tech or performance risks.
- Reviews: architecture review board or lightweight peer ADR review.
| Artifact | Purpose |
|---|---|
| ADR set | Record irreversible or contested decisions |
| C4 diagrams | Shared mental model of structure |
| API contracts | Enable parallel frontend/backend work |
| Threat model | Drive security controls into design |
| Test strategy | Map risks to test types early |
note
Purpose: realize the design as working software in vertical slices that prove value and architecture together.
Prefer thin end-to-end slices over horizontal layer completion. Keep architecture fitness checks in CI so illegal dependencies fail the build. Pair implementation with contract tests when multiple teams share APIs.
- Coding standards, reviews, and trunk-based or short-lived branches.
- Feature flags for incomplete work on main.
- Continuous integration on every change.
- Documentation as code: OpenAPI, ADRs, runbooks updated in the same PR.
| 1 | # Illustrative — fail build on architecture rule breaches |
| 2 | jobs: |
| 3 | fitness: |
| 4 | steps: |
| 5 | - run: npx depcruise --validate .dependency-cruiser.js src |
| 6 | - run: npm test -- --grep "architecture" |
| 7 | - run: npm run lint |
Purpose: reduce the risk that defects, regressions, or NFR breaches reach users.
| Layer | Questions answered | Typical owner |
|---|---|---|
| Unit | Does this unit behave in isolation? | Developer |
| Integration | Do modules/DB/API collaborate? | Developer |
| Contract | Do provider/consumer stay compatible? | Team boundary |
| E2E | Does the user journey work? | QA + eng |
| Performance | Do we meet latency/throughput NFRs? | Perf eng / shared |
| Security | Are known classes of vuln absent? | Sec + eng |
Gates: critical path tests green; NFR tests for release-blocking attributes green; known defects triaged with severity. Shift-left means running cheap tests early and expensive ones when risk warrants.
Purpose: move verified software into production safely and reversibly.
- Automated pipelines: build → test → harden → deploy.
- Progressive delivery: canaries, blue/green, ring deployments.
- Feature flags and kill switches for rapid mitigation.
- Runbooks and change records where compliance requires them.
- Post-deploy verification: synthetic checks, SLO burn alerts.
warning
Purpose: keep the system valuable: fix defects, adapt to change, improve NFRs, and evolve architecture with evidence.
Maintenance is not "lesser" engineering. It includes incident response, dependency upgrades, cost optimization, accessibility remediation, and planned extractions of modules into services when requirements demand it.
| Signal from ops | Lifecycle response |
|---|---|
| Repeated incidents in one module | Redesign boundary; add tests; maybe extract |
| SLO burn on latency | Perf design spike; caching; query plan |
| Slow feature delivery | Reduce coupling; revisit process WIP |
| Audit finding | Traceability and control changes |
Linear diagrams lie. Real lifecycles are loops:
- Customer feedback → new/changed requirements.
- Test failures → design or implementation changes.
- Incidents → requirements for resilience and sometimes architecture changes.
- Metrics → prioritization (what to build next).
Gates are intentional pause points: requirements sign-off, design review, release readiness, go/no-go. Agile shortens gates; regulated Waterfall lengthens and formalizes them. Either way, gates without criteria become rubber stamps.
| 1 | [ ] Acceptance criteria met for in-scope items |
| 2 | [ ] NFR verification attached (perf/security as required) |
| 3 | [ ] Rollback plan tested or previously proven |
| 4 | [ ] Observability: dashboards + alerts for new paths |
| 5 | [ ] ADR updated if architecture changed |
| 6 | [ ] On-call aware of change window |
| Phase | Must-have artifacts | Optional / contextual |
|---|---|---|
| Requirements | Backlog + AC + NFR table | FRD, personas, trace matrix |
| Design | ADR + API draft + data sketch | Full C4, formal UML |
| Implementation | Code + tests + PR description | Spike reports |
| Testing | Results + known issues | Perf reports, pen-test |
| Deployment | Pipeline record + change log | CAB approval |
| Maintenance | Incidents + SLO reports | Debt roadmap |
How to apply: map your team's current work onto these phases even if you use Scrum — ensure each kind of work has an owner and a quality bar. Why each phase exists: it is cheaper to discover error in that phase than in a later one. Requirements mistakes are cheapest to fix in requirements; architecture mistakes are cheapest to fix in design spikes; etc.
pro tip
Community
Get help on Slack, Discord or VIP
Stuck on a guide? Join the community and ask.