Tôi Cứ Liên Tục 'Sửa' Những Lỗi Mà Mình Không Hiểu

Trước đây tôi thường ăn mừng mỗi khi một lỗi biến mất. Một vấn đề đang hành hạ tôi, tôi thay đổi một thứ gì đó, vấn đề tan biến, và tôi cảm thấy luồng hân hoan ấm áp của chiến thắng rồi đi tiếp. Phải mất rất nhiều thời gian và rất nhiều đau đớn tôi mới học được rằng một lỗi biến mất và một lỗi được sửa là hai sự kiện hoàn toàn khác nhau — và rằng việc nhầm lẫn chúng đang âm thầm lấp đầy hệ thống của tôi bằng những vấn đề mà tôi chẳng hề giải quyết. Tôi chỉ giấu chúng khỏi chính mình.

Đây là một trong những bài học nghe có vẻ hiển nhiên khi nói thẳng ra nhưng lại khó sống đúng theo đến mức quái ác, bởi vì mọi thứ trong khoảnh khắc ấy đều đẩy bạn theo hướng sai.

Sự quyến rũ khi triệu chứng biến mất

Khi một vấn đề biến mất ngay sau khi bạn thay đổi một thứ gì đó, mọi bản năng đều gào lên rằng bạn đã sửa được nó. Sự nhẹ nhõm là có thật, tức thời, và mang tính hóa học. Áp lực phải chuyển sang việc tiếp theo là khổng lồ. Ai mà muốn cứ tiếp tục chọc vào một vấn đề mà, theo những gì bạn thấy, đã ngừng là một vấn đề?

Nhưng đây là sự thật khó chịu ẩn dưới sự nhẹ nhõm ấy: việc triệu chứng biến mất chỉ chứng minh được rằng triệu chứng đã biến mất. Nó chẳng cho bạn biết gì cả — chẳng gì hết — về việc liệu bạn có thực sự xử lý được nguyên nhân gốc rễ hay chỉ khuấy động nó đủ để nó im lặng tạm thời. Hai kết cục đó nhìn giống hệt nhau trong khoảnh khắc đó. Chúng cảm thấy giống hệt nhau. Chúng chẳng hề giống nhau chút nào.

Những bản sửa lỗi tôi không thể giải thích

Cái khuôn mẫu này, trong trường hợp của tôi, phổ biến đến mức xấu hổ. Tôi thực hiện một thay đổi — xáo trộn thứ tự của vài thao tác, thêm một lớp bảo vệ, chỉnh sửa một thứ gì đó gần đó — và lỗi ngừng xuất hiện. Và nếu lúc đó bạn chặn tôi lại và yêu cầu tôi giải thích chính xác tại sao thay đổi của tôi đã giải quyết được vấn đề, tôi sẽ không làm được. Tôi thực sự không biết. Tôi chỉ biết rằng mình đã chạm vào một thứ gì đó, và cái tệ hại đã lặng đi.

Tôi gọi đó là sửa lỗi. Nhưng đó hoàn toàn không phải là gỡ lỗi (debugging). Nó gần với việc dâng lễ vật lên một bàn thờ và nhận thấy rằng các vị thần, trong khoảnh khắc này, dường như đã nguôi giận. Tôi đã thay đổi một thứ gì đó, vũ trụ đã ngừng trừng phạt tôi, và tôi chọn diễn giải sự tương quan đó là sự thấu hiểu. Đó không phải là sự thấu hiểu. Đó là mê tín kèm theo một dòng commit message.

Một lỗi bạn không hiểu thì không phải đã chết — nó đang ẩn nấp

Vấn đề sâu xa với một bản sửa lỗi bạn không thể giải thích là bạn chẳng hề biết mình thực sự đã làm gì. Bạn đã loại bỏ lỗi, hay bạn chỉ chuyển nó đến một nơi mà hiện tại bạn không thể thấy? Bạn thực sự không biết, và sự bất định đó không hề vô hại. Bởi vì nếu nguyên nhân vẫn còn đó, nguyên vẹn chưa bị động đến, thì nó sẽ quay lại. Nó sẽ trồi lên trở lại về sau, khoác một bộ trang phục khác, ở một góc khác của hệ thống, rất có thể là một góc tệ hơn — và khi điều đó xảy ra, bạn sẽ chẳng còn chút ký ức nào rằng đó chính là kẻ thù mà bạn nghĩ mình đã đánh bại từ nhiều tháng trước.

Đây là điều tôi đã đánh giá thấp nhất. Những bản sửa lỗi không giải thích được thực ra không làm giảm số lượng lỗi trong hệ thống. Chúng di dời các lỗi đi, và chúng tước đi của bạn cái kiến thức lẽ ra giúp bạn nhận ra chúng lần nữa. Bạn không hề thắng trận chiến. Bạn chỉ đang phân tán cùng một đối thủ thành nhiều lớp ngụy trang.

Ngôi nhà ma bạn dần dần xây nên

Theo thời gian đủ dài, một hệ thống được bảo trì theo cách này sẽ chất đầy những thay đổi mà không ai, kể cả tác giả của chúng, thực sự hiểu. Một lớp bảo vệ được thêm vào “vì thiếu nó là vỡ.” Một thứ tự được giữ nguyên vì không gì khác ngoài nỗi sợ. Những nghi lễ nhỏ mà mục đích ban đầu đã hoàn toàn bị lãng quên, nhưng giờ đây ai cũng quá lo lắng không dám gỡ bỏ.

Cơ sở mã (codebase) dần dần trở thành một ngôi nhà ma của những điều mê tín — đầy những thứ bạn không dám chạm vào vì không chắc chúng đang chống đỡ cho cái gì. Và phần tàn nhẫn nhất là điều này gây ra cho khả năng thay đổi bất cứ thứ gì của bạn. Khi bạn không biết cái gì là chịu lực và cái gì là trang trí, bạn không thể di chuyển một cách tự tin chút nào. Mỗi thay đổi trở thành một canh bạc chống lại những thế lực bạn không hiểu, trong một cấu trúc do chính bạn xây nhưng không còn thấu hiểu nữa.

Kỷ luật: đừng tin một bản sửa lỗi bạn không thể giải thích

Quy tắc mà cuối cùng tôi buộc bản thân phải tuân theo thì đơn giản để phát biểu nhưng thực sự khó để giữ: một vấn đề chưa được sửa cho đến khi tôi có thể giải thích cả tại sao nó xảy ra lẫn tại sao thay đổi của tôi xử lý được nguyên nhân đó. Cả hai nửa. Nếu triệu chứng đã biến mất nhưng tôi không thể kể trọn vẹn câu chuyện đó, thì tôi chẳng sửa được gì cả — tôi chỉ đơn thuần đánh mất tầm nhìn về vấn đề, một trạng thái nguy hiểm hơn nhiều so với một vấn đề mà tôi vẫn còn nhìn thấy.

Cách này chậm hơn. Lúc nào cũng có cám dỗ muốn bỏ qua, và sự cám dỗ mạnh nhất đúng vào thời điểm tệ nhất: khi triệu chứng đã biến mất rồi và mọi thứ trông có vẻ ổn và công việc, qua mọi dấu hiệu có thể thấy, dường như đã xong. Đó chính xác là lúc kỷ luật quan trọng nhất, và chính xác là lúc nó cảm thấy thừa thãi nhất. Soi xét kỹ một bản sửa lỗi từ trên trời rơi xuống là điều trái với tự nhiên. Nó cũng chính là toàn bộ công việc.

Tại sao điều này càng quan trọng hơn trong một lĩnh vực nhiễu

Có một lý do khiến cái bẫy này đặc biệt hiểm độc trong một lĩnh vực như lĩnh vực này. Môi trường nhiễu một cách dữ dội, nghĩa là nó liên tục trao cho bạn những xác nhận giả. Bạn thực hiện một thay đổi, lần chạy tiếp theo trông khá hơn — nhưng đó là nhờ thay đổi, hay chỉ là may mắn? Trong một hệ thống mà kết quả tự nó dao động loạn xạ, “nó tốt lên sau khi tôi làm X” là bằng chứng yếu ớt đến tuyệt vọng cho việc X có làm được gì hay không.

Mê tín sinh sôi đúng ở nơi kết quả nhiễu, bởi vì sự nhiễu cứ tưởng thưởng cho những nghi lễ ngẫu nhiên đủ thường xuyên để khiến chúng có cảm giác là thật. Cũng chính sự ngẫu nhiên khiến mọi thứ khó đánh giá đó lại khiến ta dễ một cách nguy hiểm tin vào những bản sửa lỗi chẳng làm gì cả, bởi vì thỉnh thoảng con xúc xắc lại đổ ra có lợi cho bạn ngay sau cử chỉ vô nghĩa của bạn, và bộ não của bạn hăm hở ghi nhận một nguyên nhân.

Bài học sâu xa hơn: thấu hiểu là cách sửa lỗi thực sự duy nhất

Điều mà cuối cùng tôi đi đến chỗ tin tưởng là bản sửa lỗi bền vững duy nhất là bản sửa mà bạn hiểu thấu đến tận nguyên nhân của nó. Mọi thứ khác đều là vay mượn từ tương lai. Cái lỗi mà bạn dán đè lên mà không thấu hiểu thì không biến mất; nó lặng đi, và khoản vay sẽ đến hạn về sau, kèm lãi, vào một thời điểm khi bạn đã hoàn toàn quên rằng mình từng vay nó.

Vì vậy giờ đây, khi một thứ gì đó bắt đầu hoạt động mà tôi không biết tại sao, tôi đã rèn cho bản thân không cảm thấy nhẹ nhõm. Thay vào đó tôi cố gắng cảm thấy nghi ngờ. Một thành công không giải thích được không phải là một chiến thắng; nó là một bí ẩn chưa được giải mà tình cờ khoác lên mình tấm áo của chiến thắng, và việc đối xử với nó như cái vế trước là một trong những cách đáng tin cậy nhất mà tôi biết để bị chính phiên bản quá khứ của mình phục kích.

— Không tín hiệu, không lợi nhuận, không phải lời khuyên đầu tư.