Phase 01 — System Design Foundation | Topic 03

You receive a requirement:

“Build an Order Management System.”

What do you do first?

Open Visual Studio?

Create a database?

Create an OrderController?

Not yet.

Before writing code, we need to answer one simple question:

“What should the system actually do?”

That is the purpose of Functional Requirements.


What Are Functional Requirements?

Functional requirements describe the features, actions, and business operations that a system must provide.

In simple words:

Functional Requirements = What the system should do.

For example, an Order Management System might need to:

  • Register customers

  • Allow customers to place orders

  • Display order history

  • Allow order cancellation

  • Allow admins to view orders

  • Allow admins to update order status

  • Send order confirmation notifications

These are functional requirements because they describe actual system behavior.


Functional Requirements Start With Users

Before listing features, identify who will use the system.

For our Order Management System:

Customer

A customer might be able to:

  • Register and log in

  • Browse products

  • Place an order

  • View order history

  • Cancel an eligible order

  • Track order status

Admin

An admin might be able to:

  • View all orders

  • Update order status

  • Manage products

  • View customer information

  • Generate reports

  • Send notifications

Now we are getting a much clearer picture of the system.


Features vs User Actions

These two are related, but developers should understand the difference.

Feature

Order Management

User Action

Customer places an order.

Business Operation

The system creates the order, stores the order details, and updates the required information.

Think about it like this:

Feature → User Action → Business Operation

For example:

Order Cancellation → Customer cancels order → System validates whether cancellation is allowed and updates the order status.

This way of thinking becomes extremely useful when designing APIs and business logic.


Let's Convert Requirements Into APIs

Once we understand the functional requirements, we can start thinking about APIs.

For example:

[ApiController]
[Route("api/[controller]")]
public class OrdersController : ControllerBase
{
    // Create a new order
    [HttpPost]
    public IActionResult CreateOrder(OrderRequest request)
    {
        // Business logic goes here
        return Ok();
    }

    // Get a customer's order
    [HttpGet("{id}")]
    public IActionResult GetOrder(int id)
    {
        return Ok();
    }

    // Get all orders
    [HttpGet]
    public IActionResult GetOrders()
    {
        return Ok();
    }

    // Update order status
    [HttpPut("{id}/status")]
    public IActionResult UpdateStatus(int id, UpdateStatusRequest request)
    {
        return Ok();
    }

    // Cancel an order
    [HttpDelete("{id}")]
    public IActionResult CancelOrder(int id)
    {
        return Ok();
    }
}

Notice something important.

We didn't randomly create these APIs.

Each API came from a functional requirement.

For example:

Requirement

Possible API

Place Order

POST /api/orders

View Order

GET /api/orders/{id}

View Orders

GET /api/orders

Update Status

PUT /api/orders/{id}/status

Cancel Order

DELETE /api/orders/{id}

This is how requirements start turning into technical design.


But Functional Requirements Are More Than APIs

This is where many developers make a mistake.

They think:

Functional Requirement = API Endpoint

Not exactly.

An API is only one way of implementing a requirement.

Consider:

Customer can cancel an order.

The requirement does not tell us to simply execute:

order.Status = "Cancelled";

We also need to understand the business rules.

For example:

  • Can a shipped order be cancelled?

  • Can a delivered order be cancelled?

  • Can an already cancelled order be cancelled again?

  • Should the customer receive a notification?

  • Should inventory be restored?

Now the functional requirement is becoming a real business operation.


Functional Requirements Drive the System Design

This is why requirements should be understood before architecture.

A simple requirement such as:

“Send an email after an order is placed.”

can lead to additional design questions:

  • Should email sending happen immediately?

  • What happens if the email service is unavailable?

  • Should failed emails be retried?

  • Should email processing happen in the background?

  • Do we need a message queue?

A simple business requirement can therefore influence:

API → Business Logic → Database → Background Processing → Messaging → Resilience

This is the real connection between requirements and System Design.


A Simple Checklist

Before designing your application, ask:

👤 Users

Who will use the system?

⚙️ User Actions

What can each user do?

🧩 Features

What features does the system need?

💼 Business Operations

What business processes must the system support?

🗃️ Data

What information is required?

⚠️ Rules

What conditions or restrictions apply?

🔌 APIs

What operations need to be exposed?

If you can answer these questions, you have a much stronger foundation for your system design.


IMPORTANT: Don't Start With Technology

When you receive a requirement, don't immediately think:

“Should I use ASP.NET Core, SQL Server, Redis or Microservices?”

First understand:

What should the system do?

Then identify:

Users → Actions → Features → Business Operations → Data → APIs

Only after that should you start making architectural and technology decisions.


Final Takeaway

A strong developer doesn't just ask:

“How do I implement this?”

A strong developer first asks:

“What exactly does the system need to do?”

That small change in thinking can make your API design, database design, business logic, and overall architecture much clearer.

And this is one of the first steps in moving from:

“I write .NET code.”

to

“I can design .NET systems.”


What's Next?

Phase 01 — System Design Foundation | Topic 04 — Non-Functional Requirements: How Should the System Work?

In the next article, we'll look at the other side of requirements:

Performance, scalability, availability, security, reliability, and more.