Cạm bẫy của Vibe Coder: Khi AI "Ngáo" Trên Môi Trường Production & Nghệ thuật Phòng thủ
2 giờ sáng rạng sáng thứ Bảy, điện thoại mình réo liên hồi. Kênh Slack của dự án đỏ rực cảnh báo từ Grafana: Server đang bị OOM (Out Of Memory), Pod khởi động lại liên tục, API response time vọt lên vài nghìn milliseconds.
Mình vội vàng mở laptop, SSH vào server, check log và phát hiện ra thủ phạm: Một đoạn code xử lý Kafka Consumer... do chính tay mình nhờ AI sinh ra từ tuần trước. Đoạn code trông cực kỳ "sạch đẹp", chạy mượt mà trên môi trường Local và Staging, nhưng lại đưa hệ thống Production vào lòng đất khi gặp lượng traffic thực tế.
Đó chính là cạm bẫy lớn nhất của The Vibe Coder Mindset: Khi bạn quá "chill" với dòng chảy logic và giao phó hoàn toàn tiểu tiết cho AI mà quên mất các nguyên tắc phòng thủ (Defensive Programming). Hôm nay, mình sẽ bóc trần sự thật về những đoạn code "trông có vẻ đúng" này.
1. Ảo giác của "Clean Code" do AI tạo ra
Sự nguy hiểm lớn nhất của các công cụ AI như Cursor hay Copilot không nằm ở chỗ nó viết code sai cú pháp. Trái lại, AI viết code quá đẹp.
Nó biết cách tổ chức thư mục, tuân thủ SOLID, naming convention chuẩn mực. Khi bạn đọc lướt qua một đoạn code được gen ra, não bộ của bạn (đang trong trạng thái "vibe" thư giãn) sẽ dễ dàng bị đánh lừa: "Chà, code gọn gàng thế này, biến đặt tên ý nghĩa thế này, chắc chắn là logic chuẩn rồi!".
Nhưng AI thiếu một thứ cốt lõi: Context (Ngữ cảnh) của hệ thống thực tế. AI không biết rằng Database của bạn chỉ chịu được tối đa 500 connections. Nó không biết rằng API đối tác bên thứ ba thường xuyên bị timeout sau 5 giây. Nó viết code cho một thế giới lý tưởng, nơi mạng luôn ổn định và RAM là vô hạn.
2. Case Study Thực Tế: Cạn kiệt tài nguyên vì "Quá Tối Ưu"
Quay lại câu chuyện 2 giờ sáng của mình. Bài toán lúc đó là viết một Consumer để đọc dữ liệu từ Kafka và ghi vào Database. Mình đã ném cho AI một prompt cực kỳ rành mạch: "Viết cho tao một luồng đọc message từ Kafka bằng Golang, xử lý data và lưu xuống DB. Tối ưu tốc độ cao nhất có thể nhé."
AI làm xuất sắc. Để "tối ưu tốc độ", với mỗi message nhận được, nó sinh ra một Goroutine mới (go func()) để xử lý bất đồng bộ.
- Trên Local: Mình test với 10 tin nhắn/giây. Code chạy như một cơn gió.
- Trên Production: Một campaign marketing chạy, traffic dội vào 10.000 tin nhắn/giây. Code vẫn chạy đúng logic đó, sinh ra hàng chục ngàn Goroutine cùng lúc. Hậu quả? RAM server bị vắt kiệt trong nháy mắt, Connection Pool của Database bị "bóp nghẹt" đến sập hoàn toàn.
Đoạn code không sai về mặt ngôn ngữ lập trình, nó sai về Tư duy thiết kế hệ thống (System Design).
3. Nghệ thuật Phòng thủ (Defensive Programming) trước AI
Để duy trì The Vibe Coder Mindset mà không bị "bán muối" trên Production, mình đã phải thiết lập cho bản thân những nguyên tắc phòng thủ thép:
-
Nguyên tắc 1: Coi AI là một "Junior Dev gõ siêu nhanh" Đừng coi AI là một Senior Architect. Hãy coi nó là một cậu thực tập sinh gõ phím với tốc độ ánh sáng. Cậu ấy có thể viết xong 1000 dòng code trong 5 giây, nhưng nhiệm vụ của bạn (Senior) là phải Review từng dòng một, đặc biệt là các phần tương tác với I/O (Database, Network, File system).
-
Nguyên tắc 2: Luôn thiết lập Ranh giới (Boundaries) Mọi đoạn code sinh ra chạm đến tài nguyên hệ thống đều phải bị giới hạn. Thay vì để AI dùng go func() vô tội vạ, hãy yêu cầu nó viết theo pattern Worker Pool (ví dụ: chỉ chạy tối đa 50 workers đồng thời). Phải luôn có Timeout cho mọi API call. Phải có Circuit Breaker khi gọi sang service khác. Đừng bao giờ tin vào "Infinite Scale".
-
Nguyên tắc 3: Test-Driven Prompting (TDP) Thay vì bảo AI "Hãy viết hàm X", mình đổi chiến thuật: "Tôi có bộ Unit Test thế này cho hàm X (test case null, test case timeout, test case duplicate). Hãy viết code để pass qua bộ test này." Lấy test case làm vòng kim cô để giới hạn sự "ngáo" của AI.
4. Lời kết
The Vibe Coder Mindset là một bước tiến tuyệt vời giúp anh em dev làm việc năng suất hơn, tập trung vào kiến trúc thay vì syntax. Nhưng hãy nhớ, Server Production không quan tâm đến việc bạn code "chill" thế nào. Nó chỉ quan tâm đến tính Ổn định và Tính đúng đắn.
Hãy cứ lướt trên những dòng code, nhưng luôn giữ một tay trên phanh khẩn cấp nhé!
Chủ đề tiếp theo: Idempotency - Vũ khí tối thượng khi hệ thống "chập cheng"
Trong bài này mình đã nhắc tới việc xử lý lỗi khi tải cao. Vậy nếu user thanh toán lỗi, màn hình quay đều và họ bấm nút "Thanh toán" 5 lần liên tục thì sao? Làm thế nào để API của chúng ta không trừ tiền khách hàng 5 lần hay tạo ra 5 cái đơn hàng trùng lặp trên DB?
Ở bài viết tới, mình sẽ mổ xẻ một khái niệm cực kỳ quan trọng đối với Backend Dev: Idempotency (Tính luỹ đẳng). Khái niệm nghe thì hàn lâm nhưng lại là cứu tinh sống còn của các hệ thống giao dịch thực tế. Anh em nhớ follow và đón đọc nhé!
All rights reserved