Thời đại Lập trình AI, thói quen lập trình tốt vẫn còn quan trọng


Gần đây làm một bài kiểm tra Agent, phát hiện không thể đơn giản đánh giá độ phức tạp của một nhiệm vụ lập trình đối với AI từ góc nhìn của nhà phát triển.
Ví dụ một nhiệm vụ tái cấu trúc: chia một tệp lớn vài nghìn dòng thành hơn mười mô-đun nhỏ theo chức năng.
Nhiệm vụ này đối với nhà phát triển thực ra không quá khó, công việc chính là di chuyển mã, sắp xếp imports, kiểm tra biên dịch, người mới cũng có thể làm được.
Vì vậy nghĩ đến việc dùng một nhiệm vụ đơn giản để làm benchmark, kết quả lại ngoài mong đợi.
Claude Code đánh giá nhiệm vụ này khá lớn, thử tách một phần, đề xuất một PR viết phần Future work dự định từng bước làm.
Tôi tự mình dùng Agent “cứng”, thúc đẩy hướng phân tách hoàn chỉnh nhiều hơn, nhưng cái giá rõ ràng là: Tiêu thụ Token gấp hàng chục lần Claude, phần lớn thời gian sau đó dành cho việc đọc đi đọc lại file, sửa lỗi biên dịch, đọc lại file, sửa lỗi tiếp.
Điều này khiến tôi nhận ra, nhiệm vụ mà người cảm thấy đơn giản, không nhất thiết đối với Agent cũng đơn giản.
Đối với người, kiểu tái cấu trúc này nhiều khi chỉ là “dịch chuyển đoạn này sang chỗ khác”. Nhưng đối với Agent, nó phải đọc từng phần lớn của file, nhớ các hàm và các kiểm thử liên quan, rồi sinh ra một loạt chỉnh sửa chéo file, cuối cùng qua lỗi biên dịch để dần vá lỗi. Trông có vẻ như công việc máy móc, thực ra lại trở thành một nhiệm vụ tốn nhiều Token, quản lý trạng thái cao.
Gần đây có người nói rằng, trong thời đại AI Coding, các nguyên tắc phân chia mô-đun không còn quan trọng nữa, dù sao con người cũng không xem mã nữa. Giờ nghĩ lại, tôi không đồng ý. Ranh giới mô-đun rõ ràng, độ phân chia file phù hợp, phụ thuộc đơn giản không chỉ giúp con người dễ đọc mà còn giúp giảm độ phức tạp của nhiệm vụ cho Agent.
Từ góc độ khác, hiện tại công cụ đọc và sửa file của Agent đối với kiểu tái cấu trúc này cũng không quá tiện lợi.
Agent chỉnh sửa file chủ yếu vẫn là thay thế văn bản. Ví dụ Claude Code thường dùng mô hình old_string / new_string: đưa ra đoạn văn bản cũ rồi thay thế bằng mới. Codex thường dùng apply_patch: tạo ra một patch giống git diff, thể hiện việc thay thế nội dung cũ bằng mới. Cả hai phù hợp cho chỉnh sửa nhỏ, nhưng nếu muốn xóa một đoạn lớn mã cũ hoặc di chuyển một loạt hàm sang file khác, mô hình thường vẫn phải đọc toàn bộ nội dung gốc vào ngữ cảnh, rồi sinh ra một đoạn thay thế hoặc diff lớn.
Vì vậy, sau này tôi đã đưa ra một gợi ý cho Agent, để nó dùng script, sed, perl hoặc các công cụ tương tự để tách lớn file ra sơ bộ, trực tiếp xóa nội dung cũ, ghi vào file mới, rồi từ từ sửa từng phần. Khả năng hoàn thành của nó thực sự cao hơn nhiều.
Thông thường, Agent không làm vậy, chủ yếu vì trong hướng dẫn hệ thống sẽ yêu cầu mạnh mẽ rằng Agent dùng công cụ tích hợp để sửa file, chứ không phải công cụ dòng lệnh.
Nghĩ xa hơn một bước, có thể Agent cần các công cụ chỉnh sửa nâng cao hơn. Không chỉ cung cấp cho nó một giao diện “thay thế văn bản”, mà còn qua parser, LSP hoặc compiler để xây dựng cấu trúc mã, giúp Agent có thể làm tái cấu trúc như IDE: di chuyển hàm, xóa block impl, sắp xếp imports. Không biết có bạn nào đã thử làm việc này chưa.
Tổng thể, ngay cả trong thời đại AI Coding, thói quen lập trình tốt vẫn còn giá trị. Cố gắng từ sớm qua kỹ thuật harness, biến thói quen tốt thành cách làm việc mặc định của Agent, sẽ tiết kiệm rất nhiều chi phí so với việc phải làm lại sau này.
Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
  • Phần thưởng
  • Bình luận
  • Đăng lại
  • Retweed
Bình luận
Thêm một bình luận
Thêm một bình luận
Không có bình luận
  • Ghim