我在華為寫了13年程式碼的一些感悟
本文摘自“心聲社群” 華為人,感謝作者辛苦分享。
一天晚上,我和老婆聊天,說部門要我寫個“大咖談軟體”的文章,老婆斜了我一眼,淡淡地說:“Linus大神21歲就寫出了Linux核心的雛形,締造了一個自由主義的開源世界;張小龍28歲寫出了foxmail,在2000年就賣出了1200萬的價格。大咖,認識您這麼久了,還不太瞭解您有什麼傑出的成就?”我訕訕地嚥了口水:“好吧,我重新組織下語言,我需要寫個談軟體的文章……”
回首過去這半年,軟體總工、軟體專家的任命,還有新年伊始任總《全面提升軟體工程能力,打造可信的高質量產品》的發文,都讓我們這些寫了十多年程式碼的軟體工程師激動不已。我2006年進入公司,幾乎參與了華為3G控制器產品的完整生命週期,見證了華為3G從起步、上升、靈魂深處的改進、巔峰、回落的波瀾壯闊歷程,並在35歲“高齡”有幸加入到5G開發部的大家庭。
十幾年來,我一直堅持在編碼崗位,經歷了普通開發人員、TL、MDE、MDEL、SDM(雲化團隊)、Committer、軟體專家等各種崗位。然而我卻深知,不算大牛的我,從事編碼這個“高危”職業十幾年而沒有被拿去“祭天”,依靠的是一個程式設計師的自我修養——紮實的基礎軟體能力、如履薄冰的工作態度、對技術孜孜不倦的追求。
▲幽默的“祭天”說明
好程式碼長什麼模樣?
記得幾年前部門第一次評選優秀程式碼,我成為“金碼獎”獲得者之一。是因為程式碼很炫嗎?並不是。我參與評選的程式碼,遵循著簡單的原則:簡潔、邏輯清晰、函式職責單一、合理的資料結構設計。並沒有使用高深的編碼技巧,也沒有應用某某設計模式。正如公司最新的C/C++語言程式設計規範,也是將編寫簡潔的程式放在首位。簡潔、邏輯清晰的程式碼,易於閱讀和維護,這段程式碼後面也因需求變化而被修改,但卻從來沒有引入過網上問題。
當然,簡單不代表沒有思考,恰恰相反,更需要我們在寫程式碼之前謀定而後動、三思而後行。有一次專案組安排我做效能最佳化,透過反覆分析熱點函式、反覆測試比對不同話務模型下的效能差異,前前後後花了3個星期的時間,我找到了引起效能惡化的最關鍵因素。最終我決定採用修改備份機制、減小備份資料的最佳化措施。這些方案程式碼改動都很小、很簡單,但實際最佳化效果卻很好,滿足了未來幾年業務發展的需求。
再來看另一個例子,某局點升級新版本後出現CPU負載上升的問題。經過近兩週的攻關,我最終定位是新版本在業務處理流程中新增了直接讀取DB核心的操作。直接讀取DB核心,程式碼處理簡單,也能正常實現業務功能,但是效能卻非常差。如果開發過程中能多想一步,採用快取的方案,效能會有天壤之別,也是更好的程式碼。
人們常說唯一不變的就是變化,客戶需求一直在變化,我們的程式碼也會被動或者主動地在變化。設計出可擴充套件、自動適應客戶需求變化的軟體架構,是軟體工程師永恆的追求。這說說容易,做起來卻很難。需要我們不停積累業務知識,擴充套件知識面,勤于思考,識別技術未來演進趨勢。我們無法從一開始就做一個無所不能的架構,來包含未來的千變萬化,即使能,交付節奏也不一定允許。滿足當前及未來一定時間內業務需要的設計,或許就是最合適的。
練好紮實的基本功
能寫出好程式碼,更要能持續地寫出好程式碼,需要我們深刻理解技術原理和業務邏輯。前提是具備紮實的程式設計基礎,即基礎軟體能力,如基礎的資料結構和演算法、編譯原理等。
去年底,我跟部門幾個軟體高手一起,去外部參加了一次網際網路架構大會。AI、區塊鏈、物聯網、雲、中介軟體等時尚、熱點、風口相關的議題非常多。但是我沒想到,最火爆的卻是一些基礎軟體設計、架構設計和演進之類的專題。就像武俠小說寫的一樣,練好基本功、練好內功,後續無論什麼精妙招式,都會信手拈來。
另外,一些程式設計習慣,如果堅持下去,對於程式設計修養提升也是非常有用的。比如快捷鍵的使用、有效的程式碼註釋、命名規則、程式碼風格等。每次寫程式碼除了追求好程式碼之外,我都會時刻去思考軟體上的最佳化,能否能使用更少的記憶體,能否有更好的效能。重視資料結構中的每一個欄位,重視每一處小的程式碼最佳化,都有可能給我們帶來意想不到的收穫。比如去年做效能最佳化,我們僅僅是將流程中的一處動態記憶體申請修改為靜態記憶體池,卻意外獲得了30 CAPS(每秒呼叫次數)的效能提升。
▲團隊合影
一行程式碼引發的慘案
有人問,道理我都懂,為什麼卻依然寫不出好程式碼?
很多開發人員,因為個人習慣、趕工期、外部要求不高等多種原因,在程式設計時特別隨意,直接Copy-Paste。我覺得程式設計師應當像追求生活品質一樣,養成不將就的程式設計習慣、嚴謹的程式設計態度。
對於程式碼上庫,我一直都是戰戰兢兢,如履薄冰。上庫前我會反覆看自己修改的程式碼,看修改程式碼的上下文,並進行修改前後程式碼比對。程式碼上庫後再看幾遍,確保都已按預期合入。進入公司這麼多年,自己從來沒有多合、漏合、錯合過任何一行程式碼。
大家可能會覺得我這是小題大做,但事實上,這都是歷史上曾經發生過的慘痛教訓。我們在某國升級新版本後發現使用者接入成功率惡化,最後定位是由於一行程式碼被誤刪除導致的。事後回溯,開發人員自己都不記得這一行程式碼為什麼會被刪除。還有一次,一行程式碼被誤刪除,導致一個關鍵KPI指標:軟切換統計次數有變更。部門把這兩起事件總結為“一行程式碼引發的慘案”,無論是對產品品牌、客戶印象、還是對於個人,都造成了惡劣的影響。
事後大家都在思考,我們有結對程式設計、程式碼檢視、開發者自測試等非常完善的開發流程,還有MDE(模組設計師)檢視作為程式碼上庫前的“守門員”,為什麼還會發生這麼低階的錯誤?是流程沒執行到位,還是MDE疏忽、沒把好關?
在IPD 2.0變革中,公司借鑑開源組織的Committer運作,來加強我們的Committer機制和文化。5G開發部也選拔、任命了一批Committer,我有幸成為其中之一。剛開始履行Committer職責時,我有點疑惑:這不就是給MDE角色披上了新的外衣,把MDE原先“私下”做的事情,透過Committer統計資料給呈現出來嘛?
不過,經過幾個月的摸索、實踐後,我漸漸地明白,Committer機制應該是一種文化上的變革,牽引大家提升自己的軟體能力。Committer的職責很多,作為程式碼提交前的最後一道關卡,這是在當前人員能力不足階段有效果,但是最終應該被弱化的一項實踐。參與編碼前的軟體設計、持續做好架構看護和技術債務清理,讓大家都有更大的機會寫出更好的程式碼,我認為這是Committer更大的價值。
隨著個人和組織的軟體工程能力提升,自動化測試防護網和變更防護牆建設完善之後,前面提到的“一行程式碼引起的慘案”,是可以避免的。
“變更防護牆”夠不夠可靠?
對於大部分老員工,特別是無線2G/3G/4G等部門的老員工來說,一提到變更控制,都會如臨大敵。版本升級後,KPI變差是絕對不允許的,嚴重時可能面臨版本回退、客戶投訴和上報事故。而KPI變好,除了要向客戶解釋,還有可能面臨商務風險,客戶會覺得之前吃虧了。現實世界對我們就是這麼苛刻,誰讓我們是影響世界的通訊軟體工程師呢,他們這是愛之深、責之切啊!
我們開發一個版本,動輒涉及幾十萬程式碼的新增、修改或重構。要想不引入變更問題,除了做好設計、結對編碼、程式碼檢視和測試之外,我認為最關鍵的就是完善的自動化防護網。在3G時,我帶著兩個同事將IT測試工程從只有幾百個用例擴充到上萬個用例。全方位的場景覆蓋、嚴密的信元有效性檢查、完善的用例失敗判決機制、無死角的資源洩漏檢查等手段,讓變更錯誤無所遁形,給3G留下了一道變更防護牆。
開發過程中補充IT和PC-ST測試用例,不是為了提升程式碼覆蓋率,而是為了自動化防護。而要能達成自動化防護的前提,是每個用例都具備完善的有效性檢查,否則防護網就是形同虛設。幾年前,我跟一個同事開玩笑:“我會故意將某行程式碼改錯,看看你補充的用例是否能檢查出來。”讓我意外的是,在交付緊張的情況下,他仍然多花了半天時間完善用例有效性檢查,並請我故意改錯程式碼來做試驗。當然,最終的結果是,他準備得很充分,我沒能發現問題。多麼有自我追求的一個程式設計師!
保持對於新興技術的好奇心
說起程式設計師的追求,我還想起了2016年參與的一個產品雲化專案,我負責彈性伸縮特性的方案設計。在此之前,我一直在投入嵌入式軟體開發,雖然期間產品也換了好幾代的硬體,經歷了產品與平臺解耦、制式間解耦、軟體與硬體解耦等過程,但是對於服務化、微服務化、雲化等概念,我卻基本處於懵懂的狀態。
不懂怎麼辦,只能是“站在巨人肩膀上,為我所用”。兄弟產品線不是已經做了嗎,那就找他們做同行協助;友商不是有路標和規劃了嗎,那就在他們的有限材料中尋找可借鑑的地方;網際網路的亞馬遜雲、阿里雲不是有非常成熟的方案了嗎,那就下載他們的產品手冊和使用者指南……那段時間感覺自己就像是入了魔一樣,瘋狂地學習分散式軟體相關技術,瘋狂地吸收各方面的能量為我所用,最終給出了一個令自己和專案滿意的設計方案。
這也讓我充分意識到自己之前把眼光侷限於所在產品、系統、子系統的不足。作為一個程式設計師,除了要提升自己的基礎軟體能力,我們也要始終保持對於新興技術的好奇心,孜孜不倦的追求,不斷拓寬自己的視野。而這方面的能力和訴求,在5G時代更是如此。
當前我們華為5G面臨的網路安全問題,雖然有著很大的政治因素,但也從側面反映了5G的戰略意義。超高速率、超大連線數、超高可靠低時延,對我們在軟體處理時延、可靠性、安全、韌性等方面的能力都提出了更高的要求。同時,5G承載的垂直行業應用、介面開放和硬體“白盒化”等趨勢,也必將對我們當前的知識和技術體系,提出更大的挑戰。
公司計劃用五年的時間,全面提升軟體工程能力,對我們是考驗,也是機會。統一程式設計規範、整潔程式碼、整潔優雅的架構,不同的人有不同的追求,需要我們有持之以恆、水滴石穿的決心。五年或者十年後,當我們回首時,會發現自己曾經的付出是值得的。正如,清代著名學者王國維提出的讀書三境界之第三境:“眾裡尋她千百度,驀然回首,那人卻在燈火闌珊處。”
也許我們絕大多數人終其一生也無法成為Linus、張小龍這樣的大神。然而,我們能夠做一個有修養的程式設計師,並參與到改變世界的華為5G產品開發中來,在人類的通訊史中留下自己的優秀程式碼,幸哉。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545820/viewspace-2642618/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【曹工雜談】 2021在鵝廠幹了一年,我的一些感悟
- 感悟我的程式設計之路程式設計
- 感悟篇:如何寫好函式式程式碼函式
- 我在華為OD的275天
- 對不起,我錯了,這程式碼不好寫
- 我在阿里寫程式碼學會的六件事阿里
- 為什麼我寫了路由懶載入但程式碼卻沒有分割?路由
- 我參與 Seata 開源專案的一些感悟
- 一個巧合,我把文件寫進了程式碼裡
- 誰動了我的程式碼!?
- 我在華為做外包的真實經歷!
- 我總結了寫出高質量程式碼的12條建議
- 一些程式碼寫法推薦
- 為了簡寫這行程式碼,我竟使用靜態和動態編譯技術行程編譯
- 寫了 50 萬行 Go 程式碼後,我明白這些道理Go
- 我很久沒寫程式碼了,但我是個好架構師架構
- 為什麼程式設計師喜歡在半夜寫程式碼?程式設計師
- 謝爾蓋布林:谷歌不敢用Transformer,作者全跑路了,現在我每天都在寫程式碼谷歌ORM
- 給喜歡的女孩子寫了一段python程式碼,不用我表白,就成我女朋友了Python
- 關於掘金餓了麼產品分享會的一些感悟
- 畢業前寫了20萬行程式碼,讓我從成為同學眼裡的麵霸!行程
- 我重構了一遍第一份工作寫的程式碼
- 為了收集和整理程式設計的常用單詞,我寫了個背單詞應用程式設計
- 我寫的 Python 程式碼,同事都說好Python
- Rust能讓我寫出好的程式碼 - RedditRust
- 因為我最近忙、所以我寫了它
- [20211111]我看華為監控程式.txt
- 我們在編寫python程式碼時應該注意那幾件事!Python
- 程式碼背後的智慧:20條程式設計感悟程式設計
- 突然沒有力氣寫程式碼了
- 當程式設計師寫不出程式碼了……程式設計師
- 聽說你在為天天寫業務程式碼而煩惱?
- 幾道JS程式碼手寫題以及一些程式碼實現JS
- Java校招入職華為,半年後我跑路了Java
- 我是如何一步一步做介面測試的一些感悟
- 寫java程式碼的一些個人感受和總結Java
- 寫了8年的程式碼,做過的專案都下線了……
- 嘿,我造了個程式碼高亮的外掛