- Trong thực tế, các mô hình AI cho lập trình vẫn không thể thực hiện đáng tin cậy ngay cả một lệnh đơn lẻ, nhưng kỳ vọng quá mức vào kiểu lập trình tác tử tự vận hành ở chế độ nền vẫn đang hình thành
- Tác giả cho biết dù đã cung cấp một hàm Golang khoảng 100 dòng làm mã tham chiếu, cả GPT-5 lẫn Gemini Pro đều gặp vấn đề như bỏ sót một phần logic hoặc quên cập nhật
- Việc để hệ thống tác tử tự xử lý 50 tệp và nhiều hàm là điều thiếu thực tế ở trình độ công nghệ hiện nay, thậm chí còn có nguy cơ tốn nhiều thời gian gỡ lỗi hơn
- Phản hồi từ cộng đồng chia làm hai luồng: một bên cho rằng có thể áp dụng thành công ở mức hạn chế thông qua prompt có hệ thống, tài liệu hóa và kiểm chứng từng bước; bên còn lại hoài nghi rằng agentic vẫn chưa thực sự thực dụng
- Hiện tại, LLM vẫn là hệ thống dựa trên tri thức chứ không phải trí tuệ, nên cách tiếp cận thực tế là nhà phát triển trực tiếp cung cấp ngữ cảnh và xác minh theo từng bước như một hình thức "dùng như công cụ"
Vấn đề mà tác giả bài gốc nêu ra
- Ví dụ thất bại với lệnh đơn giản: tác giả cung cấp một hàm Golang 100 dòng làm tham chiếu và yêu cầu cập nhật một hàm khác theo cùng cấu trúc, nhưng cả GPT-5 lẫn Gemini Pro đều bỏ sót một phần logic hoặc quên cập nhật
- Tính thiếu thực tế của lập trình tác tử: nếu ngay cả một hàm đơn lẻ còn không xử lý tử tế, thì cách làm agentic tự sửa nhiều hàm trên 50 tệp càng dễ gây ra nhiều vấn đề hơn
- Câu hỏi về cập nhật tệp 6000 dòng: tác giả hỏi cộng đồng cách chỉnh sửa an toàn một tệp cỡ 6000 dòng, chẳng hạn như khi cập nhật phiên bản Stripe
Các trường hợp áp dụng tích cực và phương pháp
Cách tiếp cận tài liệu hóa và lập chỉ mục có hệ thống
- Dùng tệp tham chiếu Markdown: lưu tham chiếu trong tệp
.md và yêu cầu AI đọc chúng sẽ giúp tăng tính nhất quán và độ chính xác
- Ví dụ prompt: "Tham khảo tệp
goLang_Update_reference.md đính kèm để tóm tắt các điểm cốt lõi của hàm update, rồi dựa trên đó viết bản nháp cập nhật phần mềm"
- Xây chỉ mục cục bộ: với các tệp lớn (hơn 6000 dòng), có thể quét theo từng khối 1000 dòng để tạo chỉ mục gồm tên hàm và tham chiếu dòng
- Khi làm frontend, có thể dùng các chỉ mục tách riêng theo khu vực như
fr.index.md
Quản lý tác tử và cấu trúc hóa công việc
- Chuyên môn hóa tác tử: thiết lập các tác tử theo vai trò như thiết kế (architect), khám phá mã (codeseeker), lập trình viên (coder), đồng thời cung cấp tệp quy tắc
.md phù hợp cho từng vai trò
- Cách tiếp cận vertical slice: chia công việc thành các đơn vị tính năng nhỏ có thể hoàn thành trong dưới 100 nghìn token
- Khi vượt quá 100 nghìn token, xác suất tác tử hoạt động sai tăng vọt
- Bắt buộc tài liệu hóa công việc: yêu cầu cập nhật
docs/TASKS.md, docs/WORKLOG.md, docs/DECISIONS.md để duy trì tính liên tục của công việc
Tận dụng Plan Mode và Ask Mode
- Plan Mode: rà soát toàn bộ dự án, lập kế hoạch theo yêu cầu rồi tiến hành từng bước
- Ask Mode: dùng để truy vấn codebase, khám phá ý tưởng, xem xét lựa chọn; hữu ích như công cụ thay thế Google/StackOverflow
Cách tiếp cận viết kiểm thử trước
- Phát triển dựa trên kiểm thử: viết unit test trước khi viết hàm, rồi để AI lặp lại việc sinh mã cho tới khi qua được test
- Xác suất thu được mã đúng về mặt chức năng tăng đáng kể, sau đó chỉ còn cần tối ưu và dọn dẹp
Quan điểm hoài nghi và nhận thức về giới hạn
Giới hạn thực tế của agentic
- Làm việc không có giám sát là hành động liều lĩnh: ở trình độ công nghệ hiện nay, giao ticket rồi để nó tự làm ở chế độ nền có xác suất thất bại rất cao
- Khả năng bịa đặt: mô hình dễ sinh ảo giác (hallucination) hơn là thật sự thành công, và trong trường hợp xấu nhất có thể phá hỏng mã hiện có
- Tính trùng lặp của Planning Mode: chỉ cần yêu cầu mô hình cơ sở lập một kế hoạch chi tiết là đã đủ; Planning Mode không thực sự mang lại năng lực mới
Các ràng buộc bản chất của LLM
- Dự đoán chứ không suy luận: mô hình hoạt động bằng cách dự đoán từ tiếp theo thay vì xác minh kết quả, nên độ tin cậy sẽ còn bấp bênh cho tới khi grounding, memory và feedback được cải thiện
- Tri thức không phải trí tuệ: LLM là một kho tri thức tinh vi nhưng không có trí tuệ; nhà phát triển phải tự mang vào trí tuệ của mình (BYOI: Bring Your Own Intelligence) cùng ngữ cảnh cần thiết
- Thiếu bộ nhớ: mô hình không có trí nhớ thực sự, chỉ dựa vào context và context cache, nên mỗi khi bắt đầu cuộc trò chuyện mới thì ngữ cảnh lại bị đặt lại
Thiên lệch ngôn ngữ và dữ liệu
- Golang tương đối bất lợi: Golang có ít codebase công khai hơn Python hay JavaScript, nên mô hình thiếu các mẫu và quy ước đã được học
- Đây là yếu tố cấu trúc khiến việc thu được kết quả chỉnh sửa hoặc chuyển đổi nhất quán trở nên khó hơn
Hướng dẫn thực dụng để áp dụng thành công
Prompting và cung cấp ngữ cảnh
- Chỉ dẫn rõ ràng và chi tiết: dùng ngữ pháp và dấu câu chính xác, tránh diễn đạt mơ hồ và đưa ra chỉ thị minh bạch
- Tham chiếu tường minh mọi tệp liên quan: nếu không chỉ rõ toàn bộ tệp mà tác tử phải dùng, xác suất tạo ra spaghetti code sẽ tăng lên
- Thiết lập tệp quy tắc: đặt quy tắc cho toàn bộ workspace và các tệp quy tắc theo từng dự án để dẫn dắt việc sinh mã nhất quán
- Tận dụng @Docs: dùng tính năng tham chiếu tài liệu để cung cấp tri thức cốt lõi mà tác tử cần (ở một số phiên bản hoạt động chưa ổn định)
Phạm vi công việc và kiểm chứng
- Chia nhỏ thành đơn vị tối thiểu: tách công việc thành các phần nhỏ nhất có thể xử lý trong một lần, xác minh xong từng bước rồi mới sang bước tiếp theo
- Rà soát thời gian thực: xem lại mọi đoạn mã được sinh ra ngay khi nó xuất hiện và yêu cầu chỉnh sửa tức thì để tránh spaghetti code
- Sao lưu và quản lý phiên bản: tạo bản sao lưu ở mỗi bước và sử dụng hệ thống quản lý phiên bản như GitHub
- Chạy kiểm thử: dùng
pytest --testmon -q để chạy tăng dần các bài test bị ảnh hưởng, rồi chạy toàn bộ test trước khi hoàn tất
Mô-đun hóa và cấu trúc mã
- Tách tệp 6000 dòng: một tệp đơn 6000 dòng là thiếu tính mô-đun và bất lợi cho việc cung cấp ngữ cảnh, nên tách thành 12 tệp cỡ 500 dòng sẽ hiệu quả hơn
- Ưu tiên vertical slice: phát triển theo các đơn vị tính năng nhỏ có thể chạy end-to-end
Chọn mô hình và quản lý chi phí
- Ưu tiên cân nhắc Claude Sonnet 4.5: so với GPT hay Gemini, mô hình này có tính nhất quán và độ chính xác cao hơn, xứng đáng với phần chi phí bổ sung
- Lưu ý mức tiêu thụ token: các kế hoạch lớn tiêu tốn nhiều token, vì vậy khi triển khai thực tế nên chia thành các bước nhỏ để tiết kiệm chi phí hơn
Các trường hợp sử dụng đặc biệt
Tạo script dùng một lần
- Script phân tích: nếu mỗi ngày phải viết hàng trăm script phân tích dữ liệu dùng một lần, thì ngay cả với độ chính xác chỉ 50%, AI vẫn có thể tạo và chạy chúng nhanh hơn 1000 lần so với viết tay
- Có thể tự kiểm chứng kết quả: vì người dùng có thể trực tiếp xác minh đầu ra nên ngay cả khi độ chính xác thấp, cách này vẫn hữu ích trong thực tế
Xây dựng ứng dụng từ đầu
- Cấu trúc đa tác tử: khi xây một ứng dụng lớn từ con số 0, một tác tử giám sát có thể rà soát công việc của các tác tử khác để duy trì tính nhất quán
- Có hiệu quả trong việc giữ đồng nhất tên import, tên biến và tránh trùng lặp mã
- Hiệu quả theo chi phí: vẫn cần nhiều chỉnh sửa phức tạp và tái cấu trúc, nên về dài hạn cách tiếp cận theo từng bước vẫn rẻ hơn
Tóm tắt ý kiến cộng đồng
Trải nghiệm tích cực (năng suất tăng 3–5 lần)
- Website Next.js: xây dựng từ số 0 một website hoàn chỉnh, có thể triển khai, chỉ trong vài phút
- Triển khai tính năng phức tạp: thêm tính năng threads vào ứng dụng chat trong 3–4 phút (khối lượng công việc lẽ ra mất 3 ngày)
- Khi áp dụng có hệ thống: nếu kết hợp quy tắc rõ ràng, ngữ cảnh đầy đủ và xác minh từng bước thì có thể đạt mức thành công nhất quán
Trải nghiệm tiêu cực (hiện vẫn thiếu thực dụng)
- Sinh hàng loạt spaghetti code: khi giao mục tiêu quá rộng, dễ phát sinh các vấn đề như quên cập nhật tài liệu hoặc không xóa các tệp thừa
- Lỗi ngữ nghĩa: mã có thể chạy được về mặt kỹ thuật nhưng đặt sai vị trí, hoặc tái triển khai những hàm vốn đã tồn tại, tạo ra vấn đề cấu trúc
- Theo dõi quá 5 phút thường thất bại: các lượt chạy dài hơn 5 phút phần lớn tạo ra kết quả vô dụng
1 bình luận
Ý kiến trên Hacker News
CLAUDE.mdlà xong. Cốt lõi là chỉ dẫn tỉ mỉ về quy trình. Cách tôi làm gồm: 1) hướng dẫn debug theo từng dự án, 2) làm rõ tiêu chí chấp nhận, 3) chạy test thường xuyên và yêu cầu ghi lại các thay đổi nhỏ theo từng đơn vị vào file. Làm vậy, tôi có thể để Claude tự động làm việc suốt nhiều giờ gần như không cần giám sát (thi thoảng chỉ cần gõ lệnh “continue” hoặc dùng/compact). Nó không cho code hoàn hảo mọi lần, nhưng tôi cũng vậy thôi. Dù sao thì nhìn chung nó dẫn tới thay đổi tích cực và công sức của tôi giảm đi rất nhiều. Tôi vẫn chưa khuyến nghị bootstrap trong trạng thái chưa được thiết kế kỹ, nhưng đôi khi nó vẫn làm được (dĩ nhiên cần review trước). Dạo này tôi thậm chí còn cân nhắc để Claude chạy liên tục nhiều ngày để tự giải quyết vấn đề