徐繼蕓
摘要
傳統(tǒng)嵌入式系統(tǒng)的開(kāi)發(fā),受到目標(biāo)平臺(tái)多樣、開(kāi)發(fā)工具不完善、需要軟硬件協(xié)同開(kāi)發(fā)等因素影響,往往開(kāi)發(fā)周期較長(zhǎng),效率較低。同時(shí),一個(gè)產(chǎn)品線下的研發(fā)團(tuán)隊(duì)多以項(xiàng)目組為單位獨(dú)立開(kāi)發(fā),項(xiàng)目組之間缺乏有效的溝通和技術(shù)共享,導(dǎo)致重復(fù)開(kāi)發(fā),基礎(chǔ)模塊升級(jí)、維護(hù)不同步等問(wèn)題。通過(guò)開(kāi)發(fā)以通用構(gòu)建模塊為基礎(chǔ)的產(chǎn)品平臺(tái)可以有效減少重復(fù)開(kāi)發(fā),提升產(chǎn)品研發(fā)效率。同時(shí),在嵌入式產(chǎn)品平臺(tái)的開(kāi)發(fā)中,通過(guò)合理的系統(tǒng)架構(gòu),綜合使用測(cè)試驅(qū)動(dòng)開(kāi)發(fā),持續(xù)集成等敏捷開(kāi)發(fā)方法和工具,提升產(chǎn)品平臺(tái)開(kāi)發(fā)效率,保障產(chǎn)品平臺(tái)質(zhì)量。
【關(guān)鍵詞】嵌入式 產(chǎn)品平臺(tái) 敏捷開(kāi)發(fā) 持續(xù)集成 通用構(gòu)建模塊 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)
1 引言
對(duì)于一個(gè)有多個(gè)類(lèi)似產(chǎn)品的產(chǎn)品線,構(gòu)建一個(gè)以通用構(gòu)建模塊為基礎(chǔ)的產(chǎn)品平臺(tái),可以加快產(chǎn)品開(kāi)發(fā)速度,降低產(chǎn)品開(kāi)發(fā)成本,控制風(fēng)險(xiǎn)。
產(chǎn)品平臺(tái)的目標(biāo)是將產(chǎn)品線成熟的CBB(Comnion Building Block,通用構(gòu)建模塊)抽取(抽象、重構(gòu))出來(lái),提供給應(yīng)用開(kāi)發(fā)人員使用。一方面避免重復(fù)開(kāi)發(fā)基礎(chǔ)模塊,減輕應(yīng)用開(kāi)發(fā)的復(fù)雜度和工作量;另一方面,也避免了多個(gè)項(xiàng)目組各自封閉開(kāi)發(fā)導(dǎo)致基礎(chǔ)模塊升級(jí),Bug修改不同步等問(wèn)題。
產(chǎn)品平臺(tái)的核心是通用構(gòu)建CBB,CBB的核心是共性和可變性分析(Commonality and Variablity Analisys)。
下面介紹構(gòu)建產(chǎn)品平臺(tái)的核心要點(diǎn),以及相關(guān)的流程、方法和工具。
2 產(chǎn)品平臺(tái)總體架構(gòu)
針對(duì)中大型嵌入式產(chǎn)品平臺(tái),架構(gòu)需要遵循如下2條核心原則:
2.1 分層
為了保持良好的結(jié)構(gòu),對(duì)于較大型系統(tǒng)的產(chǎn)品平臺(tái),邏輯架構(gòu)一定需要分層、分包(包,在C++代碼中對(duì)應(yīng)的是namespace)設(shè)計(jì)。越底層,模塊功能越趨向工具,越高層,越趨向業(yè)務(wù)邏輯。
2.2 平臺(tái)無(wú)關(guān)設(shè)計(jì)
平臺(tái)無(wú)關(guān)設(shè)計(jì)對(duì)于嵌入式平臺(tái)非常重要,目的是切換硬件平臺(tái)后,產(chǎn)品平臺(tái)、應(yīng)用程序無(wú)需改動(dòng),只需要針對(duì)目標(biāo)平臺(tái)做一個(gè)實(shí)現(xiàn)即可。一般使用依賴倒置的設(shè)計(jì)方法實(shí)現(xiàn)平臺(tái)無(wú)關(guān)。
產(chǎn)品平臺(tái)邏輯架構(gòu)圖如圖1產(chǎn)品平臺(tái)邏輯構(gòu)架圖所示。
3 產(chǎn)品平臺(tái)的開(kāi)發(fā)方法和工具
一個(gè)典型的嵌入式產(chǎn)品平臺(tái)物理架構(gòu)視圖如圖2。
4 CBB開(kāi)發(fā)流程
CBB是產(chǎn)品平臺(tái)的核心組成,CBB開(kāi)發(fā)流程如下:
(1)模塊需求分析;
(2)模塊設(shè)計(jì);
(3)模塊接口設(shè)計(jì);
(4)編寫(xiě)接口測(cè)試用例,偏重可用性測(cè)試(即TDD,可有效幫助接口設(shè)計(jì));
(5)模塊設(shè)計(jì)評(píng)審;
(6)編碼;
(7)完善單元測(cè)試用例。
需要說(shuō)明的是步驟4,即TDD(Test-driven Development)——測(cè)試驅(qū)動(dòng)開(kāi)發(fā)。測(cè)試驅(qū)動(dòng)開(kāi)發(fā)是極限編程中倡導(dǎo)的軟件開(kāi)發(fā)方法,測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的目的是取得快速反饋,并使用說(shuō)明主線(illustrate the main line)的方法來(lái)構(gòu)建程序。
經(jīng)典的測(cè)試驅(qū)動(dòng)開(kāi)發(fā)流程,如圖3測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)流程圖所示。
為了更敏捷的做設(shè)計(jì)評(píng)審,在設(shè)計(jì)階段,可以使用TDD來(lái)完善接口設(shè)計(jì),我們稱之為T(mén)DDesign(測(cè)試驅(qū)動(dòng)設(shè)計(jì)),優(yōu)化的TDD如圖4CBB開(kāi)發(fā)中的測(cè)試驅(qū)動(dòng)(TDD)開(kāi)發(fā)流程圖所示。
即,在接口設(shè)計(jì)完成后,實(shí)現(xiàn)前,先利用單元測(cè)試框架,根據(jù)業(yè)務(wù)流,調(diào)用接口寫(xiě)幾個(gè)單元測(cè)試用例。
在實(shí)踐中TDD的好處很明顯:在寫(xiě)TDD測(cè)試用例的過(guò)程中就可能發(fā)現(xiàn)接口設(shè)計(jì)的不合理。而且,對(duì)于持續(xù)集成的系統(tǒng),TDD也并沒(méi)有增加工作量。
另一個(gè)需要特別說(shuō)明是步驟5:對(duì)設(shè)計(jì)評(píng)審的關(guān)注。要求的設(shè)計(jì)評(píng)審內(nèi)容:
(1)總體說(shuō)明(若結(jié)構(gòu)復(fù)雜則需有邏輯架構(gòu)視圖);
(2)接口使用示例;
(3)類(lèi)圖,序列圖(UML);
(4)設(shè)計(jì)決策;
(5)接口(直接附頭文件,不要粘貼到設(shè)計(jì)文檔)。
設(shè)計(jì)評(píng)審保證了CBB的設(shè)計(jì)質(zhì)量,不會(huì)因?yàn)閳F(tuán)隊(duì)成員素質(zhì)的不同而出現(xiàn)重大的設(shè)計(jì)問(wèn)題。
CBB代碼上傳到代碼倉(cāng)庫(kù)后,剩下的就是自動(dòng)化工具的工作了:依次自動(dòng)觸發(fā)單元測(cè)試,集成測(cè)試,發(fā)布測(cè)試,最后郵件發(fā)送集成結(jié)果給開(kāi)發(fā)人員。
5 持續(xù)集成流程
持續(xù)集成流程如圖5所示。
集成測(cè)試除了集成測(cè)試用例外,還復(fù)用單元測(cè)試的測(cè)試用例。集成測(cè)試運(yùn)行單元測(cè)試的用例時(shí),并非順序運(yùn)行所有模塊(每個(gè)模塊初始化,測(cè)試,反初始化后再運(yùn)行下個(gè)模塊),而是通過(guò)配置一定的依賴關(guān)系和策略,初始化一系列模塊后,運(yùn)行測(cè)試用例,最后,再反初始化這些模塊。
6 發(fā)布流程
發(fā)布流程如圖6所示,自動(dòng)化打包,并對(duì)發(fā)布包從用戶使用的過(guò)程測(cè)試一遍。發(fā)布流程每天構(gòu)建,以保證每天都處于可發(fā)布狀態(tài)。所有過(guò)程均自動(dòng)化。
7 主要工具
幾個(gè)關(guān)鍵的工具:
(1)Jenkins:做持續(xù)集成工具,使用腳本輔助實(shí)現(xiàn)嵌入式系統(tǒng)的遠(yuǎn)程部署測(cè)試。
(2)GTest:Google的單元測(cè)試框架。
(3)CMake:高效友好的自動(dòng)編譯工具,優(yōu)于configure/make。
(4)Doxygen:自動(dòng)生成接口說(shuō)明,當(dāng)然前提是規(guī)范好代碼的接口說(shuō)明格式。
(5)MediaWiki:wiki工具,做CBB發(fā)布和技術(shù)文檔的發(fā)布平臺(tái)。人人貢獻(xiàn)的思想是推崇提倡的。
8 總結(jié)
本文介紹的嵌入式產(chǎn)品平臺(tái)已經(jīng)在星網(wǎng)視易公司的KTV產(chǎn)品線得到應(yīng)用,傳統(tǒng)上,該產(chǎn)品線一款基于全新硬件平臺(tái)的系統(tǒng),開(kāi)發(fā)周期大概需要10?12個(gè)月,而基于產(chǎn)品平臺(tái),產(chǎn)品開(kāi)發(fā)效率、質(zhì)量顯著提升,芯片平臺(tái)切換時(shí)間大幅縮短至約原來(lái)的1/4。
實(shí)踐證明,一個(gè)產(chǎn)品線下多個(gè)產(chǎn)品并行開(kāi)發(fā)時(shí),使用產(chǎn)品平臺(tái),可以大幅加快產(chǎn)品開(kāi)發(fā)效率、提升質(zhì)量、降低成本。同時(shí),合理的系統(tǒng)架構(gòu),并輔以敏捷方法的使用,可以極大加快產(chǎn)品開(kāi)發(fā)效率。
參考文獻(xiàn)
[1]Duvall? Paul M,,Steve Matyas,and Andrew Glover. Continuous integration: improving software quality and reducing risk [M]. Pearson Education, 2007.
[2]Beck,Kent.Test-driven development: by example[M] . Addison-Wesley Professional, 2003.
[3]徐仕成.持續(xù)集成在現(xiàn)代軟件開(kāi)發(fā)中的應(yīng)用與研究[D].中南大學(xué),2007.
[4]紀(jì)海.基于云計(jì)算的產(chǎn)品平臺(tái)設(shè)計(jì)服務(wù)研究[D].機(jī)械科學(xué)研究總院,2012.
[5]戴建國(guó),趙慶展,郭理,秦懷斌.持續(xù)集成在項(xiàng)目開(kāi)發(fā)中的應(yīng)用研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2009(10):2573-2576.
[6]Marta Larusdottir, Jan Gulliksen, Asa Cajander. A License To Ki11-Improving UCSD In Agile Development[J]. The Journal of Systems & Software,2016.
[7]GB/T 22033-2008《信息技術(shù)嵌入式系統(tǒng)術(shù)語(yǔ)》概要[J].信息技術(shù)與標(biāo)準(zhǔn) 化,2009(08):38-40.
[8]A g i1e software development,wikipedia.org[EB/0L].http:// en.wikipedia.org/wiki/Agile_ software-development.
[9]Test-driven development,wikipedia. org [EB/OL] . http: //en. wikipedia. org/ wiki/Agile_sof tware-development.