分享菊廠一位20萬行代碼哥的經(jīng)歷:
“你肩上扛了20萬行代碼,搞得定不?”這是我剛進(jìn)華為時(shí)聽到最多的一句話。2008年9月新員工培訓(xùn)完,我沒有回西安,而是直接飛到上海承接產(chǎn)品。剛進(jìn)上海項(xiàng)目組,就受到了熱情的接待。“這次西安來了多少人承接我們模塊?”上海X模塊的PL問我。我愣愣地指了指自己:“就我一個(gè)”。“什么,就你一個(gè)?我們組有20萬行代碼,趕緊反饋再加人?!?/p>其實(shí),剛出校園的我對(duì)20萬行代碼并沒有太多概念,但是看到他的反應(yīng),頓感不妙。我趕緊找到在其他項(xiàng)目組承接產(chǎn)品的西安PL,卻得到了安慰,“沒有想象的那么嚴(yán)重,你那塊業(yè)務(wù)我也知道一些,我給你分析看。X模塊代碼邏輯比較簡(jiǎn)單,Y模塊基本不出問題可以暫時(shí)不學(xué),這樣……這樣……你只要集中把這幾個(gè)模塊搞定就行了?!?/p>加人是不可能的,于是我的培養(yǎng)計(jì)劃也相應(yīng)有了變化。入職前兩個(gè)月,我每天的任務(wù)就是讀代碼,下班前半小時(shí)給全組講解。而同期其他新員工在入職一個(gè)月時(shí)已經(jīng)開始處理問題單和開發(fā)需求了。第三個(gè)月中期答辯時(shí),其他人的膠片上呈現(xiàn)的都是“處理了XX個(gè)問題單,開發(fā)了XK代碼的需求”,而我的膠片都是模塊的代碼功能介紹。學(xué)習(xí)期結(jié)束后,20萬行代碼的威力很快得以體現(xiàn)。為了讓我快速熟悉業(yè)務(wù),項(xiàng)目組把活最雜的接口人工作安排給了我,負(fù)責(zé)所有的網(wǎng)上問題、實(shí)驗(yàn)室問題定位以及幾個(gè)高風(fēng)險(xiǎn)模塊的問題單修改。很快,我就淹沒在電話和郵件的海洋里,焦頭爛額。“問題定位沒?郵件都發(fā)好幾個(gè)小時(shí)了,環(huán)境不保留了。”“這個(gè)問題我分析應(yīng)該是你們模塊的問題,快看下,下班前沒結(jié)論我就轉(zhuǎn)單了。”“怎么回事,你名下問題單怎么不見少,版本都快過不了點(diǎn)了?!?/p>……是的,我成了各個(gè)組的“焦點(diǎn)”,同時(shí)也開始變得焦慮,雖然每天凌晨才回公寓,依然無法阻止上竄的DI值(問題密度),這下該如何是好?很快,導(dǎo)師和PL注意到了我的窘境,伸出了援助之手。看現(xiàn)象,找原因,和我一起分析現(xiàn)狀,一件一件分析手頭的事務(wù),傳授四象限工作心得,把眼前的事務(wù)按照四象限法則排好優(yōu)先級(jí),再一一擊破,慢慢堅(jiān)持一段時(shí)間后,我終于開始變得從容起來。就是為了晚上能睡安穩(wěn)覺轉(zhuǎn)正之后,我很快就遇到了第一個(gè)網(wǎng)上問題,并且經(jīng)歷了一次深刻bug修復(fù)過程。依稀記得那是周日,凌晨?jī)牲c(diǎn),電話響起時(shí)我感覺像是剛躺下就被叫醒。“我是在一線支撐的測(cè)試經(jīng)理,新版本升級(jí)報(bào)錯(cuò)了,需要馬上解決!”“好的,什么情況?先嘗試做下這幾步恢復(fù)操作,再收集下日志,我馬上去公司?!?strong>一聽是現(xiàn)網(wǎng)的問題,本來一臉迷糊的我瞬間清醒,這可容不得半點(diǎn)馬虎。快速穿好衣服,打車直奔公司。還好,問題很快定位,之前現(xiàn)網(wǎng)的服務(wù)器出現(xiàn)過網(wǎng)卡故障,客戶把服務(wù)器拆封,兩塊網(wǎng)卡拔出來擦拭金手指,插進(jìn)去的時(shí)候交換了插槽位置,導(dǎo)致網(wǎng)卡的PCI總線編號(hào)發(fā)生變化。為了防止客戶私裝其他網(wǎng)卡,引起兼容性問題,新版本代碼做了強(qiáng)制校驗(yàn),但對(duì)于這種更換網(wǎng)卡位置的場(chǎng)景,卻沒有考慮到。“這誰設(shè)計(jì)的功能,畫蛇添足!老版本都沒問題,這是致命bug,我要求必須回溯!”雖然功能不是我開發(fā)的,但聽到電話另一端的措辭嚴(yán)厲,也感覺像犯了大錯(cuò),不敢吱聲。這次的經(jīng)歷,讓我再后續(xù)很長(zhǎng)一段時(shí)間,一接到網(wǎng)上問題電話就非常緊張。網(wǎng)上問題引起的風(fēng)波還沒過去,修改這個(gè)網(wǎng)上問題的任務(wù)就落到我頭上,沒有想到的是這次修改也不順利。代碼很快就修改完了,但是驗(yàn)證時(shí)遇到一個(gè)問題。由于老型號(hào)服務(wù)器存量并不多并且前幾年已停止發(fā)貨,三種老型號(hào)服務(wù)器,實(shí)驗(yàn)室只有一臺(tái)了,其他兩種類型的服務(wù)器沒有辦法驗(yàn)證,怎么辦?“代碼判斷的就是這幾個(gè)信息,你可以通過模擬打樁,之前我都是這么測(cè)的”,在老員工的指導(dǎo)下,我很快完成了打樁測(cè)試,但心里總有點(diǎn)不踏實(shí)。結(jié)果在版本內(nèi)部轉(zhuǎn)測(cè)試前的預(yù)驗(yàn)證環(huán)節(jié),兄弟項(xiàng)目組的同事找到了我,他們的一臺(tái)服務(wù)器裝上新版本后運(yùn)行不起來。我心里“咯噔”一下,不會(huì)是那兩種沒有驗(yàn)證的服務(wù)器吧?果然,經(jīng)過實(shí)機(jī)分析,發(fā)現(xiàn)我用的打樁模擬方法和真實(shí)的硬件還是有差異。對(duì)于這次的修改引入,PL特地過來輔導(dǎo):“這次主要是你經(jīng)驗(yàn)不足,不要太放在心上。不過我們也要好好想想,遇到困難,是不是盡全力了。”再次修改時(shí),還是有一種類型的服務(wù)器沒找到,感覺真的沒辦法了。一大早我只好再求助導(dǎo)師和PL,幾小時(shí)后,PL過來對(duì)我說:“我已經(jīng)給周邊幾個(gè)部門打過電話了,有幾臺(tái)服務(wù)器可能是我們要找的,我?guī)闳ゴ_認(rèn)下。又經(jīng)過幾個(gè)小時(shí),我們終于在一個(gè)實(shí)驗(yàn)室的角落找到了一臺(tái)落滿灰塵的服務(wù)器。拍拍灰塵,一看,好家伙,這不正是我們要找的么!找電源,接線,上電,安裝版本……看到版本軟件順利啟動(dòng),心里懸了很久的大石頭總算落地了。“好,我們?cè)侔呀粨Q網(wǎng)卡順序的場(chǎng)景覆蓋下。”然而折騰了半天,網(wǎng)卡還是沒拔下來。原來這個(gè)型號(hào)的服務(wù)器硬件設(shè)計(jì)上也做了防呆,卸網(wǎng)卡需要專用的小工具。半個(gè)小時(shí)后,網(wǎng)卡終于拔了下來,PL手上不小心被劃了口子,鮮血直流,他卻蠻不在意:“為了晚上能睡個(gè)安穩(wěn)覺,這點(diǎn)小傷,值了!”后來每當(dāng)看到“打造質(zhì)量口碑,構(gòu)筑質(zhì)量文化的教堂”時(shí),我想說我們的質(zhì)量追求真的很簡(jiǎn)單,就是為了晚上能睡安穩(wěn)覺。沒有定位不了的問題“Hello,sir……”下班剛出公司,我就接到了一個(gè)老外的電話。豎起耳朵再加上熟練的“sorry”“pardon”,才終于搞清楚了,原來是之前在espace上交流過的印度一線小伙,馬上要去客戶機(jī)房操作了,還有兩個(gè)操作步驟不太清楚。從來沒跟老外通過電話的我,一時(shí)語塞,面紅耳赤,嘴巴幾次想張但就是張不開,到嘴邊的單詞,就是說不出來。對(duì)方還在時(shí)不時(shí)的“hello?hello?”以為我不在線。哎,平時(shí)都是由GTAC的兄弟幫忙溝通,這下沒人幫忙了,這可如何是好……不管了,管他語法怎樣,突然,一句“yes”蹦出了口,慢慢地,一個(gè)單詞、一個(gè)單詞地蹦出,雖然磕磕巴巴,但總算可以用英語交流了。我在電話了說了一通,反復(fù)確認(rèn)對(duì)方了解了我的意思后,才放下電話。一看手心緊張得都是汗。好在總算交流完了,頓感身心舒暢了許多。就這樣,入職兩三年后,一切逐漸步入正軌,不管是遇到什么難題,我似乎都可以從容應(yīng)對(duì)了。不過,現(xiàn)網(wǎng)出現(xiàn)的兩三起未定位的Linux系統(tǒng)掛死問題,一直是大伙兒籠罩在頭頂?shù)臑踉?。由于使用的Linux是幾年前外購(gòu)的版本,一直未升級(jí),維測(cè)功能比較弱。而我們作為業(yè)務(wù)軟件團(tuán)隊(duì),也不具備定位這種疑難問題的經(jīng)驗(yàn),求助公司的Linux團(tuán)隊(duì)后,仍無法定位,只能以老舊Linux系統(tǒng)問題進(jìn)行了答復(fù)。沒想到,不久,在一個(gè)大T局點(diǎn)又出現(xiàn)了這個(gè)問題。沒辦法,我們只能再次求助OS、硬件相關(guān)人員,快速組建了攻關(guān)團(tuán)隊(duì)。由于缺少日志,大家從軟件硬件各種角度進(jìn)行大膽猜測(cè),然后在實(shí)驗(yàn)室進(jìn)行故障注入測(cè)試,持續(xù)了一個(gè)月后,實(shí)驗(yàn)室連問題都沒有復(fù)現(xiàn),更談不上定位,所有人都很沮喪。好在新版本軟件已經(jīng)合入了掛死時(shí)自動(dòng)復(fù)位的自愈功能,問題影響可以將到最低。一線也接受了自愈方案。第一次的集中攻關(guān)就這樣心有不甘地以失敗告終。出來混,遲早要還的。問題攻關(guān)永遠(yuǎn)不會(huì)缺席,只是來得晚而已。大半年后,中國(guó)區(qū)的一起Linux掛死問題拉開第二次攻關(guān)序幕。由于是晚上出的問題,一線還沒來得及處理,我們請(qǐng)求一線保留環(huán)境,立刻協(xié)調(diào)了公司Linux和硬件的專家馬上出差到現(xiàn)場(chǎng)定位。“這次抓到第一現(xiàn)場(chǎng),總算能定位了?!蔽倚睦锵?。可惜從一線并沒有傳回好消息,只是進(jìn)一步確認(rèn),確實(shí)是Linux系統(tǒng)掛死了,原因還是不知道。一時(shí),又陷入僵局。但是攻關(guān)不能因此停滯。我們?cè)俅戊o下心來,繼續(xù)分析日志,看代碼,分析這幾個(gè)問題找共同點(diǎn),很快發(fā)現(xiàn)這幾個(gè)問題涉及的設(shè)備都是在運(yùn)行了快一年左右時(shí)出現(xiàn)了問題。莫非與單板的運(yùn)行時(shí)長(zhǎng)有關(guān)系?累積效應(yīng)的故障模式?大家很快調(diào)整了攻關(guān)方向。不久,就找到一篇關(guān)于Linux內(nèi)核內(nèi)存泄露的案例,經(jīng)過計(jì)算,在我們的單板上正好在一年左右Linux系統(tǒng)一些關(guān)鍵內(nèi)存就會(huì)耗盡,出現(xiàn)系統(tǒng)掛死。真是踏破鐵鞋無覓處,得來全不費(fèi)工夫。后續(xù)我參與甚至主導(dǎo)過多起耗時(shí)長(zhǎng)久、艱苦卓絕的疑難問題攻關(guān),Linux系統(tǒng)掛死攻關(guān)在這些問題中不是影響最大和最緊急,但卻讓我受益最多。經(jīng)歷過這次攻關(guān)后,面對(duì)任何疑難問題,我心中都有一個(gè)信念:在我司,從來沒有搞不定的事,也從來沒有定位不了的問題!2014年到2017年,由于工作調(diào)整,我轉(zhuǎn)戰(zhàn)產(chǎn)品開發(fā),暫時(shí)離開了網(wǎng)上問題處理。2018年我又重新回歸。又是一次半夜緊急電話,我急匆匆趕到GTAC的攻關(guān)室處理緊急問題,一進(jìn)門,又見到以前的幾位老伙計(jì):“看見你來我就放心了”。這句話一時(shí)間又讓我渾身充滿了力量!以上內(nèi)容來自華為內(nèi)刊《華為人》,請(qǐng)勿轉(zhuǎn)載