Chín tầng phân tích, một dòng chữ lặp lại: khi pipeline bóng rổ trả về rỗng
23 giờ 47 phút. Màn hình mở đúng một cửa sổ, chín khối nội dung xếp dọc theo...
23 giờ 47 phút. Màn hình mở đúng một cửa sổ, chín khối nội dung xếp dọc theo thứ tự cố định: phân tích chiến thuật và kỹ thuật, dữ liệu cầu thủ, vận hành đội bóng và quỹ lương, bức tranh giải đấu, luật và quản trị, ban huấn luyện và phòng thay đồ, rủi ro, câu chuyện truyền thông, hiệu ứng ngành. Mỗi khối có bảng riêng, ô đánh giá riêng, phần kết luận riêng, phần bằng chứng riêng.
Dưới cả chín tiêu đề, cùng một dòng chữ, nguyên văn, không lệch một ký tự: “N/A — insufficient information.”
Chín lần.
Một bản phân tích được thực thi trọn vẹn về hình thức. Đủ chín tầng. Đủ bảng so sánh. Đủ thẻ độ tin cậy High, Medium, Low dán sau từng suy luận. Đủ phần bằng chứng trỏ về nguồn. Đủ phần suy luận ẩn. Và nội dung bên trong bằng không: không một cầu thủ nào được nêu tên, không một đội bóng nào được xác định, không một giải đấu nào được chỉ mặt, không một con số nào xuất hiện — không điểm số, không tỷ lệ ném, không quỹ lương, không thời hạn hợp đồng, không một mốc thời gian.
Đó là toàn bộ nguyên liệu tôi có trong tay lúc 23 giờ 47 phút.
Dữ liệu là một tu viện: càng ít tiếng ồn, càng nghe rõ điều gì đó đang cố nói. Đêm đó tu viện im tuyệt đối. Thứ duy nhất đang cố nói là một lỗi nằm ở phía trước tôi, không nằm ở phía bóng rổ.
Một pipeline hai tầng và một danh sách rỗng
Hệ thống này chạy hai tầng. Tầng một đọc bài viết gốc, bóc nó thành các điểm thông tin — đơn vị nhỏ nhất của tri thức, mỗi đơn vị là một sự kiện hoặc một phát biểu có thể trích dẫn: một cầu thủ ghi bao nhiêu điểm, một đội ký hợp đồng bao nhiêu năm, một huấn luyện viên bị sa thải sau vòng đấu thứ mấy. Tầng hai nhận danh sách đó rồi áp chín chiều phân tích chuyên môn lên trên.
Quy tắc của hệ thống rất rõ: mọi kết luận ở tầng hai phải trỏ được về một điểm thông tin ở tầng một. Không trích được thì không được viết.
Tầng một đêm đó trả về: tiêu đề bài viết — không có; nguồn — không có; loại bài — chưa phân loại; quan điểm cốt lõi — để trống cả ba ô tóm tắt một câu, lập trường tác giả, mục đích bài viết; danh sách điểm thông tin — rỗng; thực thể liên quan — dòng chữ “xác định từ các điểm thông tin ở trên”; độ nhạy thời gian — chưa đánh giá; chất lượng nguồn — chưa đánh giá.
Đọc đến dòng “xác định từ các điểm thông tin ở trên” thì tôi dừng lại. Đó là một con trỏ treo. Nó trỏ vào một danh sách không tồn tại.
Trong nghề trinh sát bóng rổ có hai kiểu báo cáo trống, và chúng khác nhau đến mức không nên xếp chung một ngăn. Kiểu thứ nhất: “Cầu thủ này không có điểm mạnh nào ở mức chuyên nghiệp.” Đó là một ý kiến, có thể đúng có thể sai, nhưng nó là ý kiến của người đã xem. Kiểu thứ hai: “Tôi chưa xem trận nào của cầu thủ này.” Câu đó không nói gì về cầu thủ. Nó nói về người đi xem.
Bản báo cáo đêm đó thuộc kiểu thứ hai, nhưng được trình bày bằng định dạng của kiểu thứ nhất.
NULL không phải số 0
Trong ngôn ngữ truy vấn cơ sở dữ liệu, NULL và 0 là hai thứ hoàn toàn khác nhau, và sự khác biệt này không phải chuyện kỹ thuật vụn vặt. NULL nghĩa là “không biết”. 0 nghĩa là “đã đo, và kết quả đo được là không”.
Dịch sang tiếng Việt của sân bóng rổ: một cầu thủ ghi 0 điểm trong trận là một dữ kiện — anh ta có mặt, anh ta ném trượt, chúng ta biết chính xác anh ta trượt bao nhiêu lần. Một cầu thủ không có dòng thống kê nào trong trận là một khoảng trống — chúng ta không biết anh ta có ra sân hay không, và cũng không biết bảng thống kê có ghi nhận anh ta hay không.
Nếu hệ thống lấp khoảng trống đó bằng số 0, mọi thứ phía sau sẽ sụp theo một cách rất yên tĩnh.
Đếm số possession của một trận mà file play-by-play bị mất, rồi điền 0 vào ô Pace: trận đấu biến thành một trận chưa từng được chơi. Điền 0 vào ô số phút của một cầu thủ rồi tính chỉ số trên 36 phút: phép chia cho không, hoặc một con số vô nghĩa được trình bày gọn gàng đến mức không ai buồn kiểm tra lại. Điền 0 vào ô số lần dứt điểm của một tiền đạo rồi tính TS%: anh ta trở thành cầu thủ tệ nhất giải, và cái nhãn đó sẽ đi theo anh ta vào bản báo cáo chuyển nhượng mùa sau.
Đó là lý do tôi không tin vào những bảng số quá đẹp. Một bảng có đủ mọi ô, không một ô trống, thường không phải bảng của người đo giỏi. Nó thường là bảng của người đã lấp.
Người ta nhìn bàn thắng để nhớ trận đấu. Tôi nhìn xG để hiểu trận đấu đã không xảy ra. Nhưng có một tầng sâu hơn cả xG: trận đấu mà file dữ liệu không tồn tại thì không có xG nào để đọc, và thứ duy nhất còn lại là dòng log ghi rằng file đã không tới.
Ở bóng rổ Việt Nam, khoảng cách giữa “được ghi” và “được phân tích” vẫn còn rộng. Box score các trận trong nước có, nhưng play-by-play đầy đủ thì không phải trận nào cũng có, và dữ liệu tracking thì gần như chỉ tồn tại ở một vài giải lớn trên thế giới. Nghĩa là mọi mô hình nội địa đều đang chạy trên một nền đất có lỗ. Khi một lỗ xuất hiện, mô hình vẫn chạy. Nó không báo lỗi. Nó chỉ trả về một con số.
Chín tầng, chín kiểu trống khác nhau
Điều làm tôi chú ý ở bản báo cáo đêm đó không phải chuyện nó trống, mà là chuyện chín tầng trống theo chín cách khác nhau, và mỗi cách trống nói lên một điều riêng về chỗ đứt gãy.
Tầng chiến thuật trống ở chỗ không có nhãn hệ thống. Không có pick-and-roll, không small ball, không switch everything, không Moreyball, không DHO, không Spain pick-and-roll, không Princeton, không một biến thể zone nào được gọi tên. Không có cấu hình đội hình đầu trận, không có đội hình cuối trận, không có tình huống phát bóng biên sau timeout, không có cách dùng timeout, không có pha phạm lỗi chiến thuật. Hệ quả là ô khả năng chuyển hóa sang playoff cũng trống: muốn biết một hệ thống có sống nổi khi đối thủ chuẩn bị bảy trận liền hay không, trước hết phải biết hệ thống đó là gì. Không có hệ thống thì không có gì để chuyển hóa.
Tầng cầu thủ trống ở chỗ không có chủ thể. Không điểm, không rebound, không assist, không TS%, không PER, không chỉ số cộng trừ, không EPM, không USG%. Ba phép kiểm tra quan trọng nhất của tầng này — soi chỉ số rỗng, hiệu chỉnh theo tỷ lệ sử dụng bóng, và kiểm tra độ co rút ở playoff — đều không chạy được vì không có ai để soi. Cả ô đường cong tuổi nghề cũng trống: không có ngày sinh thì không xác định được cầu thủ đang ở sườn lên hay sườn xuống.
Tầng vận hành trống ở chỗ không có con số nào trong bốn dòng quỹ lương: hợp đồng tối đa, tầng trung cấp, phần dư từ hợp đồng tân binh, ngưỡng thuế xa xỉ. Không có vị trí so với các mức apron, không có ngoại lệ nào được dùng, không có kho dự phòng lượt chọn vòng một trong tương lai. Một đội bóng không có bảng lương thì không thể đánh giá được một thương vụ, vì mọi thương vụ trong giải đều là phép tính giữa hai bảng lương.
Tầng giải đấu trống ở chỗ không có giải. Nhãn duy nhất được truyền xuống là “basketball” — một môn, không phải một giải. NBA, FIBA, CBA, EuroLeague, VBA, ABL: mỗi giải có một khung cạnh tranh khác nhau, một cơ chế trần lương khác nhau, một lịch khác nhau. Không xác định được giải thì bốn tầng contender, playoff, play-in, tanking đều không có chỗ để đặt đội nào vào.
Tầng luật và quản trị trống ở chỗ không có điều khoản nào bị viện dẫn. Không có tranh chấp trần lương, không có tranh cãi cơ chế draft, không có án kỷ luật, không có quy định quản lý tải trọng. Điều này có nghĩa: đêm đó không có ai vi phạm gì, hoặc có ai vi phạm nhưng tầng một không đọc ra. Hai khả năng đó dẫn đến hai hành động trái ngược nhau, và tôi không có dữ liệu để phân biệt.
Tầng phòng thay đồ trống ở chỗ không có tên người. Không huấn luyện viên, không giám đốc điều hành, không chủ sở hữu, không ai để đặt lên bàn cân về độ kiên nhẫn, về mức đầu tư, về quan hệ thầy trò, về khả năng chung sống của hai ngôi sao. Một phòng thay đồ không có tên thì không có gì để phân tích ngoài việc nói rằng nó không có tên. Ngay cả những cái tên quen thuộc nhất của bóng rổ trong nước như Đinh Thanh Tâm hay Chris Dierker cũng không xuất hiện một lần nào trong toàn bộ bản báo cáo.
Tầng rủi ro trống ở chỗ không có đối tượng. Rủi ro là phép nhân của xác suất và tác động; cả hai đều cần một chủ thể. Không có chủ thể thì ma trận rủi ro sáu dòng — cạnh tranh, hợp đồng, nhân sự, luật, dư luận, hệ thống — chỉ còn là sáu dòng kẻ.
Tầng truyền thông trống ở chỗ không có câu chuyện. Không tiêu đề, không cách đóng khung, không chu kỳ nhiệt, không khoảng cách giữa kỳ vọng thị trường và thực tế. Không có câu chuyện thì không có gì để kiểm tra xem câu chuyện đó có bền hay không.
Tầng ngành trống ở chỗ không có nút nào trên bản đồ lan tỏa: thượng nguồn là đào tạo trẻ và đại lý, trung nguồn là đội bóng và giải đấu, hạ nguồn là truyền hình, giày và thị trường phái sinh. Cả ba nút đều để trống, nên không có dòng lan tỏa nào để vẽ.
Chín kiểu trống. Không kiểu nào là cùng một lỗi.
Bốn hạng mục, cùng một ngôi sao
Cuối bản phân tích có một bảng chấm điểm giá trị thông tin, và nó đáng được đọc chậm hơn cả phần thân. Giá trị cạnh tranh: một trên năm sao. Giá trị ngành: một trên năm sao. Giá trị thời sự: một trên năm sao. Giá trị tham chiếu: một trên năm sao.
Ngôi sao duy nhất ở cả bốn hạng mục không phải phần thưởng cho nỗ lực. Nó ghi rõ: ngôi sao đó chỉ phản ánh việc nhãn lĩnh vực “basketball” đã được truyền xuống đúng. Một hệ thống tự chấm mình một trên năm sao và nói rõ vì sao là một hệ thống tôi có thể dùng tiếp. Một hệ thống tự chấm bốn trên năm sao trong tình trạng không có một điểm thông tin nào thì tôi phải mở lại toàn bộ log.
Trong phần suy luận ẩn, có một dòng đáng chú ý với độ tin cậy trung bình: nếu bài viết gốc có nội dung thật mà tầng một trả về rỗng, thì đó là một lỗi pipeline đáng điều tra, vì nó sẽ làm suy giảm âm thầm mọi phân tích ở tầng hai phía sau. Dòng đó được đánh dấu Medium, không phải High — vì từ một mẫu duy nhất, không thể phân biệt được ba khả năng: bài gốc vốn không có nội dung chiến thuật, bộ đọc không phân tích được bài, hoặc bài gốc chưa từng được gửi tới. Ba khả năng, ba cách xử lý khác nhau, và chỉ một mẫu thì không đủ để chọn.
Bốn lá cờ đỏ trong một bản báo cáo trắng
Phần cuối của bản phân tích đêm đó có bốn cảnh báo, và tôi cho rằng chúng quan trọng hơn toàn bộ chín tầng phía trên.
Cảnh báo về rủi ro bịa đặt, mức cao. Cấu trúc của một cái bảng là một lời mời điền vào. Chín tiêu đề, chín ô trống, và bản năng của bất kỳ ai từng làm báo cáo là làm cho nó đầy lên. Người viết giỏi sẽ lấp bằng những câu nghe rất hợp lý: đội bóng đang mất kiểm soát khu vực giữa, cầu thủ này có vấn đề về thái độ, hàng thủ đã xuống phong độ từ sau kỳ nghỉ. Không câu nào cần số liệu để nghe có lý. Đó chính là vấn đề. Khuyến nghị đi kèm rất dứt khoát: bất kỳ bản phân tích nào trên đầu vào rỗng mà có nêu tên cầu thủ, tên đội, con số hoặc hợp đồng, hãy coi toàn bộ là bịa.
Cảnh báo về tính toàn vẹn của pipeline, mức cao. Nếu bài viết gốc có nội dung thật mà tầng một trả về rỗng, thì bộ đọc đang hỏng trong im lặng. Đây là kiểu hỏng nguy hiểm nhất trong mọi hệ thống dữ liệu, vì nó không tạo ra lỗi — nó tạo ra một kết quả rỗng trông giống hệt một kết quả hợp lệ. Cách xử lý rất cụ thể: chạy lại tầng một trên văn bản gốc, và kiểm tra xem bộ đọc có thực sự nhận được thân bài hay chỉ nhận được một đường dẫn.
Cảnh báo về rủi ro làm nhiễm bẩn hạ nguồn, mức trung bình. Một kết quả rỗng lọt vào một bản tổng hợp nhiều bài sẽ không biến mất. Nó sẽ chiếm một chỗ, kéo trung bình xuống, và làm loãng tín hiệu của những bài thật. Trong phân tích thể thao, một bài rỗng lẫn vào một bản tin tổng hợp còn tệ hơn một bài rỗng đứng riêng, vì người đọc không có cách nào nhận ra chỗ nào là trống.
Cảnh báo về lỗi cấu trúc trong việc xác định thực thể, mức trung bình. Ô thực thể liên quan giao việc cho “các điểm thông tin ở trên”, trong khi danh sách đó rỗng. Đây không phải thiếu giá trị, đây là lỗi thiết kế lược đồ. Nó giống hệt một bản báo cáo trinh sát ghi “xem ghi chú phía trên” trong khi phía trên không có ghi chú nào. Cách sửa: khi danh sách điểm thông tin rỗng, bước trích xuất thực thể phải báo lỗi to, chứ không được phát ra một chỉ dẫn không thể thực hiện.
Bốn cảnh báo, và cả bốn đều là rủi ro quy trình. Không có cái nào là rủi ro bóng rổ.
Khi thị trường lấp chỗ trống bằng câu chuyện
Phản ứng mặc định của ngành khi thiếu dữ liệu là kể chuyện. Không ai nói “tôi không biết” trước máy quay, vì “tôi không biết” không phải một câu trả lời được trả tiền. Người ta nói đội này mất kiểm soát tuyến giữa, cầu thủ này không còn khát khao, phòng thay đồ có vấn đề. Những câu đó có một đặc tính tiện lợi: chúng không thể bị chứng minh sai, vì không có số liệu nào để đối chiếu.
Rồi chuyện xảy ra theo đúng trình tự quen thuộc. Câu chuyện được đăng. Câu chuyện được chia sẻ. Câu chuyện được nhắc lại ở bản tin tuần sau, lần này không còn kèm tên người nói. Ba tháng sau, một cây bút khác trích lại câu chuyện đó như một dữ kiện nền, và viết lên trên nó một phân tích mới. Ở điểm đó, câu chuyện đã trở thành bản ghi. Và bản ghi thì không ai kiểm tra nữa.
Đây là dạng nhiễm bẩn nguy hiểm hơn cả lỗi pipeline, vì nó không để lại log.
Năm 2026, cả thế giới thương tiếc Đức. Tôi chỉ lặng lẽ đọc lại log file của mô hình. Điều tương tự đang diễn ra ở quy mô nhỏ hơn rất nhiều trong bóng rổ nội địa: khi một đội thua ba trận liền mà không ai có dữ liệu về số possession, câu chuyện sẽ được viết bằng cảm giác, và cảm giác luôn viết nhanh hơn dữ liệu.
Góc nhìn ngược lại mà tôi muốn đặt lên bàn: bản báo cáo trống đêm đó là tài liệu trung thực nhất trong toàn bộ thư mục. Chín dòng N/A là chín lần tự chế. Một hệ thống có khả năng nói “tôi không có đủ thông tin” ở cả chín tầng là một hệ thống đáng tin hơn nhiều so với một hệ thống luôn tìm được cách lấp đầy chín tầng bằng giọng văn trôi chảy.
Mọi huấn luyện viên đều nói về cảm giác. Tôi không có cảm giác, tôi có độ lệch chuẩn. Nhưng độ lệch chuẩn của một mẫu rỗng cũng là một con số vô nghĩa, và người làm dữ liệu tử tế phải biết dừng ở đúng chỗ đó.
Có một tương quan dễ bị đọc thành nhân quả ở đây. Những bản báo cáo trông đầy đặn có xu hướng được tin hơn những bản báo cáo có ô trống. Người đọc thấy bảng, thấy số, thấy chữ in đậm, và kết luận rằng đã có đo lường. Định dạng không phải bằng chứng. Một bảng có mười hai cột vẫn có thể không chứa một phép đo nào. Và ngược lại, một dòng “không đủ thông tin” có thể là kết quả của một giờ kiểm tra nghiêm túc.
Điều đáng lo nhất trong phân tích bóng rổ nội địa không phải là mô hình dở. Mô hình dở thì người ta sớm muộn cũng phát hiện, vì nó dự đoán sai. Điều đáng lo là mô hình chạy trên dữ liệu khuyết mà vẫn trả về kết quả với độ tin cậy cao. Một pipeline sập còn hơn một pipeline nói dối. Sập thì có log. Nói dối thì không.
Ba cách mở khóa và một dòng log
Bản phân tích đêm đó kết thúc bằng danh sách những gì cần để chạy tiếp, và danh sách này ngắn đến mức đáng chú ý. Chỉ cần một trong ba thứ.
Có văn bản gốc của bài viết thì việc bóc tách và phân tích chạy trong một lượt, không cần chờ gì thêm. Một kết quả tầng một đã được điền đầy đủ cũng đủ để mở khóa — cụ thể là tiêu đề bài, nguồn, danh sách điểm thông tin không rỗng, quan điểm cốt lõi, thực thể có tên cụ thể, độ nhạy thời gian, chất lượng nguồn. Hoặc chỉ cần một chủ thể bóng rổ cụ thể: một đội, một cầu thủ, một thương vụ, một hợp đồng, một thay đổi huấn luyện viên, một tranh chấp luật, hoặc một trận đấu.
Không có cái nào trong ba thứ đó. Nên trạng thái cuối cùng của bản báo cáo là một dòng: bị chặn, đầu vào rỗng, đang chờ tài liệu nguồn.
Tôi đọc dòng đó ba lần. Nó là dòng trung thực nhất trong toàn bộ tài liệu, và cũng là dòng duy nhất có thể hành động được.
Ở tầng vận hành, có ba việc phải làm và không việc nào cần đến mô hình mới. Việc đầu tiên là cho bước trích xuất thực thể báo lỗi to khi danh sách điểm thông tin rỗng, thay vì phát ra một chỉ dẫn trỏ vào khoảng không. Việc tiếp theo là lọc bỏ kết quả rỗng trước khi chúng chạm vào bất kỳ tầng tổng hợp nào. Và việc còn lại là ghi log độ dài đầu vào và độ dài đầu ra của bộ đọc, để lần sau có thể so sánh: văn bản gốc dài bao nhiêu, kết quả bóc tách dài bao nhiêu. Nếu văn bản gốc dài mà kết quả bóc tách bằng không, đó là tín hiệu rõ ràng nhất mà một pipeline có thể phát ra.
Ba việc đó áp thẳng vào bóng rổ Việt Nam được, và nên áp sớm. Một câu lạc bộ giữa mùa giải bị đứt nguồn dữ liệu — máy tính bảng của bộ phận thống kê hỏng, người ghi chép nghỉ, file play-by-play không được tải lên — sẽ không có gì báo động. Mô hình vẫn chạy. Báo cáo trước trận vẫn ra. Và huấn luyện viên vẫn đọc nó như thật. Cách sửa không phải là mua một mô hình tốt hơn. Cách sửa là một dòng log.
Dựa trên kinh nghiệm theo dõi các trận đấu của tôi, phần lớn các quyết định sai trong bóng rổ nội địa không đến từ việc đọc sai số liệu. Chúng đến từ việc đọc một số liệu không tồn tại, do ai đó đã điền vào chỗ trống từ rất lâu trước đó.
Tín hiệu cho vòng sau
Trong chu kỳ mùa giải thường niên, người ta thường theo dõi bảng xếp hạng, hiệu số, chuỗi thắng thua, và những tranh cãi trọng tài vào đêm Chủ nhật. Tôi sẽ theo dõi thêm một thứ khác: tỷ lệ ô trống trong chính những bản báo cáo mà tôi viết.
Người ta vẫn nói rằng số liệu không biết nói dối, nhưng nó cũng không biết kể chuyện — và một khi đã không kể được chuyện, nó cũng không tự biết mình đang thiếu. Việc đó phải do người viết làm. Mỗi bản báo cáo nên có hai chỉ số song song: số ô đã điền, và số ô có thể trích dẫn về một điểm thông tin. Khi hai chỉ số đó tách xa nhau, phần chênh lệch chính là phần đã bị bịa.
Mùa giải này còn dài. Sẽ có những đêm bảng tính trả về đủ thứ, và sẽ có những đêm nó trả về chín dòng N/A. Tôi muốn giữ được thói quen đọc cả hai loại với cùng một mức nghiêm túc, vì dòng N/A không phải là chỗ kết thúc của phân tích. Nó là chỗ phân tích bắt đầu đúng.
Nếu ba tháng tới, một đội bóng ở nhóm cuối bảng vẫn nhận báo cáo đầy đủ trong khi nguồn dữ liệu của họ đã đứt từ lâu, thì vấn đề của họ không nằm ở hàng thủ.
