Menu
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Đang tải...

System Design for PMs

Technical Product Manager Bài 2/60

Mở đầu — vì sao bài này quan trọng

Có một hiểu lầm phổ biến khiến nhiều PM kỹ thuật (Technical PM) tự làm khổ mình: họ nghĩ rằng để làm việc với kỹ sư về kiến trúc hệ thống, họ phải biết thiết kế hệ thống giống một Senior Engineer. Họ lao vào học cách vẽ sơ đồ, học thuộc các pattern, rồi đến buổi họp design lại lúng túng vì kỹ sư đi nhanh hơn và sâu hơn rất nhiều.

Sự thật là: bạn không thiết kế hệ thống — bạn đánh giá nó. Vai trò của bạn trong một buổi system design không phải là người vẽ ra giải pháp, mà là người đặt câu hỏi đúng, soi chiếu các đánh đổi (trade-off) với mục tiêu kinh doanh, và đảm bảo đội ngũ không chọn một phương án "đẹp về mặt kỹ thuật" nhưng "sai về mặt sản phẩm".

Đây là kỹ năng then chốt, vì 80% rủi ro lớn nhất của một sản phẩm công nghệ không nằm ở dòng code, mà nằm ở những quyết định kiến trúc được đưa ra rất sớm — khi chưa ai viết code. Một quyết định sai về việc "nên dùng một database hay tách nhiều service", "nên đồng bộ hay bất đồng bộ", "nên tự build hay dùng dịch vụ ngoài" có thể khiến team trả giá bằng nhiều tháng làm lại. PM không cần là người ra quyết định cuối cùng về kỹ thuật, nhưng PM phải là người đảm bảo quyết định đó được cân nhắc đầy đủ ở góc độ sản phẩm, chi phí và rủi ro.

Bài học này dạy bạn cách "đọc" một thiết kế hệ thống đủ sâu để tham gia có giá trị, đặt những câu hỏi khiến kỹ sư phải suy nghĩ kỹ hơn, và phát hiện những lỗ hổng mà chỉ một người nhìn từ góc sản phẩm mới thấy.

Khái niệm cốt lõi

"Đánh giá" khác "thiết kế" như thế nào

Hãy phân biệt rõ hai vai trò. Kỹ sư thiết kế: họ chọn công nghệ, vẽ luồng dữ liệu, quyết định cấu trúc bảng. Bạn đánh giá: bạn kiểm tra xem thiết kế đó có phục vụ đúng mục tiêu không, có chịu được tải thực tế không, có phù hợp ngân sách và thời gian không, và quan trọng nhất — đội ngũ đã cân nhắc các phương án thay thế nào.

Một PM giỏi trong buổi design không nói "chúng ta nên dùng Kafka". PM giỏi nói: "Nếu chúng ta dùng hàng đợi này, điều gì xảy ra khi message bị lỗi giữa chừng? Người dùng có thấy đơn hàng bị treo không?". Câu đầu là lấn sân; câu sau là tạo giá trị.

Bốn trục đánh đổi mà PM nào cũng phải nắm

Mọi thiết kế hệ thống đều là một loạt đánh đổi. Bạn không cần biết cách giải các đánh đổi này, nhưng phải nhận ra chúng đang tồn tại:

  • Tính nhất quán (Consistency) vs Tính sẵn sàng (Availability). Khi hệ thống phân tán, bạn thường phải chọn: dữ liệu luôn đúng-tuyệt-đối nhưng đôi khi từ chối phục vụ, hay luôn phục vụ nhưng đôi khi dữ liệu trễ vài giây. Với số dư ví điện tử, nhất quán là tối thượng. Với số lượt thích bài viết, trễ vài giây chẳng sao.
  • Đồng bộ (Synchronous) vs Bất đồng bộ (Asynchronous). Người dùng bấm nút và chờ kết quả ngay (đồng bộ), hay hệ thống nhận yêu cầu rồi xử lý ngầm và báo sau (bất đồng bộ)? Gửi email xác nhận nên bất đồng bộ; kiểm tra mật khẩu phải đồng bộ.
  • Đơn giản (Simplicity) vs Linh hoạt (Flexibility). Một giải pháp đơn giản triển khai nhanh nhưng khó mở rộng; một giải pháp linh hoạt thì ngược lại. Đa số startup chết vì chọn linh hoạt quá sớm.
  • Chi phí hiện tại vs Chi phí tương lai (Tech debt). Đi đường tắt hôm nay để kịp ra mắt là hợp lý — nếu cả team biết rõ mình đang vay nợ và có kế hoạch trả.

"Đắt" trong hệ thống nghĩa là gì

Khi kỹ sư nói "cái này đắt", họ thường không nói về tiền. "Đắt" có thể là: tốn nhiều thời gian phát triển, tốn tài nguyên máy chủ khi vận hành, khó bảo trì về sau, hoặc rủi ro cao khi có sự cố. Nhiệm vụ của PM là dịch chữ "đắt" mơ hồ đó thành con số cụ thể: đắt hơn bao nhiêu tuần? Tốn thêm bao nhiêu USD/tháng tiền cloud? Tiết kiệm được gì cho người dùng?

Bộ câu hỏi vàng để đánh giá một thiết kế

Đây là "vũ khí" chính của bạn. Bạn không cần câu trả lời sẵn — bạn cần câu hỏi đúng:

  • "Các đánh đổi của phương án này là gì? Chúng ta đang được gì và mất gì?"
  • "Còn cách nào khác không? Tại sao chúng ta loại bỏ phương án đó?"
  • "Điều gì xảy ra khi thành phần này hỏng (failure mode)? Người dùng thấy gì?"
  • "Thiết kế này chịu được bao nhiêu người dùng/giao dịch trước khi phải làm lại?"
  • "Phần nào khó đảo ngược nhất nếu sau này chúng ta sai?"
  • "Nếu chỉ có một nửa thời gian, ta sẽ cắt bớt phần nào?"
Câu hỏi cuối cùng đặc biệt quyền lực, vì nó buộc đội ngũ tách phần cốt lõi khỏi phần "đẹp nhưng chưa cần".

Tình huống thực tế

Tình huống 1 — Sàn TMĐT và bài toán "tồn kho hết hàng"

Một sàn thương mại điện tử tại Việt Nam (giả định, quy mô tương đương Tiki giai đoạn đầu) chuẩn bị chạy flash sale 12/12. Đội kỹ sư đề xuất kiến trúc: mỗi lần khách bấm "Mua", hệ thống kiểm tra tồn kho trực tiếp trong database chính rồi mới trừ kho.

PM không biết viết code đó, nhưng đặt một câu hỏi đánh giá: "Khi 50.000 người cùng bấm mua một món hàng chỉ còn 100 cái trong một giây, điều gì xảy ra?". Kỹ sư thừa nhận: database chính sẽ bị nghẽn, và tệ hơn — có thể bán vượt số lượng tồn kho (overselling) vì nhiều yêu cầu cùng đọc thấy "còn hàng" trước khi ai kịp trừ kho.

Cuộc trao đổi này dẫn đến phương án khác: dùng một lớp đếm tồn kho riêng trong bộ nhớ (in-memory counter) cho các mặt hàng flash sale, chấp nhận đánh đổi rằng con số tồn kho hiển thị có thể trễ vài giây, đổi lại không bao giờ bán vượt và hệ thống không sập.

Bài học: PM không đưa ra giải pháp kỹ thuật. PM chỉ ra một failure mode mà đội kỹ sư, do quá tập trung vào "đường đi hạnh phúc" (happy path), đã bỏ sót. Một câu hỏi đúng tiết kiệm hàng trăm triệu đồng doanh thu và uy tín thương hiệu.

Tình huống 2 — Ví điện tử và cám dỗ "microservices ngay từ đầu"

Một startup fintech ở TP.HCM (giả định, 8 kỹ sư) xây dựng ứng dụng ví điện tử. Tech Lead rất hào hứng đề xuất chia hệ thống thành 12 microservice ngay từ phiên bản đầu, vì "sau này scale lên hàng triệu người dùng sẽ cần".

PM đặt câu hỏi đánh giá: "Hiện tại chúng ta có bao nhiêu người dùng dự kiến trong 6 tháng đầu, và việc chia 12 service làm chậm thời gian ra mắt bao lâu so với một hệ thống gọn hơn?". Câu trả lời gây sốc: chia nhỏ ngay làm chậm ra mắt khoảng 3 tháng, trong khi mục tiêu 6 tháng chỉ là 20.000 người dùng đầu tiên — một con số mà một monolith được thiết kế gọn gàng thừa sức gánh.

PM tiếp tục: "Phần nào khó đảo ngược nhất?". Hóa ra việc tách một module ra thành service riêng về sau khá dễ; còn việc gộp 12 service đã lỡ tách thì rất khó. Kết luận: bắt đầu với một hệ thống đơn giản hơn, chỉ tách riêng phần thanh toán nhạy cảm.

Bài học: Cám dỗ "thiết kế cho tương lai" là một trong những cái bẫy đắt nhất. PM, với góc nhìn về thời gian ra thị trường và quy mô thực tế, là người duy nhất trong phòng có động cơ để hỏi "chúng ta có thực sự cần điều này bây giờ không?".

Tình huống 3 — App gọi xe và độ trễ thông báo tài xế

Một ứng dụng gọi xe ở Đông Nam Á (bối cảnh giống Grab thời kỳ đầu mở rộng) gặp phàn nàn: khách đặt xe nhưng tài xế nhận thông báo trễ 8–10 giây, dẫn đến tài xế gần đó mất chuyến vào tay tài xế xa hơn nhưng app báo nhanh hơn.

Trong buổi design lại, kỹ sư trình bày một kiến trúc xử lý phức tạp với nhiều tầng hàng đợi. PM đặt câu hỏi đánh giá rất cụ thể: "Trong toàn bộ luồng từ lúc khách bấm đặt đến lúc tài xế thấy thông báo, đâu là điểm tốn thời gian nhất?". Hóa ra 6 trong 10 giây nằm ở bước hệ thống quét toàn bộ tài xế trong thành phố để tìm người gần nhất, thay vì chỉ quét trong bán kính 3km.

PM hỏi tiếp: "Nếu chỉ quét tài xế trong vùng nhỏ quanh khách, ta mất gì?". Mất rất ít — vì 99% chuyến đi luôn ghép với tài xế trong bán kính 3km. Một thay đổi nhỏ về phạm vi tìm kiếm cắt độ trễ từ 10 giây xuống dưới 2 giây.

Bài học: PM không cần biết thuật toán tìm kiếm không gian (geospatial). PM chỉ cần kiên trì hỏi "đâu là điểm nghẽn lớn nhất" và "nếu đơn giản hóa thì ta mất gì", buộc đội ngũ định lượng vấn đề thay vì đưa ra giải pháp phức tạp cho phần không quan trọng.

Hướng dẫn từng bước

Đây là quy trình bạn có thể áp dụng cho bất kỳ buổi đánh giá thiết kế hệ thống nào:

  • Bắt đầu từ mục tiêu, không từ kỹ thuật. Trước buổi họp, viết ra một câu: "Hệ thống này phải làm được gì cho người dùng, ở quy mô nào?". Ví dụ: "Xử lý 5.000 đơn/phút trong giờ cao điểm, không bao giờ bán vượt tồn kho". Mọi đánh giá sau đó đều soi chiếu về câu này.
  • Yêu cầu kỹ sư vẽ luồng ở mức cao (high-level flow). Đề nghị họ vẽ các khối lớn và mũi tên dữ liệu chạy giữa chúng, bỏ qua chi tiết code. Nếu họ không vẽ được trong 5 phút, đó là dấu hiệu thiết kế chưa rõ ràng.
  • Hỏi về các phương án thay thế. Luôn hỏi "còn cách nào khác, và tại sao loại bỏ?". Một thiết kế tốt là thiết kế đã cân nhắc ít nhất 2–3 phương án. Nếu chỉ có một phương án, đội ngũ chưa suy nghĩ đủ.
  • Truy tìm các điểm hỏng (failure modes). Với mỗi khối trong sơ đồ, hỏi: "Nếu cái này hỏng/chậm/quá tải thì người dùng thấy gì?". Đây là nơi PM tạo giá trị lớn nhất, vì kỹ sư hay tập trung vào happy path.
  • Định lượng các đánh đổi. Biến mọi tính từ mơ hồ thành con số: "đắt" thành "thêm bao nhiêu tuần / bao nhiêu USD/tháng"; "chậm" thành "bao nhiêu mili-giây"; "không scale được" thành "sập ở mức bao nhiêu người dùng".
  • Xác định quyết định khó đảo ngược. Hỏi: "Phần nào của thiết kế này nếu sai thì rất khó sửa về sau?". Dành phần lớn thời gian tranh luận cho những quyết định một-chiều này, và để các quyết định dễ đảo ngược trôi nhanh.
  • Ghi lại quyết định và lý do. Sau buổi họp, viết một đoạn ngắn: chúng ta chọn phương án nào, vì sao, đã chấp nhận đánh đổi gì. Tài liệu này vô giá khi 6 tháng sau ai đó hỏi "tại sao hồi đó lại làm thế này".

Lỗi thường gặp & mẹo

Lỗi 1 — Giả vờ hiểu để khỏi mất mặt. Khi kỹ sư nói một thuật ngữ bạn không hiểu, đừng gật đầu cho qua. Hãy hỏi: "Anh giải thích giúp mình khái niệm đó ảnh hưởng tới người dùng thế nào?". Câu hỏi này vừa giúp bạn hiểu, vừa buộc kỹ sư liên hệ kỹ thuật với sản phẩm — điều họ thường quên.

Lỗi 2 — Lấn sân, tự đề xuất giải pháp kỹ thuật. Khi bạn nói "chúng ta nên dùng Redis", bạn vừa vượt quá vai trò, vừa có thể sai, vừa làm kỹ sư mất động lực. Hãy giữ mình ở vị trí người đặt câu hỏi và bảo vệ mục tiêu sản phẩm.

Lỗi 3 — Bỏ qua failure mode vì "hiếm khi xảy ra". Những sự cố hiếm nhưng nghiêm trọng (mất tiền, lộ dữ liệu, bán vượt kho) phải được bàn kỹ. "Hiếm" với hệ thống chạy hàng triệu lượt/ngày nghĩa là "vẫn xảy ra mỗi ngày".

Lỗi 4 — Để team thiết kế cho quy mô tưởng tượng. Nếu sản phẩm chưa có người dùng, đừng để đội ngũ tốn 3 tháng xây kiến trúc chịu được 10 triệu user. Hãy hỏi thẳng về con số thực tế trong 6–12 tháng tới.

Mẹo 1 — Dùng tỷ lệ thay vì con số tuyệt đối. Khi hỏi về tải, hãy hỏi "giờ cao điểm gấp mấy lần giờ thường?". Tỷ lệ này thường tiết lộ rủi ro rõ hơn con số trung bình.

Mẹo 2 — Học bằng cách dự nhiều buổi design. Bạn không cần đọc sách kiến trúc dày cộp. Dự 10 buổi system design, ghi lại các câu hỏi hay mà Senior Engineer đặt ra, và bạn sẽ tích lũy trực giác nhanh hơn bất kỳ khóa học nào.

Mẹo 3 — Vẽ lại sơ đồ bằng lời của bạn. Cuối buổi, hãy diễn đạt lại thiết kế bằng ngôn ngữ sản phẩm: "Tức là khi khách đặt hàng, hệ thống làm A, nếu A lỗi thì B...". Nếu bạn diễn đạt được, bạn đã hiểu đủ. Nếu không, hãy hỏi tiếp.

Bài tập thực hành

Bài tập 1 — Soi một thiết kế quen thuộc. Chọn một tính năng trong sản phẩm bạn đang làm (ví dụ: chức năng đặt lịch, giỏ hàng, thông báo). Viết ra 5 câu hỏi đánh giá theo bộ "câu hỏi vàng" ở trên. Mang chúng ra hỏi một kỹ sư trong team và ghi lại câu trả lời. Bạn sẽ ngạc nhiên vì có ít nhất một failure mode chưa ai từng bàn.

Bài tập 2 — Liệt kê đánh đổi. Lấy tình huống "ví điện tử chọn monolith hay microservices" trong bài. Viết một bảng hai cột: phương án A và phương án B, mỗi cột liệt kê "được gì / mất gì" theo bốn trục đánh đổi (nhất quán/sẵn sàng, đồng bộ/bất đồng bộ, đơn giản/linh hoạt, chi phí nay/chi phí sau). Bài tập này rèn tư duy đánh đổi cốt lõi.

Bài tập 3 — Truy tìm điểm nghẽn. Hãy mô tả luồng của một thao tác bạn làm hàng ngày trên một app (ví dụ: bấm "thanh toán" trên một ứng dụng), liệt kê tuần tự các bước hệ thống có thể đang làm, rồi đoán bước nào tốn thời gian nhất. Sau đó hỏi một kỹ sư xem bạn đoán đúng không. Đây là cách rèn trực giác về độ trễ.

Tóm tắt

Vai trò của Technical PM trong system design không phải là thiết kế — mà là đánh giá. Bạn không cần biết viết kiến trúc; bạn cần biết đặt câu hỏi đúng để soi chiếu mọi thiết kế với mục tiêu sản phẩm, quy mô thực tế và rủi ro kinh doanh.

Hãy ghi nhớ ba điều cốt lõi. Thứ nhất, mọi thiết kế là một loạt đánh đổi — nhiệm vụ của bạn là làm cho các đánh đổi đó hiện rõ và được định lượng. Thứ hai, giá trị lớn nhất bạn mang lại nằm ở việc truy tìm các điểm hỏng (failure modes) và những quyết định khó đảo ngược mà kỹ sư, do tập trung vào happy path và sự "đẹp" kỹ thuật, hay bỏ sót. Thứ ba, đừng lấn sân đề xuất giải pháp — hãy giữ mình ở vị trí người đặt câu hỏi và bảo vệ mục tiêu sản phẩm.

Bộ câu hỏi vàng — "Đánh đổi là gì?", "Còn cách nào khác?", "Khi hỏng thì người dùng thấy gì?", "Phần nào khó đảo ngược nhất?" — là công cụ bạn có thể mang vào mọi buổi họp ngay ngày mai. Bạn không cần trở thành kỹ sư giỏi nhất phòng. Bạn chỉ cần là người đặt câu hỏi sắc bén nhất phòng.