AILapTrinh.comAI Lập Trình
Đọc hiểu và cải tạo mã cũ

Tìm và xoá mã chết trong dự án cũ: dùng AI mà không xoá nhầm thứ đang chạy

Mã chết là gì, vì sao AI hay kết luận sai rằng một hàm không còn dùng, và quy trình bốn lớp bằng chứng trước khi xoá: tìm kiếm, phân tích tĩnh, log, thời gian chờ.

Hands sorting old paper folders into a cardboard box on a desk in a small Hue office, blank laptop pushed aside, afternoon window light, muted earthy colors

Mã chết là mã không bao giờ được chạy trong hệ thống hiện tại: hàm không ai gọi, nhánh điều kiện không bao giờ đúng, tệp không được nạp, trang không có đường dẫn tới. Xoá nó giúp dự án gọn hơn, người mới đọc nhanh hơn và trợ lý AI bớt bị lừa bởi những đoạn mã lỗi thời. Nhưng trong dự án cũ, "trông như chết" và "thật sự chết" là hai chuyện khác nhau, và AI đặc biệt dễ nhầm giữa hai thứ này.

Bài này giải thích vì sao các cách tìm mã chết đơn giản cho ra kết luận sai, rồi đưa ra một quy trình bốn lớp bằng chứng trước khi xoá. Mục tiêu là xoá được nhiều mà không có cuộc gọi lúc nửa đêm báo một chức năng ít dùng vừa biến mất.

Vì sao "không tìm thấy lời gọi" chưa phải bằng chứng

Cách tìm mã chết đơn giản nhất là tìm tên hàm trong toàn bộ kho; không thấy chỗ nào gọi thì coi là chết. AI cũng thường làm đúng như vậy khi bạn hỏi "hàm này có còn dùng không". Với mã mới, có kiến trúc rõ ràng, cách này khá ổn. Với mã cũ, nó sai thường xuyên vì có quá nhiều cách để một đoạn mã được chạy mà tên của nó không xuất hiện ở chỗ gọi.

Một tệp PHP có thể được gọi thẳng qua đường dẫn web từ một trang khác, từ thư gửi khách, từ ứng dụng di động phiên bản cũ mà khách vẫn dùng. Một tập lệnh có thể được gọi từ cấu hình tác vụ định kỳ trên máy chủ, thứ không nằm trong kho mã. Một hàm có thể được gọi bằng tên ghép từ chuỗi, từ giá trị lưu trong cơ sở dữ liệu, hay qua cơ chế móc nối của khung. Một nhánh điều kiện trông như không bao giờ đúng có thể đúng với đúng một khách hàng có cấu hình đặc biệt. AI không thấy bất kỳ thứ nào trong số đó nếu bạn không đưa cho nó.

Vì vậy, khi AI kết luận một đoạn mã là chết, hãy coi đó là một ứng viên cần điều tra chứ không phải một kết luận. Phần còn lại của bài là cách điều tra.

Bốn lớp bằng chứng trước khi xoá

Mỗi lớp loại bớt ứng viên sai. Đoạn mã đi qua cả bốn lớp mới nên xoá. Lớp sau tốn công hơn lớp trước, nên lọc dần.

LớpCách làmBắt được gìKhông bắt được gì
1. Tìm kiếm văn bảnTìm tên hàm, tên tệp, tên lớp trong toàn kho, kể cả tệp cấu hình, tệp mẫu giao diện, tập lệnhLời gọi trực tiếpGọi động, gọi từ ngoài kho
2. Phân tích tĩnhDùng công cụ phát hiện mã không dùng của ngôn ngữHàm riêng, biến, câu nạp không dùngGọi động, điểm vào công khai
3. Dữ liệu chạy thậtĐọc log truy cập máy chủ, log ứng dụng, cấu hình tác vụ định kỳ; thêm dòng ghi log tạmGọi từ ngoài kho, gọi hiếmĐoạn chạy theo mùa nếu thời gian theo dõi ngắn
4. Thời gian chờĐánh dấu ngừng dùng, theo dõi qua một chu kỳ nghiệp vụ đủ dàiTác vụ cuối tháng, cuối quý, cuối nămGần như không còn gì

AI giúp nhiều nhất ở lớp 1 và lớp 2: chạy tìm kiếm có hệ thống, đọc kết quả công cụ, gom ứng viên thành danh sách có ghi chú. Lớp 3 và lớp 4 phụ thuộc vào dữ liệu thật và thời gian, AI chỉ giúp đọc log và viết tập lệnh thống kê.

Công cụ phân tích tĩnh và cách hỏi AI

Hầu hết ngôn ngữ phổ biến có công cụ tìm mã không dùng. Tên và khả năng của chúng thay đổi theo thời gian, bạn kiểm trang chính thức trước khi cài.

  • Python: có công cụ như vulture chuyên tìm hàm, lớp, biến không dùng, kết quả kèm mức độ tin cậy cho từng mục.
  • JavaScript và TypeScript: trình kiểm lỗi phổ biến có quy tắc báo biến và câu nạp không dùng; có công cụ như knip tìm tệp, phần xuất và gói phụ thuộc không dùng trong cả dự án.
  • PHP: các công cụ phân tích tĩnh như PHPStan hay Psalm báo được một số loại mã không dùng như phương thức riêng không được gọi; mức hỗ trợ tuỳ cấu hình và phiên bản.
  • Gói phụ thuộc: nhiều trình quản lý gói hoặc công cụ đi kèm phát hiện gói khai báo mà không nạp ở đâu, một dạng mã chết thường bị bỏ quên.

Sau khi chạy công cụ, đưa kết quả cho AI với câu: Đây là danh sách mã không dùng do công cụ báo. Nhóm theo thư mục. Với mỗi mục, nêu lý do có thể khiến công cụ báo sai: gọi động, điểm vào web, tác vụ định kỳ, móc nối của khung. Xếp thành ba nhóm: gần như chắc chết, cần kiểm log, không nên đụng. Danh sách đã xếp nhóm này là đầu vào cho lớp 3.

Dùng log và dòng ghi tạm để có bằng chứng từ hệ thống thật

Với tệp hay trang được gọi qua web, log truy cập của máy chủ là nguồn bằng chứng tốt nhất. Một tập lệnh nhỏ đếm số lượt truy cập theo đường dẫn trong vài tháng log cho bạn biết trang nào không ai vào. AI viết nhanh tập lệnh đó bằng lệnh dòng lệnh hoặc Python; bạn chỉ cần đưa định dạng một dòng log mẫu đã che địa chỉ IP và mọi thông tin người dùng. Lưu ý log thường bị xoay vòng và xoá sau một thời gian, nên kiểm xem bạn đang có log bao lâu.

Với hàm bên trong, thêm một dòng ghi log tạm ở đầu hàm, có tiền tố dễ tìm, ghi tên hàm và thời điểm. Kỹ thuật này đôi khi được gọi là đặt bia mộ: bạn đánh dấu đoạn mã nghi là chết và chờ xem có ai ghé thăm. Triển khai lên máy chủ thật, để chạy qua một chu kỳ nghiệp vụ. Cuối chu kỳ, những hàm không để lại dòng log nào là ứng viên mạnh để xoá.

Đừng quên tác vụ định kỳ và các điểm vào ngoài web. Lấy danh sách tác vụ đang được lập lịch trên máy chủ, đối chiếu với các tập lệnh trong kho. Một tập lệnh không có trong lịch có thể vẫn được ai đó chạy tay mỗi quý, nên hỏi thêm người vận hành trước khi kết luận.

Xoá an toàn: quy trình khi đã đủ bằng chứng

Khi một đoạn mã đã qua đủ các lớp, xoá vẫn nên đi theo các bước có đường lui.

  1. Xoá trong một commit riêng, mỗi commit một nhóm mã liên quan, lời nhắn ghi rõ bằng chứng: không có lời gọi, công cụ phân tích báo không dùng, không có lượt truy cập trong khoảng thời gian theo dõi.
  2. Xoá kèm những thứ chỉ phục vụ đoạn mã đó: kiểm thử, tệp mẫu giao diện, hằng số, gói phụ thuộc. Hỏi AI liệt kê những thứ này, rồi tự kiểm.
  3. Chạy toàn bộ kiểm thử và kiểm tra cú pháp bằng đúng phiên bản ngôn ngữ của máy chủ.
  4. Triển khai vào thời điểm có người theo dõi, không vào tối thứ Sáu.
  5. Giữ khả năng hoàn tác: commit đã xoá có thể đảo ngược bằng lệnh git revert. Ghi lại danh sách đã xoá trong tài liệu dự án để ai gặp lỗi lạ biết tra ở đâu.

Có một ngoại lệ đáng chú ý: tệp nằm trong thư mục công khai của máy chủ web nhưng không còn dùng, như tệp thử, tệp sao lưu có đuôi lạ, trang gỡ lỗi. Chúng không chỉ là mã chết mà còn là rủi ro bảo mật vì ai cũng truy cập được. Loại này nên chuyển ra khỏi thư mục công khai ngay, không cần chờ đủ chu kỳ.

Ví dụ giả định: dọn thư mục báo cáo cũ của một hệ thống bán hàng

Một hệ thống bán hàng nội bộ có thư mục báo cáo chứa ba mươi tệp, nhiều tệp tên gần giống nhau như báo cáo doanh thu, báo cáo doanh thu mới, báo cáo doanh thu bản hai. Trưởng nhóm muốn gọn lại trước khi nâng cấp phiên bản ngôn ngữ, vì mỗi tệp đều phải sửa cho tương thích.

Lớp một: AI tìm kiếm tên ba mươi tệp trong toàn kho, gồm cả menu trang quản trị và tệp mẫu thư. Mười hai tệp có liên kết từ menu, mười tám tệp không. Lớp hai: công cụ phân tích báo thêm bốn hàm dùng chung chỉ được gọi từ các tệp trong nhóm mười tám. Lớp ba: tập lệnh đếm log truy cập ba tháng gần nhất cho thấy mười một trong mười tám tệp có lượt truy cập bằng không, năm tệp có vài lượt từ cùng một tài khoản kế toán, hai tệp được gọi đều đặn từ một tác vụ định kỳ trên máy chủ mà không ai nhớ.

Kết quả: năm tệp của kế toán được giữ lại và thêm vào menu cho đàng hoàng, hai tệp của tác vụ định kỳ được ghi vào tài liệu dự án. Mười một tệp còn lại được đặt dòng ghi log tạm và chờ qua kỳ quyết toán quý. Hết quý, mười tệp vẫn im lặng và được xoá trong năm commit; một tệp có lượt gọi duy nhất vào ngày cuối quý, đúng loại mã mà nếu xoá vội sẽ gây sự cố đúng lúc bận nhất.

Vì sao đáng làm, và vì sao không cần làm hết một lần

Mã chết có chi phí thật dù không chạy. Người mới mất thời gian đọc và hiểu nó. Trợ lý AI đọc kho mã cũng bị nó dẫn sai: AI thấy hai hàm làm việc gần giống nhau, chọn nhầm hàm chết để sửa hoặc để bắt chước khi viết mã mới. Mỗi lần nâng cấp phiên bản ngôn ngữ, mã chết cũng phải sửa cho qua kiểm tra, tức là bạn trả công bảo trì cho thứ không ai dùng.

Dù vậy, không cần dọn hết trong một chiến dịch. Cách bền hơn là dọn dần theo vùng: mỗi khi làm việc ở một vùng, dành một ít thời gian cho vùng đó, xoá những gì đã đủ bằng chứng. Mã chết ở vùng không ai đụng tới thì cứ để đó, nó không cản ai. Dọn chỗ mình đi qua, như người đi rừng nhặt rác trên lối mòn quen.

Câu hỏi thường gặp

Mã bị chú thích lại có phải mã chết không?

Về thực chất là có, vì nó không chạy. Mã đã đưa vào git thì không cần giữ bản chú thích để phòng khi cần lại, lịch sử git đã lưu. Xoá các khối mã bị chú thích giúp tệp dễ đọc hơn và đỡ làm AI hiểu lầm.

AI bảo hàm không ai gọi, sao xoá xong lại lỗi?

Thường do hàm được gọi động bằng tên ghép chuỗi, gọi từ tác vụ định kỳ ngoài kho mã, hoặc từ một trang được truy cập thẳng qua đường dẫn. AI chỉ thấy những gì trong phạm vi nó đọc. Cần thêm bằng chứng từ log và thời gian theo dõi.

Nên theo dõi log bao lâu trước khi xoá?

Ít nhất một chu kỳ nghiệp vụ đầy đủ của hệ thống. Với nhiều doanh nghiệp, đó là một tháng để qua kỳ đối soát, có khi một quý hoặc một năm cho báo cáo tài chính. Đoạn mã liên quan báo cáo năm cần thời gian dài nhất.

Xoá mã chết có làm hệ thống chạy nhanh hơn không?

Thường không đáng kể, vì mã không chạy thì cũng không tốn thời gian xử lý. Lợi ích chính là dễ đọc, dễ bảo trì, nâng cấp nhẹ hơn và giảm rủi ro bảo mật với các tệp công khai bị bỏ quên.

Có nên dùng tác tử AI tự động xoá mã chết không?

Có thể để tác tử lập danh sách ứng viên và chuẩn bị commit xoá cho từng nhóm, nhưng quyết định xoá phải dựa trên bằng chứng từ log và thời gian chờ mà tác tử không có. Không cho tác tử tự xoá rồi triển khai.

Gói thư viện khai báo nhưng không dùng có cần gỡ không?

Nên gỡ, vì mỗi gói là thêm bề mặt cập nhật bảo mật và thời gian cài đặt. Trước khi gỡ, kiểm xem gói có được nạp gián tiếp qua cấu hình hay qua gói khác không, rồi chạy kiểm thử và thử dựng dự án sạch từ đầu.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.

hoặc
Gọi ngay 0926 138 138