Chuyện mình thấy hàng ngày: dev mở ChatGPT, paste đoạn code vào, gõ "fix this", nhận lại code sai context, sửa không đúng chỗ, hoặc tệ hơn — trông giống đúng nhưng logic khác hoàn toàn. Rồi kết luận "AI vô dụng".
Vấn đề không phải AI — vấn đề là prompt. "Fix this" cũng giống hỏi bác sĩ "tôi bệnh, chữa đi" mà không nói triệu chứng, tiền sử, đã uống thuốc gì. Output phụ thuộc gần như hoàn toàn vào cách bạn đặt câu hỏi.
Sau hơn một năm dùng AI hàng ngày cho coding, mình đã đúc kết được một bộ prompt templates — mỗi template cho một tình huống cụ thể, đã test kết quả trên Claude, GPT-4o, và Gemini. Bài viết này chia sẻ toàn bộ — copy, thay code của bạn vào, paste, dùng ngay.
Nguyên tắc chung trước khi vào templates
Ba thứ biến một prompt tệ thành prompt tốt:
Context. AI không biết project bạn dùng .NET 8 hay Node.js, không biết convention team bạn theo, không biết đoạn code đó nằm trong controller hay background service. Mỗi prompt cần nói rõ context.
Constraint. "Cải thiện code này" → AI sửa 20 thứ bạn không yêu cầu. "Cải thiện performance của query này, KHÔNG đổi schema, KHÔNG thêm package mới" → AI focus đúng vấn đề.
Output format. "Giải thích" → nhận essay 2000 từ. "Giải thích trong 3 bullet points, mỗi bullet 1 câu" → nhận đúng thứ cần. Kiểm soát format tiết kiệm thời gian đọc kết quả.
Nhóm 1: Debug Patterns
Pattern 1: Explain This Error
Khi gặp error message hoặc stack trace mà đọc không hiểu:
Tôi gặp lỗi sau trong project [.NET 8 Web API / Angular 18 / ...]:
[PASTE STACK TRACE / ERROR MESSAGE ĐẦY ĐỦ]
Context:
- File gây lỗi: [tên file]
- Đang làm gì khi lỗi xảy ra: [mô tả ngắn]
- Đã thử: [liệt kê những gì đã thử]
Hãy:
1. Giải thích nguyên nhân gốc rễ bằng ngôn ngữ đơn giản
2. Chỉ ra dòng code nào gây lỗi
3. Đưa ra cách fix cụ thể với code ví dụ
4. Giải thích tại sao cách fix đó hoạt động
"Đã thử" là phần nhiều người bỏ qua nhưng cực quan trọng — AI không suggest lại thứ bạn đã thử rồi, tiết kiệm một lượt hỏi.
Pattern 2: Rubber Duck Debug
Khi biết bug ở đâu nhưng không hiểu tại sao code chạy sai:
Đây là method [tên method] trong [tên class]:
```[ngôn ngữ]
[PASTE CODE]
Input đầu vào: [mô tả input cụ thể, ví dụ: list 3 orders, 2 có status Pending] Output mong đợi: [mô tả] Output thực tế: [mô tả]
Hãy trace qua code step by step với input trên. Ở mỗi bước, cho biết giá trị của các biến chính. Chỉ ra chính xác bước nào output bắt đầu sai và tại sao.
AI trở thành rubber duck — nhưng thực sự trace code thay vì chỉ lắng nghe. Hiệu quả bất ngờ cho bug logic phức tạp, đặc biệt LINQ chain dài hoặc async flow khó follow.
### Pattern 3: Root Cause Analysis
Bug đã fix nhưng muốn hiểu sâu để không lặp lại:
Bug: [mô tả ngắn] Triệu chứng: [user thấy gì / log ghi gì] Root cause: [nguyên nhân đã tìm ra] Fix: [code đã sửa]
Hãy phân tích:
- Tại sao bug này không bị phát hiện sớm hơn?
- Có chỗ nào khác trong codebase có thể có bug tương tự?
- Test case nào nên viết để catch bug kiểu này?
- Design change nào ngăn bug kiểu này xảy ra hoàn toàn?
Prompt này mình dùng sau incident — AI suggest systemic improvements thay vì chỉ fix điểm.
## Nhóm 2: Refactor Patterns
### Pattern 4: Extract and Simplify
Method dài quá, cần tách nhưng không biết tách đâu:
Method sau dài [X dòng] và đang làm quá nhiều việc:
[PASTE METHOD]
Hãy:
- Xác định các "responsibility" riêng biệt trong method
- Tách thành các private method nhỏ, mỗi method 1 responsibility
- Đặt tên method mới diễn tả rõ ý đồ (intention-revealing names)
- Giữ NGUYÊN behavior — không thay đổi logic, chỉ restructure
- Comment ngắn giải thích tại sao tách như vậy
Constraint: KHÔNG thêm dependency mới, KHÔNG đổi method signature gốc.
Dòng cuối quan trọng — không có nó, AI có thể inject `ILogger`, đổi return type, hoặc thêm async mà bạn không muốn.
### Pattern 5: Modernize Syntax
Nâng cấp code cũ lên syntax mới mà không break:
Cập nhật code sau lên [C# 12 / Angular 18 / TypeScript 5.x]:
[PASTE CODE]
Áp dụng:
- [C#: primary constructor, collection expression, pattern matching, raw string literal]
- [Angular: standalone component, signal, @if/@for, inject() function]
- [TS: satisfies operator, using declaration, const type parameter]
Chỉ áp dụng cải tiến syntax. KHÔNG refactor logic. KHÔNG đổi algorithm. Với mỗi thay đổi, comment inline giải thích cú pháp mới làm gì.
### Pattern 6: Improve Readability
Code chạy đúng nhưng đọc muốn khóc:
Code sau hoạt động đúng nhưng khó đọc. Cải thiện readability:
[PASTE CODE]
Focus vào:
- Đổi tên biến/method cho rõ nghĩa hơn (tiếng Anh)
- Giảm nesting (early return, guard clause)
- Tách điều kiện phức tạp thành biến boolean có tên
- Loại bỏ code trùng lặp
- Thêm khoảng trắng logic giữa các block
KHÔNG đổi algorithm. KHÔNG đổi public API. Show TRƯỚC và SAU cho từng cải thiện.
"Show TRƯỚC và SAU" buộc AI giải thích từng thay đổi thay vì dump code mới mà bạn phải tự diff.
### Pattern 7: Performance Refactor
Code chạy chậm, cần optimize mà không break:
Method sau xử lý [mô tả data: 50.000 records, gọi 100 lần/phút, ...]:
[PASTE CODE]
Hiện tại: [response time / memory usage nếu biết] Mục tiêu: [target performance]
Hãy:
- Xác định bottleneck chính (đánh số theo mức impact)
- Đề xuất cách optimize cho TỪNG bottleneck
- Estimate improvement cho mỗi optimization
- Viết code đã optimize
Constraint:
- KHÔNG đổi database schema
- KHÔNG thêm infrastructure mới (Redis, queue, ...)
- Chỉ optimize ở application level
Constraint "chỉ application level" ngăn AI suggest "thêm Redis cache" cho mọi vấn đề — cái bạn muốn là optimize code trước đã.
## Nhóm 3: Review Patterns
### Pattern 8: Security Audit
Tìm lỗ hổng bảo mật trước khi code lên production:
Review code sau về mặt SECURITY. Đây là [API endpoint / service / middleware]:
[PASTE CODE]
Check list:
- SQL Injection (raw query, string concatenation)
- XSS (output không sanitize)
- IDOR (thiếu authorization check, user A truy cập data user B)
- Mass Assignment (bind request trực tiếp vào entity)
- Sensitive data exposure (log password, return secret trong response)
- Missing rate limiting
- Missing input validation
- Insecure deserialization
Cho mỗi issue tìm được:
- Severity: Critical / High / Medium / Low
- Dòng code bị ảnh hưởng
- Attack scenario cụ thể
- Code fix
Prompt này mình chạy cho mọi controller/endpoint trước khi merge. Nó không thay thế penetration test nhưng catch được 80% lỗi phổ biến.
### Pattern 9: Performance Review
Review performance cho code sau. Context: [endpoint được gọi X lần/phút, data size khoảng Y records]:
[PASTE CODE]
Check:
- N+1 query (lazy loading trong loop)
- Missing index hint (query pattern nào cần index)
- Unnecessary data loading (SELECT * khi chỉ cần vài field)
- Memory allocation concern (string concat trong loop, large list copy)
- Missing async (blocking call trên async path)
- Missing caching opportunity
- Missing pagination
Cho mỗi issue: mô tả impact, code trước/sau. Estimate order of magnitude improvement (2x, 10x, ...).
### Pattern 10: Convention Review
Đảm bảo code follow team convention:
Review code sau theo convention của project:
Convention:
- [C# naming: PascalCase method, camelCase local, _prefix private field]
- [Async method phải suffix Async]
- [Controller action trả ApiResponse<T>]
- [Dùng record cho DTO]
- [Dùng FluentValidation, không validate trong controller]
- [Repository pattern, không inject DbContext vào controller]
[PASTE CODE]
Liệt kê MỌI vi phạm convention, kèm dòng code và cách sửa. Chỉ check convention, KHÔNG review logic hay performance.
Convention list thay đổi theo project — copy từ `.editorconfig` hoặc team wiki.
## Nhóm 4: Generate Patterns
### Pattern 11: Test From Code
Viết test cho code có sẵn:
Viết unit test cho class sau:
[PASTE CLASS]
Yêu cầu:
- Framework: [xUnit + Moq / Jest / vitest]
- Cover: happy path + edge cases + error cases
- Test naming: [MethodName_ShouldExpected_WhenCondition]
- Arrange-Act-Assert pattern
- Mock external dependencies, KHÔNG mock class đang test
- Mỗi test case 1 assertion chính
Liệt kê test cases trước (tên + mô tả 1 dòng), rồi mới viết code. Giải thích TẠI SAO mỗi edge case quan trọng.
"Liệt kê trước rồi viết code" — trick đơn giản nhưng hiệu quả. AI plan test cases trước, tránh viết 10 happy path test mà quên edge case. Bạn cũng review được danh sách trước khi nó generate code.
### Pattern 12: Docs From Code
Generate documentation từ code có sẵn:
Viết documentation cho code sau:
[PASTE CODE]
Generate:
- XML doc comment cho mỗi public method (summary, param, returns, exception)
- Swagger annotations ([ProducesResponseType], operation description)
- Một đoạn README ngắn mô tả module này làm gì, API nào available
Style: ngắn gọn, technical, cho developer đọc. Ngôn ngữ documentation: tiếng Anh. Không generic — description phải specific cho code này.
"Không generic" ngăn AI viết kiểu "Gets the entity by ID" cho mọi GetById method. Nó sẽ viết "Retrieves a product by its unique identifier, including category and pricing information" — specific hơn.
## Pattern nâng cao: Chained Prompts
Đôi khi một prompt không đủ. Mình dùng chuỗi prompt cho task phức tạp:
### Chain: Understand → Plan → Execute → Verify
--- PROMPT 1: Understand --- Giải thích code sau làm gì. KHÔNG suggest cải tiến, chỉ giải thích: [PASTE CODE]
--- PROMPT 2: Plan (sau khi hiểu) --- Tôi cần [mô tả thay đổi]. Based on code trên:
- File nào cần sửa?
- Approach nào hợp lý? (2-3 options, pros/cons)
- Risk gì cần chú ý? Chỉ plan, CHƯA viết code.
--- PROMPT 3: Execute (sau khi confirm plan) --- Implement option [X] theo plan. Viết code đầy đủ.
--- PROMPT 4: Verify --- So sánh code mới với code cũ:
- Behavior có thay đổi không? Chỗ nào?
- Edge case nào code mới có thể miss?
- Test case nào cần viết/update?
Chia 4 bước thay vì nhồi hết vào một prompt. Mỗi bước bạn verify trước khi sang bước sau. Tốn thời gian hơn nhưng output chính xác hơn gấp bội — đặc biệt cho thay đổi phức tạp.
### Chain: Multi-file Refactor
--- PROMPT 1: Survey --- Đây là [3-5 file liên quan]. Giải thích mối quan hệ giữa chúng. Dependency nào gọi dependency nào? [PASTE FILES]
--- PROMPT 2: Impact --- Tôi muốn [thay đổi]. Liệt kê TẤT CẢ file bị ảnh hưởng và thay đổi cần làm ở mỗi file. Chỉ list, chưa code.
--- PROMPT 3: Execute per file --- Sửa [file 1]. Chỉ file này, không đụng file khác. [repeat cho từng file]
--- PROMPT 4: Integration --- Tất cả file đã sửa ở trên. Verify chúng integrate đúng. Có compile error không? Type mismatch không? Missing import?
## Anti-patterns — prompt KHÔNG nên dùng
### "Fix this" / "Improve this"
❌ Fix this code: [paste 200 dòng]
AI sửa 10 thứ bạn không yêu cầu, break 3 thứ đang hoạt động, thêm 2 dependency. Luôn nói RÕ fix CÁI GÌ.
### Paste cả file không nói focus đâu
❌ Review this service: [paste 500 dòng]
AI review lan man — chỗ quan trọng bị pha loãng trong 50 comment nhỏ. Chỉ rõ "review method X, focus performance" hoặc paste đúng method cần review.
### Không cho context
❌ Why does this not work? var x = await GetData();
AI không biết `GetData` return gì, throw gì, file nào, framework gì. Ít nhất nói stack gì, error gì, expected gì.
### Hỏi quá nhiều trong một prompt
❌ Fix bug, add logging, refactor to use repository pattern, add unit test, update Swagger docs, and optimize performance.
6 task trong 1 prompt → AI làm mỗi cái qua loa. Chia thành 6 prompt riêng, mỗi cái làm kỹ.
## Tùy chỉnh theo model
Mỗi model có điểm mạnh khác nhau — prompt cần adjust:
**Claude (Sonnet/Opus):** mạnh reasoning, follow instruction tốt. Prompt dài, nhiều constraint vẫn xử lý được. Viết "TRƯỚC KHI CODE, liệt kê approach" — Claude sẽ thực sự plan trước.
**GPT-4o:** nhanh, code generation tốt. Nhưng hay bỏ qua constraint nếu prompt dài. Đặt constraint TRƯỚC code, không CUỐI prompt. Dùng markdown headers để structure.
**Gemini Pro:** context window rất lớn. Paste nhiều file cùng lúc OK — nhưng cần chỉ rõ "focus file X, các file còn lại chỉ để hiểu context". Không chỉ rõ, nó review tất cả không focus.
Mình thường dùng Claude cho complex reasoning (debug, architecture decision), GPT-4o cho code generation nhanh (CRUD, boilerplate), và Gemini cho task cần đọc nhiều file cùng lúc.
## Template system prompt cho coding assistant
Nếu bạn dùng AI có system prompt (API, Cursor .cursorrules, Claude Project), set context một lần dùng mãi:
You are a senior [C# / TypeScript / Python] developer reviewing and writing production code.
Stack: [.NET 8, EF Core 8, PostgreSQL, xUnit] Convention: [paste team convention hoặc link đến .editorconfig]
Rules:
- Never suggest changes unless explicitly asked
- Always explain WHY, not just WHAT
- When fixing bugs, verify the fix doesn't break other behavior
- When generating code, follow existing patterns in the codebase
- If unsure, say so — don't guess
- Output code blocks with language tag for syntax highlighting
- Keep explanations concise — code speaks louder than words
Set một lần trong system prompt, mỗi prompt sau không cần repeat context.
## Tổng kết
12 prompt templates trong bài này cover phần lớn tình huống coding hàng ngày. Nhưng template chỉ là điểm khởi đầu — bạn sẽ tự customize theo stack, convention, và cách làm việc riêng.
Ba thứ cần nhớ: context (AI đang ở project nào, code nào), constraint (KHÔNG làm gì, CHỈ focus gì), và output format (list, code, explain). Ba thứ đó biến "fix this" thành prompt cho ra kết quả dùng được ngay.
Bookmark bài này, lần tới gặp bug — mở Pattern 1, paste stack trace vào, thay context, gửi. Nhanh hơn google stack trace rồi đọc 5 câu trả lời Stack Overflow.
Leave a comment
Your email address will not be published. Required fields are marked *