Legacy Code Gets Worse With Age
Code cũ không hề tốt lên theo thời gian. Nó chỉ tệ đi thôi.
Tuần trước, tôi đã mất ba tiếng đồng hồ để sửa một lỗi. Đáng lẽ việc đó chỉ mất 20 phút. Vấn đề nằm ở một module xác thực từ năm 2019. Mọi người đều lờ nó đi vì cho rằng "nó vẫn chạy tốt". Nhưng thực tế là nó không hề hoạt động. Tôi đã tìm thấy một dòng chú thích TODO từ năm 2020 nằm ngay trong file đó.
Nhiều người coi code cũ như một khoản nợ tùy chọn. Họ nghĩ rằng có thể trả nợ khi có thời gian. Nhưng code cũ giống như nấm mốc hơn. Nó lan rộng. Nó làm nhiễm bẩn các phần khác trong hệ thống của bạn. Bạn càng lờ nó đi lâu, chi phí để dọn dẹp nó càng trở nên đắt đỏ.
Điều này tạo ra một vòng lặp tồi tệ:
- Bạn thừa hưởng một dự án lộn xộn.
- Bạn thêm một câu lệnh
ifnữa để tính năng của mình hoạt động. - Sáu tháng sau, một người khác cũng làm tương tự.
- Một năm sau, file đó dài tới 800 dòng và không có lấy một bài test nào.
Loại code "vẫn chạy" này ẩn chứa những chi phí tiềm ẩn:
- Tốc độ phát triển giảm xuống. Bạn dành nhiều thời gian để đọc ngữ cảnh hơn là viết code.
- Lỗi tăng lên. Sửa được chỗ này lại làm hỏng chỗ khác.
- Việc onboarding trở nên khó khăn. Các lập trình viên mới phải chật vật để hiểu tại sao logic lại bị lặp lại ở khắp mọi nơi.
Hãy cảnh giác với những dấu hiệu cảnh báo sau:
- Những dòng chú thích vô dụng hoặc sai lệch.
- Logic nghiệp vụ bị lặp lại trong các file khác nhau.
- Phụ thuộc vòng (circular dependencies) và độ kết nối cao (high coupling).
Đừng cố gắng viết lại toàn bộ mọi thứ. Việc viết lại hoàn toàn (full rewrite) thất bại đến 80% số lần. Bạn sẽ mất hàng tháng trời để xây dựng lại những gì đã có sẵn, trong khi doanh nghiệp thì đang mòn mỏi chờ đợi các tính năng mới.
Hãy sử dụng phương pháp refactor từng bước kết hợp với các characterization tests:
- Ghi lại hành vi hiện tại bằng các bài test, ngay cả khi nó có vẻ kỳ quặc.
- Refactor mà không làm thay đổi hành vi đó.
- Lặp lại cho đến khi code có thể đọc hiểu được.
- Chỉ sau đó mới thay đổi hành vi bằng các bài test thực thụ.
Hãy tuân thủ các quy tắc sau để tránh bẫy:
- Đừng bao giờ refactor mà không có các bài test.
- Không thay đổi hành vi trong quá trình refactor. Một lỗi có thể là một tính năng chưa được ghi chép lại mà khách hàng đang dựa vào đó để hoạt động.
- Hãy để yên cho những đoạn code "yên tĩnh". Nếu một module không hề thay đổi trong ba năm qua và không gây ra vấn đề gì, hãy cứ để nó như vậy.
Hãy tập trung năng lượng của bạn vào những đoạn code mà bạn thường xuyên chạm tới.
Source: https://dev.to/taina_costa_f/legacy-code-nao-envelhece-como-vinho-quanto-mais-espera-pior-fica-132h
