Kỹ thuật Harness: Giải pháp kiểm soát chất lượng mã nguồn do AI tạo ra
Bài viết giới thiệu về khái niệm 'Harness Engineering' - một phương pháp mới giúp kiểm soát và duy trì chất lượng mã nguồn do AI tạo ra. Phương pháp này bao gồm ba thành phần chính: kỹ thuật ngữ cảnh, ràng buộc kiến trúc và thu gom rác, cùng với nguyên tắc 'làm cứng dần' để nâng cấp cơ chế kiểm tra.
Kỹ thuật Harness: Giải pháp kiểm soát chất lượng mã nguồn do AI tạo ra
Harness engineering là phương pháp bao quanh quá trình tạo mã nguồn có hỗ trợ AI bằng các công cụ xác định, quy trình đánh giá tự động và kiểm tra định kỳ, nhằm đảm bảo mã nguồn do AI sinh ra luôn chính xác và nhất quán theo thời gian. Phương pháp này giải quyết vấn đề AI tạo mã trông có vẻ hợp lý nhưng dần dần đi chệch khỏi các chuẩn mực và kiến trúc của dự án.
Bài viết phân tích nguồn gốc của khái niệm này, ba thành phần cốt lõi, và cách triển khai thực tế thông qua một plugin mã nguồn mở. Đây là hướng tiếp cận quan trọng cho các đội ngũ phát triển phần mềm tại Việt Nam đang ngày càng ứng dụng AI vào quy trình làm việc.
Nguồn gốc của khái niệm
Thuật ngữ này xuất phát từ bài viết của Birgitta Boeckeler trên martinfowler.com, trong bối cảnh ThoughtWorks triển khai phần mềm thực tế với trợ lý lập trình AI. Boeckeler quan sát thấy một vấn đề mà nhiều đội ngũ đều nhận ra: AI tạo ra mã nguồn trông hợp lý, nhưng nếu không được kiểm soát, chúng dần đi lệch hướng. AI quên các quy ước, lặp lại sai lầm, và bào mòn tính nhất quán nội tại của codebase. Mã vẫn biên dịch và vượt qua bài kiểm tra. Sự xuống cấp diễn ra âm thầm.
Điểm sáng tạo của Boeckeler là nhận ra vấn đề này đã có một giải pháp tương tự trong kỹ thuật phần mềm: test harness (bộ khung kiểm thử). Test không làm cho mã đúng về mặt cấu trúc. Chúng phát hiện khi mã không còn đúng. Test harness không phải là ràng buộc về mã bạn viết; nó là cơ chế liên tục kiểm tra xem thứ bạn viết có đạt chuẩn hay không.
Ba thành phần cốt lõi
Kỹ thuật ngữ cảnh (Context Engineering)
Trợ lý AI chỉ có thể làm việc trong phạm vi những gì nó biết. Nếu AI không biết dự án của bạn dùng thư viện logging cụ thể nào, nó sẽ tự sáng tạo cách riêng. Nếu không biết bạn không bao giờ dùng biến toàn cục có thể thay đổi, nó sẽ dùng khi thuận tiện.
Kỹ thuật ngữ cảnh là kỷ luật đảm bảo AI biết những gì nó cần biết. Trong thực tế, điều này nghĩa là duy trì một tài liệu — gọi là HARNESS.md — ghi lại stack, các quyết định kiến trúc, quy ước đặt tên, ràng buộc, và lý do đằng sau mỗi quyết định.
Tài liệu này không phải README cho con người. Nó là cơ sở tri thức cho AI. Sự khác biệt rất quan trọng: README giải thích dự án làm gì. Tài liệu ngữ cảnh nói cho AI biết phải làm gì, không được làm gì, và tại sao.
Ràng buộc kiến trúc (Architectural Constraints)
Biết luật lệ và thực thi luật lệ là hai vấn đề riêng biệt. Bạn có thể viết mọi ràng buộc vào HARNESS.md mà AI vẫn vi phạm, vì AI là hệ thống xác suất tối ưu cho tính hợp lý, không phải cỗ máy tuân theo quy tắc.
Các ràng buộc kiến trúc là cơ chế bắt lỗi vi phạm. Boeckeler gọi các điểm thực thi là "verification slots" — những thời điểm xác định trong quy trình phát triển nơi một bài kiểm tra chạy và hoặc vượt qua hoặc chặn tiến độ. Có hai loại công cụ kiểm tra:
- Công cụ xác định: linter, script, regex check, kiểm tra cấu trúc file — tạo kết quả pass/fail không cần đánh giá. Nhanh, rẻ, và hoàn toàn đáng tin cậy trong phạm vi của chúng.
- Đánh giá bằng agent: mô hình ngôn ngữ xem mã với mô tả ràng buộc và đưa ra phán đoán. Cần thiết khi ràng buộc liên quan đến ý định, ngữ nghĩa, hoặc các mẫu khó diễn đạt thành quy tắc cơ học.
Thu gom rác (Garbage Collection)
Codebase là một hệ thống sống. Dù có kỹ thuật ngữ cảnh tốt và ràng buộc nghiêm ngặt, entropy vẫn tích tụ. Mã chết phát triển. TODO comments tồn tại hàng tháng. Dependencies trở nên lỗi thời. Các abstraction từng hợp lý trở thành chướng ngại vật.
Thu gom rác là quá trình định kỳ chống lại entropy này. Khác với hai thành phần kia hoạt động tại thời điểm tạo mã hoặc review, GC chạy theo lịch trình — vì thời gian đã trôi qua, không phải vì một sự kiện coding cụ thể.
Nguyên tắc "làm cứng dần" (Progressive Hardening)
Không phải mọi ràng buộc đều bình đẳng, và không phải ràng buộc nào cũng sẵn sàng thực thi xác định từ đầu. Bậc thang làm cứng mô tả cách các ràng buộc trưởng thành qua ba trạng thái:
- Unverified (chưa kiểm chứng): Bạn đã khai báo ràng buộc trong
HARNESS.md, tin rằng nó quan trọng, nhưng chưa có cơ chế kiểm tra. Đây không phải thất bại; là cam kết xây dựng cơ chế thực thi. - Agent: Bạn đã viết prompt cho agent kiểm tra ràng buộc trong PR review hoặc kiểm tra định kỳ. Bắt được hầu hết vi phạm nhưng không hoàn hảo, cần con người review kết quả.
- Deterministic (xác định): Bạn đã diễn đạt ràng buộc đủ chính xác để mã hóa thành script, linter rule, hoặc structural check. Chạy trong CI, hoặc pass hoặc block merge.
Hướng di chuyển luôn luôn hướng tới deterministic. Khi agent liên tục bắt cùng một loại vi phạm, sự lặp lại đó là tín hiệu: mẫu đã đủ hiểu để tự động hóa. Viết script, ngừng dùng agent cho ràng buộc đó, và chuyển trạng thái sang deterministic.
Triển khai thực tế trong plugin
Plugin này cấu trúc các verification slots thành ba vòng thực thi với thang thời gian và dung sai khác nhau:
- Vòng trong (advisory, chạy lúc chỉnh sửa): kiểm tra nhẹ khi lưu file, hiển thị vấn đề như gợi ý, tối ưu cho ít ma sát, không ngắt quãng dòng chảy làm việc.
- Vòng giữa (strict, chạy lúc PR): bộ kiểm tra agent và deterministic đầy đủ khi mở pull request. Có quyền chặn merge — điểm thực thi chính cho ràng buộc kiến trúc.
- Vòng ngoài (investigative, chạy theo lịch): thu gom rác, fitness functions, kiểm tra harness chạy định kỳ — tạo báo cáo, không chặn, phát hiện entropy chậm giữa các lần integration.
Một điểm đáng chú ý: agents hoạt động với lòng tin có giới hạn. Không agent nào có quyền đơn phương sửa code production hoặc merge thay đổi. Agents review, đề xuất, báo cáo, gắn cờ. Con người quyết định. Harness khuếch đại phán đoán con người, không thay thế nó.
"Khi agent lặp lại cùng một loại vi phạm, đó là tín hiệu: mẫu đã đủ hiểu để tự động hóa."
Kết luận
Harness engineering cung cấp một khuôn khổ có hệ thống để quản lý chất lượng mã nguồn do AI tạo ra — một vấn đề ngày càng cấp thiết khi các công cụ AI coding assistant phổ biến trong cộng đồng lập trình viên Việt Nam.
Phương pháp này không chỉ giúp kiểm soát AI, mà còn giúp đội ngũ làm rõ và duy trì các chuẩn mực kiến trúc của mình. Với khả năng triển khai theo từng bước — bắt đầu với kỹ thuật ngữ cảnh và ràng buộc cơ bản, sau đó thêm thu gom rác và CI enforcement — các đội ngũ có thể áp dụng linh hoạt theo mức độ trưởng thành của mình.
Đối với các kỹ sư phần mềm tại Việt Nam đang tích hợp AI vào quy trình phát triển, việc hiểu và áp dụng harness engineering sẽ giúp tận dụng sức mạnh của AI mà vẫn đảm bảo tính nhất quán và chất lượng lâu dài của codebase — điều mà kiểm thử chức năng truyền thống không thể đảm bảo.