一個運行了一年多的薪酬系統(tǒng),賬單數(shù)字突然集體跑偏33%。工程師挖了數(shù)小時數(shù)據(jù)庫代碼,最后發(fā)現(xiàn)bug不在程序里——在用戶的腦回路里。
一張圖看懂:問題出在哪
![]()
Albert(化名)是英國北部一家法國咨詢公司分部的軟件工程師,專門維護各類甲骨文企業(yè)資源計劃系統(tǒng)的數(shù)據(jù)對接。某天,他接到緊急工單:員工工時統(tǒng)計表算出的人工成本,憑空多了約三分之一。
他打開用戶發(fā)來的文件,確認數(shù)字確實不對。第一反應(yīng)很合理——數(shù)據(jù)管道出問題了。他花了數(shù)小時深挖數(shù)據(jù)庫里的PL/SQL存儲過程,邏輯看起來無懈可擊。更詭異的是,他自己生成的測試文件,數(shù)字完全正確。
和用戶一聊,真相浮出水面。
系統(tǒng)按客戶要求輸出的是「分鐘數(shù)」。用戶覺得數(shù)字太大,想換成小時,于是手動把所有數(shù)值除以了100。Albert不得不現(xiàn)場科普:分鐘轉(zhuǎn)小時要除以60,不是100。
100和60的差值,正好讓結(jié)果偏離約33.3%。
為什么100看起來"更對"
這個錯誤太常見了。十進制思維是本能——百分制、百進制貨幣、百分數(shù),日常接觸的全是100的倍數(shù)。時間卻是六十進制的活化石,來自古巴比倫的數(shù)學(xué)遺產(chǎn)。
用戶看到「5400分鐘」,直覺反應(yīng)是「54」,而非「90」。數(shù)字變小了,單位"看起來"對了,報表順眼了,財務(wù)災(zāi)難也埋下了。
Albert的排查過程很有代表性:先懷疑系統(tǒng),再懷疑代碼,最后才懷疑人。這是工程師的慣性路徑——畢竟軟件比用戶更可預(yù)測。但企業(yè)軟件的特殊之處在于,它往往是"半成品":系統(tǒng)輸出原始數(shù)據(jù),用戶在Excel里完成最后一公里的加工。
這最后一公里,沒有版本控制,沒有單元測試,沒有代碼審查。只有一個覺得數(shù)字"太大"的人,和除號鍵。
企業(yè)軟件的灰色地帶
甲骨文薪酬系統(tǒng)本身沒出問題。數(shù)據(jù)管道正常,數(shù)據(jù)庫邏輯正常,文件生成正常。故障發(fā)生在系統(tǒng)邊界之外——那個用戶自制的"轉(zhuǎn)換層"。
這是企業(yè)IT的常態(tài)痛點。再完善的ERP系統(tǒng),也擋不住用戶把數(shù)據(jù)導(dǎo)出到Excel里"再加工"。據(jù)Albert描述,這種集成已經(jīng)穩(wěn)定運行超過一年,說明系統(tǒng)本身的設(shè)計是可靠的。但可靠性只覆蓋到文件生成那一刻,之后的故事系統(tǒng)一無所知。
更隱蔽的風(fēng)險是:用戶的"修復(fù)"可能長期潛伏。如果這次偏差不是33%這么顯眼,而是3%,會不會更晚才被發(fā)現(xiàn)?財務(wù)對賬時的小額差異,往往被歸因于"四舍五入"或"時區(qū)問題",直到某天審計師翻開原始底稿。
Albert花了數(shù)小時排查數(shù)據(jù)庫,最終用一句話解決。時間成本的不對稱,暴露了企業(yè)支持流程的盲區(qū)——我們擅長追蹤技術(shù)故障,卻不擅長追蹤"用戶創(chuàng)新"。
能防嗎?難
技術(shù)上可以強制約束。比如輸出時直接換算成小時帶小數(shù),不給用戶動手空間。或者在文件里加只讀保護、公式鎖定、甚至宏檢測。但這些手段都有副作用:靈活性降低,用戶抵觸,支持成本轉(zhuǎn)移。
Albert所在的公司選擇了另一條路:按客戶規(guī)格輸出分鐘數(shù)。這給了下游自由,也給了下游犯錯的空間。商業(yè)軟件永遠在"管控"與"靈活"之間走鋼絲,而Excel是這條鋼絲上最滑的一段。
這個案例的諷刺之處在于,用戶主動"優(yōu)化"了數(shù)據(jù),卻破壞了準確性。他們的意圖是好的——讓數(shù)字更易讀——但執(zhí)行依據(jù)的是直覺而非 domain knowledge(領(lǐng)域知識)。企業(yè)軟件的設(shè)計者常常假設(shè)用戶會按培訓(xùn)操作,現(xiàn)實是用戶會按"看起來對"的方式操作。
Albert最后說,他"不得不向用戶解釋"基本數(shù)學(xué)。這句話的疲憊感很熟悉——不是技術(shù)難題的疲憊,是溝通成本的疲憊。修復(fù)一個除號只需一秒,修復(fù)一個認知偏差需要反復(fù)。
《The Register》的"On Call"專欄常年收集這類故事,說明這不是孤例。從全球范圍看,Excel導(dǎo)致的財務(wù)錯誤每年造成數(shù)十億美元損失——有些是把基因名當(dāng)成日期自動轉(zhuǎn)換,有些是復(fù)制粘貼時行號錯位,有些,就像Albert遇到的,是100除以60的倔強。
尾聲
Albert的故事沒有系統(tǒng)性的解決方案,只有一個具體的教訓(xùn):當(dāng)數(shù)字突然跑偏33%,先問問用戶有沒有"優(yōu)化"過什么。這個比例太特殊了——它幾乎是100/60的簽名。
下次看到類似的偏差,或許可以省掉數(shù)小時的數(shù)據(jù)庫排查。畢竟,在軟件工程里,最不可預(yù)測的變量從來不是代碼。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.