?謝師茶倒了一半,老師的手機(jī)響了
謝師茶倒了一半,老師的手機(jī)響了
我手把手教了五年的徒弟,用我的技術(shù)拿了行業(yè)創(chuàng)新獎(jiǎng),轉(zhuǎn)頭就說我“培訓(xùn)不完整,故意留一手”。
大會(huì)現(xiàn)場(chǎng)他的系統(tǒng)崩了,2000多家企業(yè)看著大屏幕刷屏報(bào)錯(cuò),三家客戶損失2180萬(wàn),他讓辰宇科技的法務(wù)給我發(fā)律師函,要我“就技術(shù)培訓(xùn)不完整問題作出解釋”。
我把137次培訓(xùn)記錄提交到公證處,每一頁(yè)都有他的親筆簽名,第37次培訓(xùn)的主題就是“三層校驗(yàn)機(jī)制詳解”,他簽字確認(rèn)的那句話寫著:“我已完整學(xué)習(xí)本次培訓(xùn)內(nèi)容,理解所有技術(shù)要點(diǎn),無(wú)疑問?!?br>
技術(shù)倫理委員會(huì)的鑒定報(bào)告出來了,第一句話:“系統(tǒng)崩潰的直接原因是關(guān)鍵校驗(yàn)?zāi)K被擅自刪除?!?br>
1
大屏幕上的數(shù)字跳到2147。
我盯著臺(tái)上那個(gè)人——方杰,我教了五年的徒弟,正抱著“年度技術(shù)創(chuàng)新獎(jiǎng)”的獎(jiǎng)杯沖主持人點(diǎn)頭。
“方總,要不要現(xiàn)場(chǎng)演示一下系統(tǒng)的承載能力?”主持人舉著話筒,語(yǔ)氣是那種典型的客套。
方杰接過話筒,聲音傳遍整個(gè)會(huì)場(chǎng):“演示當(dāng)然可以,但我想做個(gè)更有說服力的——把在座各位企業(yè)的測(cè)試賬號(hào)全部接入,跑一次全負(fù)載壓力測(cè)試?!?br>
臺(tái)下三百多家企業(yè)的代表開始竊竊私語(yǔ)。
主持人愣了一下:“這個(gè)...方總,簡(jiǎn)單演示就可以...”
“沒關(guān)系?!狈浇艽驍嗨?,“我對(duì)系統(tǒng)有信心。咱們行業(yè)大會(huì)嘛,就該拿真本事說話?!?br>
我放下手里的礦泉水。
旁邊云鏡科技的CEO老陳碰了碰我的胳膊:“你徒弟膽子夠大?!?br>
“不是膽子大?!蔽叶⒅_(tái)上,“是不知道自己在做什么?!?br>
大屏幕開始顯示接入進(jìn)度。500、800、1200...數(shù)字跳得很快,方杰站在演示臺(tái)前,雙手插兜,姿態(tài)輕松得像在自家客廳。
1500的時(shí)候,屏幕右下角出現(xiàn)了第一個(gè)紅點(diǎn)。
很小,在2000+的綠色標(biāo)記里不起眼。
1800的時(shí)候,紅點(diǎn)變成了十幾個(gè)。
方杰的手從兜里拿出來了,我看見他的手指在褲縫上蹭了一下。
2000。
大屏幕上的系統(tǒng)監(jiān)控面板開始閃爍。
運(yùn)行第8秒,數(shù)據(jù)回滾的警告彈窗像瀑布一樣刷屏。
第12秒,所有客戶端的連接狀態(tài)從綠色變成灰色。
第15秒,系統(tǒng)徹底死機(jī)。
最后一行報(bào)錯(cuò)信息定格在屏幕中央:“Fatal Error: Vali**tion Module Not Found”。
會(huì)場(chǎng)安靜了三秒。
然**下開始響起****,此起彼伏。
第一排的北辰集團(tuán)CTO站起來,接電話的時(shí)候臉色煞白:“財(cái)報(bào)數(shù)據(jù)全丟了?你再說一遍?!”
第三排的人也站起來了,對(duì)著手機(jī)吼:“什么叫回滾到上周?!”
主持人拿著話筒不知道該說什么,方杰站在臺(tái)上,抱著獎(jiǎng)杯,追光燈把他照得無(wú)處可藏。
我看見他嘴唇動(dòng)了幾下,最后什么都沒說出來。
“頒獎(jiǎng)環(huán)節(jié)暫停。”主辦方的人沖上臺(tái),話筒都沒關(guān),聲音傳遍全場(chǎng),“請(qǐng)各位企業(yè)代表先處理緊急事務(wù)?!?br>
觀眾席開始騷動(dòng),有人撥律師電話,有人沖到臺(tái)前要說法。
我看見辰宇科技的謝副總坐在第五排,手機(jī)貼在耳邊,臉色從紅變白,最后成了青灰色。
老陳又碰了碰我:“你教他的時(shí)候,沒教校驗(yàn)?zāi)K?”
“教了?!蔽叶⒅笃聊簧夏切袌?bào)錯(cuò)信息,“第三十七次培訓(xùn),專門講分布式系統(tǒng)的三層校驗(yàn)機(jī)制。他簽字確認(rèn)的。”
“那這是...”
“他**。”
老陳愣?。骸盀槭裁匆?jiǎng)h?”
“可能覺得影響性能?!蔽艺酒饋?,“300并發(fā)以下,看不出問題。2000并發(fā),就是剛才那樣?!?br>
臺(tái)上的方杰被主辦方的人請(qǐng)下來了。
他抱著獎(jiǎng)杯往臺(tái)下走,經(jīng)過第一排的時(shí)候,北辰CTO直接攔住他:“方總是吧?咱們法務(wù)部的人馬上到,您別走。”
方杰的臉比大屏幕還白。
2
辰宇科技的會(huì)議室里開著空調(diào),但謝副總的額頭還是在出汗。
這是崩潰后的**個(gè)小時(shí)。
CTO把筆記本轉(zhuǎn)過來,屏幕上是系統(tǒng)崩潰時(shí)的完整日志:“方杰,你來解釋一下,為什么高并發(fā)場(chǎng)景下會(huì)出現(xiàn)數(shù)據(jù)臟讀?”
方杰坐在長(zhǎng)桌對(duì)面,手攥著茶杯:“我在公司測(cè)試環(huán)境跑過,三百并發(fā)完全沒問題。”
“大會(huì)現(xiàn)場(chǎng)是兩千并發(fā)?!盋TO敲了敲桌面,“你申報(bào)獎(jiǎng)項(xiàng)的時(shí)候?qū)懙氖鞘裁??已服?wù)2000+企業(yè)客戶,運(yùn)行穩(wěn)定性99.9%?!?br>
“客戶是有兩千多家,但不是同時(shí)在線...”
“現(xiàn)在同時(shí)在線了?!狈▌?wù)部的人打斷他,推過來三份文件,“北辰集團(tuán)、華信科技、德邦數(shù)據(jù),三家公司的追責(zé)函。初步統(tǒng)計(jì)損失金額,2180萬(wàn)?!?br>
方杰的手抖了一下,茶杯里的水灑在桌上。
法務(wù)部繼續(xù)說:“北辰那邊最嚴(yán)重,財(cái)報(bào)數(shù)據(jù)丟失,直接影響他們下周的董事會(huì)。他們法務(wù)團(tuán)隊(duì)明天到,要你本人出面說明情況。”
謝副總插話:“方杰,你老實(shí)說,系統(tǒng)到底哪里有問題?”
方杰沉默了幾秒,突然抬頭:“我懷疑是許沐白的問題?!?br>
會(huì)議室里安靜了一瞬。
“什么意思?”謝副總往前靠了靠。
“我在云鏡跟他學(xué)了五年,但他教的時(shí)候肯定留了一手?!狈浇苷Z(yǔ)速很快,“關(guān)鍵技術(shù)他不會(huì)全教,這是行業(yè)潛規(guī)則。今天這個(gè)事,可能就是因?yàn)樗?dāng)初故意不教完整,導(dǎo)致我的系統(tǒng)有缺陷。”
CTO皺眉:“你有證據(jù)?”
“我...”方杰頓了一下,“這種事不會(huì)有明面上的證據(jù),但你們想想,如果他真教全了,我的系統(tǒng)怎么可能出問題?”
謝副總盯著方杰看了幾秒,然后轉(zhuǎn)向法務(wù)部:“發(fā)函給云鏡科技,要求許沐白就技術(shù)培訓(xùn)不完整的問題作出說明?!?br>
法務(wù)部的人愣了:“這個(gè)...我們有依據(jù)嗎?”
“方杰就是依據(jù)。”謝副總一拍桌子,“他在云鏡學(xué)了五年,現(xiàn)在系統(tǒng)出事,許沐白至少有說明義務(wù)。把函件抄送給行業(yè)協(xié)會(huì),我要讓所有人知道,這事不能讓我們一家背鍋?!?br>
會(huì)議結(jié)束后,方杰回到工位。
整層樓的人都在看他,沒人說話。
他打開內(nèi)部群,手指在鍵盤上頓了頓,開始敲字:
“關(guān)于今天大會(huì)的事故,我需要說明一些情況。我在云鏡科技跟隨許沐白學(xué)習(xí)五年,但現(xiàn)在看來,他在技術(shù)傳授上存在保留。這不是個(gè)例,是行業(yè)里的普遍現(xiàn)象——師傅永遠(yuǎn)不會(huì)把真本事教給徒弟。我今天栽了,但問題的根源不在我,在于這種技術(shù)壟斷的風(fēng)氣。希望大家引以為戒?!?br>
發(fā)送。
消息在群里置頂,沒人回復(fù)。
方杰關(guān)掉電腦,看見法務(wù)部的人從他工位旁邊走過,手里拿著一份文件,抬頭是:“致云鏡科技及許沐白的律師函”。
3
我收到郵件的時(shí)候,正在調(diào)試一個(gè)客戶的數(shù)據(jù)庫(kù)。
發(fā)件人是辰宇科技法務(wù)部,主題寫著:“要求許沐白就技術(shù)培訓(xùn)不完整問題作出解釋”。
抄送名單里有行業(yè)協(xié)會(huì),還有三家我不認(rèn)識(shí)的律所。
老陳從我背后探頭看了一眼:“他們這是要咬你?”
“看起來是。”我往下翻,律師函的正文寫了三頁(yè),核心意思就一句話:方杰的系統(tǒng)出問題,是因?yàn)槲耶?dāng)年培訓(xùn)不到位。
“你準(zhǔn)備怎么辦?”
“提交培訓(xùn)記錄?!蔽谊P(guān)掉郵件,打開電腦里的一個(gè)加密文件夾,“五年,每次培訓(xùn)都有存檔。”
老陳湊過來看,文件夾里按時(shí)間排列著137個(gè)子文件夾,每個(gè)文件夾的命名格式都是“日期+培訓(xùn)主題+方杰簽字確認(rèn)”。
我點(diǎn)開第37個(gè),標(biāo)題是“分布式系統(tǒng)三層校驗(yàn)機(jī)制詳解”。
PDF的第一頁(yè)是培訓(xùn)大綱,第二頁(yè)開始是我手寫的架構(gòu)圖,每層校驗(yàn)的觸發(fā)條件、防御目標(biāo)、失效后果,寫得密密麻麻。
最后一頁(yè)是方杰的簽字,日期是崩潰前八個(gè)月。
簽字欄上面有一行手寫確認(rèn):“我已完整學(xué)習(xí)本次培訓(xùn)內(nèi)容,理解所有技術(shù)要點(diǎn),無(wú)疑問?!?br>
“他簽得這么清楚,還能倒打一耙?”老陳嘖了一聲。
“能?!蔽野盐募A打包,“不然他沒法給辰宇科技交代。”
云鏡科技的法務(wù)部用了半天時(shí)間整理材料。
137次培訓(xùn)記錄,每次都有方杰的親筆簽字。
我另外調(diào)出了完整版的源代碼,提交到公證處封存。
代碼的注釋是我當(dāng)年一行行寫的,每個(gè)模塊都有詳細(xì)說明。第三層校驗(yàn)機(jī)制的注釋開頭第一句話是:“本模塊用于防御高并發(fā)場(chǎng)景下的數(shù)據(jù)臟讀,禁止刪除或修改,否則系統(tǒng)在2000+并發(fā)時(shí)必然崩潰。”
公證員看到這行字的時(shí)候,抬頭看了我一眼:“你當(dāng)時(shí)就預(yù)見到了?”
“不是預(yù)見,是踩過坑?!蔽抑钢⑨尷锏臅r(shí)間戳,“這套校驗(yàn)機(jī)制我花了兩年調(diào)出來,每個(gè)判斷條件都對(duì)應(yīng)一個(gè)真實(shí)的事故案例?!?br>
“那方杰為什么要?jiǎng)h?”
“可能覺得我多此一舉?!?br>
公證處的封存清單打印出來,19頁(yè),每一頁(yè)都列著培訓(xùn)時(shí)間、主題、方杰的簽字照片。
我把清單拍照發(fā)給老陳,附了一句話:“材料齊了?!?br>
老陳回復(fù):“行業(yè)協(xié)會(huì)那邊我去溝通,你準(zhǔn)備一下,可能要開技術(shù)鑒定會(huì)?!?br>
當(dāng)天下午,云鏡科技的CEO親自給行業(yè)協(xié)會(huì)打電話。
我坐在旁邊聽他說:“許沐白這邊的培訓(xùn)記錄完整,有簽字確認(rèn)。辰宇科技現(xiàn)在倒打一耙,我們要求啟動(dòng)技術(shù)鑒定,還許沐白一個(gè)清白。”
電話那頭不知道說了什么,CEO的語(yǔ)氣強(qiáng)硬起來:“這不是兩家公司的私事,是行業(yè)風(fēng)氣的問題。如果今天許沐白被這么冤枉了,以后誰(shuí)還敢認(rèn)真**弟?”
掛掉電話,CEO對(duì)我說:“協(xié)會(huì)同意啟動(dòng)鑒定程序,會(huì)要求辰宇科技提交源代碼。”
“他們會(huì)給嗎?”
“不給也得給?!盋EO靠在椅背上,“三家客戶在盯著,行業(yè)協(xié)會(huì)在盯著,辰宇科技現(xiàn)在想捂都捂不住。”
我打開自己三年前的技術(shù)博客,找到一篇文章,標(biāo)題是《分布式系統(tǒng)中容錯(cuò)設(shè)計(jì)的三個(gè)層次》。
文章里詳細(xì)講了三層校驗(yàn)機(jī)制的設(shè)計(jì)思路,發(fā)布時(shí)間是方杰還在云鏡的時(shí)候。
評(píng)論區(qū)有人問:“許老師,第二層和第三層校驗(yàn)是不是有點(diǎn)冗余?”
我當(dāng)時(shí)的回復(fù)是:“看起來冗余,但高并發(fā)場(chǎng)景下,任何一層失效都可能導(dǎo)致系統(tǒng)崩潰。寧可犧牲一點(diǎn)性能,也不能讓數(shù)據(jù)出問題?!?br>
這條評(píng)論下面,有個(gè)點(diǎn)贊,用戶名是方杰的英文名。
我截圖保存,發(fā)給法務(wù)部:“再加一條證據(jù)?!?br>
4
行業(yè)協(xié)會(huì)技術(shù)倫理委員會(huì)的函件到辰宇科技的時(shí)候,謝副總正在跟董事長(zhǎng)解釋賠償方案。
董事長(zhǎng)看完函件,把文件摔在桌上:“要你們提交源代碼?你們敢提交嗎?”
謝副總咽了口唾沫:“我們內(nèi)部已經(jīng)調(diào)查過了,系統(tǒng)確實(shí)存在一些...技術(shù)缺陷?!?br>
“什么叫一些?說清楚!”
“CTO那邊檢查了代碼倉(cāng)庫(kù)...”謝副總的聲音越來越小,“發(fā)現(xiàn)方杰在八個(gè)月前有一次大規(guī)模刪除操作?!?br>
董事長(zhǎng)盯著他,一字一頓:“**什么?”
“兩層校驗(yàn)?zāi)K?!?br>
會(huì)議室里安靜了幾秒,只有空調(diào)的風(fēng)聲。
董事長(zhǎng)深吸一口氣:“為什么刪?”
“commit信息寫的是優(yōu)化性能去除冗余模塊?!?br>
“冗余?”董事長(zhǎng)的聲音拔高,“現(xiàn)在兩千多萬(wàn)的賠償是因?yàn)槿哂???br>
謝副總不敢接話。
董事長(zhǎng)敲著桌面:“把代碼倉(cāng)庫(kù)的記錄全部導(dǎo)出來,配合協(xié)會(huì)調(diào)查。另外,馬上聯(lián)系技術(shù)專家,我要知道那兩層校驗(yàn)到底是干什么用的?!?br>
CTO被叫進(jìn)會(huì)議室,打開筆記本,調(diào)出方杰那次刪除操作的詳細(xì)記錄。
“這是第二層校驗(yàn),負(fù)責(zé)并發(fā)鎖的二次驗(yàn)證?!盋TO指著屏幕,“刪掉之后,300并發(fā)以下看不出問題,因?yàn)闆_突概率低。但并發(fā)量上去,沖突就會(huì)指數(shù)級(jí)增長(zhǎng)?!?br>
“第三層呢?”
“第三層是數(shù)據(jù)一致性的最終校驗(yàn)。”CTO切換到另一個(gè)文件,“這層是兜底的,前面兩層萬(wàn)一失效,第三層能保證數(shù)據(jù)不出錯(cuò)。方杰把這層也**,等于整個(gè)系統(tǒng)裸奔?!?br>
董事長(zhǎng)看向謝副總:“你當(dāng)初挖他過來,做過技術(shù)評(píng)估嗎?”
“做了,他在云鏡的時(shí)候...”
“我問的是技術(shù)評(píng)估,不是履歷調(diào)查!”董事長(zhǎng)打斷他,“他自己獨(dú)立寫過什么?主導(dǎo)過什么?你查過嗎?”
謝副總張了張嘴,沒說出話。
董事長(zhǎng)站起來:“法務(wù)部,準(zhǔn)備材料,配合協(xié)會(huì)調(diào)查。另外,內(nèi)部**程序啟動(dòng),謝副總暫停職務(wù)。”
謝副總的臉一下子白了。
當(dāng)天下午,辰宇科技的代碼倉(cāng)庫(kù)被完整導(dǎo)出,提交給技術(shù)倫理委員會(huì)。
委員會(huì)的專家用了兩個(gè)小時(shí),把方杰的代碼和我提交的完整版代碼做了對(duì)比。
對(duì)比報(bào)告的結(jié)論部分寫得很直白:
“方杰的代碼是許沐白完整版的刪減版本。核心架構(gòu)、算法邏輯、變量命名均高度一致,唯一區(qū)別在于方杰刪除了第二層和第三層校驗(yàn)?zāi)K?!?br>
“被刪除的校驗(yàn)?zāi)K專門用于防御高并發(fā)場(chǎng)景下的數(shù)據(jù)臟讀和一致性問題,是系統(tǒng)穩(wěn)定運(yùn)行的關(guān)鍵組件?!?br>
“系統(tǒng)崩潰的直接原因是關(guān)鍵校驗(yàn)?zāi)K缺失,導(dǎo)致高并發(fā)場(chǎng)景下出現(xiàn)大規(guī)模數(shù)據(jù)回滾。”
報(bào)告的最后一句話被加粗:“本次事故屬于典型的技術(shù)改造失誤,責(zé)任方為擅自刪除關(guān)鍵模塊的操作者。”
技術(shù)倫理委員會(huì)把報(bào)告同步發(fā)給辰宇科技董事會(huì)、三家受損客戶,以及行業(yè)協(xié)會(huì)。
北辰集團(tuán)的法務(wù)部收到報(bào)告后,連夜整理訴訟材料。
**狀的第一被告是方杰,第二被告是辰宇科技。
訴訟請(qǐng)求第一條:判令被告賠償經(jīng)濟(jì)損失780萬(wàn)元。
第二條:判令被告公開道歉,消除影響。
辰宇科技的法務(wù)部看到**狀,給董事長(zhǎng)發(fā)了一封郵件,主題是:“賠償敞口預(yù)估”。
郵件正文只有一句話:“三家客戶加上潛在連帶責(zé)任,總額可能超過5000萬(wàn)。建議立即與方杰**勞動(dòng)關(guān)系,保留追償權(quán)?!?br>
董事長(zhǎng)在郵件上批了兩個(gè)字:“同意?!?br>
5
北辰集團(tuán)的車停在辰宇科技樓下的時(shí)候,我正在云鏡的會(huì)議室里跟客戶開視頻會(huì)。
老陳推門進(jìn)來,把手機(jī)遞給我,屏幕上是行業(yè)群里轉(zhuǎn)發(fā)的現(xiàn)場(chǎng)照片。
三輛黑色商務(wù)車,北辰的CTO帶著五個(gè)人,直接堵在辰宇科技的前臺(tái)。
照片里方杰站在大廳中央,臉色比墻還白。
我放大照片,看見北辰CTO手里拿著一份文件,封面上印著辰宇科技的logo。
老陳說:“那是技術(shù)保證書,方杰簽的字?!?br>
我把手機(jī)還給他,繼續(xù)開會(huì)。
半小時(shí)后會(huì)議結(jié)束,手機(jī)里已經(jīng)有十幾條未讀消息。
都是行業(yè)群里的。
有人發(fā)了北辰CTO在辰宇大廳的視頻,聲音很大,隔著手機(jī)都聽得清楚。
“方總,您去年十月簽的這份保證書,上面寫著系統(tǒng)經(jīng)過完整壓力測(cè)試,可承載3000+并發(fā),您還記得嗎?”
方杰的聲音聽起來像被掐住了喉嚨:“我確實(shí)測(cè)過...”
“測(cè)過?”北辰CTO打斷他,“大會(huì)現(xiàn)場(chǎng)2000并發(fā)就崩了,您測(cè)的是什么?空氣嗎?”
視頻里有人笑,很快被憋了回去。
方杰說:“測(cè)試環(huán)境下真的沒問題,可能是生產(chǎn)環(huán)境有什么...”
“測(cè)試環(huán)境300并發(fā),生產(chǎn)環(huán)境2000并發(fā),這叫有什么?”北辰CTO把保證書拍在前臺(tái)桌上,“方總,我們法務(wù)團(tuán)隊(duì)已經(jīng)在路上了,民事訴訟的立案通知明天送達(dá)。您今天最好別離開公司。”
視頻到這里結(jié)束了。
群里開始刷消息。
“北辰這是要往死里整啊”
“780萬(wàn),方杰賣房都不夠賠”
“辰宇科技也跑不了,連帶責(zé)任”
我退出聊天界面,看見另一個(gè)群也在閃。
是辰宇科技的內(nèi)部群,有人把我拉進(jìn)去了。