Những Tiêu Chí Và Vấn Đề Khi Review Code
The Goal of Code Review (Mục đích của Code Review)
Code Review là quá trình đánh giá code để đảm bảo code đạt được những tiêu chuẩn về chất lượng và thiết kế. Mục đích của việc code review:
- Đảm bảo sản phẩm đạt chất lượng cao nhất.
- Đảm bảo chất lượng của codebase được cải thiện theo thời gian.
- Phát triển bản thân
- Soft Skills:
- Reviewer và reviewee được luyện khả năng trình bày, giải thích ý tưởng làm sao cho người khác dễ hiểu
- Học cách lắng nghe
- Hard Skills:
- Học hỏi, chia sẻ kỹ thuật, kinh nghiệm chuyên môn
- Soft Skills:
Code Review Points (Những Tiêu Chí Cần Review)
Functionality
- Kiểm tra logic xử lý đã đúng yêu cầu chưa?
- Nếu là một tiến trình nhiều bước, đảm bảo số lượng các bước và thứ tự các bước là tối ưu nhất
- Cập nhật đúng trạng thái
- Suy nghĩ như người dùng để tìm đủ corner cases, edge cases
- Để ý những vấn đề về concurrency (deadlock, race conditions, ...)
Design
- Code changes có làm thay đổi kiến trúc của code base không?
- Code changes có tích hợp được phần còn lại của hệ thống không?
- Đây có phải thời điểm để thêm tính năng này không?
- Code changes có khả năng mở rộng về sau không?
Readability
- Naming: một tên biến dễ hiểu là một tên biến đủ dài để thể hiện nó là gì và làm gì nhưng cũng không quá dài để đọc
- Style: nên thống nhất một coding style
- Comments: cần cô đọng, rõ ràng và chủ yếu giải thích vì sao (why) thay vì nó là gì (what)
- Complexity: Khi developer viết đoạn code tổng quát hơn mức cần thiết, hoặc thêm 1 tính năng mà hiện tại hệ thống chưa cần tới nó. Như vậy nó làm tăng độ phức tạp cho hệ thống.
- Duplication: logic của đoạn code thêm mới có trùng với function nào trước đó không?
Consistency
Sự thống nhất rất quan trọng, nhất là công việc về kỹ thuật. Sự thống nhất trong codebase giúp code dễ đọc hơn, tránh được bugs không đáng có, chuyển đổi dễ dàng hơn và tạo điều kiện cho làm việc nhóm thuận tiện hơn.
Nếu team có thống nhất về style guide, convention và codebase rõ ràng thì developer nên theo để tạo sự thống nhất.
Testing
Test rất quan trọng. Test như việc mình đi khám sức khỏe định kỳ. Nếu sức khoẻ của mình có vấn đề, bác sỹ sẽ có những khuyến cáo, điều chỉnh để mình cải thiện sức khỏe. Test giúp hệ thống phần mềm chạy đúng và phát triển bền vững.
Ta cần cung cấp đầy đủ unit test, integration test, end-to-end test.
Documentation
Những thay đổi về cách build, test, tương tác, logic xử lý quan trọng hay release code đều cần được cập tài liệu tương ứng.
Good Things
Code review không chỉ tập trung tìm lỗi mà ta cần tuyên dương và phổ biến những cách xử lý hay, hiệu quả (good practices) cho developer khác. Đôi khi việc tuyên dương developer làm gì tốt còn đem lại nhiều giá trị hơn là chỉ cho họ làm gì chưa tốt.
Code Review Process (Quy Trình Review Code)
- Reviewee (developer) thực hiện xong feature hoặc fix bugs
- Reviewee tạo merge request có tên nhánh theo format feature/create-user, feature/FC-4201, fix/update-user
- Reviewee đảm bảo code compile, unit tests, automation tests thành công
- Reviewee thông báo cho reviewer lập lịch code review
- Reviewer lên checklist những đầu việc cần review theo những tiêu chí trên và những tiêu chí cần thiết cho features, bugs tại thời điểm đấy.
- Reviewee đánh giá và thực hiện theo ý kiến thống của 2 bên
- Reviewer review lại và duyệt merge request
Attitude While Reviewing (Thái Độ Khi Review)
- Lịch sự
- Đóng góp
- Học hỏi và giáo dục không chỉ trích, chê bai
How to Write Code Review Comments? (Viết Bình Luận Như Nào?)
- Hãy lịch sự, tử tế. Tránh những bình luận mang tính chê bai khiến reviewee bực tức dẫn đến bất đồng quan điểm, khó tiếp thu, lắng nghe từ 2 phía, thậm chí gây mâu thuẫn nội bộ.
- Không nên: “Tại sao bạn dùng threads ở đây trong khi rõ ràng nó không đem lại lợi ích gì về hiệu năng”
- Nên: “Xử lý đồng thời (concurrency) ở đây sẽ tăng độ phức tạp của hệ thống. Vì nó không giúp tăng hiệu năng của hệ thống. Thay vì dùng nhiều threads, bạn có thể dùng single thread cho đơn giản”
- Giải thích tại sao bạn đưa ra ý kiến đấy. Nó sẽ giúp reviewee hiểu rõ hơn và học được thêm kiến thức, kinh nghiệm.
- Đưa ra hướng giải quyết. Không cần đưa ra một giải pháp cụ thể, chi tiết vì reviewee là người thực hiện feature hoặc fix bug. Họ có cơ hội để luyện tập và có thể đưa ra hướng giải quyết khác hay hơn
- Gán nhãn mức độ nghiêm trọng của comment:
- TODO (Critical): cần được xử lý ngay vì code changes ảnh hưởng tới codebase, security, … của hệ thống
- NIT (Nitpick): vấn đề thứ yếu. Bạn nên xử lý vấn đề đó nhưng nó không có ảnh hưởng lớn.
- OPTIONAL: “Tôi nghĩ cách này hay hơn nhưng nó không phải bắt buộc”
- FYI (For Your Information): “Tôi muốn bạn cần xử lý vấn đề này ở thời điểm này. Bạn có thể suy nghĩ cách xử lý sau“
Resolving Conflicts (Giải Quyết Tranh Luận)
- Lắng nghe. Cả 2 bên cần lắng nghe, hiểu rõ ý kiến của 2 bên
- Phân tích ưu nhược điểm của giải pháp của 2 bên và những giải pháp khác
- Phân tích ngữ cảnh, yêu cầu, tìm ra thứ tự ưu tiên tính chất của hệ thống (đặc biệt quan tâm tới tính mở rộng và bảo mật của hệ thống)
- Chọn ra giải pháp phù hợp với yêu cầu trên
- Nếu vẫn chưa chọn được giải pháp thì cần tham khảo ý kiến của:
- Cả team
- Technical Lead
- Head of Engineer
Best Practices
- Sử dụng thông tin, kiến thức kỹ thuật và dữ liệu để loại bỏ quan điểm, ý kiến chủ quan chưa đúng đắn. Giải thích bằng cách đưa những nguyên tắc liên quan sẽ thuyết phục hơn. Ví dụ: SOLID, KISS, …
- Less is more. Khi ta tập trung vào 1 merge request quá lâu, độ hiệu quả sẽ giảm dần theo thời gian và có thể dẫn tới nhiều bugs hơn. Small Commit → Short Review → Better Code. Vậy bao nhiêu là small commit? Theo dữ liệu của dev Google: ~250 lines of code / CR
- Checklist. Để tránh thiếu sót khi review, ta cần có checklist. Ở thời điểm đầu, checklist có thể ít đầu việc, nhưng nó sẽ được bổ sung theo thời gian. Với mỗi feature, có thể có những đầu việc cần kiểm tra khác nhau.
- Leverage Tools. “A good developer is a lazy developer”. Sử dụng các Tool Static Code Analysis trước khi review, ví dụ như SonarQube, ...
- Tăng tốc độ review code giúp hạn chế không khí nặng nề của buổi review, hạn chế việc phàn nàn từ phía developers. Ngoài ra, tiết kiệm được thời gian của cả reviewer + reviewee
📚️ Ronin Engineer: https://ronin-engineer.github.io/register-post
🏢 System Design VN: https://fb.com/groups/systemdesign.vn
References
- https://www.evoketechnologies.com/blog/code-review-checklist-perform-effective-code-reviews/
- https://google.github.io/eng-practices/review/reviewer/
- https://medium.com/transparent-data-eng/good-practices-of-code-review-guide-for-beginners-8c084cd70be3
Nếu anh em thấy hay thì mời bạn bè vô nhóm nhé. Anh em cần design hệ thống gì có thể comment để mọi người tham khảo nhé.
Cám ơn anh em 🙏
Nhóm đang cần writer và graphic designer nếu anh em có hứng thú thì comment ở dưới nhé. Khi tham gia anh em có quyền lợi sau 😉
- Trau dồi kỹ năng viết, kỹ năng chuyên môn
- Được chia sẻ tài liệu nghiên cứu
- Kết nối, học hỏi từ anh em trong nhóm
All rights reserved