Decomposition — breaking a complex problem into smaller, manageable sub-problems that can be solved individually
Identifying requirements — what must the software do? Gathered through interviews, surveys, and observation of existing systems
Functional requirements — what the system must do (e.g. "allow users to log in")
Non-functional requirements — how it must perform (e.g. "must load in under 2 seconds", "must work on mobile")