第 3 章:第 3 章
哲維決定繼續做超出工作範圍的事。
不是因為勇敢。是因為他知道如果他現在停下來、假裝什麼都沒看到、把那份「正常」的報告寄出去,他接下來的每一天都會睡不著。他試過了——前天晚上他蓋上筆電之後躺在床上,天花板上那條裂紋像一條河,他在那條河旁邊躺了三個小時,腦子裡的數據没有停過。
所以他繼續挖。
他從數據庫裡把 RD-7203-DPV 實驗組的全部使用者清單調了出來。不是 dashboard 上的統計數據,是原始清單——八百萬個編號,每一個編號代表一個被他不知道的系統選中的人。
他做了一件很花時間的事:把這些編號的決策路徑按照時間軸排列,然後隨機抽樣,一個一個看。
第一個:四十多歲的男性,南美,中等消費。六十七天前開始出現迴圈。在那之前,他的行為模式跟一般人一樣——有時候點推薦、有時候自己搜尋、有時候什麼都不做。六十七天後的某一天,他開始固定在每天的同一時段打開 APP,點擊同一個位置的推薦內容,然後離開。每天。像鬧鐘。
第二個:二十出頭的女性,東南亞,低消費。五十三天前開始。她的迴圈不是固定選擇,而是固定了「不動」——她在 APP 的首頁待很長時間,不往下滑、不點擊任何推薦、就只是盯著看。然後離開。隔天再回來,重複。
第三個:六十歲的男性,歐洲,高消費。三十一天前開始。他開始反复購買同一價位的商品,品牌會換但價格帶完全固定。他之前是會買不同價位的——有時候貴、有時候便宜、看心情。現在不看心情了。
哲維看了五十個。然後一百個。
每個人的迴圈表現形式不一樣,但有一個共通點:在迴圈開始之前,他們的行為是多樣化的。人有時候做這個、有時候做那個、有時候什麼都不做。這是正常的——人類的決策本來就是混亂的、不規律的、充滿隨機性的。
但在迴圈開始之後,隨機性消失了。
不是完全消失——他們還是會點別的東西、還是會有別的行為。但他們的「主要決策」被固定了。在那個特定的場景、那個特定的時間、那個特定的選擇上,他們變得極度一致。
而這個一致性的觸發點,是系統。
哲維把這些案例整理成了一份文件。不是要交給蘇薇的報告——是留给自己的記錄。他不知道這份記錄以後會不會有用,但他需要把它寫下來。寫下來代表他不是在幻想這些事情。
凌晨兩點的時候,他查到了另一件事。
RD-7203-DPV 不是唯一的一個測試。
他在數據庫裡搜尋了所有帶「RD-72」開頭的測試代號。跳出來了十一個。RD-7201、RD-7202、RD-7203⋯⋯到 RD-7211。每一個都是決策路徑相關的測試。每一個的影響範圍都在 0.1% 到 0.5% 之間。每一個的狀態都是「進行中」。
他把這些測試的配置全部看了一遍。
RD-7201:測試使用者在面對同類型不同價格商品時的決策模式。
RD-7202:測試資訊呈現順序對閱讀完成率的影響。
RD-7203:決策路徑鎖定測試。就是他在修的這個。
RD-7204:測試社交互動頻率對使用者黏著度的影響。
RD-7205:測試路線推薦對實際移動路徑的影響。
RD-7206:測試推薦內容的情緒色調對使用者行為的影響。
⋯⋯
每一個測試都有一個 lock_threshold 參數。每一個都在測試系統能在多大程度上影響使用者的決策。
而這些測試的使用者加起來——他算了一下——大約佔全球活躍使用者的 2.8%。
不是 0.3%。是 2.8%。
每天,大約有 1.5 億人正在被和盟的系統做決策測試。
哲維把計算機關掉。
他坐在螢幕前,手放在鍵盤上,沒有打字。
他想到一件事。這些測試的配置裡,每一個都有 KPI 目標——推薦接受率、停留時間、轉換率。全部都是正向指標。從產品的角度來看,這些測試都是「成功的」。
但沒有任何一個配置裡寫了「使用者知情同意」。
他是做技術的,他不需要去讀倫理審查的論文他也知道——對人類行為進行干預性測試,受試者應該知道自己在被測試。這是最基本的。和盟沒有做這件事。
不是因為和盟不知道。是因為做了就沒辦法測了。
他終於理解這個測試的設計邏輯了。
如果你告訴一個人「我們正在測試能不能讓你不自覺地每天做同一個決定」,他就會開始注意自己的決策,測試結果就失真了。所以你不能告訴他。你只能在不知不覺中觀察、引導、記錄。
這不是 bug。這不是 filter bubble。
這是一場大规模的、未經知情同意的、對人類決策能力的測試。
而他寫的程式碼,是這場測試的偵測器。
哲維蓋上筆電。
凌晨三點的房間很暗,只有窗外巷子的路燈燈光從百葉窗的縫隙裡漏進來,在天花板上畫出一條一條的橫線。那些橫線跟那條裂紋交叉在一起,看起來像某種座標系统。
他躺在床上,把眼睛閉起來。
他想到那八百萬個編號。想到那個四十多歲的南美男性每天早上像鬧鐘一樣點同一個位置。想到那個二十出頭的東南亞女生盯著首頁不點擊任何東西。想到那個六十歲的歐洲男性只買固定價位的商品。
他們不知道。
他們完全不知道自己被選中了、被測試了、被鎖定了。
他們以為自己在選擇。
哲維睜開眼睛,看著天花板上的光影座標。
他拿起手機。螢幕的光很亮,他瞇了一下。時間是凌晨三點四十七分。
他打開了跟若晴的對話視窗。最後一則訊息還停在她說「我不知道它被用在 lock_threshold 邏輯裡」之後,他沒有回。
他想了很久。
然後他打了一行字:「妳看過全部的 RD-72 系列測試嗎?不只是 7203。」
他把手機放在枕頭旁邊,沒有送出。
光標在對話框裡閃著。一下、一下、一下。
他沒有按下送出。
他只是盯著那個光標,盯到他終於睡著了。
夢裡他看到一面巨大的螢幕,上面的紅點和綠點穩定流動著。每一個點都是一個人在做決定。他想要把螢幕關掉,但他找不到開關。
哲維最後是在中午的時候按下送出的。
他坐在便利商店門前的台階上,吃了一個肉包,喝了一罐冰咖啡。陽光很大,他的眼镜起了一層薄霧。他摘下眼鏡用袖子擦了那層霧,然後把手機拿出來,把那則昨天晚上沒送出的訊息送出了。
「妳看過全部的 RD-72 系列測試嗎?不只是 7203。」
已讀。過了四分鐘,若晴回了。
「我需要當面跟你說。」
哲維看著這行字,把最後一口肉包吃掉了。
他回:「什麼時候?」
「今天晚上。七點。一樣的地方。」
一樣的地方。他們分手前常去的一家小餐館,在便利商店旁邊的那條巷子裡面。賣的是台式定食,價格不貴,座位很少,但人也不多。他不知道若晴還記不記得了——她說「一樣的地方」,她也記得。
七點的時候他到了。若晴已經坐在裡面了。
她穿了一件素色的上衣,頭髮比上次視訊裡看到的長了一點。她面前擺了一杯水,沒有在喝。看到哲維進來,她點了一下頭。
他坐下來。兩個人對看了大概兩秒鐘。
「你先點餐。」她說。
他叫了一份排骨飯。她叫了一份雞腿飯。這是他們以前來這家店會點的東西——他排骨、她雞腿。他沒有刻意選,她也沒有。但有些東西就是會自動歸位。
老闆娘把餐端上來。哲維吃了兩口,若晴沒有動。
「你看過哪些?」她直接問。
「RD-7201 到 RD-7211。」他說。「妳呢?」
「我只有 7203 和 7206 的存取權限。7203 是我的分析範圍,7206 是同一個 data pipeline 所以我可以查。」
「其他的妳沒有權限?」
「和盟的測試數據是分层管理的。每個分析師只看到的自己的範圍。」
哲維把筷子放下。「所以妳不知道 7201 到 7211 全部。」
「我現在知道了。」她的聲音很平。「你上次問我之後,我查了。我用了我的權限能查的範圍,看到了 7203 和 7206 的全貌。其他的——7201、7202、7204——我查不到。你怎麼看到的?」
他沒有回答這個問題。
若晴沒有追問。她看著他的眼睛,等他自己說。
「我查了妳的操作記錄。」他說。「cyq_analyst 在八十三天前提交了決策追蹤函數的修改。在七十天前查詢過實驗組數據。在四十五天前跑了一份分析報告。」
「那些都是我做的。」她說。「但那次分析報告的內容是推薦一致性指标的優化建議。我不知道那份報告被用來做 lock_threshold 的調整依據。」
「妳沒有看完整個測試在做什麼嗎?」
「我的工作是分析 7203 的實驗數據、提供優化建議。測試的整體方向和配置是蘇薇那边決定的。我看到的是一個已經被設計好的測試框架,我負責跑數據。」
「妳看到那些人每天做同一個決定,妳覺得正常嗎?」
若晴拿起水杯,喝了一口,放下。「我看到的不是『人』。我看到的是一組 data points。一組實驗組的 data points 的決策一致性指標比對照組高出 47%。」
「妳知道那些 data points 是真人。」
「我知道。」她的聲音沒有變。「但哲維,你在看數據的時候你也不是在看『人』。你在看編號。」
這句話打中了他。因為她說的是事實。
他不說話了。老闆娘經過他們的桌子旁邊,問了一下「還要不要加湯」,他說好,她去盛了一碗湯回來。
「我需要問妳一件事。」哲維喝了口湯。「妳有沒有覺得不對?不是數據上的不對。是⋯⋯妳自己,有沒有覺得這個測試在做不該做的事?」
若晴把筷子放下。
「有。」她說。
這個字說出來的時候,兩個人之間的空氣變了一點。
「什麼時候開始的?」
「六週前。我跑完那份分析報告之後,我多看了幾眼數據。不是工作需要的,就只是⋯⋯看了。我看到一個使用者的行為曲線在特定時間點之後,所有的波動都消失了。不是變小了,是消失了。正常人的行為曲線是有波動的。這個人的曲線變成了一條直線。」
「然後呢?」
「然後我告訴自己那是極值案例。數據分析裡總有極值案例。我沒有繼續追。」
「為什麼?」
若晴沉默了好一會兒。她把水杯轉了一圈,看著杯子上的水珠。
「因為繼續追下去,我要嘛得承認我的工作有問題,要嘛得承認我在沒有充分質疑的情況下參與了一個有問題的事情。兩個都很難。」
哲維理解。他太理解了。
「妳現在打算怎麼做?」他問。
「我不知道。」她說。「我知道的是:我不能用我的內部帳號去查這些測試了。上週蘇薇那邊有人查過外包工程師的存取記錄。你的名字被標記了。」
哲維的手停了一下。「什麼?」
「你的外包帳號查詢了 RD-7203 的配置文件和底層數據表格。這些查詢觸發了內部監控。蘇薇在查你為什麼看到超出範圍的東西。」
「妳怎麼知道這件事?」
「我的主管上週在會議上提的。沒有說名字,只說有外包帳號查詢了內部測試數據。但時間範圍跟你的外包案開始時間對得上。」
哲維把湯碗放下。碗底的湯還在冒煙。
「妳在警告我?」
「我在告訴你我看到的事情。」若晴說。「你可以自己決定怎麼做。但我要先你知道一件事。」
「什麼事?」
「他們不是要害你。他們不在乎你是誰。你在他們系統裡只是一個外包帳號、一筆應付帳款、一個需要管理的風險因子。他們不會對你做什麼。他們只會把你切斷。」
「切斷?」
「終止合約、凍結款項、收回權限。然後你從他們的系統裡消失。你什麼都拿不到、什麼都證明不了。」
兩個人安靜了。隔壁桌有一個男生在看手機,手機的聲音放得很大。
「把數據給我。」若晴最後說。
「什麼數據?」
「你截圖存的那個加密資料夾。全部。」
「妳要那個做什麼?」
「我需要確認你在說的是不是真的。如果數據是真的,我需要知道範圍有多大。如果範圍像你說的——全部的 RD-72 系列——那我需要重新評估一些事。」
「妳不是在評估產品指標。妳是在評估要不要背叛妳的工作。」
若晴看著他。她的眼神沒有變——還是那個有條理的、溫柔的、認真的若晴。但底下多了一層東西。
「我需要先看到數據。」她說。
哲維想了一下。然後他把手伸進口袋,拿出手機,打開了加密資料夾,截圖全部轉傳給她。
對話視窗裡一張一張的截圖傳過去。RD-7203 的配置、lock_threshold 參數、RD-72 系列的列表、cyq_analyst 的操作記錄。
若晴看著手機,一張一張滑過去。
她的表情沒有變。但她的手——放在桌子上的那隻手——收緊了。
他們吃完了那頓飯。走出餐館的時候,天已經暗了。巷子裡的路燈亮著,照在那個雜貨店壞掉的招牌上。
「米七。」若晴看了一眼,說。
「妳也注意到。」哲維說。
「我一直都在注意。」
他們站在巷子裡,沒有說話。然後若晴轉身,往捷運站的方向走。走了幾步,她回過頭。
「哲維。」
「嗯。」
「你確定你不是在工作焦慮?」
這問題她在電話裡問過一次。那時候他的回答不是重點。
「確定。」他說。
若晴點了一下頭,然後走了。
哲維站在巷子裡,看著她的背影消失在路的盡頭。然後他往回走,爬上六樓沒有電梯的房間,打開筆電。
他打開了那份一直沒有寄出的進度報告,把它刪掉。
然後他從頭開始,寫了一份新的。
若晴花了三個晚上看哲維給她的數據。
第一天晚上她只是在確認——確認那些截圖是真的、確認 commit 記錄上的時間軸合理、確認 cyq_analyst 的操作紀錄確實是她自己的帳號。
全部都是真的。
第二天晚上她開始交叉比對。用她的內部權限查了 RD-7203 的原始實驗配置,跟哲維截圖裡的內容一對一比對。完全一致。然後她查了 7206——她的另一個有權限的測試。
7206 的描述是「推薦內容情緒色調對使用者行為的影響」。表面上是測試正向內容跟負向內容哪個更能提升停留時間。但她現在用不同的眼光去看,看到了別的東西。
實驗組的使用者被分成三個子組:A 組收到正向情緒偏多的推薦、B 組收到負向情緒偏多的推薦、C 組是對照組。
數據上,A 組的停留時間最长、B 組的留言互動率最高——憤怒的留言比快樂的留言多出三倍。
這份分析報告她三個月前就交了。當時的結論是「正向情緒內容有助於延長停留時間,負向情緒內容有助於提升互動率,建議根據產品目標調整混合比例」。
現在她看著這份報告,看到了另一個結論:他們已經知道怎麼用情緒來引導使用者的行為了。正向讓你沉溺、負向讓你激動。兩種都是鎖定。
第三天晚上,她做了一件她以前從來不做的事。
她查了 RD-7201。
她沒有 7201 的權限。但她有 7203 的權限,而 7203 跟 7201 用的是同一個數據 pipeline。她可以用 7203 的查詢接口,加上手動調整參數的方式,存取 7201 的部分數據。這不是合規的做法。但她做了。
7201 的數據比她以為的更廣。
不是只有消費決策。7201 測試的是「同類型不同價格商品的決策模式」——看起來是最無害的一個。但數據裡的「商品」不只是商品。她看到了新聞內容的價格等價(免費、付費、訂閱)、看到了影音內容的價格分級、看到了教育課程的價格區間。
系統在測試:當一個人在面對「同一件事但要付不同價錢」的時候,他的決策會被什麼因素影響。然後學會怎麼讓他「選擇」特定價位的那個。
這不是推薦優化。這是付費行為的操控。
若晴把查詢關掉,坐在黑暗裡。
她的房間比哲維的整齊。沒有泡麵碗在水槽裡、沒有衣服堆在椅子上。書桌上的東西排得很直。但此刻她坐在床邊,什麼都沒在做,只是看著地板。
她想到三年前她進和盟的時候。
那時候她剛畢業,拿到兩個 offer——一間是傳統金融公司的數據分析部門,另一間是和盟。金融公司薪水高 15%,但她選了和盟。原因很簡單:她想做「有意義的事」。和盟在做的是用數據理解人的行為,然後讓人的生活變得更好。金融公司做的只是讓有錢的人更有錢。
三年來,她確實看到了數據帶來的改變。醫療診斷的準確率提升、交通事故率下降、資源分配更有效率。這些是真實的。不是公關話語,是她親手跑出來的分析結果。
但現在她看到的另一面是:同樣的能力,同樣的數據,同樣的分析框架,可以被用在完全不同的方向。
讓一個人「更好」跟讓一個人「更可以預測」,之間的距離比她以為的近得多。
她的手機震了一下。是哲維。
「妳看完了嗎?」
她打了幾個字,刪掉,再打。最後她回:「看完了。」
「然後呢?」
若晴看著螢幕上這兩個字。然後呢。
她可以回去上班、裝作什麼都沒看到、繼續跑她的分析報告。沒有人會知道她查了 7201。她的主管不會問。蘇薇不會問。她的薪水不會少。
但那天晚上她在床上躺著,天花板上沒有裂紋——她的房間在天花板沒有裂紋的那一面——她想到一件事。
RD-7203 的 lock_threshold 參數,她的分析報告提供了優化建議。那些建議被採納了。然後 lock_threshold 的參數被調低了,代表更多使用者會被鎖定。
她交的那份報告,直接影響了那八百萬人的決策被固定住。
不是系統的責任。不是蘇薇的責任。
是她的。
若晴把眼睛閉起來。
隔天她照常上班。
早上九點進辦公室,和盟的辦公室比她之前待的金融公司明亮很多。落地窗外是城市的景觀,桌上的螢幕比她自己買的要大一個等級。她打開了自己的工作排程:今天要做的是 7203 新一輪的數據彙報,要把過去四週的實驗進度整理成簡報。
她打開了數據 dashboard。實驗組的數據很漂亮。決策一致性持續上升,推薦接受率穩定在高點。她之前每次看到這些數據都會有一種滿足感——產品在變好、她的分析有價值。
今天她只看到了數字。數字背後那些「consistency index 提升 0.3%」代表的是真實的人在做真實的決定。
她把簡報做出來了。跟之前格式一樣、數據一樣、結論一樣。她把簡報交給主管,主管說了一聲「好」,沒有多看。
中午她沒有去員工餐廳。她出去走了一圈,買了一個坐在路邊吃完。
下午她打開了跟蘇薇的通訊視窗。蘇薇是她的跨部門合作窗口——雖然她們在同一個大樓,但蘇薇那邊是產品、若晴這邊是分析,兩個人用通訊工具溝通比走過去更快。
她打了一行字:「蘇薇姐,我想確認一下 7203 的實驗下一步規劃。lock_threshold 的參數最近有要調整的計畫嗎?」
蘇薇在十五分鐘後回。「下週的產品會議會討論。目前 7203 的 KPI 達標,有在考慮擴大實驗範圍到 0.5% 到 1%。」
1%。從 0.3% 到 1%。
若晴把通訊視窗關掉。
她想起了哲維說的那句話:「optimizing 什麼?所有人。」
那天晚上她下班前做了一件事。她把自己經手的所有 7203 相關分析報告和數據查詢記錄,全部備份到了她自己的加密雲端空間。不是和盟的內部系統,是她自己付費買的。
她不知道這份備份以後會不會有用。
但如果有一天她需要證明「我知道這件事、我知道多久了、我提供了什麼」,她會有一份記錄。
走出和盟大樓的時候,天已經暗了。她站在門口,看著馬路對面的公車站。公車一班一班地過去。
她的手機又震了。是蘇薇。
「7203 的最終報告可以先準備結案版本了。你那邊方便嗎?」
若晴看了一會兒,然後回:「好。」
蘇薇又傳了一則:「另外,之前你查了 RD-7201 的系統日誌顯示了你的查詢記錄。下次要查跨測試的數據先跟我說,我好幫你開權限,跑流程比較快。」
若晴站在公車站前面,看著這則訊息。
不是質問。不是警告。只是一則提醒——「下次要先說」。
她回:「好,知道了。」
但是她知道,蘇薇已經知道了她查了 7201。這件事被記錄了。不是被追責,是被記錄。
若晴上了公車。車上沒什麼人。她坐在靠窗的位置,看著窗外的城市在行駛中倒退。
她的腦子裡同時裝著兩件事:明天要交的簡報,和她備份在加密雲端裡的那份記錄。
兩件事她都會做。
不是因為勇敢。是因為她不知道如果不做,她要怎麼繼續在這個辦公室裡坐下去。