1969年,Mcllroy首先認(rèn)識(shí)到了開(kāi)創(chuàng)可重用軟件組件的需要,但是直到現(xiàn)在軟件團(tuán)體也沒(méi)有實(shí)現(xiàn)這一目標(biāo);因此,很容易提出下列問(wèn)題:如果可重用軟件組件的優(yōu)勢(shì)如此勢(shì)不可擋,那為什么沒(méi)有在整個(gè)計(jì)算機(jī)科學(xué)中實(shí)現(xiàn)軟件組件的重用?
-Grady Booch
?
Grady Booch[1]先生當(dāng)然不會(huì)不知道其中的原因——實(shí)現(xiàn)軟件重用的代價(jià)頗高,且獲得的收益并沒(méi)有預(yù)期的那么高,多數(shù)公司和機(jī)構(gòu)知難而退,所以軟件重用至今仍然是可望不可及的“烏托邦”,接著Grady Booch當(dāng)然就要向我們展示UML和RUP的強(qiáng)大威力;但是我們卻要延著這一話題來(lái)談?wù)勡浖赜眠M(jìn)程躊躇不前的真正原因以及軟件產(chǎn)品線管理實(shí)踐中的得失。
其實(shí)現(xiàn)代軟件開(kāi)發(fā)過(guò)程中無(wú)時(shí)無(wú)刻不在重用,重用的范圍包括架構(gòu)和模式(Design Patterns)、應(yīng)用接口(CORBA、DCOM、J2EE、.NET),組件(MFC、OWL、DELPHI的Component、各種SDK等)、各種語(yǔ)言開(kāi)發(fā)平臺(tái)和支持工具等等;不過(guò)這種程度的重用并不能達(dá)到理想的多快好省的開(kāi)發(fā)要求,主要原因就是這樣的重用幾乎與業(yè)務(wù)無(wú)關(guān)——而各軟件公司的產(chǎn)品在業(yè)務(wù)上具有極大的相關(guān)性,這就為從更深層次的重用中獲益提供了可能,許多公司進(jìn)行了這方面的積極探索,建立了公司內(nèi)部的公用技術(shù)模塊、貨架技術(shù)、甚至開(kāi)發(fā)規(guī)范,然后就像滿懷希望的農(nóng)民剛剛完成播種,憧憬著金色的秋天一樣迫不及待的想從績(jī)效中看到豐厚的回報(bào)。然而增加了許多額外的工作量后預(yù)期的回報(bào)并沒(méi)有出現(xiàn),是什么原因呢?首先這些期望被重用的模塊是零散的,開(kāi)發(fā)工程師在需要時(shí)往往不知道從何處尋找,即使找到了卻發(fā)現(xiàn)在接口、兼容、格式、約束等方面存在這樣那樣的問(wèn)題,與其將就用還不如我重新開(kāi)發(fā)一個(gè)更好用!就算是發(fā)現(xiàn)了合適的組件,遺憾的是軟件工程師往往對(duì)別人的東西具有本能的“懷疑一切”的態(tài)度,所以模塊獲得重用的機(jī)會(huì)并不大;需要注意的是一般開(kāi)發(fā)可重用組件的成本比開(kāi)發(fā)一次性組件高出50%,而一個(gè)組件被重用的次數(shù)超過(guò)三次才有可能從重用中受益:結(jié)論就是公用模塊開(kāi)發(fā)方式的收益并沒(méi)有想象中那樣顯著,卻增加了單獨(dú)項(xiàng)目的開(kāi)發(fā)成本。更麻煩的是許多項(xiàng)目的預(yù)算僅僅能夠滿足自己的要求,無(wú)法提供足夠的資源進(jìn)行重用組件的開(kāi)發(fā)。許多公司在遇到麻煩的時(shí)候果斷終止了這種冒險(xiǎn)行徑,畢竟沒(méi)有誰(shuí)會(huì)傻到愿意費(fèi)力不討好!
“重用”的優(yōu)點(diǎn)是令人向往的,我們是否沒(méi)有找到適當(dāng)途徑來(lái)重用?既然公用技術(shù)模塊是零散的、被動(dòng)管理的,如果采用統(tǒng)一的、與特定業(yè)務(wù)需求更加密切的方式進(jìn)行管理又會(huì)是怎樣的結(jié)果呢?這就是采用產(chǎn)品線的方式進(jìn)行軟件開(kāi)發(fā)管理。
軟件產(chǎn)品線[2]是指一組具有可管理的公共特性的軟件密集性系統(tǒng)的集合,這些系統(tǒng)滿足特定的市場(chǎng)需求或者任務(wù)需求,并且按照預(yù)定義的方式從一個(gè)公共的核心資產(chǎn)集開(kāi)發(fā)得到。
軟件產(chǎn)品線與其他產(chǎn)品線的定義并沒(méi)有什么不同,不過(guò)核心資產(chǎn)的范圍是相當(dāng)廣泛的:包括架構(gòu)、可重用的組件、需求規(guī)格、領(lǐng)域模型、進(jìn)度計(jì)劃和預(yù)算、測(cè)試用例、開(kāi)發(fā)過(guò)程定義等等。更重要的是不要忘記“人”是核心資產(chǎn)中的核心!使用這些核心資產(chǎn)資源,我們可以高效構(gòu)建特定的產(chǎn)品,主要的工作量在于集成而不是重新開(kāi)發(fā)。軟件產(chǎn)品線不同于先前的“重用”,也不是對(duì)單一產(chǎn)品劃分子版本進(jìn)行開(kāi)發(fā),也不是一些技術(shù)管理規(guī)范,只要看看項(xiàng)目組的主要工作是在開(kāi)發(fā)還是在集成就可以清楚他們是否按照產(chǎn)品線方式運(yùn)作。我并不否認(rèn)能夠從其他開(kāi)發(fā)方式中收益,但現(xiàn)在的重點(diǎn)在于軟件產(chǎn)品線。象華為TELLIN智能網(wǎng)上運(yùn)行各種智能業(yè)務(wù),如“200電話卡”、“201校園卡”、“神州行”、“動(dòng)感地帶”、“固定電話預(yù)付費(fèi)”、“193長(zhǎng)途卡”、“17931IP卡”、“統(tǒng)一VC充值中心”等等,很難想象工程師面對(duì)如此繁多且相似度極大的智能業(yè)務(wù)系統(tǒng)都會(huì)從頭開(kāi)發(fā)——他們只是在基礎(chǔ)平臺(tái)上進(jìn)行少量的開(kāi)發(fā)和配置就可以滿足不同的業(yè)務(wù)需求。
軟件產(chǎn)品線可以為我們帶來(lái)大量的好處:縮短開(kāi)發(fā)周期、降低研發(fā)成本、減少產(chǎn)品更新和維護(hù)的難度、提供更好的產(chǎn)品質(zhì)量,進(jìn)而在競(jìng)爭(zhēng)中處于領(lǐng)先地位,獲取更大利潤(rùn)。對(duì)于個(gè)人而言也是如此,比如微軟開(kāi)發(fā)Windows NT Server時(shí),先做英文版,然后再做其他語(yǔ)言的版本,這樣做的結(jié)果就使得其他版本和英文版的時(shí)間相差特別長(zhǎng),并且很多開(kāi)發(fā)工作是重復(fù)的,即費(fèi)時(shí)又費(fèi)錢。于是唐駿有了同步開(kāi)發(fā)的想法,就做了一套范例和樣本,然后開(kāi)始推廣——“我一直認(rèn)為這是目前為止我對(duì)微軟最大的貢獻(xiàn),因?yàn)樗淖兞宋④浀拈_(kāi)發(fā)方式,使得國(guó)際版和英文版的同步性得到了很大的提高”。我想唐駿今天的成功與這次偉大的實(shí)踐不無(wú)關(guān)系吧。
聽(tīng)起來(lái)很誘人吧?!不過(guò)實(shí)現(xiàn)產(chǎn)品線方式開(kāi)發(fā)是有一定的風(fēng)險(xiǎn)和約束的,我想每一種管理方法都是在一定的約束環(huán)境下才能夠獲得較好的效果,如果不明確指出就很容易在實(shí)踐中陷入困境。就像短信廣告中只告訴你有機(jī)會(huì)中大獎(jiǎng),僅在不顯眼的地方以肉眼分辨極限的字體寫著每條收費(fèi)一元,而如何取消就更甭提了,當(dāng)用戶看到帳單大吃一驚并懊惱不已時(shí)甚至能夠聽(tīng)到商販開(kāi)心的竊笑!我們并不是在兜售和吹噓,所以還是清醒一下以免被縹緲的金錢蒙住了雙眼。
首先要清楚的就是產(chǎn)品線開(kāi)發(fā)不像單獨(dú)的項(xiàng)目開(kāi)發(fā),需要一定的啟動(dòng)成本用于建立核心資產(chǎn),而最早利用核心資產(chǎn)構(gòu)建的產(chǎn)品開(kāi)發(fā)周期和成本并不會(huì)顯著縮短,因?yàn)槠涑袚?dān)著相當(dāng)比例組件的開(kāi)發(fā)任務(wù),以及對(duì)核心資產(chǎn)的修訂和更新,也就是“前人種樹后人乘涼”。如果當(dāng)前項(xiàng)目的資源和進(jìn)度壓力都非常之大時(shí),參考下面這張圖吧:
?
從圖上看大約從公共平臺(tái)上開(kāi)發(fā)三個(gè)以上產(chǎn)品就會(huì)受益,也許你認(rèn)為總會(huì)有三個(gè)產(chǎn)品的,不過(guò)產(chǎn)品線會(huì)保證成為有效率的開(kāi)發(fā)過(guò)程,卻不會(huì)保證這些產(chǎn)品的市場(chǎng)成功,如果貴公司產(chǎn)品沒(méi)有銷路,多好的過(guò)程也無(wú)濟(jì)于事;劃到一個(gè)產(chǎn)品線下的產(chǎn)品不僅僅是看他們共性有多大,而是要看他們可以共用的共性有多大——例如一家提供通訊設(shè)備網(wǎng)管的公司要求產(chǎn)品中70%的部分是平臺(tái),另外30%是獨(dú)立開(kāi)發(fā)的。
從眾多采用產(chǎn)品線開(kāi)發(fā)的成功案例中會(huì)發(fā)現(xiàn)這樣一個(gè)奇怪的現(xiàn)象:多數(shù)是在某種“被迫”的情況下進(jìn)行的。例如CelsiusTech Systems AB,一家為世界各地海軍提供船舶指揮控制系統(tǒng)的瑞典公司,在同一時(shí)間被要求建造兩個(gè)系統(tǒng),按照慣例需要組建兩個(gè)項(xiàng)目組分別進(jìn)行開(kāi)發(fā),但是麻煩來(lái)了——即使是全瑞典也找不到這么多合格的工程師!于是他們希望實(shí)現(xiàn)一種解決方案來(lái)滿足這兩個(gè)客戶的不同需求,以及將來(lái)的客戶需求;某數(shù)據(jù)通訊設(shè)備供應(yīng)商發(fā)現(xiàn)自己的產(chǎn)品開(kāi)發(fā)速度總是較競(jìng)爭(zhēng)對(duì)手慢——盡管已經(jīng)配備了足夠的研發(fā)資源,自己的開(kāi)發(fā)進(jìn)度幾乎達(dá)到極限。原因就是競(jìng)爭(zhēng)對(duì)手采用產(chǎn)品線開(kāi)發(fā)方式,其產(chǎn)品擁有極大的相似性:僅僅在容量、速度、Qos、端口、支持協(xié)議等方面略有差別。于是這家公司也嘗試了平臺(tái)化開(kāi)發(fā),結(jié)果大大縮短開(kāi)發(fā)時(shí)間并在市場(chǎng)競(jìng)爭(zhēng)中領(lǐng)先。我并不認(rèn)為只有被迫的產(chǎn)品線開(kāi)發(fā)才會(huì)取得成功,而是說(shuō)產(chǎn)品線開(kāi)發(fā)需要業(yè)務(wù)和市場(chǎng)等方面的驅(qū)動(dòng),我們可以確認(rèn)從中收益,這樣有針對(duì)性的產(chǎn)品線運(yùn)作才更有可能成功。
在全新產(chǎn)品的開(kāi)發(fā)中試圖建立平臺(tái)往往難以成功,原因就是僅從一個(gè)產(chǎn)品中幾乎無(wú)法提取什么可以重用的共性:我曾經(jīng)參與過(guò)一個(gè)項(xiàng)目,由于業(yè)務(wù)領(lǐng)域知識(shí)的匱乏導(dǎo)致項(xiàng)目開(kāi)發(fā)吃力,此時(shí)項(xiàng)目經(jīng)理聽(tīng)說(shuō)平臺(tái)化具有無(wú)比的優(yōu)勢(shì)(銀彈乎?),于是我們采用了平臺(tái)化方式開(kāi)發(fā)——將界面上與特定用戶的標(biāo)識(shí)統(tǒng)統(tǒng)去掉,這樣就“提取”了一個(gè)“平臺(tái)版本”——遺憾的是這個(gè)“平臺(tái)”和原來(lái)的系統(tǒng)幾乎沒(méi)有什么區(qū)別,只是穿了一個(gè)“馬甲”。
采用平臺(tái)化開(kāi)發(fā)的風(fēng)險(xiǎn)并非僅來(lái)自與公司業(yè)務(wù)戰(zhàn)略的匹配和技術(shù)的可行性,更隱含著組織方面的風(fēng)險(xiǎn):這種不同于單獨(dú)項(xiàng)目開(kāi)發(fā)的方式需要在組織結(jié)構(gòu)上進(jìn)行重大的調(diào)整,并且需要一位精通產(chǎn)品線運(yùn)作實(shí)踐并具有執(zhí)行力的技術(shù)主管負(fù)責(zé)推行,同時(shí)公司還要承擔(dān)人員職位變化引起的工作效率下降、研發(fā)文化轉(zhuǎn)變等帶來(lái)的或長(zhǎng)或短時(shí)間的娠痛。請(qǐng)問(wèn)貴公司做好準(zhǔn)備了嗎?