Vibe Coding không phải là Kỹ thuật Phần mềm: Sự khác biệt giữa tạo code và xây dựng hệ thống
Vibe coding tạo ra mã nguồn nhanh chóng nhưng thiếu chiều sâu của kỹ thuật hệ thống. Bài viết phân tích ranh giới giữa việc AI tạo code và quy trình kỹ thuật thực sự, nơi các quyết định về ràng buộc, bất biến và chế độ lỗi quyết định sự sống còn của sản phẩm trong môi trường production.

Vibe coding tạo ra code. Kỹ thuật phần mềm tạo ra hệ thống.
Khoảng cách giữa hai thứ này chính là nơi các lỗi trong môi trường sản xuất (production) sinh sôi. Đây không phải là lập luận chống lại AI, mà là lập luận ủng hộ kỹ thuật.
Một mô hình AI có thể tạo ra một hệ thống đăng nhập trong vài giây. Nó sẽ không hỏi liệu địa chỉ email có phải là duy nhất hay không. Yêu cầu bị thiếu duy nhất đó có thể khiến toàn bộ hệ thống sụp đổ. Các mô hình ngôn ngữ lớn (LLM) không thể nhìn thấy loại câu hỏi giúp phần mềm trở nên an toàn.
Vibe coding mang lại cho bạn điều gì?
Vibe coding mang lại cho bạn code. Nó mang lại đầu ra. Nó mang lại đà phát triển (momentum). Nhưng điều nó không mang lại là sự liên kết (coherence).
Trước khi bất kỳ dòng code nào tồn tại, các kỹ sư phải đưa ra những quyết định giúp hệ thống an toàn:
- Định hình vấn đề (Problem framing): Xác định vấn đề, người dùng, các ràng buộc và kết quả mong muốn.
- Kỹ thuật yêu cầu (Requirements engineering): Thu thập các hành vi, bất biến (invariants), trường hợp ngoại lệ và tiêu chí chấp nhận.
- Mô hình hóa hệ thống (System modelling): Mô hình trạng thái, luồng dữ liệu, sơ đồ trình tự và lập luận nhân quả.
- Thiết kế kiến trúc (Architectural design): Các ranh giới, trách nhiệm, giao diện, chế độ lỗi và sự đánh đổi.
- Định nghĩa yêu cầu phi chức năng: Hiệu suất, độ tin cậy, bảo mật, tuân thủ, khả năng vận hành và chi phí.
- Xác định rủi ro: Các yếu tố chưa biết, sự phụ thuộc, điểm thất bại và các biện pháp giảm thiểu.
- Thiết kế giao diện và hợp đồng: Định nghĩa API, lược đồ và các đảm bảo hành vi.
- Lập kế hoạch và sắp xếp: Chia nhỏ công việc thành các đơn vị hoàn thiện và liên kết.
Kỹ thuật thực sự là gì
Khi các kỹ sư viết code, họ không chỉ đang gõ phím. Họ đang:
- Giải quyết sự mơ hồ
- Định nghĩa ranh giới
- Mô hình hóa hành vi
- Quyết định hệ thống hoạt động như thế nào dưới áp lực
Đa phần công việc này diễn ra trước khi tồn tại một dòng code duy nhất. Đây là công việc giúp hệ thống duy trì sự liên kết.
Công việc kỹ thuật mà Vibe coding bỏ qua
Những phần của kỷ luật kỹ thuật này bị LLM bỏ qua.
| Lĩnh vực | Kỹ sư quyết định điều gì | LLM tạo ra điều gì |
|---|---|---|
| Bất biến (Invariants) | Điều gì luôn luôn đúng | Code giả định mọi thứ đều ổn |
| Danh tính & Tính duy nhất | Điều gì làm một thực thể trở thành "cùng một thứ" | Code coi mọi thứ có thể thay thế cho nhau |
| Ràng buộc (Constraints) | Điều gì hệ thống không bao giờ được phép | Code vi phạm ranh giới mà không nhận ra |
| Chế độ lỗi (Failure Modes) | Hệ thống hoạt động ra sao khi gặp áp lực | Code chỉ chạy trong kịch bản lý tưởng (happy path) |
| Liên kết & Trình tự | Cái gì phụ thuộc vào cái gì, theo thứ tự nào | Code phớt lờ trình tự hoàn toàn |
| Trạng thái & Chuyển đổi | Trạng thái thay đổi như thế nào và điều gì kích hoạt nó | Code thay đổi trạng thái mà không có quy tắc |
| Giao diện & Hợp đồng | Mỗi phần cam kết điều gì với phần còn lại | Code phơi bày bất cứ thứ gì mô hình tự phát minh ra |
| Ranh giới | Điều gì hệ thống không làm | Code mở rộng cho đến khi bị vỡ |
| Xử lý lỗi | Hệ thống phục hồi như thế nào | Code sụp đổ ngay khi gặp đầu vào bất ngờ |
Đây không phải là các khái niệm trừu tượng. Chúng là những quyết định mà LLM không bao giờ hỏi. Đó là lý do tại sao hệ thống thất bại ngay cả khi code được tạo ra trông có vẻ đúng đắn.
Một hệ thống nhiều hơn là văn bản
Vấn đề này quan trọng vì một hệ thống dựa vào:
- Các bất biến phải luôn luôn đúng
- Các ràng buộc không được phép vi phạm
- Các quy tắc liên kết và trình tự định hình logic kinh doanh và hành vi người dùng
Không một trong số này tồn tại trong thế giới nội bộ của mô hình.
Tại sao code do AI tạo ra bị đình trệ và tạo ra sự mong manh
Code do AI tạo ra bị đình trệ vì các quyết định kỹ thuật chưa bao giờ được đưa ra. Khi những quyết định này bị thiếu:
- Các tính năng va chạm và làm hỏng lẫn nhau
- Trạng thái hệ thống trở nên khó dự đoán
- Các lần triển khai (deployment) trở nên mong manh và chậm chạp
- Thông báo lỗi mất đi ý nghĩa
- Các tính năng đơn giản trở nên khó thêm vào
Sự tự tin sụp đổ lâu trước khi hệ thống sụp đổ. Những quyết định này luôn tái xuất hiện sau này dưới áp lực.
Hệ thống không phải là code bạn tạo ra. Nó là môi trường mà code đó chạy bên trong.
Bản demo thì dễ, sản phẩm thì không
Cho một câu lệnh đơn giản: "Viết Python để thêm tài khoản người dùng vào trang web để mọi người có thể đăng nhập."
Mô hình đã tạo ra một ví dụ nhỏ, hoạt động được với Flask và SQLite. Điều đó có thể chấp nhận được cho một bản demo, nhưng nó không hỏi về năm yêu cầu này:
- Email có phải là duy nhất không?
- Tài khoản có cần được xác minh không?
- Người dùng có thể đặt lại mật khẩu không?
- Có vai trò (roles) nào tồn tại không?
- Mô hình bảo mật là gì?
Hậu quả của những câu hỏi không được hỏi
Nếu email không duy nhất, hai người có thể đăng ký với cùng một địa chỉ email. Nếu họ đăng nhập cùng lúc, danh tính đăng nhập của người dùng trở nên mơ hồ. Hệ thống không thể phân biệt được sự khác biệt giữa họ.
Khi một người dùng đăng nhập bằng địa chỉ email trùng lặp, việc kiểm tra đăng ký của người dùng đó từ cơ sở dữ liệu sẽ luôn chứa nhiều giá trị. Bất kỳ code nào được xây dựng để kiểm tra người dùng đã đăng ký giờ đây phải xử lý an toàn khả năng có nhiều kết quả.
Sự thiếu cân nhắc về tính duy nhất của email có nghĩa là nếu một người dùng có email trùng lặp đặt lại mật khẩu, bản triển khai vibe-coded sẽ đặt lại mật khẩu cho tất cả người dùng chia sẻ email đó. Điều này không thể sống sót trong môi trường production. Và nếu một người dùng xóa tài khoản của họ, nhiều tài khoản sẽ bị xóa.
Không hệ thống production nào có thể dung thứ cho điều này.
Nhầm lẫn đằng sau Vibe coding
Vibe coding giả định AI là "thông minh" theo cách mà một kỹ sư thông minh. Nếu điều đó đúng, các yêu cầu bị thiếu, quy tắc mơ hồ và các ràng buộc ẩn sẽ được bắt giữ tự động.
Nhưng LLM không làm bất kỳ điều nào trong số này. Chúng không suy luận về hệ thống của bạn. Chúng không xây dựng mô hình về lĩnh vực của bạn. Chúng không theo dõi các hậu quả hay bảo vệ các bất biến. Chúng tạo ra văn bản trông giống như một câu trả lời mà không thực hiện bất kỳ suy nghĩ nào mà kỹ sư thực hiện trước khi viết code.
Vì code được tạo ra giải quyết vấn đề ngay lập tức, mọi người giả định rằng sự suy nghĩ cần thiết đã được thực hiện. Họ giả định hệ thống liên kết vì tệp chạy được. Họ giả định sự thông minh nơi chỉ có sự tiếp nối mẫu (pattern continuation).
Vibe coding thất bại trong production vì các quyết định bị thiếu tái xuất hiện sau này dưới dạng lỗi, sự không nhất quán và sự mong manh. Mô hình không thể nhìn thấy danh mục những thứ cần được hỏi. Con người đã giả định mô hình đã nhìn thấy chúng.
Thay vào đó nên làm gì
Trước khi tạo bất kỳ code nào, hãy quyết định:
- Điều gì phải luôn luôn đúng (bất biến)
- Điều gì làm cho một thứ trở thành thực thể "giống nhau" (quy tắc danh tính)
- Điều gì hệ thống không bao giờ được phép (ràng buộc)
- Hệ thống hoạt động như thế nào khi mọi thứ đi sai (chế độ lỗi)
LLM tạo ra code. Chúng không đưa ra quyết định kỹ thuật. Công việc đó vẫn còn đó.
Kết luận
Vibe coding giúp bạn có một bản demo.
Kỹ thuật giúp bạn có một hệ thống sống sót sau khi tiếp xúc với thực tế.
Bài viết liên quan

Phần mềm
Google tung ra Antigravity 2.0: Ứng dụng lập trình thế hệ mới với công cụ CLI và gói đăng ký AI Ultra
19 tháng 5, 2026

Phần mềm
Plugin Checkmarx Jenkins bị xâm phạm trong cuộc tấn công chuỗi cung ứng
11 tháng 5, 2026

Công nghệ
CEO Palantir: 10% thế giới "ghét chúng tôi một cách chuyên nghiệp"
05 tháng 5, 2026
