史恭標(biāo)
2021年7月,我走出校門,走進(jìn)華為南京研究所的大門,成為了一名華為人。
我碩士學(xué)的是控制工程專業(yè),主攻模式識(shí)別。簡(jiǎn)單點(diǎn)說,就是利用各式的“相機(jī)”(如光學(xué)相機(jī)、激光雷達(dá)等)與電腦軟件算法代替人眼去自動(dòng)觀察、識(shí)別觀測(cè)對(duì)象。其間,我跟著導(dǎo)師“上山下廠”,忙得不亦樂乎。在與某鋼廠的合作項(xiàng)目中,我在學(xué)校忙碌了大半年,又駐守現(xiàn)場(chǎng)呆了小半年,帶著安全帽和現(xiàn)場(chǎng)工人們同吃同住同干,成功搞定了廢鋼裝卸自動(dòng)化的大項(xiàng)目。我們利用設(shè)計(jì)出的軟件與算法,通過高精相機(jī)和激光雷達(dá)傳送的實(shí)時(shí)數(shù)據(jù),精準(zhǔn)識(shí)別廢鋼位置,指揮行車前后移動(dòng)、定點(diǎn)抓取和裝車,從而實(shí)現(xiàn)無人化、自動(dòng)化廢鋼裝卸。正是有了這次軟件工程的實(shí)戰(zhàn)經(jīng)驗(yàn),在參加華為軟件崗的校招時(shí),我才順利通過筆試和面試,拿到了offer。

報(bào)到后,我正式加入“華為乾坤”設(shè)備生命周期管理團(tuán)隊(duì)。來到部門,我才知道,華為乾坤是一款面向行業(yè)客戶的網(wǎng)絡(luò)產(chǎn)品,可以為客戶提供安全可靠的云服務(wù)能力。我所在的團(tuán)隊(duì)負(fù)責(zé)開發(fā)設(shè)備的管理平臺(tái),通過該平臺(tái)可以讓客戶在云上便捷、快速地管理本地網(wǎng)絡(luò)設(shè)備。
入職后,在組內(nèi)一眾大佬的帶領(lǐng)下,我開始學(xué)習(xí)相關(guān)的基礎(chǔ)知識(shí)。急性子的我并不滿足于每天枯燥的練習(xí),在我苦苦央求下,我拿到了工作生涯中第一個(gè)需求:支持不同客戶,配置相應(yīng)的操作權(quán)限。
“權(quán)限配置?這也不難??!” 不等師父交代細(xì)節(jié),我就急吼吼地直接上手?jǐn)]起代碼,短短三天就洋洋灑灑寫出了兩千多行代碼。我信心滿滿地按下“commit”(確認(rèn))按鈕,把代碼提交給SE(系統(tǒng)工程師)常建強(qiáng)。
“強(qiáng)哥,我需求寫好了,你幫忙看一下!”我走到強(qiáng)哥身邊興奮地說道。強(qiáng)哥一驚:“小伙子很不錯(cuò)嘛,速度很快呀!”他笑著打開我的代碼,我則站在一旁,靜待他下一波的夸獎(jiǎng)??戳藳]兩分鐘,強(qiáng)哥臉上的笑容開始凝固,眉頭越來越緊:“哎呀,你這個(gè)代碼很學(xué)院派啊,一下子還有點(diǎn)看不懂咯!”我嘿嘿一笑,心想:“我寫的代碼,哪是這么容易就被你看懂的!”強(qiáng)哥揮揮手讓我先回去,低頭繼續(xù)研究起來。
第二天一早,我在辦公室迎面見到了強(qiáng)哥。還沒等我開口,就聽到他說:“我昨晚看了一遍你的代碼,你留意下批注的代碼審閱意見?!?/span>
“有這么多問題嗎?需要你看一晚?”我心里嘀咕著,不解地打開電腦,一下子被滿屏的審閱意見整蒙了 :“命名不好”“可讀性差”“抽象提取,避免霰彈式修改”“邊界條件考慮不足”……我有些不服氣,湊合著改了幾處問題,就草草提交了代碼,心想:“這都是小問題嘛!主要功能沒問題,這不就行了!”
但很快,問題單就像冷冷的冰雨狠狠地砸向我。轉(zhuǎn)測(cè)后,我“喜提”了9張問題單,我的第一個(gè)需求也名列當(dāng)期轉(zhuǎn)測(cè)質(zhì)量倒數(shù)榜單的“榜首”。我開始尷尬地修改一張張問題單,我也逐漸發(fā)現(xiàn)正是因?yàn)槲也恍加诟恼切?qiáng)哥指出的“小細(xì)節(jié)”,才引發(fā)一系列bug。我不禁責(zé)怪自己太“年輕”,也頓悟:“學(xué)院派”可能并不是一個(gè)褒義詞!在校期間,我寫代碼向來是“高歌猛進(jìn)”,大多數(shù)情況只驗(yàn)證可行性,很少考慮代碼的穩(wěn)定性與性能,更不會(huì)關(guān)注客戶的實(shí)際使用場(chǎng)景。
我像是泄了氣的皮球,一時(shí)間沒了勁頭。強(qiáng)哥似乎看穿了我的低落,走過來安慰我:“年輕就不要怕失敗,更何況這都不算什么失?。 蔽×诉@次教訓(xùn),我開始關(guān)注代碼質(zhì)量和規(guī)范,安下心來,扎扎實(shí)實(shí)地把iLearning上的《軟件架構(gòu)設(shè)計(jì)》《代碼壞味道》《開發(fā)者自測(cè)試》等課程學(xué)習(xí)了一遍。我更加注意細(xì)節(jié)、重視代碼架構(gòu)和質(zhì)量,從代碼設(shè)計(jì)到開發(fā),我都主動(dòng)與SE和測(cè)試的同事們溝通,我還會(huì)在寫完代碼后做好充分的自測(cè)。認(rèn)真修改好9張問題單后,這個(gè)需求總算經(jīng)受住了測(cè)試的嚴(yán)格考驗(yàn)。

乾坤云設(shè)備生命周期管理團(tuán)隊(duì)合影(左一為作者)
隨著高級(jí)威脅、勒索病毒的日益猖獗,華為乾坤團(tuán)隊(duì)規(guī)劃了“云-邊-端”協(xié)同的縱深防御體系,能通過強(qiáng)大的云上安全大腦,協(xié)同邊界網(wǎng)絡(luò)設(shè)備與終端安全軟件,為客戶提供安全的網(wǎng)絡(luò)環(huán)境。
其中,“端”是指終端安全EDR(終端防護(hù)與響應(yīng)),是一款安裝在終端電腦上的殺毒軟件。不同于傳統(tǒng)殺毒軟件“被動(dòng)挨打”的防護(hù)思路,我們可以通過云端威脅情報(bào)、機(jī)器學(xué)習(xí)、異常行為分析等方式,主動(dòng)發(fā)現(xiàn)內(nèi)外部安全威脅,并自動(dòng)化阻止、取證、補(bǔ)救和溯源,從而有效保障網(wǎng)絡(luò)安全。
2021年下半年,為加速EDR研發(fā)進(jìn)度,部門抽調(diào)了各領(lǐng)域?qū)<液凸歉山M成終端防護(hù)預(yù)研小組。當(dāng)時(shí),“端”側(cè)安全還沒有落地,大家都沒有“端上安全衛(wèi)士”開發(fā)的經(jīng)驗(yàn),面對(duì)未知的領(lǐng)域都有些發(fā)怵。想到之前在鋼廠實(shí)習(xí)時(shí)我做過類似的開發(fā),我鼓起勇氣向時(shí)任乾坤云終端安全團(tuán)隊(duì)的負(fù)責(zé)人王亮請(qǐng)纓:“我以前做過一些端側(cè)軟件,要不我來試試吧!”
本來,我還擔(dān)心亮哥會(huì)因?yàn)槲沂莻€(gè)初出茅廬的小兵而猶豫,沒想到他直接點(diǎn)了頭:“太好了,果然是‘初生牛犢不怕虎’!團(tuán)隊(duì)在這個(gè)新戰(zhàn)場(chǎng)上還沒有太多的技術(shù)積累,這件事做起來肯定會(huì)很困難,但我相信只要你能扎進(jìn)去、好好干,咱一定能做出成績(jī)!”
亮哥的鼓勵(lì)讓我干勁十足,懷著既興奮又忐忑的心情,我隨即投入到“端側(cè)安全”這個(gè)新戰(zhàn)場(chǎng)。仔細(xì)研究后,我發(fā)現(xiàn)這件事遠(yuǎn)沒有我最初想的那么簡(jiǎn)單:從軟件的安裝部署到網(wǎng)絡(luò)通信,再到核心的采集、指令執(zhí)行的能力,甚至整個(gè)軟件工程的編譯構(gòu)建,一切都將是從零開始。一時(shí)之間,我竟然迷茫到不知從何下手。
靜下心來仔細(xì)想想,我又給自己打氣:我背后還有一支強(qiáng)大、靠譜的隊(duì)伍。有什么問題,邊問、邊學(xué)、邊解決就好了!調(diào)整好心態(tài),我開始一邊體驗(yàn)業(yè)界產(chǎn)品的功能和業(yè)務(wù)場(chǎng)景,一邊研究同類開源產(chǎn)品的技術(shù)實(shí)現(xiàn)。
通過亮哥的引薦,我還輾轉(zhuǎn)找到公司安全網(wǎng)關(guān)部門的張偉雙、軟件教練杜鵬和李釗等技術(shù)大佬,主動(dòng)學(xué)習(xí)、了解產(chǎn)品的技術(shù)原理和實(shí)現(xiàn)細(xì)節(jié)。那段時(shí)間,我的腦袋里裝滿了“如何保證網(wǎng)絡(luò)通道的安全”“怎樣第一時(shí)間采集到攻擊者的惡意行為”“怎樣高效地執(zhí)行云上殺毒指令”……等一系列問題。為了能第一時(shí)間約到專家,我蹲點(diǎn)等著專家的WeLink頭像“變綠”,到專家工位“圍追堵截”,甚至厚著臉皮約著專家去擼串。會(huì)議拉了一次又一次,肉擼了一串又一串,手上的難題也終于一個(gè)又一個(gè)被攻克。
其中,有一個(gè)問題讓我印象深刻。在開發(fā)勒索行為檢測(cè)這一功能時(shí),我們發(fā)現(xiàn)在某些機(jī)器上的檢測(cè)延遲非常高,夸張到勒索行為發(fā)生5分鐘后,我們的軟件才提示自動(dòng)攔截,但這顯然已經(jīng)是“馬后炮”了!

延遲時(shí)間這么久,意味著防勒索功能已經(jīng)失去意義,我們必須要攻克這一技術(shù)難題。我們團(tuán)隊(duì)從頭到尾排查下來,發(fā)現(xiàn)是“事件上報(bào)性能不足”導(dǎo)致了如此大規(guī)模的延遲。勒索軟件一秒鐘可能產(chǎn)生上千條異常事件,但云側(cè)上傳接口每秒最多允許我們調(diào)用十余次,這是百倍的性能差距。打個(gè)比方,這就像繁忙的高速公路上突然出現(xiàn)一個(gè)“龜速”收費(fèi)站,只允許車輛慢慢通過,而后面又有車輛源源不斷地涌入,馬上就會(huì)出現(xiàn)幾公里的“大型堵車現(xiàn)場(chǎng)”。
問題看上去很簡(jiǎn)單,我提出了擴(kuò)建“收費(fèi)站”的解決辦法。然而,專家很快就駁回了這個(gè)思路,因?yàn)閿U(kuò)展的成本難以估量,會(huì)影響產(chǎn)品的整體競(jìng)爭(zhēng)力。這個(gè)問題只得另想他法。
問題無解,下班后,我們一行人結(jié)伴前往地鐵站。
“高速路上堵車,收費(fèi)站不給力是一方面,但路上的車是不是也太多了?如果不能改造收費(fèi)站,那有沒有辦法減少車的數(shù)量?”杜教練在月臺(tái)上提出了自己的想法。
“可是,‘車’的數(shù)量怎么控制呢?有些性能很好的電腦,勒索病毒一秒鐘就可以加密幾百個(gè)文件,產(chǎn)生上千個(gè)事件,這些事件都得上報(bào),這樣才能準(zhǔn)確判斷出是否有勒索病毒。”我細(xì)細(xì)想了想,無奈地回道。
“那如果做一個(gè)分類器,先把這些‘車’歸歸類,做一些初步的信息提煉,有沒有可能減少事件的數(shù)量?”杜教練繼續(xù)分析道。
“這個(gè)路子肯定可以,但是我們端側(cè)的分析模型還不健全,不具備信息提煉的能力……”我嘆了口氣,思緒開始有些混亂。
聊著聊著,地鐵進(jìn)站的播報(bào)響了起來。杜教練嘿嘿一笑:“這會(huì)晚高峰,路上肯定堵死了,幸虧坐地鐵?!?/span>
嗯?我腦中靈光一現(xiàn):如果我們也讓那些“車”去坐“地鐵”,是不是就可以大批量、準(zhǔn)時(shí)到達(dá)目的地?
有了這個(gè)想法,我立馬和杜教練討論起來。巨量的事件如果按照順序一個(gè)個(gè)上報(bào)到云上,必然會(huì)造成通道擁堵,但如果我們建一輛定時(shí)啟動(dòng)的“地鐵”,讓它們都按班次運(yùn)行,一次就可以運(yùn)送近千條數(shù)據(jù),應(yīng)該就能解決現(xiàn)在的困境!第二天,我們開始嘗試這一解決方案,果然有戲!后續(xù),為了更充分地提高性能,除了“定時(shí)啟動(dòng)”,我們還制定了“車滿即走”的數(shù)據(jù)發(fā)送策略,進(jìn)一步避免了高延時(shí)攔截的尷尬。
最終,我成功完成了挑戰(zhàn)任務(wù),順利交付了第一版端側(cè)軟件。當(dāng)一個(gè)惡意進(jìn)程在靶機(jī)上產(chǎn)生高級(jí)威脅時(shí),我們的終端軟件瞬間能采集到它的行為信息,并上報(bào)給“云上安全大腦”。隨后,安全大腦通過分析研判,迅速下達(dá)處置指令,收到指令的終端軟件立即阻斷惡意行為,并能將惡意進(jìn)程隔離在安全區(qū)內(nèi),成功保護(hù)了終端設(shè)備的安全!
在這個(gè)新戰(zhàn)場(chǎng)上,初出茅廬的我首戰(zhàn)告捷,快速成長(zhǎng),榮獲了華為南京研究所“年度優(yōu)秀新員工”的榮譽(yù),也成為了一名Committer(代碼提交者)。這些榮譽(yù)和責(zé)任,更讓我對(duì)軟件開發(fā)保持敬畏心,時(shí)刻擁有對(duì)探索未知領(lǐng)域的無限熱情與勇氣,充滿持續(xù)進(jìn)步、持續(xù)成長(zhǎng)的動(dòng)力。

南京研究所優(yōu)秀新員工頒獎(jiǎng)(右二為作者)
2022年上半年,隨著業(yè)務(wù)的快速推進(jìn)、開發(fā)投入力量增多,我們的軟件代碼量開始飛速膨脹,從一開始的“精致小巧”變得臃腫起來。更令我們頭疼的是,它似乎慢慢變成了一間“破敗的房子”:代碼分層混亂、業(yè)務(wù)間耦合嚴(yán)重,上新增功能時(shí)必須要非常小心,一不留神就會(huì)“牽一發(fā)而動(dòng)全身”。在版本月度迭代中,常常要先花上半個(gè)月修復(fù)舊bug,再花半個(gè)月“寫出”一堆新bug,這種情況讓我非常抓狂。這些臃腫、甚至有些“丑陋”的代碼,我越看越不順眼。于是,我決心來一次徹底“翻新”:重構(gòu)業(yè)務(wù)模塊代碼!
我將這個(gè)大膽的想法告訴PL(項(xiàng)目負(fù)責(zé)人)后,他震驚后仰:“夠大膽啊!重構(gòu)無疑是有風(fēng)險(xiǎn)的,你要思考好兩個(gè)問題,已有的功能怎么保證正常?新代碼的質(zhì)量怎么保證?”
還記得,軟件教練李釗老師曾為我解答“什么是好代碼”的困惑,這個(gè)答案我一直牢記:“首先,讓人看得不爽的代碼一般都不是好代碼!你看得不爽時(shí),八成寫代碼的人的思路也不通暢。其次,好測(cè)試的代碼一般都是好代碼!好測(cè)試就意味著分層合理、功能內(nèi)聚,而且測(cè)試周全的代碼也很少出bug!”
記起釗哥的指導(dǎo),我瞬間有了方向。首先,我把我所負(fù)責(zé)的業(yè)務(wù)模塊內(nèi)所有代碼都捋了一遍,一邊理解一邊畫出業(yè)務(wù)流程圖,將讓我感到“不爽”的代碼全記錄下來。接下來,我開始梳理哪些流程重復(fù)、哪些分層不合理,哪些地方可以補(bǔ)充測(cè)試用例……最后,我將這份“重構(gòu)”思路整理成文檔,分享到組內(nèi),讓大家一起幫忙審核優(yōu)化。
反復(fù)打磨之后,我開始正式著手重構(gòu)。這次,我計(jì)劃采用TDD(測(cè)試驅(qū)動(dòng)開發(fā))模式編寫代碼。我著重考慮了業(yè)務(wù)的使用場(chǎng)景,依此編寫測(cè)試用例,在測(cè)試用例跑通后再重寫內(nèi)部邏輯?;艘粋€(gè)多月的時(shí)間,我成功將數(shù)據(jù)采集、指令執(zhí)行兩大功能的架構(gòu)底座抽取了出來,重新幫“房子”打好了可靠的“新地基”。代碼寫完后,我還拉著軟件教練一起反復(fù)優(yōu)化,針對(duì)重構(gòu)的代碼逐字斟句酌地反復(fù)調(diào)整……
重構(gòu)代碼交付后,新問題引入為零,測(cè)試覆蓋率由原來的不足20%提升到80%,軟件性能也有了進(jìn)一步的提高,我們還獲得了總架構(gòu)師的點(diǎn)贊。
有了這個(gè)“地基”,我們?cè)谕卣剐聵I(yè)務(wù)時(shí)的確輕松了不少。截至目前,這個(gè)“地基”已經(jīng)支撐20多項(xiàng)業(yè)務(wù)平穩(wěn)且快速發(fā)展,它還讓我榮獲2022年ICT產(chǎn)品與解決方案“杰出工程師”的榮譽(yù)。在這次的重構(gòu)中,我也將源自《代碼整潔之道》、公司倡導(dǎo)的clean code方法論付諸實(shí)踐,學(xué)到了很多東西,未來也會(huì)身體力行地持續(xù)追求好代碼、輸出好代碼。

ICT產(chǎn)品與解決方案“杰出工程師”
入職兩年多,懷著對(duì)軟件的熱愛,懷著對(duì)“工程師”這一角色的強(qiáng)烈認(rèn)可,我從一個(gè)“學(xué)院派”的軟件小白慢慢成長(zhǎng)為一名“杰出工程師”,這個(gè)過程中有壓力、有曲折、有付出,更有收獲。正如《軟件整潔之道》的作者Bob大叔所說:“做軟件就像‘畫畫’,編程的本質(zhì)是一門工藝?!蔽蚁M夷芤恢碑?dāng)好一名工匠,用手中的鍵盤一絲不茍地雕刻手中的代碼。
我相信,我會(huì)心懷熱愛,用代碼勾勒出擁有無限可能的未來!

文章來源:心聲社區(qū)
選擇羅蘭格,選擇專業(yè)
關(guān)注公眾號(hào)
查看更多分享內(nèi)容
