# 86: Hai cái sai tạo thành một cái đúng (và rất khó để fix)

Code không bao giờ nói dối nhưng chúng có thể liên hệ bản thân. contradict nghĩa là “mâu thuẫn”=> dịch là mẫu thuẫn với chính mình Và chúng dẫn đến những khoảnh khắc “Làm sao mà chúng có thể hoạt động được?

Trong một bài phỏng vấn, trưởng nhóm thiết kế phần mềm Apollo 11 Lunar, Allan Klump, tiết lộ rằng phần mềm điều khiển động cơ tồn tại một bug có thể khiến cho bộ phận hạ cánh không ổn định. Tuy nhiên, một lỗi khác bù lại cho nó và phần mềm đã được dùng cho sự đáp Apollo 11 và 12 trước khi lỗi ấy có thể được tìm thấy và sửa chữa.

Xét một hàm trả về một trạng thái hoàn chỉnh. Tưởng tượng rằng nó sẽ trả về false trong khi nó phải là true. Tiếp theo ta tiếp tục tưởng tượng rằng cài hàm điều khiển quên kiểm tra giá trị trả về. Mọi thứ đều hoạt động vô cùng ổn định cho đến khi ai đó nhận ra điều này và thêm vào.

Hoặc xét một ứng dụng lưu trữ các trạng thái của nó bằng XML. Tưởng tượng rằng một trong những nốt đã bị viết sai thành TimeToLive thay vì TimeToDie như trong tài liệu đã ghi chép. Mọi thứ có vẻ ổn khi bộ phận viết code và đọc đều mắc chung một lỗi. Nhưng khi ta sửa một trong số chúng, hoặc là thêm một ứng dụng mới để đọc cùng những tài liệu ấy, khiến cho sự đối xứng bị phá hỏng tương tự với code.

Khi hai sai lầm trong đoạn code tạo nên một lỗi có thể thấy được,các phương pháp tiếp cận đều trở nên không hiệu quả. Nhà phát triển nhận được bản thông tin về bug, tìm và sửa sai lầm ấy sau đó thử test lại. Bản báo lỗi ấy vẫn tồn tại nhưng là do sai lầm thứ hai vẫn còn hoạt động. Vì vậy cái đầu tiên đã được loại bỏ, đoạn code tiếp tục đoạn kiểm tra cho tới khi sai lầm thứ hai được tìm thấy và sửa chữa. Tuy nhiên sai lầm thứ nhất quay lại, bản báo lỗi vẫn còn đó, điều tương đương xảy ra với sai lầm thứ hai. Quá trình lặp lại nhưng giờ đây nhà phát triển ấy dừng khắc phục hai lỗi và tiến hành quá trình khắc phục khác mà chắc chắn không bao giờ hoạt động.

Cuộc chơi của hai sai lầm trong đoạn code xuất hiện với một lỗi không chỉ khiến nó trở nên rất khó để khắc phục mà còn khiến cho các nhà phát triển lạc lối, chỉ để thấy họ thử đúng câu trả lời từ sớm.

Vấn đề này không chỉ xuất hiện trong code mà còn xuất hiện trong việc soạn thảo các tải liệu cần thiết. Và chúng còn có thể lan rộng từ nơi này sang nơi khác. Một lỗi trong code đã làm lu mờ lỗi nằm trong phần mô tả.

Không dừng lại ở đó, chúng còn có thể lan sang người. Người dùng học được rằng khi ứng dụng bảo trái có nghĩa là phải và từ đó họ điều chỉnh hành vi của họ. Họ còn có thể truyền sang người dùng khác: “Hãy nhớ rằng khi ứng dụng bảo nhấn nút bên trái hãy nhấn nút bên phải”. Và khi lỗi được sửa khiến cho người dùng phải làm quen lại từ đầu.

Một lỗi sai đơn lẻ có thể dễ dàng phát hiện và khắc phục. Vấn đề ở đây chính là chính có quá nhiều nguyên nhân, do đó cần phải thay đổi nhiều lần, cuối cùng khiến việc sửa chữa trở nên khó khăn. Một phần là bởi vì những vấn đề này vô cùng dễ dàng để sửa do đó mọi người chủ quan nghĩ chúng có thể khắc phục nhanh chóng, tuy nhiên khó khăn ập đến sau đó.

Chúng tôi không có một lời khuyên nào giúp bạn xác định các lỗi mà nguyên nhân đến từ những sai lầm đáng tiếc trên. Hãy giữ cho mình một cái đầu lạnh và sẵn sàng kiểm tra tất cả các khả năng có thể xảy ra nếu cần thiết.