- Nhà máy phần mềm vận hành ở quy mô lớn bằng cách bọc vòng lặp lặp lại việc thu thập ngữ cảnh, hành động và xác minh trong các harness; chúng được chia thành nhà máy sáng, nơi con người đưa ra phán đoán, và nhà máy tối, nơi cả việc rà soát mã cũng được giao cho máy
- Sinh mã, kiểm thử và quét có thể mở rộng gần như không tốn chi phí, nhưng rà soát và phán đoán của con người khó mở rộng, nên nút thắt không nằm ở lượng sinh ra mà ở tốc độ xác minh kết quả một cách rẻ và đáng tin cậy
- Nếu con người không đọc mã, nợ hiểu biết (comprehension debt) sẽ tích tụ giữa quy mô mã và mức độ hiểu biết của con người; ngay cả khi kiểm thử vẫn pass, trong các hệ thống phức tạp vận hành lâu dài, vấn đề bảo trì có thể xuất hiện muộn
- Chỉ nên cho phép tự động hóa hoàn toàn trong các vòng lặp ngắn có tiêu chí phán định tức thời, không drift và khó bị thao túng; với các việc có chi phí và phạm vi ảnh hưởng lớn khi quyết định sai, như xác thực, thanh toán, API công khai, vẫn phải duy trì rà soát của con người
- Vai trò của kỹ sư chuyển từ trực tiếp viết từng thay đổi sang thiết kế và bảo vệ vòng lặp bên ngoài, đồng thời phải xác minh bằng chứng về chẩn đoán, triển khai, kiểm thử do agent thực hiện và chịu trách nhiệm về phê duyệt cũng như kết quả
Từ vòng lặp đến nhà máy phần mềm
- Ý tưởng biến phần mềm thành một quy trình sản xuất có thể lặp lại và đo lường được có thể truy ngược đến bài “The economics of program production” do Bob Bemer công bố năm 1968
- Vì khó “đúc” ý tưởng như linh kiện ô tô, trong nửa thế kỷ qua các nỗ lực kiểu này nhìn chung không đạt kỳ vọng
- Những thay đổi trong 2 năm gần đây đủ lớn để xem xét lại ý tưởng nhà máy phần mềm cũ, nhưng các cạm bẫy trong quá khứ có thể được đóng gói lại như cơ hội mới
- Toàn bộ hệ thống gồm ba tầng: vòng lặp, harness, nhà máy
- Vòng lặp là đơn vị công việc tối thiểu, trong đó một agent thu thập ngữ cảnh, hành động rồi kiểm tra kết quả, lặp lại cho đến khi đáp ứng điều kiện kết thúc
- Loop engineering là cách thiết kế một hệ thống nhỏ cung cấp prompt cho agent, thay vì để con người nhập prompt mỗi lần
- Harness bao gồm sandbox nơi vòng lặp chạy, các công cụ có thể dùng, bộ nhớ được duy trì giữa các lần chạy, và gate để xác định đã hoàn tất hay chưa
- Mô hình không có harness có thể lặp vô tận, nên harness giúp vòng lặp trở nên hữu ích và an toàn
- Nhà máy phần mềm là cấu trúc nhận mục từ hàng đợi công việc, chạy đồng thời nhiều vòng lặp dựa trên harness, đi qua gate rà soát rồi đưa vào production
- Nó gần với một sơ đồ tổ chức gồm các vòng lặp hơn là một agent đơn lẻ lớn hơn
- Đơn vị công việc của kỹ sư cũng chuyển từ từng thay đổi mã sang vòng lặp, harness và luồng giữa các vòng lặp
Luồng công việc và nút thắt của nhà máy
- Tầm nhìn của lãnh đạo kỹ thuật, ý định của kỹ sư, tín hiệu từ sự cố và yêu cầu người dùng đi vào một hàng đợi công việc chung
- Harness chọn mục, tạo thay đổi, rồi CI, kiểm thử, phân tích tĩnh và các loại quét đồng thời kiểm tra thay đổi đó
- Nếu gate rà soát phê duyệt, thay đổi được triển khai; dữ liệu giám sát production lại quay về làm tín hiệu kích hoạt công việc
- Sinh, kiểm thử và quét có thể mở rộng với chi phí không đáng kể, nhưng phán đoán của con người ở gate rà soát thì khó mở rộng
- Việc có thể tăng tốc độ phát triển và tần suất triển khai hay không phụ thuộc vào cách xử lý nút thắt phán đoán này
Nhà máy tối và nợ hiểu biết
- Nhà máy tối trong sản xuất là cơ sở vận hành khi tắt đèn vì máy móc không cần ánh sáng
- FANUC đã vận hành loại nhà máy này từ năm 2001, và Xiaomi cũng mở một nhà máy tối tự động hóa cao vào năm 2024
- Trong nhà máy phần mềm tối, con người không đọc mã, và thay đổi được triển khai chỉ dựa trên xác minh do chính cỗ máy tạo mã thực hiện
- “Tối” ở đây không mang sắc thái tiêu cực, mà nghĩa là con người đã biến mất khỏi quá trình viết, rà soát và triển khai diff
- Loại bỏ rà soát của con người khiến các yếu tố cản trở biến mất, tạo cảm giác throughput theo chiều dọc của nhóm tăng mạnh
- Tuy nhiên, do chi phí ẩn, duy trì luồng công việc này lâu dài khó hơn vẻ bề ngoài
- Orchestration, prototyping dựa trên sandbox và gọi công cụ sẽ tiếp tục mạnh lên, nhưng chỉ harness thôi là chưa đủ để duy trì chất lượng codebase dài hạn
- Nợ hiểu biết là khoảng cách giữa lượng mã đang tồn tại và lượng mã con người thực sự hiểu
- Nhà máy tối tích tụ nợ hiểu biết nhanh chóng ngay cả khi kiểm thử vẫn pass
- Khác với thay đổi tức thời trên một vùng mã nhỏ hay dự án cuối tuần, các hệ thống kế thừa phức tạp được phát triển hơn 10 năm vẫn phải được duy trì liên tục ở nhịp độ chuyên nghiệp
- Vận hành một dự án tự động hóa trong 3–6 tháng có thể khiến bạn bị nhấn chìm bởi lượng mã chưa đọc
- Khi Dex Horthy vận hành một nhà máy tự động hóa hoàn toàn trong khoảng 4 tháng, nơi con người không nhìn vào mã được sinh ra, việc tìm nguyên nhân vấn đề đòi hỏi debug thủ công vất vả
- Càng tối đa hóa lượng token sử dụng, mức độ con người hiểu hệ thống càng âm thầm giảm xuống
- Thất bại có thể không đến bằng việc toàn bộ hệ thống từng pass kiểm thử đột ngột sụp đổ, mà đến muộn và lặng lẽ
Vì sao xác minh trở thành ràng buộc thay vì sinh mã
- Back pressure là nguyên tắc chỉ trao quyền tự chủ cho vòng lặp trong phạm vi có thể xác minh rẻ và đáng tin cậy
- Khoảng cách giữa năng lực sinh gần như không giới hạn và sự chú ý hữu hạn của con người là vấn đề cốt lõi
- Nếu đoạn xác minh không mở rộng, thay đổi sẽ chồng chất; nếu chỉ tăng số lượng mà không có gate đáng tin cậy, sẽ sinh ra PR chất lượng thấp và lỗi được “sản xuất” ra
- Cải thiện năng lực mô hình không tự động thu hẹp khoảng cách giữa sinh và xác minh
- Giá trị của kiến trúc tốt bộc lộ qua nhiều tháng và nhiều năm, không phải vài giây hay vài phút
- Khó tính toán một hàm chi phí gọn gàng hay tín hiệu đánh giá tức thời cho sự xuất sắc về kiến trúc, nên cũng khó huấn luyện các quyết định thiết kế phức tạp như những ví dụ tốt
Cách bật đèn trở lại
- Ngay cả trong nhà máy sáng, agent vẫn phụ trách phần lớn triển khai, nhưng tại những điểm có chi phí phán đoán sai cao, đèn được bật lên và con người đọc sản phẩm đầu ra trước khi triển khai
- Phán đoán của con người không nên chỉ gắn vào lần code review cuối cùng, mà phải chuyển lên các giai đoạn sản phẩm, thiết kế và kiến trúc trước khi agent bắt đầu vòng lặp
- Nếu dành trước 1 giờ để rà soát một kế hoạch 200 dòng, có thể giảm một cuộc review dài phải lục qua 2.000 dòng mã sinh ra sau triển khai để tìm các quyết định thiết kế
- Quyết định càng tốn kém và kéo dài, con người càng cần tham gia trước khi triển khai; ngay cả khi đã rà soát trước, vẫn trực tiếp kiểm tra diff nếu cần
- Lưới an toàn không phải kỹ thuật mới, mà gồm các thực hành kiến trúc quen thuộc
- Dùng type và method signature tốt để bắt lỗi ở compiler thay vì production
- Đặt các điểm nối kiểm thử (seam) để cố định hành vi và quan sát thay đổi
- Sắp xếp để cả con người lẫn mô hình đều dễ tìm mã cần thiết
- Giữ call stack ngắn và dễ đọc
- Làm rõ ranh giới component để giới hạn phạm vi ảnh hưởng của thay đổi
- Dùng dependency injection để có thể thay thế các thành phần
- Kiến trúc như vậy đóng vai trò thứ hai: ngăn lỗi của agent coding tự động theo cách rẻ và khó đánh lừa
- Các agent như Claude Code và Codex được reinforcement learning cho harness riêng và việc sử dụng công cụ, nhưng không đảm bảo khả năng bảo trì dài hạn
- Lưới an toàn phải tồn tại bên ngoài mô hình, và đầu tư kiến trúc trở thành phương tiện để có thêm quyền tự chủ một cách an toàn
- Khi kết hợp với hạ tầng an toàn, một số vòng lặp ngắn và rủi ro thấp có thể chạy không người giám sát
- Ví dụ, mỗi đêm một cron GitHub Actions có thể sửa đúng một antipattern, vi phạm lint hoặc prop bị đặt optional không cần thiết, rồi commit và mở một PR nhỏ
- Những mục có chi phí thất bại lớn như hệ thống xác thực, engine thanh toán, hợp đồng API công khai cần được con người rà soát bằng tri thức hệ thống và phán đoán
Vòng lặp đủ điều kiện tự động hóa
- Để một vòng lặp được tự động hóa hoàn toàn, việc kiểm tra phải rẻ, chạy thường xuyên và dựa trên tiêu chí khó bị đánh lừa
- Bao gồm bộ phán định trả về true/false rõ ràng, type gate, kiểm thử dựa trên thuộc tính, và agent rà soát kết hợp với rubric đánh giá thực tế
- Phán định phải có ngay lập tức và không drift theo thời gian
- Có thể tự động hóa khi trạng thái hoàn tất không chỉ con người mà cả máy cũng chứng minh được
- Vòng lặp ngắn dễ xác minh hơn vòng lặp dài
- Theo quy tắc kinh nghiệm của Dex, agent hoạt động tốt trong 3–10 bước, nhưng bắt đầu mất luồng khi vượt quá 20 bước
- Ngữ cảnh càng tích lũy, khả năng agent lệch khỏi đường đi càng lớn, và vòng lặp dài giấu lỗi ở các góc khuất
- Nếu chi phí của câu trả lời sai lớn và chỉ con người mới phát hiện được, phải bật đèn
- Bao gồm lỗi production tinh vi không bị kiểm thử bắt, phạm vi ảnh hưởng rộng, và các quyết định chi phối công việc trong hơn 1 năm
- Trong những trường hợp này, sự chú ý của con người là sản phẩm thực sự và là tài nguyên đắt nhưng thiết yếu
- Nếu đặt mọi vòng lặp cùng một chế độ, cả hai phía đều thất bại
- Vận hành tất cả trong bóng tối có thể khiến vài tháng sau phải tháo dỡ hệ thống
- Vận hành tất cả trong ánh sáng sẽ biến review thành nút thắt khổng lồ
- Kỹ năng cốt lõi là quyết định tại điểm nào trong mỗi vòng lặp cần bật đèn
Đồ thị và state machine bọc quanh vòng lặp
- Dù gọi công việc của agent là finite state machine hay lời gọi dịch vụ có điều kiện, cuối cùng nhiều khả năng nó được cấu thành như một đồ thị có hướng
- Mỗi node là một bước rõ ràng, và cạnh giữa các node là điều kiện rõ ràng
- Mọi mã đều có thể biểu diễn bằng control flow graph, nên bản thân cấu trúc này không mới
- Quyền tự chủ của agent bị giới hạn trong từng node, chứ không trải trên toàn bộ đồ thị
- Nỗ lực mới là loại bỏ flowchart, để mô hình tự chọn đường đi ở mỗi lần gọi công cụ rồi tự tuyên bố hoàn tất
- Sau khi va chạm với codebase cũ, xu hướng giành lại quyền sở hữu control flow giống như khôi phục đồ thị truyền thống quanh vòng lặp
- Tác vụ sửa bug diễn ra khác nhau trong vòng lặp thuần túy và trong đồ thị
- Trong vòng lặp thuần túy, việc điều tra vấn đề, thay đổi mã, chọn và chạy kiểm thử theo thứ tự nào, thử lại và phán đoán hoàn tất đều được quyết định trong quá trình thực hiện
- Trong đồ thị, tái hiện bug hoặc yêu cầu thêm thông tin, xác định nguyên nhân, sửa, kiểm thử và rà soát được định nghĩa trước thành đường đi
- Kiểm thử thất bại quay lại bước sửa, thành công chuyển sang rà soát, và chỉ hoàn tất khi được phê duyệt
- Agent hành động thông minh bên trong mỗi node nhưng không thể rời sang đường đi không được phép
- Đồ thị là hình thức trực quan hóa back pressure
- Đổi lại việc từ bỏ một phần tự do của agent, ta có các kiểm tra bắt buộc và điểm thất bại có thể đọc được
- Nếu thực thi thất bại, có thể xác định node nào đã chặn nó
- Giống cách tiếp cận của 12-factor agents, nhiều hệ thống agent gần với “mã phần lớn mang tính quyết định, được trộn thêm các bước LLM ở đúng chỗ”
- Cùng mẫu này cũng xuất hiện trong LangGraph và LlamaIndex Workflows, đồ thị workflow lai trên agent của Jerry Liu, cũng như state machine và actor model mà David Khourshid liên kết
- Ở đây, đồ thị không phải knowledge graph, mà là đồ thị có hướng định nghĩa trước luồng công việc và các cạnh có điều kiện
Con người sở hữu vòng lặp bên ngoài
- Con người không biến mất khỏi nhà máy, mà chuyển từ dây chuyền thực thi sang vòng lặp bên ngoài
- Agent thực hiện vòng lặp bên trong gồm điều tra bug, viết chẩn đoán, triển khai sửa đổi, chạy kiểm thử và báo cáo kết quả
- Kỹ sư phán đoán liệu vấn đề có được giải quyết đúng cách hay không, xác minh chẩn đoán và triển khai, phê duyệt thay đổi và chịu trách nhiệm về kết quả sai
- Ở ranh giới giữa vòng lặp bên trong và bên ngoài là bằng chứng như diff, kiểm thử, log và phần giải thích ngắn nối chúng lại
- Khi có type, điểm nối kiểm thử và rubric đánh giá, có thể giám sát quá trình chạy của agent mà không cần nhiều thao tác thủ công cho từng thay đổi
- Vị trí của kỹ sư chuyển từ chỗ trực tiếp viết thay đổi trên dây chuyền sản xuất sang chỗ thiết kế dây chuyền và canh giữ gate
- Mô hình và harness có thể cải thiện, nhưng khó tự động hóa phán đoán của con người trong việc nhận diện các vấn đề đắt đỏ về dài hạn
- Nguy hiểm nhất là biến mọi không gian làm việc thành bóng tối đến mức con người không thể thấy chuyện gì đang diễn ra, thậm chí không tìm được công tắc đèn
Chưa có bình luận nào.