“照”出代碼的美

      網友投稿 741 2025-04-01

      “照”出代碼的美

      口述/吳亞偉 整理/李曉婷

      加入終端,緣來如此美妙

      2005年的一個夜晚,老爸因為工作需要買回了家里第一臺電腦。初中生的我,第一次望著顯示屏上的windows大草原,體驗著鼠標在系統頁面自由跳轉的快感,被這個“價值不菲”的產品勾起了興趣。這之后,我常常采用各種“游戲隱藏秘笈”跟老爸斗智斗勇,以此獲得更多與電腦的“約會”時間。

      步入高中,我的興趣再次延伸,偶然間學習到通過U盤boot文件自啟動批處理,反編譯破解了網管軟件,甚至成了黑客論壇版主。這一切引爆了我成為一名軟件工程師的好奇心,于是高考報志愿時我毫不猶豫選擇了計算機專業。

      大學期間,正值Android崛起,我也隨之開啟了Android的探索之路。新奇于第一次在自己手機里安裝了自己的應用,學著獨立開發了一個游戲輔助工具,并添加廣告盈利,親身體驗了一次移動互聯網紅利,還被導師推薦參加了一些和學校合作的有關Android的創新項目……

      用編碼改變世界,成了我最想實現的夢。

      2015年7月,22歲的我順利畢業,如愿加入正在智能手機領域開疆辟土的華為終端,期待再續Coding之緣,做自己喜歡的事,在技術領域探索更多的美妙。

      萌新預研,提前熟悉相機基礎框架

      入職軟件基礎ROM部兩周時,PL安排我去做預研(預備研發)工作,我成為預研團隊唯一的新員工。PL鼓勵我:“往上跳一跳,能‘夠’到就大膽上!”這句話讓我受用至今。

      那時候,團隊正在做下一代相機預研項目。新的相機應用要從功能較少的一代接口切換到能力和拓展性更強的二代接口,并最終落地到華為旗艦機的雙攝產品中。這涉及40萬行代碼量和數百個功能的重新開發,而預研要做的是搭起新相機應用的基礎插件化框架,將內部各個功能解耦成多個相互獨立的插件,彼此能自由組合,想要哪個模式,把文件加進來就行,供后續功能業務的快速拓展。

      這對萌新的我來說,無疑是一個挑戰,當時插件化在業內還沒有太成熟的方案,終端內部也沒有做過。但我也知道,這更是一個機遇,職場起步就能接觸和學習比較新的技術,還有什么比這更美好的事呢?

      別看我現在說得好像很容易,當時特別艱難。我在大學期間的學習偏技術原理,原來做開發是用的“野路子”,寫個幾千行的代碼做個小項目還湊合,而現在參與的是需要整個團隊維護、數十萬代碼量級的大工程,預研更復雜的是,要搞清楚基礎框架,“野路子”一下子暴露出短板,寫出來的代碼有各種毛病,比如只考慮功能的實現,從未考慮代碼要分層分模塊,沒考慮代碼的可讀性。我不得不逼著自己從零開始理解新架構。

      幸運的是,我抓住了當時的架構設計師陳國棟的“援手”。國棟哥當時在華為已十年,是相機的模塊設計師,在相機領域造詣頗深。他給我推薦Java書籍,講解新框架的設計思想,再手把手教我設計接口草稿,職場新人喝著前輩的這杯“咖啡”吸收宇宙的能量。

      “照”出代碼的美

      前輩的思考方式和工作習慣也深深影響了我,他會從全局考慮設計是否合理,是否適合后續業務演進,接口設計是否穩定,后續會不會頻繁修改。他還有一個習慣,和別人溝通時,一邊溝通一邊寫下設計好的接口代碼,等溝通完,設計草稿已經出來了?!俺送瓿扇蝿?,更重要的是要想如何高效完成。”他常常對我這樣說。

      從前輩的身上,我學到了太多太多。我知道了什么是代碼的好壞味道,代碼要講究可讀性、可拓展性、可維護性,我知道了代碼的設計原則是為了更快更好地業務交付,我知道了怎么寫代碼,相機業務是什么,更學習了什么是插件化的技術和解耦……就這樣一邊工作一邊學習,做得多,學得也多,不僅幫助我提前熟悉了新架構,也為后面獨立承擔基礎模塊開發打好了基礎。

      毫不謙虛地說,我自此建立了一種在熟悉的領域不管多難都能搞定的自信。也正是這種自信,支撐我后來不管碰到什么難題,都會選擇“跳一跳”,萬一“夠”到了呢!

      落地雙攝,我“夠”到了

      完成新相機基礎插件化框架預研后,為趕上3個月后的旗艦機發布,預研組十余人展開了與時間賽跑的三個月封閉開發。

      因為對基礎框架非常熟悉,主管將相機應用的基礎流程管理,這一最基礎也最容易出現問題的部分交給了還是新員工的我,其他人負責人像、夜景、大光圈等各個模式的開發?;A流程管理涉及基礎的相機啟動模塊,3A算法交互模塊、插件管理模塊、基礎拍攝流程等,用作各個模式的實現基礎。那時候,我每天都要面對任務板上幾十個密密麻麻的問題單和需求,有的能復現還好,有的是小概率偶現,還有一些是歷史遺留問題,問題的繁雜常常讓我措手不及。

      好在“敲代碼”這件事讓人受益又讓人快樂。我在代碼的海洋里奮力探索,從團隊空間到公司論壇,再到外部開源社區、搜索引擎,想盡辦法不斷汲取知識,找到解題思路,把一個個問題作為練手的工具,每晚到深夜仍然樂此不疲。當時相機的啟動涉及二代接口和第三方應用,能參考的資料非常少,我查閱各種文檔、手冊和網上的問答,幾乎搜遍全網終于在公司Andriod源碼里找到了參考工程,有全量幾十萬行的代碼。我從中搜索與實現功能有關的代碼,仔細分析研讀,找到了解題的鑰匙,并從此掌握了一套知識搜索和學習技巧,獨立解決問題更游刃有余,問題單的閉環速度也越來越快,從一開始一天一兩個到后來平均五六個,甚至在組內有了“解單高手”的稱號,算是漸漸站穩了腳跟。

      忙碌的日子總是過得飛快,搭載了全組人心血的全新相機應用火熱出爐,我們成功按期交付版本,落地P9系列雙攝產品中。

      現在回想起來,當時的艱難困苦都煙消云散,留下的只有滿滿的收獲與感激。每當遇到艱難的階段,我就會想起這段經歷,對自己說:不怕跳一跳,就怕不敢跳;每一次起跳,都是向下一次發起沖擊。

      優化十來天,相機啟動性能達業界第一

      2018年,離EMUI9.0版本拉出商用分支只有十幾天,我們突然接到一個新的優化訴求——Connect老化性能評測,相機啟動性能要從1.2秒優化至0.6秒。

      這個突如其來的極端要求把我搞懵了,我非常排斥,心想怎么可能?往常這種需求要投入兩三人用一個月的時間實現,是不是流程出了問題?一般一個指標提升10%已經是非常大的變化了,這次要提升100%,幅度這么大,合理嗎?業界其他競品當時最快就是0.6幾秒,我們在十幾天內能做到超越嗎?

      盡管帶著諸多疑問,我還是一邊和測試部確認需求,一邊著手分析歷史代碼。三天時間,通過排查發現,原來是歷史代碼隨意增加功能搗的鬼。我開始對代碼大膽“開刀”,對“壞味道”的歷史代碼逐一優化,并且調整相機全局資源加載流程的優先級,想盡辦法減少每一毫秒的開銷,一下子優化到了0.9秒,但是離最終目標還有不小的差距。

      之后,考慮多個線程相互等待問題,我把一些線程的串行改為并行,把首界面不會出現的東西晚一點加載,相機啟動性能優化到0.7秒。我感覺自己已經絞盡腦汁,可離要求的還有0.1秒!

      還能再優化嗎?我想來想去,只能采用比較極端的辦法了。相機啟動涉及幾十個類幾百個變量的初始化,我會去摳每個變量的初始化時間消耗,有些不需要在相機啟動時出現在界面的變量,要么挪到后面,要么放到比較靠后的時間段執行,這樣一個一個細摳,終于達到了0.6秒。

      最終,我們的相機啟動性能實現了Connect老化海外評測業界第一的目標。

      完成任務后,我對代碼的理解更深了一層。隨意添加功能導致性能惡化,這些就是我們開發人員自己挖的坑,而指標優化,不過是開發人員必要的自我填坑罷了。有的人會及時填坑,目的是解決短期矛盾;而更優者則是前期“不留坑”,和壞代碼說“NO”,目的是解決長遠問題。

      2019年,做相機1+N 組件化方案時,在完成需求規定特性的基礎上,我依然思考著如何避免以前的問題重犯。組件化后會帶來加載的高負載,我想了一個辦法,按需延遲加載各個拍攝模式組件,減少初始內存消耗20M,整體內存占用下降10%,高負載下性能優化15%以上。

      有人說,你走過的路每一步都算數。其實你每改一次壞代碼,積累的好代碼就越多;你每一次寫代碼“不留坑”,持續用好代碼要求自己,就是在構建好代碼的萬里長城。

      主動重構界面,效率提升60%

      相機作為新手機發布會賣點的“??汀保缑嬖O計一直以來受到用戶的廣泛關注。

      在我來公司的這幾年,相機界面從4.1版本升級到10.0版本,存在多次大的用戶界面調整。2017年,我和同事十余人日夜奮戰3個月,修改了十萬行代碼,成功交付新版相機界面。但改完之后回過頭看,我們發現人力投入還是比較大,我心里不斷冒出另一個想法:能不能讓相機應用的界面調整變得更簡單?能不能做到在不影響功能邏輯的前提下調整界面?

      當時相機應用的界面和功能耦合,界面就是用戶看到的圖標、按鈕,功能是用戶點擊了圖標或按鈕后的響應。調整界面就會影響到功能,修改起來復雜,容易引入問題。

      痛定思痛,我決定選擇重構,也減少以后界面調整的工作量。把這個想法和團隊一說,大家也非常支持。

      然而,面對歷史的功能接口設計易與界面耦合的問題,新接口不僅要解決歷史痛點,又必須適配相機所有的功能特性,這意味著很多需求都要推倒重來。而要推倒重來的前提,是對原來的功能業務代碼了解透徹,并有很好的重構思維。

      比如,相機的美膚功能,重構時存在一代簡單美膚、二代加了虛化效果,后來又加了光滑、美白、瘦臉等美膚能力,每一個功能對應不同的歷史產品,由不同的人開發的不同版本,規格不一,重構后的代碼必須能保證以往的功能規格都能使用,且不會遺漏。為了了解原來的代碼,我找到當時做這些功能需求的人,一個一個去交流,但有些功能已經實現很久了,開發的人不一定記得自己寫過的代碼,也只能靠自己一行一行看代碼,自己去理解掌握。

      說實話,這期間,我曾經有過放棄的念頭。團隊并沒有給我定重構的目標,能實現多少是自己擬定的,我曾考慮放棄比較復雜的模塊,但一想到下一次交付還會產生問題,還不如一次就把事情搞定,只得硬著頭皮咬牙堅持下來。

      幸運的是,重構之后界面服務化管理模塊成功上庫,界面和功能在EMUI9.0版本中解耦成功,開發變得更簡單,更穩定。緊接著在2019年最新的EMUI10.0相機界面中,我基于重構的代碼,用了2個月便快速完成界面替換,效率提升60%。

      這讓我把余下的精力放到與界面設計師一起持續打磨極致體驗上。原先相機在華為手機、平板、折疊屏的布局上并不統一,帶來了界面適配和維護較大的工作量,我們一起優化了設備的差異性,進行了統一,在面向用戶的EMUI10.0設計風格調研中,相機的整體滿意度再上一個臺階,讓我再次嘗到重構的美妙。

      不經意間,我養成了每次修改問題單主動識別壞代碼、重構問題頻發區的習慣。2019年,我重構的代碼也驚喜獲得了軟件部首屆鴻蒙金碼獎。

      重構應該是自我驅動的,每一位工程師都應該嘗試著獨立看護某些模塊,發現代碼壞味道,再大膽優化。在編程界,流傳著一句話——10萬行代碼鑄就編程高手,它也激勵著我主動重構,寫出更多好代碼。這種量變到質變的過程,本身就是代碼修煉之道。

      年輕,就要一碼當先

      “殺”猿祭天、畢業2年擁有4年工作經驗、全員格子衫……每當我看到網友們對程序員調侃時,也會會心一笑。慢慢地,我也會注意到這些標簽背后增加了新內容,比如小學開通python課程,比如非計算機專業的大學生跨界編碼,比如很多名人紛紛學習編程……這無一不在印證喬布斯“人人都應該學習編程”的話嗎?而作為年輕一代的程序員,我們更要一碼當先。

      不管程序員的標簽是什么,我們都需要用代碼為自己代言。轉眼進入華為已經4年有余,我很幸運,伴隨著終端的每一步發展和崛起,我也從職場菜鳥成為能獨當一面的模塊設計師。工作之余,我很喜歡去視頻網站看手機拆解視頻、前沿科技評測視頻,了解主流廠商攝像頭規格及安裝方式,了解未來趨勢。我喜歡我正在做的事,我也慶幸我能一直做自己喜歡的事。未來面臨全場景的應用設計的新挑戰,這將又是新的學習之旅,但我始終相信,只要拼搏向前,再大的困難總會結束,我們終有所獲。

      作為26歲編碼人,我常常會幻想這樣一個場景:

      夕陽西下,年邁古稀,家里的小輩問我最會什么,我能自豪地說:“我最會敲代碼!“

      本文為《華為人》版權所有,未經允許不得轉載。如需轉載請聯系編輯部hwrb@huawei.com

      本文來自“華為人”期刊

      華為人期刊 程序員 軟件開發

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS表格技巧–柱形圖怎么做出占比的效果(wps做百分比柱狀圖)
      下一篇:如何在Excel中創建進度條形圖?
      相關文章
      国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲精品无码成人| 亚洲自偷自偷偷色无码中文| 国产精品亚洲片在线花蝴蝶| 亚洲国产成人AV在线播放| 亚洲国产成a人v在线观看| 亚洲精品美女在线观看播放| 亚洲美女视频网址| 久久亚洲日韩看片无码| 亚洲黄色高清视频| 亚洲精品动漫在线| 亚洲婷婷天堂在线综合| 亚洲人成电影网站| 亚洲制服丝袜第一页| 中文日韩亚洲欧美制服| 亚洲综合激情五月丁香六月| 亚洲日本一线产区和二线产区对比| 亚洲不卡影院午夜在线观看| 中文无码亚洲精品字幕| 亚洲av无码一区二区三区天堂| 亚洲成av人在线观看网站 | 亚洲高清中文字幕免费| 亚洲综合av一区二区三区| 亚洲欧洲AV无码专区| 色欲aⅴ亚洲情无码AV蜜桃| 一级毛片直播亚洲| 亚洲国产精品成人| 中文字幕亚洲乱码熟女一区二区| 亚洲夜夜欢A∨一区二区三区| 亚洲国产精品SSS在线观看AV| 国产V亚洲V天堂无码| 亚洲天堂久久精品| 亚洲人和日本人jizz| 亚洲中文字幕无码久久| 在线播放亚洲精品| 在线观看亚洲成人| 亚洲爱情岛论坛永久| 亚洲午夜久久久久久尤物| 亚洲熟女综合一区二区三区 | 图图资源网亚洲综合网站| 亚洲欧洲久久精品|