Who needs something?
Actor + context.
Different users can have conflicting goals.
Side 57
A study of software as a long-lived engineered artifact. Software engineering connects requirements, architecture, code, verification, deployment and maintenance under continuous change.
Requirements define what must be true for users and systems, along with the constraints under which the software must operate.
Actor + context.
Different users can have conflicting goals.
Observable result.
Outcome-oriented requirements resist premature implementation choices.
Latency, privacy, platform, cost?
Nonfunctional constraints often shape architecture more than feature count.
Concrete behavior.
Testable acceptance conditions reduce ambiguity between intent and implementation.
Design for change, not prophecy.
Likely volatility should influence modular boundaries.
Boundaries, interfaces and ownership determine whether one change stays local or spreads across the system.
Strong modules expose small stable interfaces.
High coupling increases change propagation and testing burden.
High cohesion makes components easier to reason about.
Interfaces should reveal what consumers need while hiding implementation detail.
State placement strongly affects concurrency, reliability and testability.
Dependency direction influences how easily components can be replaced.
Readable structure, explicit contracts and bounded side effects make behavior easier to change safely.
Good names reduce the amount of context a reader must reconstruct.
Small coherent functions are easier to test and compose.
Unbounded shared mutable state creates hidden interactions.
Error handling should preserve enough context for recovery or diagnosis.
Code review catches defects and spreads system knowledge beyond one author.
Different tests isolate different risks.
| Level | Scope | Strength | Risk |
|---|---|---|---|
| Unit | Small component | Fast, localized feedback | Can miss integration failure |
| Integration | Several components | Tests boundaries | More setup and slower feedback |
| End-to-end | Whole user path | High realism | Slower and more brittle |
| Property | Invariant over many inputs | Broad behavioral coverage | Requires good property definition |
| Regression | Previously failing case | Prevents recurrence | Can accumulate noise if poorly maintained |
A change is not complete until it can be released, observed and reversed safely.
Dependency and environment control reduce “works on my machine” drift.
Automated checks catch incompatibility close to the change that caused it.
Progressive rollout limits blast radius.
Logs, metrics and traces connect production symptoms to causes.
Reversibility changes the risk of deployment decisions.
Database and protocol migrations often require compatibility across versions.
Maintenance, dependency changes, user growth and shifting requirements continuously reshape the system.
Repair behavior that violates requirements.
Respond to new platforms, dependencies and environments.
Add new capabilities without destroying existing contracts.
Improve internal structure without intentionally changing external behavior.
Remove obsolete code, interfaces and dependencies deliberately.