1. 程式人生 > >HiSDP —— 高效的C++軟件開發平臺

HiSDP —— 高效的C++軟件開發平臺

eset padding http 成了 發出 software 服務器環境 維護 參考

目前阿裏集團每天有近1000PB的數據是通過LogAgent采集的,為了讓LogAgent做到資源占用節省和高效采集,背後是基於HiSDP去構建的。

緣由

當決定采用C++編程語言去開發一個軟件時,緊接著所面臨的問題是軟件庫、平臺與框架的選擇。當然,選擇的範圍估計很大程度來自開源軟件。進一步地,無外乎兩種思路:

  • 根據所開發軟件的需要選擇各種合適的開源軟件,然後將這些開源軟件組合到一起去完成軟件開發工作。這種方式所帶來的問題在於,將各個開源軟件拼湊到一起需要耗費一定的精力。此外,可能因為踩各開源軟件中的坑而導致最終軟件產品的穩定期拉得更長,後期的維護成本也更高。

  • 采用市面上成熟的大型開源軟件項目,對之進行裁剪去滿足項目開發的需要。這一方式雖說在裁剪上需要消耗一定的精力(這是一次性的工作內容),但由於大型項目的成熟確保了其所選擇的各個開源子項目的質量得到了充分的驗證而避免我們再踩坑,且其中所使用各開源軟件的代碼能很好地起到示範作用去幫助工程師更快地上手寫出更具質量的代碼。HiSDP就是基於這一思路而產生的!

HiSDP源於Google的Chromium開源軟件,即大家平時經常使用的Chrome瀏覽器的開源版。作者因為曾經有大約3年半的時間是基於Chromium做淘寶瀏覽器和UC瀏覽器電腦版的軟件開發工作,所以對Chromium背後所蘊藏的Google之工程理念和對工程質量的要求有著深刻的認識與體感,

包含但不限於:

  • 重度依賴單元測試。Chromium對單元測試代碼的組織與實踐形成了一套行之有效、很容易上手的工程規範,很好地示範了如何通過gtest/gmock去編寫單元測試代碼,並讓執行單元測試的動作與開發環境做到了無縫整合。
    特別重視程序的性能度量。Google一直力爭讓Chrome瀏覽器在運行速度上與競品保持優勢,為此非常重視性能數據的可視化,tracing功能就是在這樣的背景下產生的(用Chrome瀏覽器導航到chrome://tracing這個網址就可以對瀏覽器打開的網頁進行性能tracing)。

  • 極度關註程序的編譯效率。由於Chromium的代碼量很是龐大,所以這個項目從開始之初就在一直持續地優化整個工程的編譯速度。除了gn+ninja這一編譯工具組合,Chromium的代碼組織與程序格式也為了加速編譯而做了規範並細致地執行到位。

  • 將程序的可查錯性當作良好的編程習慣。整個Chromium的代碼隨處可見DCHECK(與assert相似),以及在關鍵點存在CHECK(會產生dump文件而記錄下發生問題的現場)。

  • 嚴格執行Google C++ Coding Style中所定義的編碼規範。為了幫助新手更好地掌握這一規範,甚至還開發出了cpplint這樣的代碼規範掃描工具(用Python實現的)。

  • 對軟件設計質量的持續極致追求。Chrome瀏覽器大約6周出一個大版本,每個版本都能看到對之前沒有做到位的完善痕跡,有的改進尺度之大足以讓人為之動容。這種工程實踐所帶來的結果是Chromium的整體代碼質量很高且久經考驗。

基於我對Chromium的這些認識,很自然地想到將那些能力與氣質帶到其他項目中,希望能“站在巨人的肩膀上”以“殺雞用牛刀”的思路去開發其他C++軟件。

HiSDP是High-productivity Software Development Platform的簡寫。取這個名的本意是希望他成為C++編程語言的高效軟件開發平臺。然而,將Chromium裁剪成HiSDP並使之適合用於集團服務器環境下的軟件開發還是經歷了一些波折。最大的問題在於,Chromium的開發環境基本上是基於Ubuntu 16.04構建的,存在內核版本比集團環境的更高而導致無法直接正常運行的問題,當然這個問題經過一番折騰後得到了解決。

能力

  • 具備跨Windows、Mac和Linux操作系統的軟件開發能力。HiSDP完全保留了Chomium的base庫,該庫抽象並封裝了file、string、threading、process、message_loop、memory、profiling等諸多內容,能很好地滿足其他軟件開發工作的基礎需要。

  • 具備復雜工程的高效源代碼組織與快速構建能力。通過gn文件(與CMakeLists.txt文件的作用相似)對源文件進行管理;通過ninja(與make類似)調用編譯器完成編譯工作;通過DEPS文件管理工程所依賴的第三方Git倉庫。可以想象,gn文件的語法完全考慮了跨平臺場景下源代碼的組織形式。構建速度將隨著項目規模的增大而表現得愈加明顯。

  • 全面復用與Chromium配套的各種開發工具。Chromium將各種工具都放到了depot_tools 這個獨立的Git倉庫中,其中包含了支撐高效軟件開發工作的各種腳手架工具。

  • 實現了被開發軟件與HiSDP自身的很好解耦。通過引入HiApp的概念,將基於HiSDP開發的軟件的源代碼都放在一個獨立的Git倉庫中,將HiApp與這個倉庫掛鉤而實現了與HiSDP的代碼組合。下面的命令示例了如何獲取depot_tools、HiSDP和LogAgent的代碼,希望有助於幫助理解HiApp的概念。

$ git clone http://gitlab.alibaba-inc.com/middleware-expert/depot_tools.git depot_tools
$ vim ~/.barshrc    // 追加下面內容
  export PATH="/path/to/depot_tools/:$PATH"
$ source ~/.barshrc
$ mkdir LogAgent && cd LogAgent
$ fetch hisdp [email protected]:LogAgent/[email protected]

簡單說來,使用depot_tools和HiSDP的開發體驗與Chromium是完全一樣的。

價值

  • 解決“技術可以,開發不行”現象。當個體對軟件工程沒有足夠的認識,並不清楚除了編程語言和算法外,還有其他關鍵因素影響著開發效率和最終的軟件質量,那時就會表現出“技術可以,開發不行”,即各種技術知識都知道,但卻做不到有質效地開展軟件開發工作。HiSDP因為繼承了Chromium十多年所沈澱的工程經驗,所以是一個很好的學習場所,即便一開始沒有意識到那麽做背後所蘊含的理念,只要模仿就可能最終貫通領悟。

  • 助力跨平臺軟件開發。由於天然地支持開發可運行於Windows、Mac和Linux上的軟件,HiApp因為有這樣的“底座”而更容易實現跨平臺開發。

  • 提高軟件開發效率。這一點是顯而易見的,圍繞工程各個方面的腳手架工作在HiSDP上都已具備,只需在HiApp的開發中專註於所需解決的業務問題。

  • 通過代碼共享解決了版本依賴問題。與大多C++程序員所希望的所不同的是,HiSDP不是以庫的形式呈現的,而是完全以源碼形式。借助HiApp這一概念,使得被開發軟件的源代碼也成為了HiSDP的一部分。這一形式省去了采用庫形式發布所帶來的版本升級與同步問題,當HiSDP中修復了缺陷時,由HiApp的開發者通過pull最新的代碼做到修復。如果讀者細想這一點,會對其價值有更深的認識。

挑戰

正如“天下沒有免費的午餐”所表達的哲理,當我們在享受HiSDP所帶來的優勢時,也不得不面臨一些挑戰,即掌握HiSDP需要一定的時間、其入門的門坎相對要高出不少。誠然,這一挑戰需要工程師個體通過學習去應對,且學習過程需要在即便上手後仍持續保持,因為HiSDP真的是一個巨大的知識寶藏,從技術和工程領域都給出了很多有啟發性的實現參考和解決方案,非常值得“細品慢嚼”。

最後,LogAgent在剛過去的2018財年很好地用HiSDP演繹了“用牛刀殺雞”的工程理念。

技術分享圖片

附錄

  • 《What is GN?》

  • 《The Ninja build system》

原文鏈接


HiSDP —— 高效的C++軟件開發平臺