Requirements Engineering: Nghệ thuật Hiểu đúng Bài toán trước khi Giải

Có một câu nói nổi tiếng trong ngành phần mềm: "If you don't know where you're going, any road will take you there." Requirements Engineering (Kỹ nghệ yêu cầu) chính là la bàn giúp bạn xác định đích đến trước khi bắt đầu hành trình phát triển phần mềm.

Theo nghiên cứu của Standish Group, khoảng 70% dự án phần mềm thất bại không phải do kỹ thuật kém, mà do yêu cầu không rõ ràng hoặc thay đổi liên tục. Đây chính là lý do tại sao Requirements Engineering lại quan trọng đến vậy.

Requirements là gì? Phân loại cơ bản

Requirements (yêu cầu) là mô tả về những gì hệ thống cần làm và các ràng buộc mà nó phải tuân theo. Chúng ta chia requirements thành hai loại chính:

1. Functional Requirements (Yêu cầu chức năng)

Đây là những gì hệ thống phải làm - các tính năng, hành vi cụ thể mà người dùng mong đợi.

Ví dụ thực tế:

  • "Người dùng có thể đăng nhập bằng email và mật khẩu"
  • "Hệ thống gửi email xác nhận sau khi đặt hàng thành công"
  • "Admin có thể xem báo cáo doanh thu theo tháng dưới dạng biểu đồ"

Chú ý: Functional requirements nên cụ thể, đo lường được, và tránh mơ hồ. So sánh hai cách viết:

  • "Hệ thống phải nhanh" (mơ hồ)
  • "Trang chủ phải load trong vòng 2 giây với 1000 người dùng đồng thời" (cụ thể, đo được)

2. Non-Functional Requirements (Yêu cầu phi chức năng)

Đây là những ràng buộc về cách thức hệ thống hoạt động - chất lượng, hiệu năng, bảo mật. Chúng thường bị bỏ qua nhưng lại cực kỳ quan trọng.

Các nhóm phổ biến:

Performance (Hiệu năng):

  • "API response time < 200ms cho 95% requests"
  • "Hệ thống xử lý được 10,000 transactions/giây"

Scalability (Khả năng mở rộng):

  • "Hỗ trợ từ 1,000 lên 100,000 người dùng mà không cần redesign"

Security (Bảo mật):

  • "Mật khẩu phải được hash bằng bcrypt với cost factor 12"
  • "API phải sử dụng OAuth 2.0 cho authentication"

Usability (Khả năng sử dụng):

  • "Người dùng mới có thể hoàn thành đơn hàng đầu tiên trong 3 phút"

Reliability (Độ tin cậy):

  • "Uptime 99.9% (downtime tối đa 8.76 giờ/năm)"

Maintainability (Khả năng bảo trì):

  • "Code coverage phải đạt tối thiểu 80%"
  • "Mỗi module phải có documentation đầy đủ"

Tại sao phân biệt hai loại này lại quan trọng?

Functional requirements quyết định features bạn build. Non-functional requirements quyết định architecture bạn chọn. Ví dụ:

  • Nếu yêu cầu xử lý 1 triệu users đồng thời → bạn cần kiến trúc microservices, load balancer, caching
  • Nếu yêu cầu downtime = 0 → bạn cần redundancy, failover mechanisms
  • Nếu yêu cầu bảo mật cao → bạn cần encryption, audit logs, penetration testing

Quy trình Khơi gợi Yêu cầu (Requirements Elicitation)

Khơi gợi yêu cầu là nghệ thuật "khai thác" nhu cầu thực sự từ stakeholders. Đây là giai đoạn khó nhất vì:

  • Stakeholders không phải lúc nào cũng biết họ muốn gì
  • Họ biết nhưng không diễn đạt được
  • Họ nói một đằng nhưng thực tế cần một nẻo

Các kỹ thuật Elicitation hiệu quả

1. Interviews (Phỏng vấn)

Nói chuyện trực tiếp với stakeholders - từ end-users đến managers.

Tips để phỏng vấn hiệu quả:

  • Chuẩn bị câu hỏi mở: "Bạn làm công việc này như thế nào hiện tại?" thay vì "Bạn có cần tính năng X không?"
  • Tìm hiểu workflow thực tế, không chỉ workflow lý tưởng
  • Hỏi về pain points: "Điều gì làm bạn mất nhiều thời gian nhất?"
  • Listen actively và đặt câu hỏi follow-up

2. Observation (Quan sát)

Đôi khi người dùng làm khác với những gì họ nói. Hãy quan sát họ làm việc thực tế.

Ví dụ: Bạn đang làm app cho nhân viên bán hàng. Thay vì chỉ hỏi họ cần gì, hãy đi cùng họ một ngày. Bạn có thể phát hiện:

  • Họ phải nhập thông tin khách hàng đến 3 lần vào các hệ thống khác nhau
  • Họ làm việc chủ yếu trên mobile, không phải desktop
  • Khu vực họ làm việc có sóng internet yếu

→ Requirements thực sự: Offline-first mobile app với auto-sync và single data entry.

3. Workshops & Brainstorming

Tập hợp nhiều stakeholders cùng lúc để thảo luận. Kỹ thuật hữu ích:

  • User Story Mapping: Vẽ journey của user, xác định các bước và pain points
  • Design Thinking workshops: Empathize → Define → Ideate → Prototype → Test

4. Prototyping

"Show, don't tell." Tạo mockup hoặc prototype để stakeholders visualize được sản phẩm.

Low-fidelity: Wireframes vẽ tay, Figma sketches
High-fidelity: Interactive prototype với Figma/Adobe XD

Lợi ích: Stakeholders dễ feedback hơn khi thấy được giao diện cụ thể, tránh hiểu lầm.

5. Questionnaires & Surveys

Hữu ích khi bạn có nhiều users cần gather feedback, nhưng:

  • Câu hỏi phải rõ ràng, không leading
  • Kết hợp multiple choice với open-ended questions
  • Response rate thường thấp → cần incentives

6. Document Analysis

Đọc tài liệu hiện có: user manuals, business processes, competitor analysis, support tickets.

Insight từ support tickets: Nếu 60% tickets là về "quên mật khẩu" → yêu cầu: tích hợp social login hoặc passwordless authentication.

Tài liệu hóa Yêu cầu: BRD vs SRS

BRD (Business Requirements Document)

Ai viết: Business Analyst
Đối tượng: Stakeholders, management
Nội dung: HIGH-LEVEL business goals, không đi sâu technical

Cấu trúc điển hình:

  1. Executive Summary
  2. Business Objectives (tại sao cần dự án này?)
  3. Stakeholders (ai liên quan?)
  4. Scope (trong/ngoài phạm vi)
  5. Success Metrics (đo lường thành công thế nào?)
  6. High-level Requirements
  7. Assumptions & Constraints

Ví dụ BRD requirement: "Tăng tỷ lệ chuyển đổi từ visitor sang customer lên 15% trong Q2 bằng cách đơn giản hóa checkout process."

SRS (Software Requirements Specification)

Ai viết: System Analyst, Technical Lead
Đối tượng: Development team, QA
Nội dung: DETAILED technical specifications

Cấu trúc điển hình:

  1. Introduction & Scope
  2. Overall Description (user classes, constraints)
  3. Detailed Functional Requirements (use cases, user stories)
  4. Non-Functional Requirements (performance, security...)
  5. System Features
  6. External Interface Requirements (APIs, hardware)
  7. Data Requirements (database schemas, data flow)

Ví dụ SRS requirement: "FR-101: Hệ thống cho phép guest checkout không cần đăng ký. User nhập email, shipping address, payment info. Hệ thống validate email format, kiểm tra địa chỉ qua Google Maps API, xử lý payment qua Stripe. Response time < 3s."

Mối quan hệ BRD - SRS

Think of it như một pyramid:

  • BRD: "Tại sao?" và "Cái gì?" (business perspective)
  • SRS: "Như thế nào?" và "Chi tiết ra sao?" (technical perspective)

BRD được viết trước, sau đó được "refine" thành SRS với technical details.

Quản lý Thay đổi Yêu cầu: Đối phó với Scope Creep

Scope Creep là hiện tượng requirements liên tục được thêm vào mà không điều chỉnh timeline/budget. Đây là "kẻ thù số 1" của mọi project manager.

Nguyên nhân Scope Creep

  1. Yêu cầu ban đầu không rõ ràng → stakeholders "nhớ ra" features sau
  2. Thiếu change control process → ai cũng có thể đề xuất tính năng mới
  3. "While you're at it..." syndrome → "Đã làm feature A rồi thì làm luôn B đi"
  4. Gold plating → Developer tự thêm features "hay ho" mà không ai yêu cầu

Strategies để Control Scope

1. Baseline Requirements

Sau khi sign-off BRD/SRS, tạo một baseline - bản requirements chính thức được approve. Mọi thay đổi đều phải so sánh với baseline này.

2. Change Request Process

Thiết lập quy trình formal cho mọi thay đổi:

  • Submit: Stakeholder điền Change Request Form
  • Analyze: Đánh giá impact (effort, timeline, cost)
  • Approve/Reject: Change Control Board (CCB) quyết định
  • Implement: Nếu approved, update baseline và thông báo team

3. MoSCoW Prioritization

Phân loại requirements theo độ ưu tiên:

  • Must have: Critical, không có thì sản phẩm fail
  • Should have: Quan trọng nhưng có workaround tạm thời
  • Could have: Nice to have nếu còn time/budget
  • Won't have (this time): Để lại cho version sau

Khi có change request mới, classify nó vào MoSCoW và trade-off với existing requirements.

4. Timeboxing

Với Agile, fix timeline cho sprint nhưng flexible về scope. Features không hoàn thành được chuyển sang sprint sau.

5. Documentation & Communication

Mọi requirements change phải:

  • Được ghi nhận rõ ràng (ai yêu cầu, khi nào, tại sao)
  • Communicate với toàn bộ team
  • Update vào backlog/issue tracker

Khi nào nên chấp nhận Change?

Không phải mọi change đều là "scope creep xấu". Chấp nhận khi:

  • Có critical bug/security issue phát hiện
  • Thị trường/competitor thay đổi đột ngột
  • Compliance/legal requirements mới xuất hiện
  • Change mang lại ROI rõ ràng và không làm delay critical milestones

Best Practices cho Requirements Engineering

Involve stakeholders sớm và thường xuyên
Đừng đợi đến cuối mới cho họ xem sản phẩm.

Viết requirements testable
Mỗi requirement nên có acceptance criteria rõ ràng để QA test.

Sử dụng User Stories cho Agile
Format: "As a [role], I want [feature] so that [benefit]."
Example: "As a customer, I want to save items to wishlist so that I can purchase them later."

Traceability Matrix
Map mỗi requirement đến design, code, và test cases. Đảm bảo không có requirement nào bị "lạc mất".

Validation vs Verification

  • Validation: "Are we building the RIGHT product?" (theo đúng nhu cầu user?)
  • Verification: "Are we building the product RIGHT?" (theo đúng spec?)

Review & Update thường xuyên
Requirements không phải "khắc trên đá". Review định kỳ để đảm bảo vẫn relevant.

Common Pitfalls cần tránh

Ambiguous language
Tránh từ mơ hồ như "fast", "user-friendly", "robust". Thay bằng metrics cụ thể.

Goldplating
Không tự ý thêm features mà stakeholder không yêu cầu, kể cả khi bạn nghĩ nó "cool".

Analysis Paralysis
Đừng cố gắng document 100% requirements trước khi bắt đầu code. Với Agile, embrace iterative refinement.

Ignoring Non-Functional Requirements
Nhiều team chỉ focus vào features mà quên security, performance, scalability → technical debt khổng lồ sau này.

Key Takeaways

  • Requirements Engineering quyết định 70% thành công của dự án
  • Phân biệt rõ Functional (cái gì) vs Non-Functional (như thế nào) Requirements
  • Elicitation cần đa dạng kỹ thuật: interviews, observation, prototyping, workshops
  • BRD cho business view, SRS cho technical details
  • Scope creep là thực tế - quản lý nó bằng change control process và prioritization
  • Requirements phải specific, measurable, testable

Trong bài tiếp theo, chúng ta sẽ khám phá System Design & Design Patterns - cách chuyển requirements thành kiến trúc hệ thống cụ thể và các mẫu thiết kế giúp giải quyết vấn đề tái diễn.


Bài viết thuộc series "From Zero to AI Engineer" - Module 1: Development Process