Framework RADIO - Cách tiếp cận có hệ thống cho Front-end System Design

Phong Hy

Mình mới đọc được một bài viết khá hay trên Linkedin về RADIO framework - được thiết kế riêng để trả lời các câu hỏi thiết kế hệ thống front-end (front-end system design) một cách có cấu trúc. Thú thực là trước đây mình hay bị lạc đề khi gặp những câu hỏi mở kiểu "Thiết kế Facebook" hay "Thiết kế YouTube", nhưng với framework này thì mọi thứ rõ ràng hơn nhiều.

RADIO Framework là gì?

RADIO là viết tắt của năm bước chính trong thiết kế hệ thống front-end:

  • Requirements - Yêu cầu
  • Architecture - Kiến trúc
  • Data Model - Mô hình dữ liệu
  • Interface - Giao diện (API)
  • Optimizations - Tối ưu hóa

Ý tưởng chính của front-end system design framework này là: khi bạn có một cấu trúc tốt, bạn đã thắng một nửa trận đánh system design interview rồi.

1. Requirements Exploration - Hiểu rõ đề bài System Design

Thời gian khuyến nghị: Không quá 15% buổi phỏng vấn

Đây là bước quan trọng nhất trong front-end system design nhưng nhiều người hay bỏ qua. Các câu hỏi system design thường mơ hồ và thiếu thông tin nhất định. Bạn phải chủ động đặt câu hỏi để làm rõ requirements.

Đừng ngại hỏi trong System Design Interview

Hãy tưởng tượng interviewer bảo bạn "Thiết kế Facebook". Facebook thì có news feed, profile, bạn bè, nhóm, stories... Cái nào là trọng tâm của system design này? Nếu bạn không hỏi mà cứ lao vào thiết kế luồng kết bạn, có thể interviewer đang muốn bạn tập trung vào news feed thì bạn mất điểm ngay.

Một số câu hỏi nên đặt trong front-end system design:

Use case chính là gì?

Với Facebook thì là news feed, phân trang feed, và đăng bài mới. Với YouTube thì là trải nghiệm xem video. Đây là functional requirements quan trọng nhất.

Functional vs Non-functional requirements?

  • Functional requirements: Những tính năng cơ bản không thể thiếu - user có thể hoàn thành các luồng chính đúng cách không.
  • Non-functional requirements: Performance, scalability, UX tốt hơn - không bắt buộc nhưng làm sản phẩm tốt hơn.

Tính năng nào là core, nào là nice-to-have?

Ví dụ đăng bài thì có text, photo, video, poll, check-in... cái nào là bắt buộc trong system design này?

Một số câu hỏi khác cần hỏi trong front-end system design:

  • Hỗ trợ nền tảng nào? Desktop/mobile/tablet?
  • Cần offline support không?
  • User chính là ai?
  • Performance requirements?

Mẹo nhỏ cho System Design

Hãy ghi lại các yêu cầu đã thống nhất để có thể tham chiếu suốt bài thi và đảm bảo bạn đã cover hết requirements.

2. Architecture / High-level Design - Thiết kế kiến trúc Front-end

Thời gian khuyến nghị: Khoảng 20% buổi phỏng vấn

Khi đã hiểu rõ requirements, hãy vẽ sơ đồ kiến trúc. Mỗi component là một hình chữ nhật, mũi tên thể hiện luồng dữ liệu.

Các component thường gặp trong Front-end Architecture

  • Server: coi như black box, assume có API để gọi qua HTTP/WebSockets
  • View: những gì user thấy, có thể chứa subview nhỏ hơn
  • Controller: xử lý tương tác user và chuẩn bị dữ liệu cho view (không phải lúc nào cũng cần)
  • Model/Client store: nơi lưu dữ liệu, thường là app-wide

Ví dụ với News Feed Architecture

┌─────────────────────────────────────┐
│           Feed UI                   │
│  ┌────────────┐  ┌──────────────┐   │
│  │Feed Post   │  │Post Composer │   │
│  └────────────┘  └──────────────┘   │
└─────────────────────────────────────┘
                ↕
┌─────────────────────────────────────┐
│          Controller                 │
└─────────────────────────────────────┘
                ↕
┌─────────────────────────────────────┐
│         Client Store                │
└─────────────────────────────────────┘
                ↕
┌─────────────────────────────────────┐
│            Server                   │
└─────────────────────────────────────┘

Component responsibilities trong Front-end Architecture:

  • Server: Cung cấp feed data qua HTTP API, cho phép tạo bài mới
  • Controller: Điều phối luồng dữ liệu, gọi API
  • Client Store: Lưu data dùng chung toàn app
  • Feed UI: Chứa list posts và UI đăng bài
    • Feed Post: Hiển thị data một post, nút like/react/share/comment
    • Post Composer: UI để user tạo bài mới

Một số điểm cần lưu ý trong Front-end System Design

  • Separation of concerns: Mỗi component có mục đích rõ ràng
  • Nơi xử lý computation: Nên xử lý trên server hay client? Tùy context và sản phẩm

3. Data Model - Mô hình dữ liệu cho Front-end

Thời gian khuyến nghị: Khoảng 10% buổi phỏng vấn

Bây giờ hãy nghĩ xem có những trường dữ liệu nào trên client. Có hai loại chính:

Server-originated data

Dữ liệu từ server, thường lưu trong database và nhiều người xem hoặc truy cập từ nhiều devices.

Ví dụ: user data (name, profile picture), user-generated data (feed posts, comments).

Client-only data

Dữ liệu chỉ sống trên client, không cần gửi về server.

Data cần persist: User input như form fields - cần gửi về server và lưu vào database.

Ephemeral data: Trạng thái tạm thời - form validation state, tab hiện tại, section có đang expand không... có thể accept khi mất data khi đóng browser.

Ví dụ Data Model cho News Feed

Entity Belongs to Fields
Post Feed Post id, created_time, content, image, author, reactions
Feed Feed UI posts (list), pagination metadata
User Client Store id, name, profile_photo_url
NewPost Feed Composer message, image

Note: Tùy tiến độ bài thi và yêu cầu phát triển, bạn có thể thêm fields sau. Đây là quá trình động và lặp lại.

4. Interface Definition - Định nghĩa API cho Front-end

Thời gian khuyến nghị: Khoảng 15% buổi phỏng vấn

Định nghĩa interface giữa các components. API có thể là:

  • Server-client: HTTP/WebSocket APIs
  • Client-client: JavaScript functions

Mọi API đều có ba phần:

Phần Server-client Client-client
Tên và chức năng HTTP path JavaScript function
Parameters GET query, POST params Function parameters
Return Value HTTP response (JSON) Function return value

Ví dụ Server-client API: Lấy Feed

Request:

GET /feed

Parameters:
{
  "size": 10,
  "cursor": "=dXNlcjpXMDdRQ1JQQTQ"
}

Response:

{
  "pagination": {
    "size": 10,
    "next_cursor": "=dXNlcjpVMEc5V0ZYTlo"
  },
  "results": [
    {
      "id": "123",
      "author": {
        "id": "456",
        "name": "John Doe"
      },
      "content": "Hello world",
      "image": "https://www.example.com/feed-images.jpg",
      "reactions": {
        "likes": 20,
        "haha": 15
      },
      "created_time": 1620639583
    }
  ]
}

5. Optimizations and Deep Dive - Tối ưu hóa Front-end

Thời gian khuyến nghị: Khoảng 40% buổi phỏng vấn

Đây là phần chiếm nhiều thời gian nhất trong front-end system design. Không đủ thời gian để cover hết mọi thứ, nên hãy chọn khéo.

Chiến lược chọn topic trong System Design Interview

Tập trung vào phần quan trọng của sản phẩm: E-commerce thì nói về performance, collaborative editor thì nói về race conditions và concurrent modifications.

Chơi sở trường: Nếu bạn giỏi accessibility thì nói sâu về nó, giỏi performance thì nói về các optimization techniques.

Các chủ đề có thể nói trong Front-end System Design

  • Performance: Load time, interaction speed
  • User Experience: Responsive, feedback, error handling
  • Network: Caching, compression, CDN
  • Accessibility (a11y): Keyboard navigation, screen reader support
  • Multilingual Support: i18n, l10n
  • Multi-device Support: Responsive design, Progressive Enhancement
  • Security: XSS protection, CSRF tokens, content security policy

Tóm tắt Framework RADIO cho System Design

Step Objective Duration
Requirements Hiểu rõ đề và xác định scope <15%
Architecture Xác định components và quan hệ ~20%
Data Model Mô tả entities và fields ~10%
Interface Định nghĩa API giữa components ~15%
Optimizations Discuss optimization opportunities ~40%

Framework này giúp mình có một cấu trúc rõ ràng khi đối mặt với các câu hỏi front-end system design. Quan trọng nhất là bước Requirements - nếu bạn không hiểu rõ đề từ đầu, có thể thiết kế sai hoàn toàn hướng đi trong system design interview.

Kết luận về Front-end System Design

Hy vọng RADIO framework này giúp ích được cho các bạn đang chuẩn bị cho các buổi phỏng vấn system design front-end! Đừng quên luyện tập với các câu hỏi thực tế và làm quen với các công cụ vẽ diagram như Excalidraw hoặc diagrams.net.