【華為人】——做橫掃問題的“掃地僧”
讀博的時候,我和華為曾經有過一段親密接觸。當時實驗室和華為有一個關于無線網絡環境下視頻QoE度量的合作項目。我作為項目負責人,從視頻編碼、信道建模、傳輸協議等各個環節進行建模、算法、仿真、數據分析,得到了一個非常復雜的模型,自我感覺非常完善,卻被華為研發人員無情地指出模型“太理想化”。在隨后數次的交流中,華為提出了很多實際工程化中應用的約束和要求,都是我完全沒想到的。

這次技術合作影響了我此后的博士學習生涯。我開始把大部分精力都花在算法在實際工程應用中如何解決問題上。算下來,至少寫了超過15萬行的代碼。我越來越覺得,解決工程問題并不是只靠幾個公式、模型和算法能完成的,從技術到實際解決工程問題的“最后一公里”更為關鍵,需要大量的工程經驗積累。
從不繞過稀奇古怪的難題
2010年,我加入了華為,從事無線基站的軟件平臺的工程開發。這個平臺支撐了全球超過500萬基站的發貨,支持十幾種不同的CPU、上百種單板硬件、多版本編譯器、多樣的操作系統,龐大的代碼量和復雜的業務邏輯,是復雜工程環境下的大規模應用項目,也是積累經驗的絕佳機會。
我躊躇滿志地準備大干一場,卻沒料到,遇上的全是稀奇古怪的難題。
2013年,為了讓代碼更具有靈活性和擴展性,我用了“反應式框架”重構了代碼,也用了一些C++編程中的小技巧。這種技術方案我很早在學校就用過,而且也是很多開源軟件中的常用做法。
我信心滿滿,認為代碼實現得很漂亮,自然不會有什么問題。剛開始驗證也很順利,但是測試人員在一款比較老的芯片上進行驗證時,卻發生了嚴重的錯誤——程序崩潰了。我一下懵了,把重構的那部分代碼看了又看,也對比一些開源代碼中類似的寫法,甚至還把C++標準文檔的對應部分翻閱了一下,仍然非常確信這是正確的寫法,實在百思不得其解。交付時間很緊迫,我只能用另外的實現方法繞過了這個問題,完成了交付。但這個詭異的問題卻始終縈繞在我的腦海中:如果找不到根因,以后還會遇到。
我下決心把 “蟲”捉到。我利用中午休息的時間,一點點去啃優化后的匯編代碼,但有幾行始終看不明白。請教了在這方面很有經驗的老同事,也沒有看到什么問題。連續兩個中午,我翻來覆去看了好幾遍還是沒有進展,連吃飯都沒胃口了。晚上回到家,我又仔細翻閱C++標準,一行行讀下來,發現備注中有些線索指向C++ ABI規范。總算有點眉目了,第二天我找出相關規范,對照生成的匯編代碼仔細對比,確實發現了配套編譯器在此處的Bug,并通過咨詢CPU提供商的工程師,證實了這個問題。
“蟲”終于捉到了!我覺得入口的盒飯都異常美味。此后,我們也把這種寫法加入到我們開發的靜態代碼檢查工具中,用于提前發現問題。
在之后的幾年開發過程中,我遇到了十多次和OS、運行時庫、鏈接器、編譯器相關的問題。我從來沒有繞過這些問題,而是堅持把問題代碼的根本原因找到,這讓我積累了多樣化的經驗、更透徹的掌握計算機底層基礎知識,同時讓我對編碼可靠性、移植性有了更深入的思考。程序員就是在不停解決問題的過程中成長,再通過沉淀和思考,成為技術專家。
欠下的“債”都要還回去
寫代碼是不是就是if-else的業務邏輯代碼堆砌?我不這么認為。寫出高效率、可擴展性強、高質量、簡潔的代碼不是一件容易的事。首先,作為程序員要有追求,不能僅僅以實現基本可用的功能為目標,“能打補丁用就行”等只顧眼前的做法會帶來越來越重的技術“債務”,以致整個業務領域在面向未來的時候寸步難行。其次,要多學習和借鑒優秀的代碼架構,從技術上提高自己,并把優秀的思想用在平時的開發中。
最難忘的一次“還債”經歷是關于軟件平臺中的CPRI共享(CPRI-Sharing)特性的,這是基站軟件平臺支撐無線SingleRAN多制式資源共享的重要特性,復雜的算法支撐多達幾百種場景組合。
當時代碼已經復雜到一個函數3000多行,總共2萬多行核心代碼,每增加場景都可能導致以前的功能受損,幾乎沒人敢改,也不愿意從根本上解決這些“債務”。
剛開始我對代碼細節不太了解,也是一樣提心吊膽地往里面塞代碼。每加一部分代碼,就要把業務邏輯反反復復推演一遍,看看對于老的功能、其他的場景是否有影響。都說代碼是開發人員的臉面,我想我的代碼夾在這樣的“爛代碼”中,以后拿出去也不好意思見人啊!我決定把當前混亂的實現作一個高層次的抽象,重構這部分代碼,實現“算法和場景隔離”。
經過一個版本的痛苦開發后,我對細節已經比較了解了,腦海里也有了完整的功能地圖。在這個基礎上,我想到曾經讀過的一個跨平臺多媒體播放器VLC(VideoLAN Client)的源代碼。它完全基于插件化的思想,用一個精巧的插件管理和插件的“能力評分”機制,把視頻、音頻編解碼器等作為插件靈活拼裝。這就有點像搭樂高,可以根據使用需求進行組合,也可以隨時刪減模塊,具備高度的靈活性。
我借鑒了這個思路重構了代碼。每個算法對象都可以作為獨立的插件,在運行時根據硬件能力和組網場景進行選擇。重構后的代碼非常容易理解,也具備很強的擴展性,最重要的是擴展新功能支持新場景時,對老功能幾乎沒有影響。之后的幾年里,這個框架支撐了幾次大的新需求,很少出問題。我想這應該算是好的代碼實現帶來的收益吧!
其實,開發人員在經過幾年的編碼后,常常會陷入到一定的瓶頸。這個時候需要打開邊界,多看一些優秀的開源代碼,尤其要精讀一份高質量代碼,用心體會其中的架構設計思想,這會幫助我們提升編碼能力,形成自己的思想。
當“扁鵲二哥”需要勇氣
2011~2012年,無線大規模切換到Linux操作系統,以前的代碼編寫錯誤導致的多線程死鎖、數據競爭的問題在實驗室測試時頻繁出現。一旦上網出現問題,對基站業務來說都是致命的。
當時,無線不斷強調員工要成為“扁鵲二哥”,提前發現問題隱患。既然問題都已經有苗頭了,當然不能坐視不管了。我所在的軟件設計團隊決定通過對代碼的靜態分析來檢測這類問題。
經過一段時間調研,我們找到一些簡單的方案,但檢查的準確度很低,能用的場景的非常有限。我直觀地覺得,要能夠解決大部分場景的檢查,必須要基于C/C++的編譯器的深層次信息。
我拿出讀博期間的方式,查閱IEEE/ACM論文、看Clang的社區論壇等所有可能獲得信息的地方。再加上團隊的共同努力,這些問題逐步獲得了解決。最終,開發完成的工具(“Soter”)在軟件平臺累積發現超過50多處多線程死鎖、數據競爭的問題。
隨后,我們繼續增強該工具從TOP低級編碼、安全編碼、編程規范等多方面功能,在部門的編碼質量看護上發揮重要的作用。在內源平臺上開源后,也被很多部門和其他產品線部門應用。
回想整個過程,為了從根本上提升軟件工程能力,徹底解決問題,我們才選擇了一條艱難的道路。但這也讓我們認識到,投資基礎工程能力建設對整個開發團隊的重要性。
理解技術的本質,才能跨界創新
在軟件云化的趨勢下,我們看到了云化軟件在資源共享、彈性伸縮方面的優勢,但在傳統的基站硬件上,這些軟件技術、框架都沒法直接應用。只有理解這些技術的本質,使用“云化軟件的思維”重構部分架構和實現才有可能。
去年,我和清華大學的老師一起開展合作項目,用的是老師提出的ASPCA算法進行日志降維分析。這個算法在常用的標準數據集上測試效果非常好,但是真正用到當前軟件的日志上,效果卻不好。一方面是我們的日志內容不規范,另外這個算法真正發揮作用需要大量數據前處理。直到我們通過日志模板提取、日志分區、分模塊、按時間軸緯度分析等數據處理方法后,算法才真正發揮作用。
我最大的體會是,想到這些Idea也許沒那么困難,甚至做出技術原型的復雜度也沒那么大,但是真正能用在一個商用化的、大規模的系統中,困難程度遠超想象。這個時候,我們會發現,這些技術和方法,離真正能解決工程實際問題這“最后一公里”還有很大距離,而這正是我們需要著力的方向。
我想我會繼續堅持對軟件的熱愛,打開邊界、腳踏實地,在看似枯燥的工程開發中不斷解決問題,發掘技術的金礦。
【問答時間】
問:你成長為“軟件王”,有啥秘籍?
答:阿里巴巴在的技術合作人“多隆”,是加入公司16年來一直在編碼的“掃地僧”。他曾經說過,技術成長的秘訣就在不停地解決各種工程問題,從業務代碼看到框架代碼、庫、libc代碼、操作系統內和代碼等。我非常認同,程序員就是在不停解決問題的過程中成長。
問:開發工作真的有技術含量嗎?
答:如果不打開邊界,不去了解業界發展,只局限在當前的工作領域涉及的技術,就會覺得工作沒有技術含量。如果只是從外界了解一些技術概念、想法,而不真正理解技術本質,并解決技術落地的“最后一公里”問題,那也不可能真正提升能力。
問:你通過什么方式解壓?
答:循環聽一首非常振奮人心的音樂,或者去看電影來解壓。最喜歡的一首歌:It’s My Life,最喜歡的電影:《星際穿越》。
問:你的愛好是什么?
答:我喜歡玩一些卡牌類的游戲。大學的時候,整整一年時間,整個寢室同學把所有的錢都拿來到國外買“萬智牌”,沒錢就吃泡面和餅干,哈哈。
本文為《華為人》版權所有,未經允許不得轉載。如需轉載請聯系編輯部hwrb@huawei.com
華為人期刊
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。