Vì sao phát triển theo đặc tả (Spec-Driven Development) thất bại khi mở rộng quy mô và cách khắc phục
(arcturus-labs.com)Bài viết này cho rằng phát triển theo đặc tả (spec-driven development) tuy hứa hẹn trong công việc lập trình với sự hỗ trợ của AI agent, nhưng sẽ thất bại khi mở rộng ở quy mô lớn trong bối cảnh sản phẩm toàn cầu do tính mơ hồ của đặc tả ngôn ngữ tự nhiên. Để giải quyết điều này, tác giả đề xuất một hệ thống phân cấp và tiến hóa của "đặc tả sống" (living specifications) tích hợp giữa mã nguồn và AI hội thoại; hệ thống này tạo ra vòng phản hồi cho các quyết định sản phẩm, giúp giảm sai lệch và cho phép phát triển có AI hỗ trợ hiệu quả ở quy mô lớn.
Những lý do chính khiến phát triển theo đặc tả thất bại ở quy mô lớn
Phát triển theo đặc tả truyền thống gặp vấn đề với đặc tả sản phẩm toàn cầu vì các lý do sau:
-
Tính mơ hồ của đặc tả ngôn ngữ tự nhiên: Đặc tả quy mô lớn được viết bằng ngôn ngữ tự nhiên nên thiếu chính xác và mơ hồ. AI có thể tạo mã một cách nhất quán theo đặc tả, nhưng kết quả có thể khác với ý định của lập trình viên. Ví dụ, nếu viết đặc tả cho toàn bộ sản phẩm website và để AI agent xây dựng trong 2 ngày, thành phẩm có thể khớp với đặc tả nhưng lại lệch khỏi ý đồ ban đầu. Nếu cố giải quyết bằng cách liên tục bổ sung các mục chi tiết để làm rõ mọi điểm mơ hồ, tài liệu sẽ trở nên quá dài dòng, làm mất lợi ích của việc viết đặc tả, và cuối cùng biến thành một ngôn ngữ hình thức không khác mấy mã nguồn.
-
Thiếu ngữ cảnh chia sẻ và sự hiểu biết về thế giới: AI có kiến thức rộng nhờ dữ liệu công khai, nhưng không hiểu các thông lệ riêng của công ty, quy tắc của codebase hay "cách làm việc" nội bộ. Trong khi đó, con người tích lũy điều này qua thử và sai, review PR, các cuộc họp và những cuộc trao đổi không chính thức. Một tài liệu ngữ cảnh duy nhất không thể nắm bắt hết những điều đó.
-
Xử lý làm rõ kém hiệu quả: Con người dựa vào ngữ cảnh chung để chỉ giải quyết những điểm mơ hồ thực sự liên quan một cách hiệu quả (ví dụ không cần hỏi về những phần đã rõ như chọn thư viện), còn AI vì thiếu sự tinh tế của ngữ cảnh nên hoặc hỏi những câu không cần thiết, hoặc khả năng làm rõ vẫn còn ở giai đoạn đầu. Điều này khiến AI giống như một "thực tập sinh quá tham vọng", luôn cần được hướng dẫn liên tục.
Vì các vấn đề này, phát triển theo đặc tả ở quy mô toàn cục là không thực tế nếu không có thêm cơ chế bổ trợ, và chưa thể đạt được độ trơn tru như hợp tác giữa con người với nhau.
Ví dụ cụ thể
- Kịch bản phát triển theo đặc tả cực đoan: Lập trình viên viết đặc tả cho toàn bộ website và AI tạo ra sản phẩm hoàn chỉnh trong 2 ngày, nhưng vì mơ hồ nên kết quả khác với ý đồ mong muốn.
- Quá trình học hỏi của con người: Lập trình viên học các chuẩn mực của công ty thông qua thay đổi mã ban đầu, review PR, họp hành và các cuộc trò chuyện ở hành lang, trong khi AI không thể tích lũy loại tri thức ngầm này.
- Codebase bị lão hóa: Trong quy trình truyền thống, lập trình viên đọc và sửa mã mà không có đặc tả, khiến hệ thống dần trở thành những "tấm chăn vá" (patchwork quilts) chắp vá, còn các quyết định sản phẩm bị thất lạc thì bị "giẫm đạp lên" (trammeling over).
Bài viết cũng nhắc lại bài trước đó (về roaming RAG) để nói rằng AI khá giỏi trong việc điều hướng các cấu trúc liên kết phân cấp. Không có nghiên cứu tình huống chính thức, chủ yếu là các ví dụ giả định và mang tính giải thích.
Giải pháp được đề xuất
Bài viết đưa ra một giải pháp mang tính kết nối, tập trung vào xử lý mơ hồ, xây dựng ngữ cảnh và tích hợp với mã nguồn:
Kích hoạt làm rõ thông qua đối thoại tương tác
- Triển khai tương tác qua lại giữa AI và lập trình viên (ví dụ trải nghiệm chat) để nhận diện và làm rõ các điểm mơ hồ trong đặc tả. Với tác vụ nhỏ, AI có thể tạo ra nhiều phiên bản triển khai từ cùng một đặc tả để bộc lộ chỗ mơ hồ, sau đó cùng lập trình viên so sánh và thảo luận.
Xây dựng thế giới quan cho agent bằng đặc tả phân cấp
- Dùng đặc tả toàn cục có cấu trúc phân cấp để giúp AI hiểu được các chuẩn mực của công ty và codebase. Thay vì một tài liệu khổng lồ duy nhất, đặc tả chính sẽ liên kết tới các tài liệu đặc tả con:
- Gắn chặt với cấu trúc mã nguồn, chẳng hạn đặc tả theo từng tệp (hoặc bản tổng hợp theo thư mục).
- Hoặc theo kiểu wiki tự do hơn (nhưng cần cẩn trọng với độ phức tạp quá mức).
- Tận dụng khả năng điều hướng liên kết của AI (như đã nói ở bài trước).
Vai trò của mã nguồn như đặc tả tối hậu
- Xem mã hiện có như đặc tả "mức lá" rõ ràng cho các giả định cấp thấp. Thay vì tái sinh hoàn toàn từ đặc tả gốc, nên hướng tới thay đổi dựa trên codebase hiện tại. Cách này thừa nhận rằng ngôn ngữ tự nhiên không thể đảm bảo cùng một đầu ra mỗi lần, và tránh đòi hỏi mức độ chính xác bất khả thi.
Đặc tả sống: cách sử dụng và tiến hóa
- Biến đặc tả thành những "tài liệu sống" cùng tiến hóa với codebase:
- AI điều hướng đặc tả toàn cục để giữ cho triển khai khớp nhau, bảo tồn các quyết định sản phẩm tốt hơn cả quy trình làm việc của con người.
- Lập trình viên trích xuất thông tin đặc tả liên quan thông qua đối thoại với AI (không cần đọc toàn bộ); đồng thời gắn cờ các điểm không nhất quán khi xác định phạm vi công việc.
- Khi mã thay đổi thì kích hoạt cập nhật đặc tả: so sánh và chỉnh sửa thay đổi so với đặc tả hiện có, rồi đưa cả thay đổi đặc tả vào PR.
- Lợi ích: giúp kỹ sư dễ hiểu tác động của thay đổi hơn, tăng mức độ tham gia của quản lý sản phẩm (vì có thể chỉnh sửa đặc tả dễ đọc), và hỗ trợ ban lãnh đạo truy vấn quá trình tiến hóa của sản phẩm. AI tự động hóa vấn đề mà tài liệu truyền thống thường gặp: không được cập nhật thường xuyên.
Kết luận và khuyến nghị
Tương lai của phát triển theo đặc tả không nằm ở việc hoàn thiện tuyệt đối các đặc tả ngôn ngữ tự nhiên, mà ở việc xây dựng hệ thống xử lý mơ hồ dựa trên đối thoại, ngữ cảnh phân cấp và mã nguồn. Đột phá thực sự là những đặc tả sống do AI duy trì, tạo ra vòng phản hồi để bảo tồn quyết định sản phẩm, duy trì ngữ cảnh và xóa bỏ khoảng cách giữa đặc tả với triển khai. Khuyến nghị là áp dụng đặc tả phân cấp, tiến hóa, tích hợp mã nguồn và AI hội thoại để hiện thực hóa quy trình làm việc với AI có thể mở rộng, vượt qua phát triển truyền thống do con người thực hiện.
1 bình luận
Cảm giác rất giống một bài đăng được quăng ra sau khi chạy GPT.