我的一家咨詢客戶為郵電做軟件項(xiàng)目,對(duì)于不同的項(xiàng)目,雖然項(xiàng)目不同,但是都是郵電行業(yè)的,或多或少都有相同的部分,但是每個(gè)項(xiàng)目幾乎都是白手起家,從零開始。B項(xiàng)目的一位成員曾經(jīng)做過A項(xiàng)目,發(fā)現(xiàn)A項(xiàng)目的部分函數(shù)可以B項(xiàng)目中,他就把這些函數(shù)copy過來。這么做顯然節(jié)約了他一點(diǎn)編碼時(shí)間,然而大家有沒有想過,如果他們能夠搭建軟件平臺(tái)框架,把很多項(xiàng)目都可能會(huì)用上的功能模塊識(shí)別出來,封裝成公共的基礎(chǔ)模塊,為各個(gè)項(xiàng)目所使用,會(huì)很大程度較少項(xiàng)目工作量、縮短項(xiàng)目周期、提升項(xiàng)目質(zhì)量。
會(huì)提升質(zhì)量嗎?或者有人有這樣的疑問。軟件平臺(tái)為許多產(chǎn)品所用,就大大增加平臺(tái)中缺陷發(fā)現(xiàn)的機(jī)會(huì),有助于平臺(tái)的迅速穩(wěn)定。人的美麗不僅是外在美,內(nèi)在美一樣很重要;軟件也一樣,軟件的質(zhì)量不僅是外在的、用戶可以感知的質(zhì)量,也包括內(nèi)在的、用戶感知不到的質(zhì)量,比如可維護(hù)性、可移植性的優(yōu)劣。軟件平臺(tái)之所以能夠成為平臺(tái),通常會(huì)有精心設(shè)計(jì)的架構(gòu),提升軟件的“內(nèi)在美”,而沒有基于平臺(tái)開發(fā)的軟件,通常迫于項(xiàng)目的進(jìn)度壓力,開發(fā)人員關(guān)注的是如何把客戶需求實(shí)現(xiàn)了,哪里顧得上軟件的內(nèi)部質(zhì)量屬性。因此,基于軟件平臺(tái)開發(fā)的軟件,有助于讓軟件同時(shí)具備“外在美”和“心靈美”。
會(huì)減少工作量、縮短工期嗎?好像沒有人有疑問。但是,估計(jì)你會(huì)低估平臺(tái)所能帶來的工作量和工期的縮減程度?;谥赜闷脚_(tái)的軟件開發(fā),毫無疑問節(jié)約了開發(fā)時(shí)間,但是往往很多人忽略了測(cè)試的時(shí)間也得到了節(jié)約,維護(hù)的工作量也得到大大縮減。以維護(hù)工作為例,當(dāng)修復(fù)了一個(gè)平臺(tái)bug,如果該平臺(tái)為十個(gè)產(chǎn)品所用,那么實(shí)際上是用解決一個(gè)bug工作量解決了十個(gè)產(chǎn)品的bug。
軟件平臺(tái)往往會(huì)成為企業(yè)的核心競(jìng)爭(zhēng)力之一。比如,有些軟件項(xiàng)目競(jìng)標(biāo),你覺得少于100萬你就會(huì)虧錢,而有的公司敢報(bào)50萬,他們還賺錢,為什么?因?yàn)槿思抑恍枰?0%開發(fā)工作量,另外80%是已有的軟件平臺(tái)。H3C在國(guó)內(nèi)異軍突起,短短幾年時(shí)間已經(jīng)成為企業(yè)網(wǎng)市場(chǎng)的領(lǐng)先者。一切都沒有偶然,H3C在市場(chǎng)的卓越表現(xiàn)是因?yàn)閮?nèi)部有強(qiáng)大的研發(fā)能力,而這種強(qiáng)大的研發(fā)能力的一個(gè)重要體現(xiàn)是他們的平臺(tái)軟件。H3C大部分軟件工程師都從事平臺(tái)軟件的開發(fā)和維護(hù)工作,而各個(gè)產(chǎn)品的軟件工程師相對(duì)并不多,因?yàn)楦鳟a(chǎn)品的軟件開發(fā)工程師要開發(fā)的僅僅是一小部分與硬件相關(guān)的驅(qū)動(dòng)而已,大部分功能都由平臺(tái)軟件提供。即使驅(qū)動(dòng)軟件與硬件相關(guān),他們也盡量提出一些公用模塊,比如設(shè)備的啟動(dòng)界面模塊,可見,想方設(shè)法地重用已經(jīng)成為H3C的一種研發(fā)習(xí)慣。試想,如果H3C沒有平臺(tái)軟件,那么他們的軟件開發(fā)和測(cè)試人員要翻十倍或許都不夠用。
有的人會(huì)說,我們的企業(yè)不一樣,產(chǎn)品各異,根本不需要也可能構(gòu)建軟件平臺(tái)?;蛟S這是事實(shí),我曾經(jīng)的咨詢客戶,軟件開發(fā)人員一共不超過二十人,而編程語(yǔ)言就有五六種,在規(guī)范他們軟件開發(fā)過程之前,我向總經(jīng)理提出了癥狀背后的一個(gè)本質(zhì)問題:業(yè)務(wù)方向不明確、產(chǎn)品不聚焦。享譽(yù)全球的蘋果公司也只有幾款可以數(shù)得過來的產(chǎn)品,而我們國(guó)內(nèi)很多名不見經(jīng)傳的小企業(yè)研發(fā)出的產(chǎn)品琳瑯滿目,可是有多少賺錢的?所以,有人說了,在這個(gè)時(shí)代,管理者要學(xué)的是如何做減法,不是做加法,要成功,就要專注!如果你的業(yè)務(wù)專注了,必然就有了構(gòu)建平臺(tái)的可能和需要,而一旦你構(gòu)建起了強(qiáng)大的平臺(tái),雖不能保證你會(huì)成為這個(gè)領(lǐng)域的Number one,但會(huì)使你成為這個(gè)領(lǐng)域的Professional。
現(xiàn)在,或許你已經(jīng)有了強(qiáng)烈的構(gòu)建屬于自己的平臺(tái)的沖動(dòng),但如何下手呢?下面告訴你軟件平臺(tái)DIY六步驟法。
步驟一:選擇基準(zhǔn)產(chǎn)品
首先,選擇一個(gè)具有對(duì)本業(yè)務(wù)領(lǐng)域最具代表性的產(chǎn)品,以此產(chǎn)品的軟件作為軟件平臺(tái)的雛形。構(gòu)建軟件平臺(tái)不必從零開始,平臺(tái)從產(chǎn)品中,又到產(chǎn)品中去。
步驟二:組建平臺(tái)團(tuán)隊(duì)
再則,要組建各個(gè)軟件平臺(tái)架構(gòu)師團(tuán)隊(duì)。科技以人為本,構(gòu)建平臺(tái)軟件的極其關(guān)鍵的人是軟件架構(gòu)師,架構(gòu)師就好比建筑行業(yè)的設(shè)計(jì)師,架構(gòu)的質(zhì)量決定了整個(gè)平臺(tái)的質(zhì)量,而架構(gòu)師的能力水平又決定了架構(gòu)的質(zhì)量。架構(gòu)師要精通軟件設(shè)計(jì),同時(shí)也要對(duì)所選擇的代表性產(chǎn)品軟件技術(shù)非常熟悉。此時(shí),你也許要撓頭了,我們工程師都很年輕,沒有這樣的人才怎么辦?或者挖一個(gè)本行業(yè)的架構(gòu)師來,或者借助外力,引入培訓(xùn)、咨詢幫助經(jīng)驗(yàn)相對(duì)豐富的工程師一同去設(shè)計(jì)軟件架構(gòu)。對(duì)許多公司來講,第二種方法的可操作性會(huì)更強(qiáng)一些,我曾輔導(dǎo)過一些企業(yè)工程師去設(shè)計(jì)平臺(tái)框架,我提供方法,他們提供產(chǎn)品技術(shù)知識(shí),一同討論互動(dòng)的過程中,迅速構(gòu)建起了平臺(tái)架構(gòu),更重要的是,在這個(gè)過程中,工程師的設(shè)計(jì)能力得到了提升,平臺(tái)設(shè)計(jì)好了,同時(shí)也培養(yǎng)出來了一批軟件架構(gòu)師。
除了構(gòu)建平臺(tái)之初需要架構(gòu)團(tuán)隊(duì)之外,在平臺(tái)實(shí)現(xiàn)和后期的維護(hù)升級(jí)還需要平臺(tái)軟件開發(fā)維護(hù)人員。強(qiáng)烈建議從組織上要把平臺(tái)的開發(fā)、維護(hù)工作獨(dú)立出來,目的是:1、確保平臺(tái)工作有較充分的資源。因?yàn)楫a(chǎn)品開發(fā)屬于緊急而重要的工作,而平臺(tái)開發(fā)相對(duì)來說不太緊急,如果沒有獨(dú)立的專職的平臺(tái)團(tuán)隊(duì),開發(fā)人員往往都被安排到了緊急的工作上,即產(chǎn)品開發(fā),然而重要度要大的平臺(tái)開發(fā)沒人來做了;2、確保平臺(tái)的架構(gòu)不被要求各異的產(chǎn)品所破壞。我曾經(jīng)的咨詢客戶很重視軟件平臺(tái)建設(shè),辛辛苦苦構(gòu)建好了之后,因?yàn)闆]有獨(dú)立的平臺(tái)團(tuán)隊(duì)專門負(fù)責(zé)平臺(tái)的開發(fā)和維護(hù),導(dǎo)致最后的平臺(tái)被各個(gè)產(chǎn)品改得面目全非,已不能稱之為平臺(tái)了。
步驟三:平臺(tái)架構(gòu)設(shè)計(jì)
首先對(duì)所選的產(chǎn)品軟件進(jìn)行總體架構(gòu)設(shè)計(jì),總體架構(gòu)首先要對(duì)軟件進(jìn)行層次劃分。如果你學(xué)過計(jì)算機(jī)網(wǎng)絡(luò)知道OSI/RM,就會(huì)知道分層的好處,就是使用下層提供的服務(wù)而為上層提供統(tǒng)一的服務(wù),屏蔽本層及以下層的差異,當(dāng)本層及以下層發(fā)生了變化不會(huì)影響到上層。
做軟件設(shè)計(jì)要學(xué)習(xí)硬件設(shè)計(jì),硬件的設(shè)計(jì)越來越簡(jiǎn)單,二十年前,哪怕是一個(gè)功能很簡(jiǎn)單的電路,電路板上也要鋪上密密麻麻的元器件,而如今,一塊電路板上焊幾塊集成芯片(IC),就可以實(shí)現(xiàn)很復(fù)雜的功能,對(duì)硬件設(shè)計(jì)人員的電路設(shè)計(jì)能力恐怕還沒有三十年前高,因?yàn)橹饕δ芏技傻搅诵酒锩?,設(shè)計(jì)人員不必了解芯片內(nèi)部如何實(shí)現(xiàn),只要讀懂芯片手冊(cè)、了解了各個(gè)管腳的定義,可以利用IC實(shí)現(xiàn)所要的功能了。軟件架構(gòu)進(jìn)行了分層,每一層就相當(dāng)一塊大的IC,層與層之間的互動(dòng)都不必了解層內(nèi)部是如何實(shí)現(xiàn)的,只需要搞清楚每一層的對(duì)外接口函數(shù)(相當(dāng)于IC的管腳)即可,當(dāng)軟件開發(fā)人員只需要關(guān)心本層的技術(shù)細(xì)節(jié)時(shí),軟件實(shí)現(xiàn)的難度將大大降低,對(duì)開發(fā)人員的技能要求也隨之降低。
以目前應(yīng)用較廣的Android軟件系統(tǒng)為例。Android共分四層,最底層為L(zhǎng)INUX KENEL層,作為硬件和軟件之間的抽象層,它隱藏具體硬件細(xì)節(jié)而為上層提供統(tǒng)一的服務(wù)。其上一層為L(zhǎng)IBRARIES和RUNTIME,顧名思義,這一層是一個(gè)C/C++庫(kù)集合,相當(dāng)于中間件,各個(gè)應(yīng)用通過APPLICATION FRAMEWORK層訪問。APPLICATION FRAMEWORK層存在的目的就是為了簡(jiǎn)化組件的重用,任何應(yīng)用程序都能發(fā)布他的功能且任何其他應(yīng)用程序可以使用這些功能。APPLICATION層是指運(yùn)行在Android系統(tǒng)上的五花八門的應(yīng)用程序了,如日歷、地圖、郵箱等。
?
?
有了總體架構(gòu)設(shè)計(jì)之后,接下來便是對(duì)每一層進(jìn)行展開設(shè)計(jì),如Android架構(gòu)所示,每一層在細(xì)分出多個(gè)組件,每個(gè)組件又可以看出一個(gè)小IC,同樣,此時(shí)不必關(guān)注小IC內(nèi)部如何實(shí)現(xiàn)的,只要把這個(gè)IC的功能和相應(yīng)的管腳(也就是軟件接口)定義出來。最好,每個(gè)小IC可以做出編譯可裁剪的,即用條件編譯保證只編譯自己需要的功能模塊。
步驟四:平臺(tái)實(shí)現(xiàn)和驗(yàn)證
在平臺(tái)架構(gòu)設(shè)計(jì)完成后,接下來是實(shí)現(xiàn)了。此時(shí),也不必所有的代碼都要一行行地重新編寫,可以把已實(shí)現(xiàn)了產(chǎn)品軟件拿來借鑒、甚至可以重用,但一定確保不與設(shè)計(jì)相違背,代碼的風(fēng)格也要遵循統(tǒng)一的規(guī)范。實(shí)現(xiàn)之后,要對(duì)每個(gè)模塊、以及各個(gè)模塊的集成進(jìn)行測(cè)試,確保正確實(shí)現(xiàn)了。
步驟五:平臺(tái)發(fā)布
最后,平臺(tái)軟件要發(fā)布給用戶,也就是產(chǎn)品開發(fā)人員。此時(shí),要注意以下兩點(diǎn),第一,發(fā)布的平臺(tái)軟件最好為二進(jìn)制的,而不是源代碼,目的是從技術(shù)上防止平臺(tái)被產(chǎn)品開發(fā)人員改動(dòng)。第二,要為平臺(tái)的客戶,寫平臺(tái)軟件的使用手冊(cè)。使用手冊(cè)應(yīng)對(duì)每個(gè)模塊的功能、如何裁剪、在什么情況下裁剪、它的對(duì)外接口進(jìn)行詳盡描述,便于使用者能夠方便地、正確地使用軟件平臺(tái)。
?步驟六:平臺(tái)的維護(hù)和升級(jí)
最后一步,恐怕也是最不易做好的一步。打天下容易,坐天下難;建軟件平臺(tái)容易,維護(hù)平臺(tái)難。為什么?一個(gè)企業(yè)不斷面臨原有產(chǎn)品維護(hù)、升級(jí)和全新產(chǎn)品開發(fā)的情況,而且各個(gè)產(chǎn)品的研發(fā)工期通常比較緊張,產(chǎn)品維護(hù)時(shí)對(duì)bug解決時(shí)間通常也有急迫的要求,如何保證這些面臨著時(shí)間壓力的研發(fā)和維護(hù)工作中,各個(gè)產(chǎn)品依然考慮平臺(tái)軟件的完整性,哪怕忽略短期的便利性也不犧牲平臺(tái)軟件的完整性,確實(shí)是一個(gè)很大的調(diào)整。許多企業(yè)在建好了平臺(tái)之后,各個(gè)使用平臺(tái)軟件的產(chǎn)品,在維護(hù)和升級(jí)過程中,自行地改動(dòng)、增刪平臺(tái)代碼,導(dǎo)致最后各個(gè)產(chǎn)品的平臺(tái)軟件部分已各不相同,此時(shí)平臺(tái)完全地跟著產(chǎn)品走了,已不能稱之為平臺(tái)了。
要解決以上的問題,有兩個(gè)關(guān)鍵前提,其實(shí)在前面已經(jīng)提過。第一,從組織結(jié)構(gòu)上要保證有獨(dú)立的團(tuán)隊(duì)專門負(fù)責(zé)平臺(tái)軟件的維護(hù)和升級(jí);第二,平臺(tái)軟件提供給產(chǎn)品的軟件包一定是二進(jìn)制的,而不是源代碼。的確,如果提供源代碼可能會(huì)給產(chǎn)品的開發(fā)和維護(hù)人員提供方便,然而這樣小小的好處的代價(jià)導(dǎo)致整個(gè)平臺(tái)遭到破壞這樣巨大的損失。有人說,可通過制度來保證產(chǎn)品人員不改動(dòng)平臺(tái),是的,是可以通過制度來保證,但是監(jiān)督、檢查所帶來的成本一定非常巨大,好比我們也可以通過制度規(guī)定而不是銀行卡加上密碼的方式來保證每個(gè)人都取自己的錢,然而沒有那個(gè)銀行敢這樣做的。
有了以上兩個(gè)關(guān)鍵前提,還要建立平臺(tái)的升級(jí)開發(fā)和維護(hù)機(jī)制。當(dāng)產(chǎn)品不斷有新的需求,而當(dāng)前的平臺(tái)軟件又不滿足這些的需求,此時(shí),產(chǎn)品不可以為了所謂的快速市場(chǎng)反應(yīng)獨(dú)自開發(fā)這些需求,而不考慮要求平臺(tái)升級(jí)從而滿足這些需求。因此,當(dāng)產(chǎn)品面對(duì)市場(chǎng)需求時(shí),要評(píng)估這些需求需要平臺(tái)增加或改動(dòng)哪些功能,然后向平臺(tái)軟件團(tuán)隊(duì)提出開發(fā)任務(wù),平臺(tái)開發(fā)完成后再向產(chǎn)品發(fā)布,這樣就保證了平臺(tái)軟件也是隨著客戶需求而發(fā)展演進(jìn)的。
平臺(tái)的維護(hù)工作涉及了一個(gè)很重要的bug同步問題,即任何一款使用平臺(tái)軟件的產(chǎn)品發(fā)現(xiàn)了屬于平臺(tái)軟件的bug時(shí),不可以只在該產(chǎn)品上修復(fù), bug的修復(fù)一定要同步到平臺(tái)軟件上(如果平臺(tái)軟件提供給產(chǎn)品的是二進(jìn)制文件,該bug同步很容易實(shí)現(xiàn)),既該bug最終是在平臺(tái)軟件上得到了修復(fù),并把修復(fù)后的平臺(tái)軟件在何時(shí)的時(shí)機(jī)升級(jí)其它產(chǎn)品,如此,一個(gè)產(chǎn)品bug的解決,所有的產(chǎn)品也都不存在該bug了。
同時(shí),平臺(tái)軟件不會(huì)只有一個(gè)版本存在,因?yàn)樵谑褂玫钠脚_(tái)軟件版本需要維護(hù),另外要若干增加新特性、特性定制等開發(fā)版本的存在,平臺(tái)軟件的版本管理將是非常重要的一項(xiàng)工作。版本管理不僅涉及軟件的配置管理,包括版本的規(guī)劃,即規(guī)劃出要開多少個(gè)版本分支,為何要開出這些分支,何時(shí)這些分支在回到主線,何時(shí)將發(fā)布XX版本,等等,也包括版本的監(jiān)控、版本發(fā)布管理,以及不同版本間的bug同步,即不可以在舊版本中已解決掉的bug又重新出現(xiàn)在新版本里。因而,平臺(tái)軟件的開發(fā)維護(hù)工作想要做好,需要較全面的高水平的研發(fā)管理,平臺(tái)軟件建設(shè)得如何特別能反映一個(gè)企業(yè)的研發(fā)管理水平和研發(fā)實(shí)力。