- What should the app do?
- How well must the app do it?
Functional requirements
Functional requirements describe the visible features and behaviors of the system — the actions your users can perform and the outcomes you can test. For a simple photo-sharing app, typical functional requirements include:- A user can sign up.
- A user can upload a photo.
- A user can follow another user.
- A user can scroll their feed.
- A user can like and comment on posts.

Non-functional requirements
Non-functional requirements (NFRs) describe quality attributes and operational constraints rather than specific features. Common NFRs include latency, durability, scalability, availability, and cost. These requirements drive architectural choices even though users never ask for them explicitly. Ask questions like:- How fast should the feed load — 0.5 seconds or 8 seconds?
- Will uploaded photos survive a disk failure?
- Will the app support one million users during peak traffic or only a few hundred?

- A family photo app can tolerate occasional lag and lower availability.
- Instagram must serve millions (or billions) of users with low latency and high availability.
Non-functional requirements frequently conflict. Higher performance and higher availability usually increase cost and complexity. For example, maintaining hot standby machines to tolerate failures increases ongoing infrastructure expenses.
Ask targeted questions to decide what to build: Who are your users? What are expected peak loads? What latency, durability, and availability targets do you need? What is your budget for infrastructure and operational complexity?