Menu
ESC

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

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

Đang tải...

Bài 11 — Đọc Code Pull Request như một PM

Technical Product Manager Bài 11/60

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

Có một niềm tin sai lầm rất phổ biến trong giới Product Manager: "Code là việc của engineer, PM không cần đụng vào." Niềm tin này nghe có vẻ hợp lý — bạn đâu phải người viết code, sao phải đọc Pull Request làm gì? Nhưng chính nó là ranh giới ngầm tách một Product PM bình thường khỏi một Technical PM thực thụ.

Pull Request (PR) — hay yêu cầu hợp nhất code — là đơn vị nhỏ nhất mà một thay đổi phần mềm đi qua trước khi được đưa vào sản phẩm. Mỗi feature bạn viết spec, mỗi bug bạn báo cáo, cuối cùng đều biến thành một hoặc nhiều PR. Đó là nơi ý tưởng trên giấy gặp hiện thực kỹ thuật. Và nếu bạn không bao giờ nhìn vào nơi đó, bạn đang quản lý sản phẩm bằng niềm tin chứ không phải bằng bằng chứng.

Hãy hình dung: bạn viết một spec dài 5 trang về tính năng "đặt lịch hẹn mentor". Hai tuần sau engineer báo "xong rồi". Bạn test trên staging, mọi thứ trông ổn. Nhưng ba tuần sau, khách hàng phản ánh rằng khi hai người đặt cùng một khung giờ trong vòng vài giây, hệ thống cho phép trùng lịch. Đây là một race condition (tình huống tranh chấp tài nguyên đồng thời) — và nó đã nằm rõ ràng trong PR mà engineer merge từ ba tuần trước. Nếu bạn biết đọc PR, bạn đã có thể đặt câu hỏi "Chuyện gì xảy ra nếu hai người bấm cùng lúc?" ngay khi review, thay vì để khách hàng phát hiện giúp.

Bài học này không biến bạn thành engineer. Mục tiêu khiêm tốn hơn nhưng cực kỳ giá trị: giúp bạn đọc một PR đủ để hiểu feature có thực sự khớp với ý định sản phẩm hay không, để bắt được những edge case engineer vô tình bỏ qua, và để xây dựng lòng tin với đội kỹ thuật bằng cách thể hiện rằng bạn quan tâm đến cách mọi thứ thực sự vận hành.

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

Pull Request là gì và nó chứa những gì

Một PR là một đề xuất thay đổi code. Nó gồm bốn phần mà PM nên nhận biết:

  • Tiêu đề và mô tả (description): Engineer giải thích PR này làm gì, giải quyết vấn đề nào, link tới ticket/spec liên quan. Đây là phần PM đọc trước tiên và đôi khi là phần duy nhất bạn thực sự cần đọc kỹ.
  • Diff (phần thay đổi code): Các dòng được thêm (màu xanh, dấu +) và xóa (màu đỏ, dấu -). Bạn không cần đọc hiểu từng dòng logic, nhưng cần biết file nào, vùng nào bị động đến.
  • Conversation (thảo luận): Các comment review qua lại giữa engineer. Đây là kho vàng — nơi những tranh luận kỹ thuật, đánh đổi, và quyết định được ghi lại.
  • Checks/CI: Các bài test tự động chạy trên PR. Màu xanh là pass, đỏ là fail. PM cần biết PR có đang "đỏ" không trước khi merge.

Ba lý do cốt lõi PM nên đọc PR

Thứ nhất — Kiểm chứng feature có đúng spec không. Spec là ý định; code là hiện thực. Khoảng cách giữa hai thứ này luôn tồn tại vì engineer phải tự lấp đầy hàng trăm chi tiết bạn không viết ra. Đọc PR là cách duy nhất bạn thấy được những chi tiết đó được lấp như thế nào.

Thứ hai — Bắt edge case bị bỏ sót. Engineer giỏi về kỹ thuật, nhưng bạn mới là người hiểu sâu nhất về hành vi người dùng và quy tắc nghiệp vụ. Khi đọc PR, bạn thường phát hiện những câu hỏi nghiệp vụ mà code chưa trả lời: "Nếu user nhập số tiền âm thì sao?", "Nếu user ở múi giờ khác thì giờ hiển thị thế nào?", "Nếu đơn hàng đã thanh toán rồi mà user bấm hủy thì sao?"

Thứ ba — Xây dựng lòng tin (trust) với engineer. Khi một PM chịu khó vào đọc PR, hỏi những câu hỏi thông minh về nghiệp vụ thay vì hỏi "bao giờ xong?", engineer cảm nhận được sự tôn trọng và đồng hành. Mối quan hệ chuyển từ "PM giao việc — engineer làm" sang "cùng nhau xây sản phẩm".

Đọc PR KHÔNG phải là review code

Đây là điểm gây nhầm lẫn lớn nhất, cần phân định rõ. Engineer review code để bắt lỗi kỹ thuật: hiệu năng, kiến trúc, bảo mật, code sạch hay bẩn. Đó không phải việc của bạn và bạn cũng không đủ năng lực làm việc đó — đừng cố. PM đọc PR với một lăng kính hoàn toàn khác: lăng kính nghiệp vụ và sản phẩm. Bạn không hỏi "đoạn code này có tối ưu không", bạn hỏi "hành vi mà đoạn code này tạo ra có đúng với điều người dùng cần không". Ranh giới này phải luôn nằm trong đầu bạn, nếu không bạn sẽ vừa làm phiền engineer vừa lạc lối trong những thứ ngoài tầm.

Tình huống thực tế

Tình huống 1 — Tiki và cái bẫy "giảm giá phần trăm"

Một PM tại một sàn thương mại điện tử lớn ở Việt Nam (gọi là sàn T) viết spec cho tính năng mã giảm giá: "Áp dụng voucher giảm 20% cho đơn hàng từ 200.000đ trở lên." Engineer implement xong, mở PR với mô tả ngắn gọn: "Add 20% discount voucher logic."

PM mở PR ra đọc. Phần mô tả không có gì đáng ngờ. Nhưng khi xem qua phần conversation, cô thấy một engineer khác đã comment: "Should we cap the max discount? A 200M VND order would get 40M off." PM khựng lại. Trong spec cô viết, cô chỉ nghĩ tới đơn hàng vài trăm nghìn — cô quên mất rằng có những khách doanh nghiệp đặt đơn vài trăm triệu. Một voucher 20% không giới hạn trần có thể tạo ra khoản giảm 40 triệu đồng cho một đơn duy nhất, đủ để âm vốn cả chương trình khuyến mãi.

PM lập tức comment vào PR: "Cảm ơn đã raise. Nghiệp vụ cần cap tối đa 100.000đ mỗi voucher. Mình sẽ update spec." Một dòng comment đó tiết kiệm cho công ty hàng chục triệu đồng tiền khuyến mãi thất thoát.

Bài học rút ra: Phần conversation trong PR thường chứa những câu hỏi nghiệp vụ mà engineer raise lên nhưng không ai có thẩm quyền trả lời. PM chính là người trả lời. Nếu PM không đọc, câu hỏi đó hoặc bị bỏ qua, hoặc engineer tự đoán — và đoán sai.

Tình huống 2 — Startup fintech và edge case "thanh toán hai lần"

Tại một startup fintech ở Singapore phục vụ thị trường Đông Nam Á, PM phụ trách luồng nạp tiền vào ví. Spec yêu cầu: "User nhập số tiền, bấm Nạp, hệ thống gọi cổng thanh toán, nếu thành công thì cộng tiền vào ví."

PR được mở. PM đọc phần diff và để ý thấy code chỉ kiểm tra duy nhất một điều kiện: "nếu cổng thanh toán trả về success thì cộng tiền". PM tự đặt câu hỏi từ kinh nghiệm sản phẩm của mình: Chuyện gì xảy ra nếu user bấm nút Nạp hai lần liên tiếp vì mạng lag? Hoặc nếu cổng thanh toán gửi callback success hai lần? Trong diff, cô không thấy bất kỳ cơ chế idempotency nào (đảm bảo một thao tác lặp lại nhiều lần chỉ có tác dụng một lần).

Cô comment: "Mình lo về double-charge. Nếu callback từ cổng đến hai lần với cùng transaction_id, ví của user có bị cộng tiền hai lần không? Hoặc tệ hơn, user có bị trừ tiền hai lần ở phía ngân hàng không?" Engineer đọc xong tái mặt — đúng là chưa xử lý. Họ thêm một lớp kiểm tra transaction_id duy nhất trước khi merge.

Bài học rút ra: PM không cần biết cách code chống double-charge (đó là việc engineer). PM chỉ cần biết đặt câu hỏi nghiệp vụ đúng: "Nếu thao tác này lặp lại thì sao?" Đây là loại edge case mà engineer trong guồng quay implement rất dễ bỏ sót, còn PM với góc nhìn người dùng lại nhìn ra ngay.

Tình huống 3 — Đội nội bộ và PR "âm thầm đổi hành vi"

Một PM tại một công ty SaaS B2B ở TP.HCM phụ trách tính năng phân quyền. Một hôm, trong lúc đọc lướt các PR của sprint (một thói quen cô duy trì 15 phút mỗi sáng), cô thấy một PR tên "Refactor permission check" — nghe có vẻ chỉ là dọn dẹp kỹ thuật, không đổi hành vi.

Nhưng khi đọc kỹ phần mô tả, cô thấy một dòng: "Also, now admins can edit other users' profiles." Khoan đã — đây không phải refactor, đây là một thay đổi hành vi sản phẩm. Việc cho phép admin sửa profile người khác là một quyết định nghiệp vụ và bảo mật lớn, cần thông qua privacy review (đặc biệt khi công ty đang phải tuân thủ Nghị định 13 về bảo vệ dữ liệu cá nhân). Engineer đã "tiện tay" thêm vào mà không ai phê duyệt.

PM block PR lại, kéo thay đổi đó ra thành một quyết định riêng để bàn bạc đúng quy trình.

Bài học rút ra: Những thay đổi hành vi nguy hiểm nhất thường núp dưới những cái tên vô hại như "refactor", "cleanup", "minor fix". Thói quen đọc lướt PR mỗi ngày giúp PM bắt được những "con ngựa thành Troy" này trước khi chúng vào sản phẩm.

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

Đây là quy trình thực dụng để đọc một PR với tư cách PM, áp dụng trong 5–15 phút:

Bước 1 — Đọc tiêu đề và mô tả trước. Trả lời câu hỏi: PR này nói nó làm gì? Nó có link đúng tới ticket/spec của tôi không? Nếu mô tả trống rỗng hoặc mơ hồ, đó đã là một red flag — hãy nhẹ nhàng yêu cầu engineer viết rõ hơn.

Bước 2 — Đối chiếu với spec. Mở spec của bạn bên cạnh. Lần lượt từng yêu cầu (requirement) trong spec, tự hỏi: "PR này có đề cập tới điều này không? Acceptance criteria của tôi đã được cover chưa?" Bạn đang kiểm tra độ phủ, không phải logic.

Bước 3 — Quét qua phần diff ở mức "file và hành vi". Đừng đọc từng dòng. Hãy nhìn xem PR động đến những file/màn hình nào. Nếu spec của bạn chỉ nói về màn hình thanh toán mà PR lại sửa cả file liên quan đến đăng nhập, hãy hỏi tại sao.

Bước 4 — Đọc kỹ phần conversation. Đây là phần giá trị nhất với PM. Tìm những câu hỏi engineer raise lên mà chưa được trả lời, đặc biệt những câu mang màu sắc nghiệp vụ ("should we...", "what if...", "do we need to handle..."). Đó là chỗ bạn vào cuộc.

Bước 5 — Đặt câu hỏi edge case bằng ngôn ngữ nghiệp vụ. Chạy qua checklist tinh thần của bạn: Input rỗng/sai/cực đại thì sao? Thao tác lặp lại thì sao? Người dùng ở trạng thái bất thường (chưa đăng nhập, đã bị khóa, múi giờ khác) thì sao? Lỗi mạng giữa chừng thì sao? Comment những câu hỏi này một cách lịch sự, đóng khung là câu hỏi chứ không phải mệnh lệnh.

Bước 6 — Kiểm tra trạng thái CI/checks. Nếu các bài test đang "đỏ", đừng hối thúc merge. Hỏi engineer xem đó là test thật sự fail hay chỉ là sự cố hạ tầng.

Bước 7 — Approve hoặc nêu quan ngại rõ ràng. Nếu mọi thứ ổn về mặt nghiệp vụ, hãy nói rõ "Về phía sản phẩm thì OK với mình" để engineer yên tâm. Nếu không, ghi rõ điều gì cần làm rõ trước khi merge.

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

Lỗi 1 — Cố review code như engineer. PM comment về dấu cách, tên biến, hay "đoạn này nên dùng vòng lặp khác" sẽ khiến engineer khó chịu và làm loãng vai trò. Hãy ở đúng lăng kính nghiệp vụ.

Lỗi 2 — Im lặng vì sợ "lộ ra mình không biết code". Nhiều PM né PR vì ngại bị đánh giá. Nhưng câu hỏi nghiệp vụ thông minh không đòi hỏi bạn biết code. "Nếu user bấm hai lần thì sao?" là câu hỏi vàng, không phải câu hỏi ngớ ngẩn.

Lỗi 3 — Trở thành nút thắt cổ chai (bottleneck). Nếu bạn đòi đọc và duyệt mọi PR, bạn sẽ làm chậm cả team. Hãy chọn lọc: đọc kỹ những PR động đến luồng nghiệp vụ quan trọng, lướt nhanh phần còn lại.

Mẹo 1 — Duy trì thói quen 15 phút đọc PR mỗi sáng. Lướt qua các PR mở của sprint giúp bạn bắt sớm những thay đổi hành vi bất ngờ, như tình huống "refactor" ở trên.

Mẹo 2 — Học cách đọc diff cơ bản trên GitHub/GitLab. Bạn không cần biết lập trình, chỉ cần hiểu màu xanh là thêm, đỏ là xóa, và biết cách tìm file bị đổi. Đây là kỹ năng đọc, không phải kỹ năng viết.

Mẹo 3 — Đóng khung comment như câu hỏi, không phải phán xét. "Mình tò mò, nếu... thì sao?" mở ra đối thoại; "Cái này sai rồi" đóng cửa nó lại. Giọng điệu quyết định việc bạn xây hay phá lòng tin với engineer.

Mẹo 4 — Ghi lại quyết định nghiệp vụ ngay trong PR. Khi bạn trả lời một câu hỏi nghiệp vụ trong PR, quyết định đó được lưu vĩnh viễn cạnh code. Sáu tháng sau, khi ai đó hỏi "tại sao voucher cap 100k?", câu trả lời đã nằm sẵn ở đó.

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

  • Đọc một PR thật. Vào repository của team bạn (hoặc một dự án mã nguồn mở trên GitHub nếu bạn chưa có quyền truy cập), chọn một PR đang mở liên quan đến tính năng bạn hiểu. Dành 15 phút đọc theo quy trình 7 bước ở trên. Viết ra 3 câu hỏi nghiệp vụ mà bạn sẽ comment.
  • Truy tìm edge case bị bỏ sót. Lấy một spec gần đây của bạn và liệt kê tối thiểu 5 edge case (input bất thường, thao tác lặp, trạng thái user bất thường, lỗi mạng, dữ liệu cực đại). Sau đó đối chiếu với PR tương ứng xem bao nhiêu trong số đó thực sự được xử lý.
  • Phân loại lăng kính. Cho 10 comment mẫu (tự nghĩ hoặc lấy từ PR thật), phân loại từng cái thuộc "lăng kính engineer" (kỹ thuật) hay "lăng kính PM" (nghiệp vụ). Mục tiêu: rèn phản xạ nhận ra đâu là việc của bạn.
  • Viết lại một comment phán xét thành câu hỏi. Lấy một comment mang giọng phán xét và viết lại thành câu hỏi mở, lịch sự, đóng khung nghiệp vụ.

Tóm tắt

Đọc Pull Request là kỹ năng phân biệt Technical PM với PM thông thường. Bạn không đọc PR để review code như một engineer — bạn đọc nó qua lăng kính nghiệp vụ và sản phẩm để trả lời ba câu hỏi: feature có đúng spec không, có edge case nào bị bỏ sót không, và bạn có đang xây dựng lòng tin với đội kỹ thuật không.

Những phần giá trị nhất với PM là mô tả (PR này nói nó làm gì), conversation (nơi engineer raise câu hỏi nghiệp vụ chờ bạn trả lời), và việc đối chiếu với spec. Sức mạnh thực sự của bạn không nằm ở việc đọc hiểu code, mà ở việc đặt đúng câu hỏi nghiệp vụ: "Nếu user làm điều bất thường này thì sao?" — loại câu hỏi mà engineer trong guồng implement rất dễ bỏ qua.

Hãy biến việc đọc PR thành một thói quen 15 phút mỗi ngày, luôn comment bằng giọng câu hỏi thay vì phán xét, và đừng trở thành nút thắt cổ chai. Làm được vậy, bạn không chỉ bắt được những lỗi tốn hàng chục triệu đồng trước khi chúng đến tay khách hàng, mà còn trở thành người đồng hành mà engineer thực sự tôn trọng.