WEBSITE ĐANG PHÁT TRIỂN

Code review như một công cụ mentoring - không phải kiểm soát

Tôi từng review code như một "quality gate" - tìm lỗi, reject, approve. Sau một sự việc với junior developer, tôi hiểu ra: Code review là opportunity tốt nhất để mentor mà không cần lên lịch buổi 1-on-1 riêng.

Cái comment làm tôi phải nhìn lại mình

Năm đó tôi là tech lead của một team 6 người. Tôi tự hào về code quality của team - PR rejection rate cao, comment kỹ, bug rate thấp.

Một hôm tôi review PR của Linh - junior developer mới 6 tháng. Tôi để lại 12 comments. Ngắn gọn, technical, đúng hết.

Một tuần sau Linh xin nghỉ. Trong exit interview, khi được hỏi lý do, cô ấy nói: "Em cảm thấy code của em lúc nào cũng sai hết. Không biết mình có đang tiến bộ không."

Tôi ngồi đọc lại 12 comments của mình. Tất cả đúng. Nhưng không một comment nào nói: "Approach này thú vị vì...", "Em đã handle được X tốt, phần Y có thể cải thiện bằng cách...", "Câu hỏi cho em: tại sao em chọn cách này thay vì Y?"

12 comments. 12 lần nói "sai". Không một lần nói "tốt". Không một lần giải thích tại sao, chỉ nói phải làm gì.

Đó là lúc tôi nhận ra: Tôi đang review code, không phải mentoring developer.


Bước ngoặt: Code review là gì thực sự?

Sau sự việc đó, tôi research và reflect nhiều hơn về code review.

Code review là một cơ chế có 3 mục đích:

  1. Quality gate: Catch bugs, enforce standards
  2. Knowledge sharing: Spread knowledge về codebase
  3. Mentoring: Grow developer skills

Hầu hết team tập trung vào mục đích 1 và bỏ qua hoàn toàn mục đích 3. Nhưng với junior và mid developer, mục đích 3 thường quan trọng hơn mục đích 1.

Lý do: Bug từ junior dev thường là symptom của knowledge gap. Fix bug mà không address knowledge gap → bug tương tự sẽ xuất hiện lại.


Bài học tôi rút ra: Framework cho mentoring code review

Nguyên tắc 1: Hỏi trước, phán sau

Thay vì: "Đây là anti-pattern. Refactor thành Repository pattern."

Dùng: "Tại sao em chọn approach này? Có cân nhắc Repository pattern không? Tôi tò mò muốn hiểu reasoning của em."

Câu hỏi có hai tác dụng:

  • Bạn có thể đang sai - developer có thể có context bạn không biết
  • Nếu developer không có lý do tốt, việc giải thích reasoning sẽ stick hơn là đọc instruction

Nguyên tắc 2: Acknowledge trước khi suggest

Mỗi review phải có ít nhất một comment nhận ra cái gì developer đã làm tốt.

Không phải khen cho có - mà là thực sự tìm thứ gì đó tốt để acknowledge. Luôn có.

✅ "Em đã handle error case khá tốt ở đây - throw specific exception thay vì generic là đúng.
   Một điều có thể strengthen thêm: thêm error context vào exception message.
   Thay vì throw new OrderException("Invalid"), có thể throw new OrderException($"Invalid order status: {order.Status} when processing payment")
   Điều này giúp debugging sau này dễ hơn nhiều."

Nguyên tắc 3: Explain "why", không chỉ "what"

Tệ nhất: "Refactor thành này."

Trung bình: "Nên dùng X thay vì Y."

Tốt: "Nên dùng X thay vì Y, vì X giúp testability tốt hơn - khi Y hardcode dependency, unit test sẽ phải mock entire service."

Developer học pattern khi họ hiểu reasoning, không chỉ khi họ biết rule.

Nguyên tắc 4: Phân loại comment

Tôi dùng prefix để developer biết level của mỗi comment:

[BLOCK]: Phải fix trước khi merge - security issue, potential bug, breaking change
[SUGGEST]: Nên fix - code quality, maintainability
[QUESTION]: Tôi không hiểu, cần clarify
[NIT]: Nice-to-have, không nhất thiết fix ngay
[LEARN]: Chia sẻ thêm context/pattern để developer học

Khi developer thấy 5 comments nhưng chỉ 1 là [BLOCK], họ biết PR không tệ - chỉ cần một fix nhỏ.

Nguyên tắc 5: Pair thay vì just comment khi complexity cao

Khi feedback quá phức tạp để giải thích qua comments, đừng viết essay dài. Ngồi lại 30 phút pair programming để walk through - đây effective hơn nhiều.


Gửi các bạn trẻ

Nếu bạn đang ở vai trò reviewee:

Khi nhận comment: Đừng defensive. Mọi comment - dù được diễn đạt tệ đến đâu - đều có information bạn có thể học. "Code này xấu" không helpful, nhưng "tại sao reviewer nghĩ code này xấu?" thì có.

Khi không hiểu comment: Hỏi. "Anh/chị có thể giải thích tại sao approach này tốt hơn không? Em muốn hiểu hơn." Đây không phải defensive - đây là learning.

Khi không đồng ý: Hỏi, không argue. "Anh/chị có thể share thêm context tại sao X tốt hơn Y không? Em đang thấy trade-off là..." Nếu sau discussion bạn vẫn không đồng ý - escalate professionally.


Bạn nghĩ sao?

Bạn đang review code theo approach nào? Và nếu bạn từng nhận review tệ - nó ảnh hưởng đến bạn như thế nào? Tôi tin rằng code review culture ảnh hưởng rất lớn đến psychological safety của team - muốn nghe góc nhìn của các bạn 👇


/Son Do - believe in basic

#1percentbetter #TechnicalLeadership #CodeReview #Mentoring #EngineeringCulture


Bài viết liên quan

Xem thêm
Technical Leadership & Engineering Culture

Khi AI làm được mọi thứ, thứ còn lại chính là bạn

Trong thời đại AI viết code, dự đoán bug, và generate bất kỳ tài liệu kỹ thuật nào, thứ không thể tự động hóa lại là điều đơn giản nhất: cuộc trò chuyện thật sự giữa người với người. Và chính điều đó đang trở thành lợi thế cạnh tranh lớn nhất của bạn.

Technical Leadership & Engineering Culture

Antigravity và nghệ thuật chống lại trọng lực tổ chức

Trọng lực tổ chức là cái lực vô hình kéo team về phía "những gì đã quen rồi". Để bay lên (antigravity), bạn phải hiểu rõ nó, đo lường nó, rồi mới có thể chống lại nó.

Technical Leadership & Engineering Culture

Mentoring junior developer không phải là dạy code

Sau 20 năm trong ngành và 7+ năm làm tech lead, tôi nhận ra: mentoring junior developers không phải là dạy code, mà là dạy cách suy nghĩ. Nếu bạn chỉ giải quyết các vấn đề cho họ, bạn đang cướp đi cơ hội để họ trở thành independent engineer. Thực ra cách lớn nhất để giúp junior phát triển là cùng học cách giải quyết vấn đề, chứ không phải đưa câu trả lời sẵn.