+1

Plan Before You Code: Đừng Để AI Xây Lâu Đài Trên Cát

Chắc hẳn anh em dev nào cũng từng trải qua cảm giác này: Nhận một ticket requirement mới trông có vẻ "ngon ăn". Máu nghề nổi lên, bạn lập tức bật Cursor hoặc VS Code, tạo branch mới, định nghĩa ngay vài cái Struct, setup file route và bắt đầu gõ rào rào. Cảm giác lúc đó "vibe" cực kỳ, code tuôn chảy như suối.

Cho đến 3 ngày sau...

Lúc bắt đầu ghép nối các module hoặc đưa cho Frontend test, bạn chợt nhận ra: "Chết dở, logic check điều kiện này đòi hỏi phải query một bảng bên kia, nhưng mình chưa thiết kế khóa ngoại!" hay "Luồng Kafka này nếu bị duplicate message thì sao?". Kết quả? Bạn đập đi viết lại mất thêm 1 tuần.

Đó chính là hậu quả nhãn tiền của việc bỏ qua bước sống còn: Plan Before You Code.

1. Cạm bẫy của "Tốc độ" trong kỷ nguyên AI

Ngày trước, gõ code chậm, nên anh em có thời gian vừa gõ vừa ngẫm nghĩ logic. Bây giờ, với các công cụ AI, một luồng CRUD hay một con Worker xử lý queue có thể được gen ra trong 10 giây.

Nhưng hãy nhớ: AI chỉ là thợ xây, nó không phải là Kiến trúc sư. Nếu bạn đưa cho nó một ý tưởng mập mờ, nó sẽ xây cho bạn một cái nhà vệ sinh nằm giữa phòng khách một cách cực kỳ nhanh chóng và đẹp đẽ. Việc lao vào code ngay lập tức không làm bạn nhanh hơn, nó chỉ giúp bạn... đi sai đường với tốc độ cao hơn mà thôi.

2. Vậy "Plan" là làm những gì?

Là một Backend Dev, trước khi chạm tay vào bất kỳ dòng code logic nào, mình bắt buộc bản thân phải hoàn thành 3 "bản vẽ" sau:

A. Data Model & ERD (Entity Relationship Diagram)

Data là trái tim của hệ thống. Nếu Database Schema sai, mọi dòng code Golang hay Node.js viết ra sau đó đều là rác. Mình luôn dùng các tool như dbdiagram.io để vẽ ra các bảng. Bảng User map với bảng Order thế nào? Index sẽ đánh ở cột nào để tối ưu query text search (như Elasticsearch)? Việc trực quan hóa giúp mình nhìn ra ngay những điểm "ngu" trong thiết kế dữ liệu trước khi tốn công viết các file Migration.

B. Sequence Diagram (Luồng tuần tự)

Khi làm việc với Microservices, bạn không thể code chay được. Bạn phải biết Request từ Client đập vào API Gateway, chạy qua Service A check quyền, bắn message sang Kafka, rồi Service B hứng message đó ghi vào DB. Chỉ cần vài phút kéo thả trên Excalidraw hoặc viết syntax PlantUML, bạn sẽ thấy rõ luồng đi của data. Nếu có bước nào gọi API bên thứ 3 (như cổng thanh toán), bạn sẽ tự hỏi ngay: "Nếu nó timeout 5s thì luồng này xử lý thế nào?" - Và thế là bạn vá được một lỗ hổng chí mạng từ trong trứng nước.

C. API-First Design (Hợp đồng API)

Đừng bắt Frontend/Mobile phải chờ bạn code xong backend mới có API để ghép. Hãy định nghĩa trước API Contract (Request body, Response JSON payload, Error codes) trên Swagger hoặc Postman. Chốt cái "hợp đồng" đó với team. Sau đó, Frontend đi mock data để làm UI, còn bạn an tâm code logic phía dưới mà không sợ bị "lật kèo" sửa API phút chót.

3. Prompt AI bằng "Bản thiết kế"

Khi bạn đã có một bản Plan (Tech Spec) hoàn chỉnh dưới dạng text hoặc markdown, lúc này sức mạnh của The Vibe Coder Mindset mới thực sự bùng nổ.

Thay vì bắt AI tự mò mẫm, bạn ném toàn bộ cái file Tech Spec đó vào context của AI và ra lệnh:

"Đây là thiết kế Database Schema và luồng Sequence Diagram của tính năng Checkout. Dựa vào hợp đồng API này, hãy gen cho tao toàn bộ Interface, Struct và repository layer bằng Golang."

Kết quả nhận được sẽ chuẩn xác đến 95%. Bạn hoàn toàn nắm quyền kiểm soát kiến trúc, và AI trở thành một cỗ máy đẻ boilerplate code theo đúng ý đồ thiết kế của bạn.

4. Lời kết

Viết code giống như việc lát gạch cho một ngôi nhà. Bạn có thể lát rất đẹp, rất nhanh, nhưng nếu cái móng (Architecture) đã méo mó và bản vẽ (Plan) không có, thì ngôi nhà đó sớm muộn cũng sập khi gặp dông bão (Traffic thực tế). Hãy rèn luyện thói quen tư duy bằng giấy bút và sơ đồ trước khi nghĩ bằng Code.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí