Dữ liệu của tôi đã nói dối trước cả khi tôi viết một dòng logic
Trong một thời gian dài, tôi tin rằng vấn đề của mình nằm ở code. Mỗi khi kết quả ra sai, tôi lại lục lọi logic của mình, các mô hình của mình, những phần khôn khéo mà tôi tự hào. Thủ phạm thực sự gần như luôn nằm ở một tầng bên dưới tất cả những thứ đó, im lặng và không được ai soi xét: chính bản thân dữ liệu. Nó trông sạch sẽ. Nhưng không phải vậy. Và mọi thứ tôi dựng lên trên nó đều trung thành kế thừa lời nói dối đó.
Đây là kiểu thất bại nhàm chán nhất trên đời, và đó chính xác là lý do khiến nó nguy hiểm đến vậy. Chẳng ai muốn dành thời gian đi kiểm tra từng hàng số liệu. Nên chẳng ai làm, và sự mục ruỗng cứ nằm yên đó dưới đáy, chống đỡ cho mọi thứ.
Huyền thoại về dữ liệu sạch
Dữ liệu thị trường thô trông gọn gàng đến mức yên lòng. Những hàng ngay ngắn, các dấu thời gian trật tự, những con số trông hợp lý nối tiếp nhau thành chuỗi. Sự gọn gàng đó là một lớp ngụy trang. Dữ liệu từ thế giới thực, thu thập từ những hệ thống thực thi thoảng vẫn hỏng hóc, đầy rẫy những lỗi nhỏ không hề tự lên tiếng báo trước: những khoảng trống nơi vài khoảnh khắc đơn giản là bị thiếu, những bản ghi trùng lặp, những dấu thời gian trôi lệch hoặc không khớp, những giá trị đông cứng và lặp lại trong lúc gián đoạn, đôi khi là những con số bất khả thi, cả những đoạn dài bị dịch lệch khỏi vị trí một cách tinh vi.
Không có thứ nào trong số này đến kèm nhãn cảnh báo. Nó trông y hệt dữ liệu tốt, bởi vì nó nằm trong cùng những hàng ngay ngắn ấy. Định dạng vẫn trung thực ngay cả khi nội dung thì không, và định dạng lại là tất cả những gì bạn nhìn thấy thoáng qua.
Rác đi vào, rác tự tin đi ra
Điều cần khắc cốt ghi tâm là hệ thống không hề biết dữ liệu sai. Nó không thể biết. Nó nhận bất cứ thứ gì bạn đưa cho và xử lý phần dữ liệu hỏng với đúng sự cần mẫn mà nó dành cho phần sự thật, rồi cho ra một kết quả sạch sẽ, tự tin, trông chuyên nghiệp, được dựng trên nền mục ruỗng.
Cái bẫy nằm gọn ngay ở đó. Đầu ra trông ổn. Sự hỏng hóc không lan ra dưới dạng những lỗi rõ rành rành, gào thét chỉ thẳng vào vấn đề. Nó lan ra dưới dạng những câu trả lời sai nhưng nghe có lý — những kết quả hoàn toàn đáng tin, vượt qua được cảm giác trực giác của bạn, và bạn vui vẻ dựng thứ tiếp theo lên trên chúng. Đến khi cái sai lộ ra, nếu nó từng lộ ra, thì nó đã bị chôn vùi dưới nhiều tầng công việc, tất cả đều giả định rằng cái nền bên dưới chúng là vững chắc.
Những lỗi ẩn mình bên trong vẻ hợp lý
Tôi học được, một cách chậm chạp, rằng những lỗi dữ liệu nguy hiểm không phải là những lỗi hiển nhiên. Một mức giá bằng không, cả một ngày bị thiếu, một giá trị vô nghĩa lộ liễu — những thứ đó bạn bắt được, vì chúng phi lý ngay trên bề mặt. Chúng vấp ngay vào lớp kiểm tra hợp lệ đầu tiên.
Những lỗi thực sự làm bạn đau là những lỗi nghe có lý. Một giá trị sai nhưng vẫn nằm trong một khoảng đáng tin. Một dấu thời gian lệch đúng một đơn vị. Một khoảng trống mà thứ gì đó ở thượng nguồn đã lặng lẽ điền vào bằng một phỏng đoán. Những thứ này lướt thẳng qua mọi lớp kiểm tra hợp lệ bạn có, bởi chúng trông y hệt dữ liệu hợp lệ — không thể phân biệt được với sự thật trừ phi bạn cố ý đi đối chiếu chúng với một thứ khác. Sự hỏng hóc đắt giá nhất là loại đủ lịch sự để trông như đúng.
Tôi đã gỡ lỗi nhầm tầng của tòa nhà
Trong một quãng thời gian dài đến mức xấu hổ, bản năng của tôi khi có gì đó ra lạ là đi tìm lỗi trong logic của mình — trong phần thú vị, tinh vi của hệ thống, phần mà tôi thấy đáng để suy ngẫm. Lỗi gần như chưa bao giờ nằm ở đó. Nó nằm bên dưới, trong dữ liệu, trong một giả định nào đó về đầu vào mà tôi đơn giản là chưa bao giờ buồn đi kiểm chứng.
Thực chất, tôi đang lục soát các tầng trên cùng của một tòa nhà để tìm nguồn cơn của một vết nứt đang chạy xuyên qua phần móng. Tôi soi đi soi lại đoạn code thanh lịch, chẳng tìm thấy gì sai, và càng lúc càng hoang mang — bởi vì chẳng có gì sai với nó cả. Nó đang xử lý chính xác những đầu vào tệ thành những đầu ra tệ, đúng như được thiết kế. Phần logic vô tội. Cái nền mà nó đứng lên mới là kẻ có tội.
Chất lượng dữ liệu không phải một việc làm xong là xong
Một trong những nhận thức khiêm nhường hơn cả là bạn không thể làm sạch dữ liệu một lần rồi đi tiếp. Đó là ảo tưởng. Dữ liệu mới cứ liên tục kéo đến, và nó kéo đến cùng những lỗi mới. Một nguồn lặng lẽ đổi định dạng. Một nhà cung cấp ở thượng nguồn bị gián đoạn rồi điền bù khoảng trống bằng thứ gì đó đáng ngờ. Một thứ vốn ổn định suốt nhiều tháng bỗng hỏng theo một kiểu mới lạ vào một ngày thứ Ba bình thường.
Tôi dần hiểu ra, chất lượng dữ liệu không phải một đợt dọn dẹp một lần để bạn gạch khỏi danh sách. Nó là một kỷ luật liên tục — một thái độ nghi ngờ thường trực với mọi đầu vào, duy trì mãi mãi, bởi khoảnh khắc bạn ngừng canh chừng chính xác là khoảnh khắc một sự hỏng hóc mới và đầy sáng tạo ngang nhiên bước vào không gặp trở ngại.
Kiểm tra hợp lệ một cách tàn nhẫn, không tin gì cả
Cách khắc phục thực tế là coi mọi đầu vào là có tội cho đến khi được chứng minh là sạch. Kiểm tra các khoảng trống. Kiểm tra các bản ghi trùng lặp. Kiểm tra các giá trị bất khả thi, các dấu thời gian không chịu tiến đều về phía trước, những đoạn đáng ngờ nơi một con số ngừng thay đổi theo kiểu mà dữ liệu thật không bao giờ làm vậy. Và quan trọng nhất, hãy gắn thẳng những lớp kiểm tra này vào trong pipeline, để sự hỏng hóc bị tóm gọn và báo động ngay ở cửa trước, đúng khoảnh khắc nó đến, thay vì bị phát hiện nhiều tháng sau dưới dạng cái kỳ quặc không giải thích nổi trong một kết quả mà bạn không còn lần ngược lại được nữa.
Đó là công việc tẻ nhạt, phòng thủ, hoàn toàn chẳng hào nhoáng. Nó cũng chính là công việc quyết định liệu mọi thứ phía hạ nguồn được dựng trên đá hay trên cát. Một thất bại ồn ào ngay ở cửa là một món quà. Một thất bại im lặng mà bạn kế thừa rồi dựng lên trên đó là một thảm họa diễn ra chậm rãi.
Bài học sâu hơn: phần móng định ra cái trần
Nguyên tắc nằm dưới tất cả những điều này đơn giản và không khoan nhượng. Không lượng tài tình nào trong mô hình bên trên có thể bù đắp cho sự mục ruỗng trong dữ liệu bên dưới. Chất lượng của mọi thứ bạn dựng lên bị giới hạn, một cách tuyệt đối, bởi chất lượng của thứ bạn nạp vào. Bạn không thể lý luận để thoát khỏi những đầu vào tệ; bạn chỉ có thể tạo ra cái sai tự tin hơn, công phu hơn dựng trên chúng.
Vậy nên cái lao động buồn tẻ, bạc bẽo nhằm đảm bảo đầu vào sạch không hề thấp kém hơn công việc thực sự, theo cách tôi từng đối xử với nó. Nó chính là phần móng của công việc thực sự, và toàn bộ kết cấu bên trên chỉ trung thực đúng bằng cái nền đó mà thôi. Tôi từng muốn nhảy vọt qua nó để đến với những phần thú vị. Giờ tôi hiểu rằng những phần thú vị là vô giá trị nếu phần nhàm chán bên dưới chúng đang nói dối.
— Không tín hiệu, không lợi nhuận, không phải lời khuyên đầu tư.