Bỏ qua và tới nội dung chính

Từ Prompt-Driven Development đến Contract-Driven Development

Trong giai đoạn đầu của AI coding, nhiều developer phát triển phần mềm bằng cách viết prompt để AI tạo code trực tiếp. Nhưng khi hệ thống lớn dần, nhiều team bắt đầu chuyển sang contract-driven development để giữ kiến trúc ổn định, diff dễ review hơn và codebase bền hơn cho production.

1 lượt xem 5 phút đọc

TL;DR

Từ prompt-driven development đến contract-driven development không phải là bỏ AI, mà là chuyển AI khỏi vai trò người gõ code lang thang sang một trợ lý bám contract, master-brief và workflow rõ ràng hơn. Nếu repo của bạn đang lớn dần và diff bắt đầu phình, đây là bước chuyển đáng cân nhắc.

Key Takeaways

  • Prompt-driven development rất nhanh
  • Contract-driven development ổn định hơn
  • Git diff nhỏ hơn khi dùng contract
  • Hai workflow có thể kết hợp

Từ Prompt-Driven Development đến Contract-Driven Development

Khi AI coding mới bùng lên, một phong cách phát triển phần mềm xuất hiện rất nhanh và rất tự nhiên: viết prompt, nhận code, chỉnh một chút rồi commit. Cảm giác này cực kỳ hấp dẫn. Nó làm nhiều developer có cảm giác như vừa mở khóa chế độ tăng tốc cho nghề nghiệp của mình. Câu chuyện từ “ý tưởng” sang “code chạy được” bỗng ngắn lại đáng kể.

Cách làm đó được gọi khá hợp lý là prompt-driven development. Tức là prompt đóng vai trò điểm khởi đầu chính của quá trình tạo phần mềm. Viết prompt tốt, AI sẽ sinh ra code tốt hơn. Sửa prompt thêm một chút, code thay đổi theo. Ở giai đoạn prototype hoặc khi khám phá ý tưởng, đây là một workflow rất mạnh.

Nhưng khi dự án lớn dần, nhiều team bắt đầu nhận ra rằng việc để prompt trở thành “nguồn chân lý ngầm” của hệ thống có một số giới hạn. Lúc đó một workflow khác dần xuất hiện: contract-driven development. Thay vì bắt đầu từ prompt để tạo code trực tiếp, team bắt đầu từ contract để mô tả hệ thống một cách có cấu trúc, rồi để compiler hoặc generator sinh code từ đó.

Nói ngắn gọn, đây không chỉ là thay đổi công cụ. Đây là thay đổi điểm bắt đầu của engineering workflow.

Prompt-driven development là gì?

Prompt-driven development là cách phát triển phần mềm bằng cách mô tả yêu cầu cho AI và để AI tạo code trực tiếp từ mô tả đó. Ví dụ rất quen thuộc:

Tạo API quản lý user bằng Node.js, có create, list, update và delete.

AI sẽ có thể sinh ra:

  • controller
  • service
  • model
  • validation
  • test skeleton

Developer sau đó chỉnh sửa một chút rồi commit. Workflow này nhanh, tiện và rất hợp với lúc ta chưa chắc mình muốn hệ thống trông như thế nào. Nó tối ưu cho việc khám phá. Prompt tốt có thể thay cho hàng loạt thao tác khởi tạo thủ công. Với nhiều người, đây là lần đầu tiên cảm giác “mô tả bằng lời rồi ra code” trở nên thực dụng đến vậy.

Vì sao prompt-driven development hấp dẫn đến thế?

Bởi vì nó giảm ma sát ban đầu cực mạnh. Bạn không cần ngồi dựng từng file từ đầu. Bạn không cần nhớ hết boilerplate. Bạn không cần mất nửa ngày cho một tính năng nhỏ chỉ để tạo khung. AI làm rất nhiều phần công việc mở đầu một cách nhanh chóng. Điều này mang lại ít nhất bốn lợi ích rõ rệt:

  • prototype ra nhanh
  • ý tưởng được kiểm chứng sớm
  • developer tiết kiệm thời gian khởi tạo
  • rào cản thử nghiệm giải pháp mới thấp hơn

Nói vui một chút, prompt-driven development giống như có một thực tập sinh siêu nhanh và không biết mệt, chỉ cần bạn mô tả đủ rõ thì bạn đã có bản nháp chạy được rất sớm.

Những giới hạn của prompt-driven development khi dự án lớn dần

Khi codebase nhỏ, workflow này hoạt động khá ổn. Nhưng khi hệ thống lớn dần, vài vấn đề bắt đầu xuất hiện và thường xuất hiện cùng lúc.

Git diff lớn

AI có thể thay đổi nhiều file để hoàn thành một task. Chỉ một thay đổi business nhỏ nhưng diff lan qua controller, service, DTO, test, helper và đôi khi cả những chỗ không thật sự cần thiết. Pull request trở nên khó review hơn rất nhiều.

Code structure không nhất quán

Mỗi prompt có thể tạo ra một style code khác nhau. Prompt hôm nay sinh ra structure kiểu A, prompt mai sinh ra kiểu B. Nếu team không có kỷ luật kiến trúc đủ mạnh, codebase sẽ dần trở nên khó đọc và khó đoán hơn.

Architecture drift

Khi AI chỉnh sửa code trực tiếp qua nhiều vòng lặp, kiến trúc hệ thống có thể thay đổi theo thời gian mà không ai thực sự chủ động thiết kế sự thay đổi đó. Business logic bắt đầu rò sang sai layer, naming dần lệch nhau, abstraction mọc theo lịch sử chứ không theo ý đồ.

Nguồn chân lý bị phân tán

Đây là điểm ít được nói hơn. Trong prompt-driven development, ý định hệ thống thường nằm một phần ở prompt, một phần ở code AI sinh ra, một phần ở các sửa tay sau đó. Tức là nguồn chân lý bị tản mát. Đến lúc cần hiểu vì sao hệ thống trông như hiện tại, team phải lần lại lịch sử rất mệt.

Contract-driven development là gì?

Contract-driven development thay đổi cách bắt đầu viết code. Thay vì bắt đầu bằng prompt để tạo code trực tiếp, developer bắt đầu bằng contract. Contract mô tả hệ thống ở mức có cấu trúc hơn, ví dụ:

  • API và endpoint
  • data schema
  • workflow hoặc interaction shape
  • error model
  • auth hoặc policy metadata

Sau đó code được sinh từ contract.

contract → validate → compile → code

Điểm quan trọng là contract trở thành nơi mô tả sự thay đổi chính của hệ thống. Code chỉ là đầu ra ổn định của quá trình đó.

Sự khác nhau giữa hai workflow

Tiêu chí Prompt-Driven Contract-Driven
Bắt đầu từ Prompt Contract
Cách tạo code AI sinh trực tiếp Compiler hoặc generator sinh code
Nguồn chân lý Phân tán giữa prompt và implementation Tập trung ở contract
Git diff Thường lớn Nhỏ hơn và rõ hơn
Phù hợp Khám phá, prototype Production, scale dài hạn

Vai trò của AI trong contract-driven development

AI vẫn đóng vai trò rất quan trọng. Nhưng thay vì viết code trực tiếp vào repo ở quy mô lớn, AI giúp:

  • thiết kế API
  • viết contract
  • mô tả workflow
  • gợi ý schema và error case
  • soát consistency giữa các phần mô tả

Code sau đó được sinh ra bởi compiler hoặc generator. Điều này giữ được hai lợi ích cùng lúc: tốc độ tư duy và mô tả của AI, cùng với sự ổn định của đầu ra do compiler bảo đảm. Đây là lý do ngày càng nhiều team backend không muốn bỏ AI, mà chỉ muốn đổi chỗ đứng của AI trong pipeline.

Vì sao nhiều team chuyển từ prompt-driven sang contract-driven?

Bởi vì khi hệ thống bắt đầu có tuổi đời, những bài toán quan trọng nhất không còn là “code ra nhanh được không”, mà là:

  • có review nổi không
  • có giữ được kiến trúc không
  • có onboarding người mới được không
  • có rollback và refactor an toàn không
  • có dùng AI mà không tăng nợ kỹ thuật quá nhanh không

Prompt-driven development trả lời rất tốt câu hỏi về tốc độ khởi động. Contract-driven development trả lời tốt hơn các câu hỏi về tính bền vững. Khi dự án lớn dần, team buộc phải quan tâm nhiều hơn tới tính bền vững đó.

Có phải prompt-driven development là sai?

Không hề. Nó cực kỳ hữu ích trong giai đoạn đầu, khi ta cần khám phá nhanh, thử nhiều hướng, chưa chắc boundary nào là đúng và chưa muốn đầu tư formalism quá sớm. Vấn đề chỉ xảy ra khi team mang workflow tối ưu cho khám phá sang dùng nguyên xi cho production lâu dài.

Đây là chỗ nhiều đội bị nhầm. Cái giúp ta khởi động nhanh chưa chắc là cái giúp ta scale khỏe. Prompt-driven development rất giỏi làm mồi lửa. Contract-driven development giỏi xây hệ thống bền hơn quanh ngọn lửa đó.

Một lộ trình chuyển đổi thực dụng

Đa số team không nhảy từ prompt-driven sang contract-driven trong một đêm. Họ thường đi theo lộ trình mềm hơn:

  1. Dùng prompt để khám phá giải pháp và nhanh chóng tạo bản nháp.
  2. Chọn những pattern lặp lại nhiều nhất trong repo.
  3. Đưa các pattern đó vào contract hoặc DSL.
  4. Dùng generator sinh phần code lặp lại từ contract.
  5. Giữ business logic đặc thù ở phần code viết tay.

Cách làm này giúp team không phải đập bỏ mọi thứ. Họ chỉ chuyển dần nguồn chân lý từ prompt rời rạc sang contract có cấu trúc. Nói kiểu đời thường: không phải đổi xe giữa đường, mà là thay dần các bộ phận quan trọng để xe chạy ổn hơn.

Kết luận

Từ prompt-driven development đến contract-driven development là một bước trưởng thành rất tự nhiên trong thời đại AI coding. Prompt-driven giúp developer đi nhanh ở giai đoạn khám phá. Contract-driven giúp hệ thống ổn định hơn khi dự án lớn dần và bước vào production nghiêm túc.

Nhiều team hiệu quả nhất hiện nay không chọn một trong hai theo kiểu trắng đen. Họ kết hợp cả hai: dùng prompt để khám phá ý tưởng, nhưng dùng contract để xây cấu trúc có thể sống lâu trong repository. Đó là cách vừa giữ được tốc độ, vừa không biến repo thành một bộ sưu tập của những prompt đẹp mà khó duy trì. Nói theo kiểu hơi CTO một chút: khởi động nhanh là tốt, nhưng đi đường dài mới là chỗ thể hiện bản lĩnh của workflow.

Một câu rất đáng nhớ khi chọn workflow

Prompt-driven development tối ưu cho việc trả lời câu hỏi “có thể làm được không?”. Contract-driven development tối ưu cho câu hỏi “làm thế nào để thứ này sống khỏe trong production?”. Nếu team nhớ được hai câu hỏi này, việc chọn workflow cho từng giai đoạn sẽ sáng sủa hơn rất nhiều.

Không phải chuyển đổi để bớt dùng AI, mà để dùng AI đúng chỗ

Nhiều người nghe contract-driven development rồi nghĩ team đang “quay lưng với AI”. Thực ra ngược lại. Đây là cách dùng AI trưởng thành hơn: dùng AI ở tầng mô tả, nơi nó rất mạnh, và giao phần tạo output ổn định cho compiler hoặc generator. Chuyển workflow không phải để chậm lại. Chuyển workflow là để đi nhanh mà ít để lại hiện trường hơn.

Chọn workflow theo giai đoạn, không theo niềm tin

Team mạnh thường không tôn thờ prompt hay contract như tôn giáo. Họ chọn công cụ theo giai đoạn. Cần khám phá nhanh thì dùng prompt-driven. Cần chuẩn hóa và scale production thì chuyển dần sang contract-driven. Khi nhìn workflow như một phổ liên tục thay vì hai phe đối lập, quyết định kỹ thuật sẽ bớt cảm tính hơn rất nhiều.

Điểm mấu chốt để không chuyển đổi nửa vời

Nếu đã bắt đầu đi theo hướng contract-driven, team nên thật sự xem contract là nơi cần review nghiêm túc. Nhiều đội thất bại không phải vì contract-driven development tệ, mà vì họ vẫn review contract như review tài liệu phụ. Trong khi đó, implementation lại vẫn bị soi quá kỹ ở phần lặp. Đảo đúng trọng tâm review là một bước nhỏ nhưng tác động rất lớn đến hiệu quả của cả workflow.

Khi team hiểu điều đó, việc chuyển từ prompt-driven sang contract-driven sẽ không còn mang cảm giác bỏ cái mới để quay về cái cũ. Nó mang cảm giác lớn lên trong cách dùng cái mới.

Và khi một workflow vừa giữ được tốc độ khám phá, vừa bảo vệ được production, đó thường là dấu hiệu bạn đang đi đúng hướng.

Khám phá bằng prompt, ổn định bằng contract. Nhiều team khỏe nhất hiện nay đang đi đúng công thức rất thực tế đó.

Khi chọn đúng workflow cho đúng giai đoạn, AI không còn là nguồn gây tranh cãi quá nhiều. Nó trở thành công cụ mà ai cũng biết nên dùng ở đâu để tạo ra nhiều giá trị nhất.

Nói cách khác, trưởng thành trong AI coding không phải bỏ prompt. Đó là biết khi nào prompt nên nhường vai chính cho contract.

Đó cũng là lúc AI không còn là món tăng tốc nhất thời, mà trở thành một phần trưởng thành của quy trình phát triển phần mềm.

Một kết luận rất thực dụng cho team backend

Nếu team của bạn còn đang ở giai đoạn cần thử thật nhanh, prompt-driven development vẫn là đồng minh rất mạnh. Nhưng nếu repo đã bắt đầu có tuổi, có nhiều người cùng sửa và mỗi thay đổi đều cần sống khỏe qua code review, QA và production, thì contract-driven development gần như là bước tiến tự nhiên tiếp theo. Đó không phải đổi phe. Đó là nâng cấp cách làm việc.

Frequently Asked Questions

Q: Prompt-driven development là gì?

Đó là cách phát triển trong đó prompt trở thành điểm bắt đầu chính cho thay đổi code.

Vì sao nhiều team muốn đi từ prompt-driven sang contract-driven?

Vì khi repo lớn lên, prompt thuần túy khó giữ được tính nhất quán và phạm vi thay đổi.

Contract-driven development khác gì?

Nó đặt contract làm nguồn chân lý rồi để compiler hoặc workflow sinh phần code lặp từ đó.

AI có bị giảm vai trò trong mô hình mới không?

Không, AI vẫn hữu ích nhưng chuyển từ người gõ code hộ sang trợ lý ở tầng mô tả và thiết kế thay đổi.

Git diff có cải thiện khi chuyển hướng không?

Có, vì semantic change được gom về contract trước khi lan ra implementation.

Master-brief đóng vai trò gì trong quá trình chuyển đổi?

Master-brief giúp team giữ ngữ cảnh chung ổn định để AI và compiler cùng bám đúng hướng.

Midi Coder có hợp với bước chuyển này không?

Có, vì Midi Coder được xây theo tư duy contract-driven backend development.

Có cần bỏ hẳn prompt không?

Không, prompt vẫn hữu ích cho khám phá và mô tả, chỉ là không nên giữ vai trò nguồn chân lý duy nhất.

Chuyển đổi nên bắt đầu ở đâu?

Hãy bắt đầu ở vùng code lặp nhiều như DTO, validation, endpoint API hoặc service scaffold.

Dấu hiệu cho thấy đã đến lúc chuyển là gì?

Review mệt hơn, diff to hơn và team bắt đầu không chắc mình đang sửa logic hay đang sửa phong cách.