Một cuộc thảo luận gần đây về việc tìm lỗi thông qua đọc code cẩn thận đã gây ra cuộc tranh luận sôi nổi giữa các lập trình viên về những phương pháp hiệu quả nhất để ngăn chặn lỗi, đặc biệt khi xử lý các hệ thống phần mềm quy mô lớn.
Cuộc trò chuyện tập trung vào việc liệu đọc code thủ công có thể đóng vai trò như một phương pháp đáng tin cậy để phát hiện lỗi hay không, hoặc liệu các phương pháp tự động như hệ thống kiểu và kiểm thử thuộc tính có thực tế hơn cho các tình huống phát triển trong thế giới thực.
Quy mô tạo ra các yêu cầu khác nhau
Cộng đồng chia rẽ mạnh mẽ về việc liệu các kỹ thuật đọc code có hoạt động ngoài các dự án nhỏ hay không. Trong khi một số lập trình viên báo cáo thành công trong việc tìm lỗi trong các triển khai 500 dòng, những người khác lại cho rằng phương pháp này trở nên không thực tế với các hệ thống phân tán hàng triệu dòng đã tích lũy 15 năm nợ kỹ thuật. Căng thẳng cốt lõi nằm giữa tầm nhìn lý tưởng về code được chế tác cẩn thận, dễ đọc và thực tế lộn xộn của các hệ thống kế thừa với các lớp trừu tượng chồng chất.
Nhiều lập trình viên có kinh nghiệm chỉ ra rằng các codebase lớn đòi hỏi các chiến lược hoàn toàn khác. Họ nhấn mạnh rằng hệ thống kiểu, kiểm tra bất biến và kiểm thử thuộc tính tự động trở thành những công cụ thiết yếu khi đạt đến giới hạn nhận thức của con người.
Công cụ Ngăn ngừa Lỗi Tự động
- Hệ thống kiểu dữ liệu để phát hiện các lỗi cơ bản
- Kiểm tra bất biến và xác nhận
- Kiểm thử thuộc tính tự động
- Đánh giá mã nguồn tập trung vào hợp đồng
- Lập trình phòng thủ với phát hiện lỗi sớm
- Chính sách không có stack trace trong nhật ký sản xuất
Mô hình tư duy so với công cụ
Một phần đáng kể của cuộc thảo luận tập trung vào việc xây dựng mô hình tư duy về cách code hoạt động so với việc dựa vào các công cụ tự động. Những người ủng hộ đọc code cho rằng việc hiểu hành vi chương trình thông qua phân tích cẩn thận giúp các lập trình viên viết code tốt hơn ngay từ đầu. Họ đề xuất theo dõi luồng điều khiển từ các hàm chính và theo dõi các thay đổi trạng thái qua các cấu trúc dữ liệu chính.
Tuy nhiên, những người hoài nghi đặt câu hỏi liệu phương pháp này có mở rộng được ngoài các hàm riêng lẻ hoặc các module nhỏ hay không. Họ lưu ý rằng ngay cả với việc đọc cẩn thận, các tương tác phức tạp giữa các thành phần hệ thống thường ẩn giấu những lỗi nghiêm trọng nhất.
Kỹ thuật đọc code
- Theo dõi luồng điều khiển bắt đầu từ main() hoặc các điểm vào của hệ thống
- Theo dõi các thay đổi trạng thái trên các cấu trúc dữ liệu quan trọng
- Tập trung vào các mẫu dễ gây lỗi (ví dụ: bộ cấp phát với câu lệnh try trong Zig)
- Sử dụng git blame/log để hiểu bối cảnh lịch sử
- Đọc toàn bộ hệ thống con trong quá trình review code, không chỉ các diff
Chiến lược lập trình phòng thủ
Cộng đồng cũng đã nêu bật các phương pháp trung dung thực tế kết hợp hiểu biết của con người với các biện pháp bảo vệ tự động. Một số lập trình viên ủng hộ các kỹ thuật lập trình phòng thủ, chẳng hạn như phát hiện lỗi sớm với việc ghi log phù hợp, kết hợp với chính sách không khoan nhượng đối với stack trace trong log sản xuất.
Lập trình một cách phòng thủ, nhưng đừng dành quá nhiều thời gian để xử lý các điều kiện lỗi. Hủy bỏ càng sớm càng tốt. Giữ đủ thông tin để định vị lỗi sau này.
Những người khác nhấn mạnh tầm quan trọng của việc làm cho các trạng thái không hợp lệ không thể được biểu diễn ngay từ đầu, thay vì cố gắng bắt lỗi sau khi chúng xảy ra.
Kiểm tra thực tế ngành công nghiệp
Cuộc tranh luận tiết lộ một căng thẳng cơ bản giữa các thực hành phát triển lý tưởng và các ràng buộc của ngành. Trong khi đọc code cẩn thận và các phương pháp tập trung vào phòng ngừa có thể tạo ra phần mềm chất lượng cao hơn, áp lực kinh doanh thường ủng hộ việc lặp lại nhanh chóng và sửa lỗi sau khi xảy ra.
Một số lập trình viên lưu ý rằng phương pháp thành công nhất có thể kết hợp nhiều chiến lược: kiến trúc code dễ đọc cho phát triển mới, kiểm thử tự động để ngăn chặn hồi quy và đọc code chiến lược cho các thành phần hệ thống quan trọng. Hiểu biết chính nổi lên từ cuộc thảo luận là các kỹ thuật khác nhau hoạt động tốt hơn ở các quy mô và giai đoạn khác nhau của vòng đời dự án.
Cuộc tranh luận đang diễn ra phản ánh những câu hỏi rộng lớn hơn về các thực hành kỹ thuật phần mềm khi các hệ thống ngày càng phức tạp và các nhóm phát triển đối mặt với áp lực ngày càng tăng để cung cấp tính năng nhanh chóng trong khi duy trì độ tin cậy của hệ thống.
Tham khảo: Look Out For Bugs