Nguyen Le PhongNguyen Le Phong

Reviewer là người đọc đến sớm

Xem reviewer như người đầu tiên đọc thay cho tương lai giúp pull request rõ hơn, câu hỏi bớt gây nhiễu và quyết định dễ bảo trì hơn.

Pull request chỉ đổi vài file, CI đã xanh, phần mô tả có mấy dòng và một câu bảo rằng hành vi “khá hiển nhiên”. Đến cuối buổi chiều, reviewer mở nó ra rồi phải tự ghép câu chuyện từ những cái tên rời rạc, vài giả định không được viết xuống và một bài test cho thấy code chạy nhưng không nói vì sao điều đó đáng giữ.

Hai người ngồi cạnh một laptop; một người cầm bút chỉ vào màn hình có các khối nội dung.
Người đọc đầu tiên giúp kiểm tra xem phần thay đổi có tự kể được câu chuyện của nó hay không.

Reviewer thường được hình dung như người gác cổng: approve, block, yêu cầu sửa hay đòi thêm test. Chức năng ấy cần thiết, nhưng chưa đầy đủ. Reviewer còn là người đọc của tương lai đến sớm. Họ là người đầu tiên nhìn phần thay đổi mà không mang theo toàn bộ ký ức của tác giả về vấn đề.

Nhìn như vậy, mục tiêu của review không còn là bắt quả tang ai đó cẩu thả. Nó trở thành phép thử cho khả năng bảo trì: vì sao nhánh xử lý này tồn tại, vì sao thêm dependency kia, test đang giữ hành vi nào, và chỗ nào người đến sau không nên tiện tay sửa? Những câu hỏi đó nghiêm túc mà không cần biến review thành cuộc chấm điểm con người.

Người viết có thể giúp bằng cách coi pull request như một hộp thời gian nhỏ. Mô tả không cần dài, chỉ cần đủ bốn ý: thay đổi gì, vì sao làm lúc này, đã chấp nhận trade-off nào và kiểm tra bằng cách nào. Ảnh chụp, log hay ví dụ trước–sau làm giảm phần suy đoán mà reviewer phải gánh. Đó là sự tử tế rất thực dụng.

Người review cũng có thể hỏi theo góc nhìn của việc bảo trì sau này. Thay vì “chỗ này khó hiểu”, có thể hỏi: “Mình đặt tên theo luật nghiệp vụ được không, để người đọc không phải mở thêm ba file mới thấy ý định?” Thay vì “thêm test”, có thể hỏi: “Hành vi nào sẽ gây thiệt hại nếu âm thầm bị phá?” Tiêu chuẩn không hạ xuống; chỉ có nhiễu cảm xúc được bớt đi.

Góc nhìn ấy đặc biệt hữu ích với tri thức đang bị giấu. Nhiều thay đổi không sai về kỹ thuật, nhưng chỉ hiểu được nếu từng có mặt trong một cuộc nói chuyện riêng, một luồng Slack hoặc sự cố production mà vài người còn nhớ. Review là lúc thuận tiện để chuyển phần ngữ cảnh đó vào tên code, comment cần thiết, test hoặc chính lịch sử pull request.

Tất nhiên, không phải thay đổi nào cũng cần một bài luận. Có việc hoàn toàn cơ học, có bản sửa lỗi phải đi gấp. Ngay cả vậy, một câu đúng chỗ vẫn có thể tiết kiệm nhiều giờ đào bới: “Giữ response cũ trong lúc client mới đang rollout”, hay “Test này khóa lại cơ chế retry từng hỏng ở production”. Ngữ cảnh nhỏ hôm nay thường rẻ hơn khảo cổ lớn ngày mai.

Khi code review vận hành tốt, nó không chỉ bắt lỗi. Nó dạy cả nhóm hình hài của sự rõ ràng. Mọi người chia thay đổi nhỏ hơn vì dễ đọc hơn, gọi tên trade-off vì điều không nói ra sẽ thành mơ hồ, và xem review như việc cùng chăm một codebase thay vì phán xét cá nhân.

Reviewer đáng giá nhất không nhất thiết là người nói to nhất. Nhiều khi đó là người lặng lẽ đọc thay cho một đồng đội chưa xuất hiện. Nếu người ấy hiểu được quyết định mà không cần gọi tác giả quay lại kể chuyện, review đã làm xong phần việc cho hiện tại lẫn tương lai.

Bạn thấy bài viết thế nào?