Tạo code thực sự hoạt động với AI

Hãy học cách tạo ra code chất lượng sản phẩm với AI - không phải những ví dụ đơn giản, mà là code phù hợp với phong cách, mẫu và quy ước của codebase của bạn.

Bẫy Copy - Paste

Đây là lỗi phổ biến nhất mà các nhà phát triển mắc phải khi tạo code bằng AI: họ nhập một prompt mơ hồ, nhận lại 50 dòng code chung chung, dán vào và dành cả giờ tiếp theo để sửa chữa cho phù hợp với codebase của họ.

Đó không phải là phát triển có sự hỗ trợ của AI. Đó là phát triển bị AI cản trở.

Giải pháp không phải là AI tốt hơn, mà là prompt tốt hơn. Khi bạn cung cấp cho AI ngữ cảnh phù hợp, nó không chỉ tạo ra code - mà còn tạo ra code trông giống như do chính nhóm của bạn viết.

Hãy để bài viết chỉ cho bạn sự khác biệt.

Ví dụ thực tế về prompt mơ hồ so với cụ thể

Prompt mơ hồ:

📍 Nơi dán: Mở ChatGPT (chat.openai.com), Claude (claude.ai) hoặc Gemini (gemini.google.com) và bắt đầu một cuộc trò chuyện mới.

📋 Cách sao chép prompt này: Nhấp vào bất kỳ đâu bên trong khối màu xám, nhấn Cmd+A rồi Cmd+C (Mac) hoặc Ctrl+A rồi Ctrl+C (Windows). Hoặc sử dụng biểu tượng sao chép xuất hiện.

Viết một hàm để xử lý việc đăng ký người dùng.

 

✏️ ​​Cách điền thông tin chi tiết của bạn: Thay thế mỗi [] và trình giữ chỗ trong ngoặc bằng thông tin cụ thể từ tình huống thực tế của bạn. Thông tin đầu vào mơ hồ sẽ tạo ra kết quả đầu ra mơ hồ — hãy cụ thể.

👀 Những gì bạn sẽ thấy: Trong vòng vài giây, AI sẽ trả về một phản hồi có cấu trúc dựa vào prompt ở trên. Hãy đọc kỹ và coi đó là bản nháp, không phải là câu trả lời cuối cùng.

📌 Nên làm gì với kết quả đầu ra: Lưu phản hồi vào file Notes. Chọn gợi ý có hiệu quả cao nhất và thực hiện nó trong tuần này — đừng cố gắng làm tất cả mọi thứ cùng một lúc.

⚠️ Nếu thấy không ổn: Nếu các gợi ý có vẻ chung chung, hãy dán nội dung này: "Hãy cụ thể hơn với ngữ cảnh thực tế của tôi. Bỏ qua những lời khuyên chung chung." Nếu nó bỏ qua các chi tiết quan trọng bạn đã cung cấp, hãy hỏi: "Bạn đã thiếu [X] trong ngữ cảnh của tôi — hãy thực hiện lại với điều đó làm ràng buộc chính."

Bạn sẽ nhận được một cái gì đó chung chung. Có thể là Express.js, có thể là Flask, hoặc có thể là một cái gì đó không dùng framework nào cả. Nó sẽ sử dụng các quy ước mà bạn không tuân theo và những mẫu không khớp với codebase của bạn.

Prompt cụ thể:

Viết một endpoint đăng ký người dùng cho API Express.js của chúng tôi.

Các mẫu của chúng tôi:
- Chúng tôi sử dụng TypeScript với chế độ strict
- Controller là các lớp với những phương thức tĩnh
- Xác thực sử dụng Zod schema
- Lỗi ném ra AppError(statusCode, message)
- Mật khẩu được mã hóa bằng bcrypt (12 vòng)
- Phản hồi tuân theo { success: boolean, data?: T, error?: string }

Đây là một endpoint hiện có để tham khảo:

static async login(req: Request, res: Response) {
  const { email, password } = LoginSchema.parse(req.body);
  const user = await UserRepository.findByEmail(email);
  if (!user) throw new AppError(401, 'Invalid credentials');
  const valid = await bcrypt.compare(password, user.passwordHash);
  if (!valid) throw new AppError(401, 'Invalid credentials');
  const token = generateToken(user.id);
  res.json({ success: true, data: { token, user: sanitize(user) } });
}

Viết phương thức đăng ký theo cùng một mẫu.

Prompt thứ hai tạo ra code được đưa thẳng vào codebase của bạn. Cùng một mẫu, cùng cách xử lý lỗi, cùng định dạng phản hồi. Tại sao ư? Bởi vì bạn đã cho AI thấy chính xác "đúng" trông như thế nào.

Ba lớp ngữ cảnh

Khi tạo code, hãy nghĩ về ngữ cảnh ở ba lớp:

Lớp 1: Ngữ cảnh dự án

Bạn đang sử dụng ngăn xếp nào? Nhóm của bạn tuân theo những quy ước nào? Những mẫu nào đã được thiết lập?

Dự án: API REST Node.js/TypeScript
Framework: Express với mô hình middleware
Cơ sở dữ liệu: PostgreSQL thông qua Prisma ORM
Xác thực: JWT với token làm mới
Test: Jest + Supertest

Bạn không cần lặp lại điều này mỗi lần - nhưng đối với các cuộc hội thoại AI mới, tóm tắt ngắn gọn dự án sẽ tiết kiệm rất nhiều thời gian trao đổi qua lại.

Lớp 2: Ngữ cảnh code

Code hiện có nào liên quan? Đây là ngữ cảnh mạnh mẽ nhất bạn có thể cung cấp. Dán vào:

  • File bạn đang thêm vào (hoặc ít nhất là các phần liên quan)
  • Các giao diện hoặc kiểu liên quan
  • Các hàm tương tự thể hiện mô hình của bạn
  • Các schema hoặc mô hình cơ sở dữ liệu liên quan

Lớp 3: Ngữ cảnh nhiệm vụ

Điều gì cụ thể cần phải xảy ra? Hãy cụ thể hơn:

Thêm endpoint PATCH /users/:id/preferences với các chức năng sau:
- Chấp nhận cập nhật một phần tùy chọn người dùng
- Xác thực rằng notification_email là email hợp lệ nếu được cung cấp
- Xác thực rằng theme là một trong các giá trị: 'light', 'dark', 'system'
- Trả về đối tượng tùy chọn đã cập nhật
- Yêu cầu xác thực (sử dụng authMiddleware của chúng tôi)

Tạo code từng bước

Các tác vụ lớn thường cho kết quả kém hơn những tác vụ nhỏ. Lý do là: Khi bạn yêu cầu toàn bộ một tính năng cùng một lúc, AI phải xử lý quá nhiều vấn đề - kiểu dữ liệu, xác thực, logic nghiệp vụ, xử lý lỗi, truy vấn cơ sở dữ liệu, định dạng phản hồi.

Thay vào đó, hãy chia nhỏ nó ra:

Bước 1: Kiểu dữ liệu và giao diện trước

Dựa trên Prisma schema của chúng ta cho người dùng, hãy tạo một schema xác thực Zod
để cập nhật tùy chọn người dùng.
Các trường: theme (sáng/tối/hệ thống), notification_email
(email hợp lệ), language (code ISO 639-1).
Tất cả các trường đều tùy chọn cho những bản cập nhật một phần.

Bước 2: Logic nghiệp vụ

Viết phương thức updatePreferences cho UserService.
Nó nên chấp nhận userId và đối tượng tùy chọn một phần đã được xác thực.
Sử dụng mẫu hiện có của chúng ta từ
UserService.updateProfile (được hiển thị bên dưới).

[Dán phương thức updateProfile]

Bước 3: Controller và định tuyến

Tạo phương thức controller và đăng ký định tuyến
cho PATCH /users/:id/preferences. Làm theo mẫu
từ các định tuyến người dùng hiện có của chúng ta (hiển thị bên dưới).

[Dán file định tuyến liên quan]

Mỗi phần đều được tập trung. Mỗi phần được xây dựng dựa trên kết quả đã được xác minh từ bước trước. Và nếu có gì đó sai, bạn sẽ biết chính xác ở đâu.

Kiểm tra nhanh: Sửa prompt này

Đây là một prompt mà một nhà phát triển có thể viết. Bạn sẽ cải thiện nó như thế nào?

Tạo một lớp cache cho API của tôi.

Hãy nghĩ về những gì còn thiếu. Bạn sẽ thêm gì? Đây là một phiên bản được cải tiến:

Thêm cache phản hồi dựa trên Redis vào API Express của chúng ta.

Yêu cầu:
- Mặc định lưu vào cache các phản hồi GET trong 5 phút
- Sử dụng URL yêu cầu + tham số truy vấn làm cache key
- Bỏ qua việc lưu vào cache cho các yêu cầu đã được xác thực (có tiêu đề Authorization)
- Vô hiệu hóa cache khi POST/PUT/DELETE truy cập cùng một tài nguyên
- Triển khai dưới dạng middleware của Express để có thể thêm vào cho từng route

Mẫu middleware hiện tại của chúng tôi:
[dán ví dụ middleware]

Thiết lập Redis client:
[dán cấu hình Redis]

Sự khác biệt là rất lớn.

Xử lý lỗi trong code được tạo bởi AI

Code do AI tạo ra đôi khi sẽ sai. Không phải sai nghiêm trọng - thường là sai tinh tế. Dưới đây là các mẫu cần chú ý:

API ảo. AI tạo ra một phương thức không tồn tại trong phiên bản thư viện bạn đang sử dụng. Luôn luôn xác minh rằng các phương thức, tham số và kiểu trả về tồn tại trong phiên bản của bạn.

# AI might generate this for pandas 2.x
df.append(new_row)  # WRONG: .append() was removed in pandas 2.0
# Correct:
df = pd.concat([df, pd.DataFrame([new_row])])

Các mẫu lỗi thời. Dữ liệu huấn luyện AI bao gồm code cũ. Bạn có thể nhận được componentWillMount trong React hoặc var trong JavaScript hiện đại. Hãy chỉ định rõ phiên bản của bạn.

Thiếu xử lý lỗi. AI có xu hướng tạo ra trường hợp thành công một cách hoàn hảo và bỏ qua các trường hợp ngoại lệ. Sau khi tạo code, hãy luôn hỏi: "code này thiếu xử lý lỗi nào?"

Giả định sai về dữ liệu của bạn. AI có thể giả định một trường luôn hiện diện trong khi nó có thể là null, hoặc một mảng không bao giờ trống. Hãy đối chiếu với schema thực tế của bạn.

Điểm mù về bảo mật. Code do AI tạo ra đôi khi bỏ qua việc làm sạch đầu vào, sử dụng các phương thức mã hóa lỗi thời hoặc tạo ra những lỗ hổng tấn công SQL injection. Đừng bao giờ tin tưởng để AI tạo những code quan trọng về bảo mật mà không xem xét cẩn thận.

Nguyên tắc "Hãy thể hiện, đừng chỉ nói"

Mô hình tạo code hiệu quả nhất là thể hiện cho AI thấy những gì bạn muốn thông qua các ví dụ thay vì mô tả bằng lời.

Nói (kém hiệu quả hơn):

Viết các hàm tuân theo các nguyên tắc lập trình hàm
với tính bất biến và các hàm thuần túy.

 

Thể hiện (hiệu quả hơn nhiều):

Hãy viết hàm calculateDiscount theo cùng 
một mẫu như các hàm hiện có sau:

const calculateTax = (price: number, rate: number): Money => ({
  amount: Math.round(price * rate * 100) / 100,
  currency: 'USD',
});

const calculateShipping = (weight: number, zone: Zone): Money => ({
  amount: ZONE_RATES[zone] * Math.ceil(weight),
  currency: 'USD',
});

AI ngay lập tức nắm bắt được các mẫu của bạn: TypeScript với các kiểu dữ liệu rõ ràng, những hàm thuần túy, kiểu trả về Money, quy ước làm tròn. Bạn không cần phải giải thích bất kỳ điều gì trong số đó.

Bài tập thực hành: Tạo một thành phần thực tế

Hãy thử ngay với codebase của bạn:

  1. Chọn một tính năng bạn cần xây dựng (hoặc đã xây dựng gần đây)
  2. Tìm 1-2 thành phần/chức năng tương tự hiện có
  3. Viết một prompt bao gồm:
  4. Ngữ cảnh dự án của bạn (2-3 dòng)
  5. Các ví dụ code hiện có
  6. Các yêu cầu cụ thể cho code mới
  7. Tạo code
  8. So sánh nó với những gì bạn sẽ viết thủ công

Lưu ý những gì AI đã làm đúng và những gì cần điều chỉnh. Khoảng cách đó sẽ thu hẹp đáng kể khi bạn giỏi hơn trong việc cung cấp ngữ cảnh.

Những điểm chính cần ghi nhớ

  • Prompt cụ thể kèm ví dụ luôn tốt hơn các yêu cầu mơ hồ
  • Cung cấp ba lớp ngữ cảnh: dự án, code và nhiệm vụ
  • Chia nhỏ các nhiệm vụ tạo code phức tạp thành những bước nhỏ hơn, tập trung hơn
  • Luôn xác minh đầu ra của AI - hãy chú ý đến các API ảo và việc thiếu xử lý lỗi
  • Cho AI thấy các mẫu của bạn thông qua những ví dụ code, không phải mô tả bằng văn bản
  • Code do AI tạo ra là bản nháp đầu tiên, không phải sản phẩm cuối cùng
  • Câu 1:

    Prompt nào cho ra kết quả tạo code tốt hơn?

    GIẢI THÍCH:

    Các prompt cụ thể với những yêu cầu rõ ràng (thư viện, tham số, kiểu trả về, các mẫu hiện có) tạo ra kết quả tốt hơn đáng kể so với những yêu cầu mơ hồ về code 'tốt'.

  • Câu 2:

    Bạn LUÔN LUÔN nên làm gì sau khi AI tạo code?

    GIẢI THÍCH:

    Code do AI tạo ra có thể chứa các lỗi nhỏ, sử dụng API lỗi thời hoặc bỏ sót những trường hợp ngoại lệ. Bạn luôn nên đọc và hiểu code được tạo ra, sau đó xác minh xem nó hoạt động chính xác trước khi tích hợp.

  • Câu 3:

    Khi nào bạn nên chia yêu cầu tạo code thành các phần nhỏ hơn?

    GIẢI THÍCH:

    Chia nhỏ các nhiệm vụ phức tạp thành những yêu cầu nhỏ hơn, tập trung hơn sẽ cho kết quả tốt hơn. Mỗi thành phần nhận được sự chú ý đầy đủ của AI, và bạn có thể xác minh tính đúng đắn từng bước một.

  • Câu 4:

    Cách hiệu quả nhất để AI phù hợp với phong cách lập trình của bạn là gì?

    GIẢI THÍCH:

    Cho AI xem các ví dụ thực tế từ codebase của bạn hiệu quả hơn nhiều so với việc mô tả phong cách của bạn bằng lời nói. AI sẽ nắm bắt được các mẫu, quy ước đặt tên và lựa chọn kiến ​​trúc từ những ví dụ cụ thể.

Thứ Tư, 10/06/2026 10:28
51 👨 35
Xác thực tài khoản!

Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:

Số điện thoại chưa đúng định dạng!
Số điện thoại này đã được xác thực!
Bạn có thể dùng Sđt này đăng nhập tại đây!
Lỗi gửi SMS, liên hệ Admin
0 Bình luận
Sắp xếp theo
❖ Phát triển Web với AI