Cẩm nang prompt engineering cho lập trình viên
(addyo.substack.com)1. Mở đầu: Prompt quyết định năng suất phát triển
- Hiệu năng của trợ lý lập trình AI phụ thuộc vào chất lượng prompt. Yêu cầu rõ ràng tạo ra mã tinh chỉnh, còn câu hỏi mơ hồ sinh ra đầu ra vô dụng.
- Cách viết prompt giờ đây là một năng lực thiết yếu với lập trình viên, và điều này giống như việc huấn luyện một đối tác phát triển.
- Bài viết này cho thấy “câu hỏi tốt” tạo ra “mã tốt” như thế nào thông qua các ví dụ thực tế và phần so sánh.
2. 7 nguyên tắc của một prompt hiệu quả
① Cung cấp ngữ cảnh
- AI không biết bối cảnh dự án của người dùng, vì vậy cần nêu rõ ngôn ngữ, framework, thư viện, thông báo lỗi, mục tiêu, v.v.
- Ví dụ: bao gồm bối cảnh kỹ thuật như “xảy ra TypeError khi fetch user trong môi trường Node.js + Express + Mongoose”.
② Làm rõ mục tiêu
- “Code không chạy” không giúp ích gì. Hãy hỏi chính xác theo kiểu “Kết quả mong đợi là ○○ nhưng thực tế lại là △△. Vì sao vậy?”.
③ Chia nhỏ tác vụ phức tạp
- Thay vì hỏi toàn bộ chức năng cùng lúc, yêu cầu theo từng bước sẽ hiệu quả hơn. Ví dụ: component > quản lý state > tích hợp API.
④ Bao gồm ví dụ đầu vào/đầu ra
- Nếu cho thấy ví dụ đầu ra mong muốn, khả năng AI hiểu đúng ý định sẽ cao hơn. (
[3,1,4]→[1,3,4])
⑤ Gán vai trò
- Việc thiết lập vai trò như “hãy review code như một lập trình viên React senior” sẽ cải thiện độ sâu và chất lượng phản hồi.
⑥ Cải thiện lặp qua đối thoại
- Phản hồi đầu tiên không nhất thiết phải hoàn hảo. Nếu bạn đưa feedback, AI sẽ tiếp tục theo mạch đó và dần tạo ra kết quả tinh chỉnh hơn.
⑦ Duy trì tính nhất quán của mã
- Nếu bản thân code được viết nhất quán về tên hàm, định dạng, comment, v.v., AI cũng sẽ giữ được mạch đó và nâng cao chất lượng.
3. Chiến lược prompt cho việc debug
① Nêu rõ lỗi và so sánh với hành vi mong đợi
- Nếu cung cấp cùng lúc thông báo lỗi, triệu chứng vấn đề, kết quả mong đợi và giá trị đầu vào, AI có thể chẩn đoán chính xác hơn.
② Yêu cầu truy vết theo từng dòng
- Những yêu cầu như “hãy truy vết từng bước xem giá trị biến này bắt đầu bất thường từ đâu” rất hiệu quả với các bug logic phức tạp.
③ Cung cấp mã tái hiện tối thiểu
- Thay vì đưa toàn bộ code, chỉ cần đưa phần cốt lõi nơi phát sinh vấn đề thì AI sẽ phân tích nguyên nhân chính xác hơn.
④ Đặt câu hỏi tiếp theo thật rõ ràng
- Tốt hơn là đặt câu hỏi trực tiếp như “ở phần này điều kiện nào đang sai?” thay vì “vì sao lại ra kết quả này?”.
⑤ So sánh ví dụ: câu hỏi tệ vs. câu hỏi tốt
- Nếu chỉ nói đơn giản “code không chạy” thì thường chỉ nhận được câu trả lời mang tính suy đoán, nhưng nếu đưa cả thông báo lỗi và code thì sẽ nhận được hướng giải quyết chính xác.
4. Chiến lược prompt cho refactor và tối ưu hóa
① Làm rõ mục tiêu refactor
- Thay vì chỉ nói “hãy refactor”, cần nêu mục tiêu cải thiện cụ thể như “tăng khả năng đọc, cải thiện hiệu năng, cập nhật API”.
- Nếu mục tiêu mơ hồ, AI có thể thử những cải tiến ngẫu nhiên hoặc thay đổi theo hướng không mong muốn.
② Cung cấp ngữ cảnh ngôn ngữ/môi trường
- Nếu cho biết style dự án hoặc ràng buộc kỹ thuật như “chuyển React class component → function component”, “môi trường Node.js 14”, thì có thể tạo ra chuyển đổi phù hợp.
③ Yêu cầu cả phần giải thích
- Nếu yêu cầu giải thích “vì sao lại thay đổi như vậy” cùng với code đã refactor, bạn vừa có thể review chất lượng code vừa có thêm hiệu quả học tập.
④ Nâng cấp chất lượng bằng yêu cầu dựa trên vai trò
- Những yêu cầu như “hãy refactor như một lập trình viên TypeScript senior” sẽ dẫn tới các đề xuất cải tiến hiện đại và sâu sắc hơn.
5. Chiến lược prompt cho việc triển khai tính năng mới
① Chia tính năng thành các bước để yêu cầu
- Ngay cả tính năng phức tạp cũng sẽ cho kết quả ổn định hơn nếu yêu cầu theo thứ tự “thiết kế cấu trúc tính năng → tạo UI → nối logic”.
② Cung cấp style code hiện có
- Nếu đưa ra component tương tự hoặc convention nội bộ, code sinh ra sẽ phù hợp hơn với tính nhất quán của dự án. Ví dụ: “tạo ProductList dựa trên UserList”.
③ Truyền đạt ý định bằng comment/TODO
- Trong IDE, nếu thêm comment ngôn ngữ tự nhiên như
// TODO: 요청 유효성 검증 구현, Copilot sẽ tự động sinh khối code phù hợp với ý đó.
④ Đưa ra ví dụ đầu vào/đầu ra
- Khi bao gồm ví dụ về giá trị đầu vào và đầu ra mong đợi, AI sẽ cố gắng đáp ứng chúng và độ chính xác sẽ cao hơn.
⑤ Cải thiện lặp dựa trên feedback
- Dù kết quả đầu tiên chưa đạt kỳ vọng, nếu đưa feedback như “hãy dùng
mapthay vìfilter”, AI sẽ phản ánh ngay và tiếp tục cải thiện.
6. 7 mẫu prompt thất bại (Anti-patterns)
① Yêu cầu mơ hồ
- Những câu hỏi như “tại sao code này không chạy?” chỉ dẫn tới các câu trả lời chung chung vô nghĩa. Hãy kèm thông báo lỗi, code và kết quả mong đợi.
② Yêu cầu quá tải
- Những yêu cầu tổng hợp như “tạo toàn bộ app + thêm chức năng xác thực + kèm script deploy” dễ gây thiếu sót hoặc nhầm lẫn, nên cần tách theo từng bước.
③ Không có câu hỏi
- Nếu chỉ ném code ra mà không có yêu cầu, AI dễ tóm tắt hoặc đưa ra kết quả không liên quan, nên cần làm rõ mục đích câu hỏi.
④ Tiêu chí thành công không rõ ràng
- “Làm nhanh hơn”, “sửa cho tốt hơn” là những tiêu chí mơ hồ. Cần đưa ra tiêu chí có thể đo lường được như “cải thiện xuống độ phức tạp thời gian O(n)”.
⑤ Phớt lờ câu hỏi của AI
- Nếu AI hỏi “đây là function component hay class component?”, bạn cần trả lời để nhận được đầu ra tối ưu hơn.
⑥ Thiếu nhất quán
- Nếu style, cú pháp và thuật ngữ liên tục thay đổi, AI cũng sẽ bị rối. Duy trì một style thống nhất sẽ giúp nâng cao chất lượng phản hồi.
⑦ Tham chiếu mơ hồ như “đoạn code ở trên”
- Cuộc trò chuyện càng dài, “đoạn code ở trên” càng trở nên không rõ ràng. Tốt nhất là đưa lại code hoặc nêu rõ tên hàm.
7. Kết luận: Cộng tác với AI là một cuộc đối thoại lặp
- Prompt engineering giờ đây là kỹ năng giao tiếp cốt lõi của lập trình viên. Cung cấp ngữ cảnh, mục tiêu rõ ràng và cải thiện lặp là nền tảng.
- AI không chỉ là trợ lý coding mà còn là cộng tác viên và đối tác học tập. Nếu tận dụng tốt, không chỉ năng suất mà cả năng lực phát triển cũng sẽ được nâng cao.
- Nếu vận dụng nhiều chiến lược như thử nghiệm, feedback, gán vai trò, bạn có thể làm việc với AI như một thành viên thực chiến trong nhóm.
- Mục tiêu cuối cùng là tạo ra mã nhanh hơn và chính xác hơn, nhưng đồng thời cũng nên tích cực dùng nó như một công cụ học tập để trở thành lập trình viên tốt hơn.
Bảng so sánh prompt tốt vs. prompt tệ
| Phân loại | Debug | Refactor | Triển khai tính năng |
|---|---|---|---|
| Prompt tốt | Đây là thời điểm xảy ra TypeError. Giá trị kỳ vọng là ○○ nhưng lại ra NaN. Nhờ phân tích nguyên nhân. |
Hãy loại bỏ phần lặp trong hàm này và cải thiện hiệu năng. Tách phần fetch thành helper, và giữ nguyên thông báo lỗi. |
Hãy tạo component ProductList có ô tìm kiếm. Nhận JSON từ /api/products rồi lọc danh sách, đồng thời bao gồm cả trạng thái lỗi và loading. |
| Prompt tệ | Tại sao hàm của tôi không chạy? |
Refactor giúp tôi. |
Làm chức năng tìm kiếm giúp tôi. |
5 bình luận
Hóa ra cũng không khác mấy so với cách đối xử với lập trình viên là con người.
Playbook kỹ thuật prompt dành cho lập trình viên
Hãy tham khảo thêm cả phiên bản do bot tóm tắt GN+ tổng hợp. Phần bình luận tóm tắt trên Hacker News cũng đáng đọc.
Bạn đăng trước rồi nhỉ..
Cảm ơn.
Làm ơn, làm ơn đừng làm vậy mà nói rồi thì kiểu gì cũng có 1 trong 10 đứa vẫn làm thế -_-
Con người thì biết gì chứ!