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

Phần mềm30 tháng 5, 2026·8 phút đọc

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 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 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ựcKỹ 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 đúngCode 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épCode 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ựcCode 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àoCode phớt lờ trình tự hoàn toàn
Trạng thái & Chuyển đổiTrạ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 đồngMỗi phần cam kết điều gì với phần còn lạiCode 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àmCode mở rộng cho đến khi bị vỡ
Xử lý lỗiHệ thống phục hồi như thế nàoCode 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ế.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗