Trả lời nhanh: Dự án PHP cũ không có kiểm thử là tình huống phổ biến nhất ở Việt Nam, và cũng là tình huống rủi ro nhất khi đưa agent vào. Thứ tự đúng: dựng lưới an toàn tối thiểu trước gồm Git sạch, bản sao lưu database và một danh sách luồng phải chạy được; bắt đầu từ việc chỉ đọc như giải thích code và tìm chỗ nguy hiểm; rồi mới tới việc sửa, và luôn ở những chỗ ít người dùng nhất. Đừng bắt đầu bằng việc dọn code.
Nhận một dự án chạy nhiều năm, không có tài liệu, không có kiểm thử, và vẫn đang phục vụ khách. Đây là tình huống mà agent giúp được rất nhiều nhưng cũng dễ gây họa nhất. Bài này nói thứ tự an toàn để bắt đầu.
Ba việc trước khi gõ dòng lệnh đầu tiên
Một, đưa vào Git nếu chưa có. Nghe khó tin nhưng vẫn còn nhiều dự án PHP chạy thật mà mã nguồn chỉ nằm trên máy chủ. Không có Git thì không có đường quay lui, và mọi thứ sau đó đều nguy hiểm.
Hai, sao lưu database và kiểm chứng bản sao lưu. Không phải chỉ tạo file, mà là thử khôi phục nó ra một database khác để chắc chắn nó dùng được, theo bài về chu kỳ sao lưu.
Ba, viết ra danh sách luồng phải chạy được. Đăng nhập, xem danh sách, đặt hàng, thanh toán, trang quản trị. Đây là bộ kiểm thử thủ công của bạn cho tới khi có kiểm thử thật.
Ba việc này mất một buổi và chúng là điều kiện cần. Bỏ qua chúng để đi nhanh là cách chắc chắn nhất để có một buổi tối rất dài.
Tuần đầu: chỉ đọc
Đừng cho agent sửa gì trong tuần đầu. Bốn việc chỉ đọc mà giá trị rất cao:
- Vẽ bản đồ hệ thống. Bảo nó đọc mã nguồn và mô tả các mô đun chính, luồng dữ liệu, và những chỗ trông như phần lõi. Lưu kết quả vào tài liệu trong repo.
- Tìm chỗ nguy hiểm. Truy vấn ghép chuỗi trực tiếp, chỗ nhận dữ liệu người dùng mà không kiểm tra, mật khẩu lưu sai cách, chuỗi bí mật trong mã nguồn.
- Tìm code chết. File không ai gọi tới, hàm không được dùng. Đây là thông tin quý khi bạn muốn thu hẹp phạm vi phải hiểu.
- Giải thích những đoạn khó hiểu mà bạn sắp phải đụng tới.
Kết quả của tuần này là một bản đồ và một danh sách rủi ro. Cả hai đều đáng giá hơn bất kỳ dòng code nào nó có thể viết trong cùng thời gian.
Việc sửa đầu tiên
Chọn theo ba tiêu chí: ít người dùng chạm tới, dễ kiểm chứng, và không đụng tới tiền.
Ví dụ tốt: một trang báo cáo nội bộ mà chỉ vài người trong công ty xem. Ví dụ tệ: luồng thanh toán, dù nó đang có lỗi rõ ràng.
Quy trình cho mỗi lần sửa:
- Tạo nhánh riêng.
- Yêu cầu agent viết kiểm thử cho hành vi hiện tại của phần sắp sửa, chạy thử để chắc là nó qua.
- Sửa.
- Chạy lại kiểm thử vừa viết, cộng danh sách luồng chính bằng tay.
- Triển khai vào giờ vắng khách, và ở lại theo dõi một lúc.
Bước hai là chỗ nhiều người bỏ qua và cũng là bước quan trọng nhất: viết kiểm thử cho hành vi hiện tại trước khi sửa, kể cả khi hành vi đó trông kỳ lạ. Rất nhiều thứ kỳ lạ trong dự án cũ là cách xử lý một tình huống thật mà bạn chưa biết.
Bốn việc không giao ngay
Dọn code toàn diện. Đây là việc nghe hấp dẫn nhất và nguy hiểm nhất khi bạn chưa hiểu hệ thống. Chờ tới khi có kiểm thử che phần đó.
Nâng phiên bản PHP. Nghe như việc kỹ thuật đơn giản nhưng nó chạm tới mọi thứ. Làm sau, và làm trên môi trường thử trước, theo bài máy chủ thử nghiệm.
Đổi cấu trúc database. Không quay lui được như code, và dữ liệu thật thì không có bản nháp.
Sửa luồng thanh toán. Ngay cả khi nó đang có lỗi. Hãy hiểu thật kỹ trước, và nếu buộc phải sửa thì làm thủ công với sự tập trung cao nhất.
Bốn việc này đều làm được sau vài tháng, khi bạn đã có bản đồ, có kiểm thử cho phần chính, và hiểu vì sao hệ thống lại được viết như vậy.
Xây dần lưới an toàn
Song song với việc sửa, hãy dùng agent để dựng dần bộ kiểm thử. Thứ tự ưu tiên:
- Phần tính toán tiền. Giá, thuế, phí vận chuyển, khuyến mãi. Đây là chỗ sai thì thấy ngay bằng tiền.
- Phần xác thực và phân quyền. Sai thì thành lỗ hổng.
- Các luồng chính trong danh sách bạn đã viết ở đầu.
Cách yêu cầu để không nhận về kiểm thử giả nằm ở bài về test tự động: mô tả theo hành vi cần đảm bảo, và luôn thử làm hỏng code để xem kiểm thử có bắt được không.
Sau ba tháng làm theo thứ tự này, bạn có một dự án cũ nhưng có bản đồ, có lưới an toàn cho phần quan trọng nhất, và một quy trình để đi tiếp. Đó là kết quả tốt hơn nhiều so với việc dọn sạch code trong tuần đầu rồi ngồi gỡ hậu quả.
Bảng điều kiện bắt buộc trước khi bắt đầu
| Việc | Vì sao bắt buộc |
|---|---|
| Sao lưu cơ sở dữ liệu và mã nguồn | Dự án cũ thường không có cách quay lui nào khác |
| Đưa toàn bộ mã vào một kho quản lý phiên bản | Không có nó thì mọi thay đổi đều không đảo ngược được |
| Dựng được một bản chạy thử tách khỏi bản đang phục vụ khách | Sửa thẳng trên bản đang chạy là cách hỏng nhanh nhất |
Ba việc này thường mất một tới hai ngày và cảm giác như chưa làm được gì. Nhưng bỏ qua chúng thì mọi bước sau đều là đánh cược.
Vì sao tuần đầu chỉ nên đọc
Dự án cũ không có kiểm thử thường mang rất nhiều tri thức ngầm: một hàm tên như thế này nhưng làm việc khác, một bảng dữ liệu có cột không dùng nữa nhưng vẫn phải ghi vào vì có nơi khác đọc. Giao việc sửa ngay từ đầu là giao cho một bên chưa biết những chỗ đó. Tuần đầu hãy dùng để hỏi những câu như: luồng đặt hàng đi qua những tệp nào, chỗ nào ghi vào bảng người dùng, có bao nhiêu nơi gửi email. Kết quả của tuần này là một bản đồ, và bản đồ đó có giá trị lâu hơn bất kỳ bản vá nào.
Xây lưới an toàn từng lớp một
# Voi du an cu khong co kiem thu, dung co gang phu het ngay# Xay theo thu tu nay: # Lop 1: kiem tra cu phap toan bo, re nhat va bat duoc loi ngo ngan nhatfind . -name "*.php" -not -path "./vendor/*" -exec php -l {} \; # Lop 2: bai kiem thu cho dung phan ban sap sua# Khong phu toan bo, chi phu duong di ma ban sap cham vao # Lop 3: bai kiem thu cho luong quan trong nhat ve tien# Dat hang, thanh toan, tinh gia. Ba cho nay sai la mat tien that # Lop 4: kiem tra tu dong khi day ma len # Moi lan sua mot loi thi them mot bai kiem thu cho dung loi do# Sau sau thang ban se co luoi bao ve o dung nhung cho hay hongBốn việc để lại cho giai đoạn sau
- Đổi cấu trúc bảng dữ liệu. Trong dự án cũ, một cột tưởng như bỏ đi được thường có nơi khác đang đọc mà không ai nhớ.
- Sửa phần xác thực và phân quyền. Sai ở đây là lỗ hổng, không phải lỗi hiển thị.
- Dọn mã hàng loạt trên nhiều tệp. Chưa có lưới kiểm thử thì không có cách nào biết bạn vừa làm hỏng gì.
- Nâng phiên bản nền tảng. Việc này cần làm, nhưng làm riêng thành một đợt có kế hoạch, không lồng vào các thay đổi khác.
Câu hỏi thường gặp
Dự án không có kiểm thử thì bắt đầu từ đâu?
Từ việc chỉ đọc: vẽ bản đồ hệ thống và tìm chỗ nguy hiểm. Trước đó phải có Git, có bản sao lưu database đã kiểm chứng, và một danh sách luồng chính để thử tay.
Có nên để agent dọn code cũ ngay không?
Không. Đây là việc nghe hấp dẫn nhất nhưng nguy hiểm nhất khi chưa có kiểm thử. Nhiều đoạn code trông kỳ lạ thực ra đang xử lý một tình huống thật mà bạn chưa biết.
Nên viết kiểm thử cho phần nào trước?
Phần tính tiền, rồi tới xác thực và phân quyền, rồi mới tới các luồng chính. Đó là thứ tự theo mức thiệt hại khi sai chứ không theo mức dễ viết.
Nâng phiên bản PHP có nên giao cho agent không?
Nó giúp được nhiều ở phần tìm các đoạn code không còn tương thích. Nhưng hãy làm trên môi trường thử trước, và chỉ khi bạn đã có kiểm thử che các luồng chính.
